diff --git a/source/gui/settingsDialogs.py b/source/gui/settingsDialogs.py
index 40b005e..7ee0827 100644
--- a/source/gui/settingsDialogs.py
+++ b/source/gui/settingsDialogs.py
@@ -7,6 +7,7 @@
 import glob
 import os
 import copy
+import re
 import wx
 import winUser
 import logHandler
@@ -1562,22 +1563,18 @@ class InputGesturesDialog(SettingsDialog):
 	title = _("Input Gestures")
 
 	def makeSettings(self, settingsSizer):
+		# Translators: The label of a text field for the filter in Input Gestures dialog.
+		settingsSizer.Add(wx.StaticText(self, label=_("&Filter by:")))
+		filter = wx.TextCtrl(self)
+		filter.Bind(wx.EVT_TEXT, self.onFilterChange, filter)
+		settingsSizer.Add(filter)
 		tree = self.tree = wx.TreeCtrl(self, style=wx.TR_HAS_BUTTONS | wx.TR_HIDE_ROOT | wx.TR_SINGLE)
 		self.treeRoot = tree.AddRoot("root")
 		tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.onTreeSelect)
 		settingsSizer.Add(tree, proportion=7, flag=wx.EXPAND)
 
-		gestures = inputCore.manager.getAllGestureMappings(obj=gui.mainFrame.prevFocus, ancestors=gui.mainFrame.prevFocusAncestors)
-		for category in sorted(gestures):
-			treeCat = tree.AppendItem(self.treeRoot, category)
-			commands = gestures[category]
-			for command in sorted(commands):
-				treeCom = tree.AppendItem(treeCat, command)
-				commandInfo = commands[command]
-				tree.SetItemPyData(treeCom, commandInfo)
-				for gesture in commandInfo.gestures:
-					treeGes = tree.AppendItem(treeCom, self._formatGesture(gesture))
-					tree.SetItemPyData(treeGes, gesture)
+		self.gestures = inputCore.manager.getAllGestureMappings(obj=gui.mainFrame.prevFocus, ancestors=gui.mainFrame.prevFocusAncestors)
+		self.populateTree()
 
 		sizer = wx.BoxSizer(wx.HORIZONTAL)
 		# Translators: The label of a button to add a gesture in the Input Gestures dialog.
@@ -1597,6 +1594,32 @@ class InputGesturesDialog(SettingsDialog):
 	def postInit(self):
 		self.tree.SetFocus()
 
+	def populateTree(self, filter=''):
+		if filter:
+			#This regexp uses a positive lookahead (?=...) for every word in the filter, which just makes sure the word is present in the string to be tested without matching position or order.
+			filterReg = re.compile(r'(?=.*?' + r')(?=.*?'.join(filter.split(' ')) + r')', re.U|re.IGNORECASE)
+		for category in sorted(self.gestures):
+			treeCat = self.tree.AppendItem(self.treeRoot, category)
+			commands = self.gestures[category]
+			for command in sorted(commands):
+				if filter and not filterReg.match(command):
+					continue
+				treeCom = self.tree.AppendItem(treeCat, command)
+				commandInfo = commands[command]
+				self.tree.SetItemPyData(treeCom, commandInfo)
+				for gesture in commandInfo.gestures:
+					treeGes = self.tree.AppendItem(treeCom, self._formatGesture(gesture))
+					self.tree.SetItemPyData(treeGes, gesture)
+			if not self.tree.ItemHasChildren(treeCat):
+				self.tree.Delete(treeCat)
+			elif filter:
+				self.tree.Expand(treeCat)
+
+	def onFilterChange(self, evt):
+		filter=evt.GetClientObject().GetValue()
+		self.tree.DeleteChildren(self.treeRoot)
+		self.populateTree(filter)
+
 	def _formatGesture(self, identifier):
 		try:
 			source, main = inputCore.getDisplayTextForGestureIdentifier(identifier)
@@ -1667,6 +1690,7 @@ class InputGesturesDialog(SettingsDialog):
 			self.pendingAdds.add(entry)
 		self.tree.SetItemText(treeGes, disp)
 		self.tree.SetItemPyData(treeGes, gid)
+		scriptInfo.gestures.append(gid)
 		self.onTreeSelect(None)
 
 	def onRemove(self, evt):
@@ -1681,6 +1705,7 @@ class InputGesturesDialog(SettingsDialog):
 		except KeyError:
 			self.pendingRemoves.add(entry)
 		self.tree.Delete(treeGes)
+		scriptInfo.gestures.remove(gesture)
 		self.tree.SetFocus()
 
 	def onOk(self, evt):
diff --git a/user_docs/en/userGuide.t2t b/user_docs/en/userGuide.t2t
index 3222009..88aedec 100644
--- a/user_docs/en/userGuide.t2t
+++ b/user_docs/en/userGuide.t2t
@@ -1091,6 +1091,7 @@ Only commands that are applicable immediately before the dialog is opened are sh
 For example, if you want to customize commands related to browse mode, you should open the Input Gestures dialog while you are in browse mode.
 
 The tree in this dialog lists all of the applicable NVDA commands grouped by category.
+You can filter them by entering one or more words from the command's name into the Filter by edit box in any order.
 Any gestures associated with a command are listed beneath the command.
 
 To add an input gesture to a command, select the command and press the Add button.
