diff --git a/source/gui/__init__.py b/source/gui/__init__.py
index 3f006fc..2514422 100644
--- a/source/gui/__init__.py
+++ b/source/gui/__init__.py
@@ -762,3 +762,12 @@ def shouldConfigProfileTriggersBeSuspended():
 		if window.IsShown() and getattr(window, "shouldSuspendConfigProfileTriggers", False):
 			return True
 	return False
+
+def GetSelectedItems(listControl):
+	"""Helper function which accepts one parameter - object of type wx.ListCtrl and returns a list of selected indexes."""
+	selectedItems=[]
+	index=listControl.GetFirstSelected()
+	while index>=0:
+		selectedItems.append(index)
+		index=listControl.GetNextSelected(index)
+	return selectedItems
diff --git a/source/gui/settingsDialogs.py b/source/gui/settingsDialogs.py
index c833bf0..89f3639 100644
--- a/source/gui/settingsDialogs.py
+++ b/source/gui/settingsDialogs.py
@@ -1200,7 +1200,7 @@ class DictionaryDialog(SettingsDialog):
 		# Translators: The label for the combo box of dictionary entries in speech dictionary dialog.
 		entriesLabel=wx.StaticText(self,-1,label=_("&Dictionary entries"))
 		entriesSizer.Add(entriesLabel)
-		self.dictList=wx.ListCtrl(self,dictListID,style=wx.LC_REPORT|wx.LC_SINGLE_SEL,size=(550,350))
+		self.dictList=wx.ListCtrl(self,dictListID,style=wx.LC_REPORT,size=(550,350))
 		# Translators: The label for a column in dictionary entries list used to identify comments for the entry.
 		self.dictList.InsertColumn(0,_("Comment"),width=150)
 		# Translators: The label for a column in dictionary entries list used to identify pattern (original word or a pattern).
@@ -1218,6 +1218,14 @@ class DictionaryDialog(SettingsDialog):
 		entriesSizer.Add(self.dictList,proportion=8)
 		settingsSizer.Add(entriesSizer)
 		entryButtonsSizer=wx.BoxSizer(wx.HORIZONTAL)
+		moveUpButtonID=wx.NewId()
+		# Translators: The label for a button in speech dictionaries dialog to move up existing entries.
+		moveUpButton=wx.Button(self,moveUpButtonID,_("Move &up"),wx.DefaultPosition)
+		entryButtonsSizer.Add(moveUpButton)
+		moveDownButtonID=wx.NewId()
+		# Translators: The label for a button in speech dictionaries dialog to move down existing entries.
+		moveDownButton=wx.Button(self,moveDownButtonID,_("Move &down"),wx.DefaultPosition)
+		entryButtonsSizer.Add(moveDownButton)
 		addButtonID=wx.NewId()
 		# Translators: The label for a button in speech dictionaries dialog to add new entries.
 		addButton=wx.Button(self,addButtonID,_("&Add"),wx.DefaultPosition)
@@ -1229,9 +1237,31 @@ class DictionaryDialog(SettingsDialog):
 		removeButtonID=wx.NewId()
 		removeButton=wx.Button(self,removeButtonID,_("&Remove"),wx.DefaultPosition)
 		entryButtonsSizer.Add(removeButton)
+		importButtonID=wx.NewId()
+		# Translators: The label for a button in speech dictionaries dialog to import entries from file.
+		importButton=wx.Button(self,importButtonID,_("&Import"),wx.DefaultPosition)
+		entryButtonsSizer.Add(importButton)
+		exportButtonID=wx.NewId()
+		# Translators: The label for a button in speech dictionaries dialog to export entries to file.
+		exportButton=wx.Button(self,exportButtonID,_("E&xport"),wx.DefaultPosition)
+		entryButtonsSizer.Add(exportButton)
+		clearButtonID=wx.NewId()
+		# Translators: The label for a button in speech dictionaries dialog to delete all existing entries.
+		clearButton=wx.Button(self,clearButtonID,_("&Clear"),wx.DefaultPosition)
+		entryButtonsSizer.Add(clearButton)
+		revertButtonID=wx.NewId()
+		# Translators: The label for a button in speech dictionaries dialog to revert the current dictionary to the last saved state.
+		revertButton=wx.Button(self,revertButtonID,_("Re&vert"),wx.DefaultPosition)
+		entryButtonsSizer.Add(revertButton)
+		self.Bind(wx.EVT_BUTTON,self.OnMoveUpClick,id=moveUpButtonID)
+		self.Bind(wx.EVT_BUTTON,self.OnMoveDownClick,id=moveDownButtonID)
 		self.Bind(wx.EVT_BUTTON,self.OnAddClick,id=addButtonID)
 		self.Bind(wx.EVT_BUTTON,self.OnEditClick,id=editButtonID)
 		self.Bind(wx.EVT_BUTTON,self.OnRemoveClick,id=removeButtonID)
+		self.Bind(wx.EVT_BUTTON,self.OnImportClick,id=importButtonID)
+		self.Bind(wx.EVT_BUTTON,self.OnExportClick,id=exportButtonID)
+		self.Bind(wx.EVT_BUTTON,self.OnClearClick,id=clearButtonID)
+		self.Bind(wx.EVT_BUTTON,self.OnRevertClick,id=revertButtonID)
 		settingsSizer.Add(entryButtonsSizer)
 
 	def postInit(self):
@@ -1249,6 +1279,36 @@ class DictionaryDialog(SettingsDialog):
 			self.speechDict.save()
 		super(DictionaryDialog, self).onOk(evt)
 
+	def OnMoveUpClick(self,evt):
+		index=self.dictList.GetFirstSelected()
+		while index>0:
+			self.dictList.InsertStringItem(index+1, str(index+1))
+			self.dictList.SetStringItem(index+1,0,self.tempSpeechDict[index-1].comment)
+			self.dictList.SetStringItem(index+1,1,self.tempSpeechDict[index-1].pattern)
+			self.dictList.SetStringItem(index+1,2,self.tempSpeechDict[index-1].replacement)
+			self.dictList.SetStringItem(index+1,3,self.offOn[int(self.tempSpeechDict[index-1].caseSensitive)])
+			self.dictList.SetStringItem(index+1,4,self.offOn[int(self.tempSpeechDict[index-1].regexp)])
+			self.dictList.DeleteItem(index-1)
+			self.tempSpeechDict.insert(index-1, self.tempSpeechDict.pop(index))
+			index=self.dictList.GetNextSelected(index)
+		self.dictList.SetFocus()
+
+	def OnMoveDownClick(self,evt):
+		selectedIndexes = gui.GetSelectedItems(self.dictList)
+		selectedIndexes.reverse()
+		for index in selectedIndexes:
+			if index==len(self.tempSpeechDict)-1:
+				break
+			self.dictList.DeleteItem(index+1)
+			self.dictList.InsertStringItem(index, str(index))
+			self.dictList.SetStringItem(index,0,self.tempSpeechDict[index+1].comment)
+			self.dictList.SetStringItem(index,1,self.tempSpeechDict[index+1].pattern)
+			self.dictList.SetStringItem(index,2,self.tempSpeechDict[index+1].replacement)
+			self.dictList.SetStringItem(index,3,self.offOn[int(self.tempSpeechDict[index+1].caseSensitive)])
+			self.dictList.SetStringItem(index,4,self.offOn[int(self.tempSpeechDict[index+1].regexp)])
+			self.tempSpeechDict.insert(index, self.tempSpeechDict.pop(index+1))
+		self.dictList.SetFocus()
+
 	def OnAddClick(self,evt):
 		# Translators: This is the label for the add dictionary entry dialog.
 		entryDialog=DictionaryEntryDialog(self,title=_("Add Dictionary Entry"))
@@ -1288,11 +1348,62 @@ class DictionaryDialog(SettingsDialog):
 		entryDialog.Destroy()
 
 	def OnRemoveClick(self,evt):
-		index=self.dictList.GetFirstSelected()
-		while index>=0:
+		selectedIndexes = gui.GetSelectedItems(self.dictList)
+		#delete in reverse to allow deleting of multiple subsiquent items
+		selectedIndexes.reverse()
+		for index in selectedIndexes:
 			self.dictList.DeleteItem(index)
 			del self.tempSpeechDict[index]
-			index=self.dictList.GetNextSelected(index)
+		self.dictList.SetFocus()
+
+	def OnImportClick(self,evt):
+		speechDictExt='dic'
+		# Translators: The message displayed in the dialog that allows you to choose a speech dictionary file which will be imported into the current dictionary.
+		fd=wx.FileDialog(self,message=_("Choose speech dictionary File"),
+		# Translators: the label for the speech dictionary file type in the import speech dictionary dialog.
+		wildcard=(_("Speech dictionary (*.{ext})")+"|*.{ext}").format(ext=speechDictExt),
+		defaultDir=speechDictHandler.speechDictsPath,style=wx.FD_OPEN)
+		if fd.ShowModal()!=wx.ID_OK:
+			return
+		dictPath=fd.GetPath()
+		stack=False
+		if len(self.tempSpeechDict)>0:
+			if gui.isInMessageBox:
+				return
+			# Translators: Message shown to ask wether to append or replace the currently loaded speech dictionary during import.
+			if gui.messageBox(_("Do you want to append the contents of this dictionary to the current one?\nIf you press 'No' all current entries will be removed."), _("Append or replace"), wx.YES_NO|wx.ICON_WARNING) == wx.YES:
+				stack=True
+		newIndex=len(self.tempSpeechDict) if stack else 0
+		lastIndexBefore=newIndex-1 if stack else 0
+		self.tempSpeechDict.load(dictPath, stack)
+		if not stack:
+			self.dictList.DeleteAllItems()
+		while newIndex<len(self.tempSpeechDict):
+			self.dictList.Append((self.tempSpeechDict[newIndex].comment,self.tempSpeechDict[newIndex].pattern,self.tempSpeechDict[newIndex].replacement,self.offOn[int(self.tempSpeechDict[newIndex].caseSensitive)],self.offOn[int(self.tempSpeechDict[newIndex].regexp)]))
+			newIndex+=1
+		self.dictList.Select(lastIndexBefore)
+		self.dictList.Focus(lastIndexBefore)
+		self.dictList.SetFocus()
+
+	def OnExportClick(self,evt):
+		if not len(self.tempSpeechDict):
+			return
+		filename = wx.FileSelector(_("Save As"), default_filename=self.speechDict.fileName, default_path=speechDictHandler.speechDictsPath, flags=wx.SAVE | wx.OVERWRITE_PROMPT, parent=self)
+		if not filename:
+			return
+		self.tempSpeechDict.save(filename)
+		self.dictList.SetFocus()
+
+	def OnClearClick(self,evt):
+		del self.tempSpeechDict[:]
+		self.dictList.DeleteAllItems()
+		self.dictList.SetFocus()
+
+	def OnRevertClick(self,evt):
+		self.OnClearClick(evt)
+		self.tempSpeechDict.extend(self.speechDict)
+		for entry in self.tempSpeechDict:
+			self.dictList.Append((entry.comment,entry.pattern,entry.replacement,self.offOn[int(entry.caseSensitive)],self.offOn[int(entry.regexp)]))
 		self.dictList.SetFocus()
 
 class BrailleSettingsDialog(SettingsDialog):
diff --git a/user_docs/en/userGuide.t2t b/user_docs/en/userGuide.t2t
index ee6f0d0..499a282 100644
--- a/user_docs/en/userGuide.t2t
+++ b/user_docs/en/userGuide.t2t
@@ -1057,7 +1057,7 @@ They are:
 -
 
 All dictionary dialogs contain a list of rules which will be used for processing the speech.
-The dialog also contains Add, Edit and Remove buttons.
+The dialog also contains Move up, Move down, Add, Edit, Remove, Import, Export, Clear and Revert buttons.
 
 To add a new rule to the dictionary, press the Add button, and fill in the fields in the dialog box that appears and then press Ok.
 You will then see your new rule in the list of rules.
@@ -1075,6 +1075,21 @@ Another checkbox allows you to state whether your pattern is a "Regular expressi
 A regular expression is a pattern containing special symbols that allow you to match on more than one character at a time, or match on just numbers, or just letters, as a few examples.
 Regular expressions are not covered in this user guide, but there are many tutorials on the web which can provide you with more information.
 
+If you want to edit a perticular dictionary entry, select it in the list and press the Edit button. A dialog similar to the Add rule dialog will appear, allowing you to change all of its fields.
+Note that only one dictionary entry should be selected for the Edit button to work.
+
+If you want to Remove one or more entries from the dictionary - select them and press the Remove button.
+You can remove all entries at once by pressing Clear button.
+You can revert the dictionary to the last saved state at any time by pressing the Revert button.
+
+The entries which are higher in the list will be applied before those that are lower in the list. Therefore, once selected, you can move them up and down by pressing the respective buttons.
+
+You can also Import other dictionaries as well as Export the whole dictionary.
+To import a dictionary file into the current dictionary, press the Import button and locate the file you want to import, then press Open.
+If you have existing dictionary entries, NVDA will ask you wether it should preserv them and append the contents of the file to the end of the list, or clear them first.
+To export the contents of the current dictionary to the file, press the Export button, choose a name and location for the new file and press Save.
+If you have made any changes to the dictionary before exporting - they will be included into the export file, but won't be saved to the original file until you press the Ok button (unless you are exporting to the original file).
+
 +++ Punctuation/symbol pronunciation +++[SymbolPronunciation]
 This dialog allows you to change the way punctuation and other symbols are pronounced, as well as the symbol level at which they are spoken.
 
