diff --git a/source/core.py b/source/core.py
index 8f5a5f7..2f061aa 100644
--- a/source/core.py
+++ b/source/core.py
@@ -351,6 +351,9 @@ This initializes all modules such as audio, IAccessible, keyboard, mouse, and GU
 	else:
 		log.debug("initializing updateCheck")
 		updateCheck.initialize()
+		# execute pending update, if any and the user agrees
+		if updateCheck.isPendingUpdate() and updateCheck.askInstallUpdateNow():
+			updateCheck.executeUpdate()
 	log.info("NVDA initialized")
 
 	log.debug("entering wx application main loop")
diff --git a/source/gui/__init__.py b/source/gui/__init__.py
index 5b1645b..02a42ff 100644
--- a/source/gui/__init__.py
+++ b/source/gui/__init__.py
@@ -191,6 +191,18 @@ class MainFrame(wx.Frame):
 		# Translators: Title for temporary speech dictionary dialog (the voice dictionary that is active as long as NvDA is running).
 		self._popupSettingsDialog(DictionaryDialog,_("Temporary dictionary"),speechDictHandler.dictionaries["temp"])
 
+	def onExecuteUpdateCommand(self, evt):
+		if updateCheck and updateCheck.isPendingUpdate():
+			updateCheck.executeUpdate()
+
+	def onUpdatePendingUpdatesMenuItemCommand(self, evt):
+		try:
+			self.sysTrayIcon.menu.RemoveItem(self.sysTrayIcon.runPendingUpdatesMenuItem)
+		except:
+			pass
+		if not config.conf["general"]["askToExit"] and updateCheck and updateCheck.isPendingUpdate():
+			self.sysTrayIcon.menu.InsertItem(self.sysTrayIcon.menu.GetMenuItemCount()-2,self.sysTrayIcon.runPendingUpdatesMenuItem)
+
 	def onExitCommand(self, evt):
 		if config.conf["general"]["askToExit"]:
 			self.prePopup()
@@ -450,6 +462,10 @@ class SysTrayIcon(wx.TaskBarIcon):
 			# Translators: The label for the menu item to open donate page.
 			item = self.menu.Append(wx.ID_ANY, _("Donate"))
 			self.Bind(wx.EVT_MENU, lambda evt: os.startfile(DONATE_URL), item)
+			# Translators: The label for the menu item to run pending updates.
+			item = self.runPendingUpdatesMenuItem = self.menu.Append(wx.ID_ANY, _("Run pending updates"), _("Start previously downloaded updates, which are still not applyed"))
+			self.Bind(wx.EVT_MENU, frame.onExecuteUpdateCommand, item)
+			self.Bind(wx.EVT_UPDATE_UI, frame.onUpdatePendingUpdatesMenuItemCommand)
 		self.menu.AppendSeparator()
 		item = self.menu.Append(wx.ID_EXIT, _("E&xit"),_("Exit NVDA"))
 		self.Bind(wx.EVT_MENU, frame.onExitCommand, item)
@@ -692,6 +708,9 @@ class ExitDialog(wx.Dialog):
 		_("Restart"),
 		# Translators: An option in the combo box to choose exit action.
 		_("Restart with addons disabled")]
+		if updateCheck and updateCheck.isPendingUpdate():
+			# Translators: An option in the combo box to choose exit action.
+			self.actions.append(_("Run pending updates"))
 		# Translators: A combo box to choose exit action (possible options are exit, restart, restart with addons disabled).
 		self.actionsList=wx.Choice(self,actionsListID,name=_("Action"),choices=self.actions)
 		self.actionsList.SetSelection(0)
@@ -713,6 +732,9 @@ class ExitDialog(wx.Dialog):
 			queueHandler.queueFunction(queueHandler.eventQueue,core.restart)
 		elif action == 2:
 			queueHandler.queueFunction(queueHandler.eventQueue,core.restart,True)
+		elif action == len(self.actions)-1:
+			if updateCheck:
+				updateCheck.executeUpdate()
 		self.Destroy()
 
 	def onCancel(self, evt):
diff --git a/source/updateCheck.py b/source/updateCheck.py
index 7993e9f..945089d 100644
--- a/source/updateCheck.py
+++ b/source/updateCheck.py
@@ -80,6 +80,39 @@ def checkForUpdate(auto=False):
 		return None
 	return info
 
+def isPendingUpdate():
+	try:
+		pendingUpdateFile=state["pendingUpdateFile"]
+	except:
+		pendingUpdateFile=False
+	if not pendingUpdateFile or not os.path.isfile(pendingUpdateFile):
+		return None
+	return pendingUpdateFile
+
+def executeUpdate(destPath=None):
+	if not destPath:
+		destPath=isPendingUpdate()
+	if not destPath:
+		return
+	state["removeFile"] = destPath
+	state["pendingUpdateFile"]=None
+	saveState()
+	shellapi.ShellExecute(None, None,
+		destPath.decode("mbcs"),
+		u"--install -m",
+		None, 0)
+
+def askInstallUpdateNow():
+	exitDialogEnabled=config.conf["general"]["askToExit"]
+	return gui.messageBox(
+					# Translators: A message presented when the update has been successfully downloaded asking the user to install or postpone.
+		_("Update is ready to install.\nYou can install it now, or install it later from the exit dialog.\nInstall now?") if exitDialogEnabled else
+		# Translators: A message presented when the update has been successfully downloaded asking the user to install or postpone.
+		_("Update is ready to install.\nYou can install it now, or install it later from the NVDA menu.\nInstall now?"),
+		# Translators: The title of the dialog displayed when the update is about to be installed.
+		_("Install Update"),wx.YES|wx.NO|wx.ICON_WARNING
+	)==wx.YES
+
 class UpdateChecker(object):
 	"""Check for an updated version of NVDA, presenting appropriate user interface.
 	The check is performed in the background.
@@ -361,17 +394,29 @@ class UpdateDownloader(object):
 
 	def _downloadSuccess(self):
 		self._stopped()
-		# Translators: The message presented when the update has been successfully downloaded
-		# and is about to be installed.
-		gui.messageBox(_("Update downloaded. It will now be installed."),
-			# Translators: The title of the dialog displayed when the update is about to be installed.
-			_("Install Update"))
-		state["removeFile"] = self.destPath
+		# if the user agrees - install update, or preserv it otherwise
+		if askInstallUpdateNow():
+			executeUpdate(self.destPath)
+			return
+		moveDest=os.path.join(globalVars.appArgs.configPath, os.path.basename(self.destPath))
+		try:
+			os.renames(self.destPath, moveDest)
+		except:
+			gui.messageBox(
+				# Translators: The message when downloaded update file could not be preserved.
+				_("The downloaded file could not be moved to a safe location and could disappear on the next system restart.\n"
+					"NVDA still can use it during this session, but if you want to preserv it, you can copy it yourselv from:\n"
+					"%s" % self.destPath),
+				_("Error"), wx.OK | wx.ICON_ERROR)
+			moveDest=self.destPath
+		oldPendingFile=isPendingUpdate()
+		if oldPendingFile and os.path.isfile(oldPendingFile):
+			try:
+				os.remove(oldPendingFile)
+			except OSError:
+				pass
+		state["pendingUpdateFile"]=moveDest
 		saveState()
-		shellapi.ShellExecute(None, None,
-			self.destPath.decode("mbcs"),
-			u"--install -m",
-			None, 0)
 
 class DonateRequestDialog(wx.Dialog):
 	# Translators: The message requesting donations from users.
