Merged with default branch to prepare the 17.08 release. maintenance release-17.08

Wed, 02 Aug 2017 13:28:50 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 02 Aug 2017 13:28:50 +0200
branch
maintenance
changeset 5825
9487c08b6a23
parent 5790
6411ee48fe91 (current diff)
parent 5824
a8ef49c858dc (diff)
child 5826
ea0f0f066b1d

Merged with default branch to prepare the 17.08 release.

APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Preferences/__init__.py file | annotate | diff | comparison | revisions
QScintilla/Shell.py file | annotate | diff | comparison | revisions
WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
changelog file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric6.api	Thu Jul 06 18:59:43 2017 +0200
+++ b/APIs/Python3/eric6.api	Wed Aug 02 13:28:50 2017 +0200
@@ -1243,7 +1243,7 @@
 eric6.E5Gui.E5SideBar.E5SideBar.tabWhatsThis?4(index)
 eric6.E5Gui.E5SideBar.E5SideBar.widget?4(index)
 eric6.E5Gui.E5SideBar.E5SideBar?1(orientation=None, delay=200, parent=None)
-eric6.E5Gui.E5SimpleHelpDialog.E5SimpleHelpDialog?1(title="", label="", help="", parent=None)
+eric6.E5Gui.E5SimpleHelpDialog.E5SimpleHelpDialog?1(title="", label="", helpStr="", parent=None)
 eric6.E5Gui.E5SingleApplication.E5SingleApplicationClient.processArgs?4(args)
 eric6.E5Gui.E5SingleApplication.E5SingleApplicationClient?1()
 eric6.E5Gui.E5SingleApplication.E5SingleApplicationServer.handleCommand?4(cmd, params)
@@ -4018,7 +4018,9 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.contextType?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.end?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.indent?4()
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.setSpecial?4(special)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.source?4()
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.special?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.ssource?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.start?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext?1(source, startLine, contextType)
@@ -8169,15 +8171,19 @@
 eric6.QScintilla.Shell.Shell.dropEvent?4(event)
 eric6.QScintilla.Shell.Shell.editorCommand?4(cmd)
 eric6.QScintilla.Shell.Shell.event?4(evt)
-eric6.QScintilla.Shell.Shell.executeLines?4(lines)
+eric6.QScintilla.Shell.Shell.executeLines?4(lines, historyIndex=None)
 eric6.QScintilla.Shell.Shell.focusInEvent?4(event)
 eric6.QScintilla.Shell.Shell.focusNextPrevChild?4(nextChild)
 eric6.QScintilla.Shell.Shell.focusOutEvent?4(event)
 eric6.QScintilla.Shell.Shell.gestureEvent?4(evt)
 eric6.QScintilla.Shell.Shell.getClientType?4()
 eric6.QScintilla.Shell.Shell.getHistory?4(clientType)
+eric6.QScintilla.Shell.Shell.getHistoryIndex?4()
 eric6.QScintilla.Shell.Shell.handlePreferencesChanged?4()
+eric6.QScintilla.Shell.Shell.historyStyle?4()
+eric6.QScintilla.Shell.Shell.historyStyleChanged?7
 eric6.QScintilla.Shell.Shell.insert?4(txt)
+eric6.QScintilla.Shell.Shell.isHistoryEnabled?4()
 eric6.QScintilla.Shell.Shell.keyPressEvent?4(ev)
 eric6.QScintilla.Shell.Shell.loadHistory?4(clientType)
 eric6.QScintilla.Shell.Shell.mousePressEvent?4(event)
@@ -8195,6 +8201,9 @@
 eric6.QScintilla.Shell.ShellAssembly.shell?4()
 eric6.QScintilla.Shell.ShellAssembly.showFind?4(txt="")
 eric6.QScintilla.Shell.ShellAssembly?1(dbs, vm, horizontal=True, parent=None)
+eric6.QScintilla.Shell.ShellHistoryStyle.Disabled?7
+eric6.QScintilla.Shell.ShellHistoryStyle.LinuxStyle?7
+eric6.QScintilla.Shell.ShellHistoryStyle.WindowsStyle?7
 eric6.QScintilla.ShellHistoryDialog.ShellHistoryDialog.getHistory?4()
 eric6.QScintilla.ShellHistoryDialog.ShellHistoryDialog.on_copyButton_clicked?4()
 eric6.QScintilla.ShellHistoryDialog.ShellHistoryDialog.on_deleteButton_clicked?4()
@@ -8445,6 +8454,7 @@
 eric6.Templates.TemplateViewer.TemplateViewer.save?4()
 eric6.Templates.TemplateViewer.TemplateViewer.writeTemplates?4(filename=None)
 eric6.Templates.TemplateViewer.TemplateViewer?1(parent, viewmanager)
+eric6.Toolbox.PyQt4ImportHook.PyQt4Importer.QComboBox_currentData?4(role=None)
 eric6.Toolbox.PyQt4ImportHook.PyQt4Importer.find_module?4(fullname, path=None)
 eric6.Toolbox.PyQt4ImportHook.PyQt4Importer.load_module?4(fullname)
 eric6.Toolbox.PyQt4ImportHook.PyQt4Importer?1()
@@ -10588,6 +10598,43 @@
 eric6.WebBrowser.SearchWidget.SearchWidget.on_findtextCombo_editTextChanged?4(txt)
 eric6.WebBrowser.SearchWidget.SearchWidget.showFind?4()
 eric6.WebBrowser.SearchWidget.SearchWidget?1(mainWindow, parent=None)
+eric6.WebBrowser.Session.SessionManager.SessionManager.CloneSession?7
+eric6.WebBrowser.Session.SessionManager.SessionManager.ReplaceSession?7
+eric6.WebBrowser.Session.SessionManager.SessionManager.RestoreSession?7
+eric6.WebBrowser.Session.SessionManager.SessionManager.SwitchSession?7
+eric6.WebBrowser.Session.SessionManager.SessionManager.aboutToShowSessionsMenu?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.activateTimer?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.autoSaveSession?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.cloneSession?4(sessionFilePath)
+eric6.WebBrowser.Session.SessionManager.SessionManager.defaultSessionFile?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.deleteSession?4(sessionFilePath)
+eric6.WebBrowser.Session.SessionManager.SessionManager.getSessionsDirectory?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.isValidSession?4(session)
+eric6.WebBrowser.Session.SessionManager.SessionManager.lastActiveSessionFile?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.newSession?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.openSession?4(sessionFilePath, flags=0)
+eric6.WebBrowser.Session.SessionManager.SessionManager.preferencesChanged?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.readSessionFromFile?4(sessionFileName)
+eric6.WebBrowser.Session.SessionManager.SessionManager.renameSession?4(sessionFilePath, flags=0)
+eric6.WebBrowser.Session.SessionManager.SessionManager.replaceSession?4(sessionFilePath)
+eric6.WebBrowser.Session.SessionManager.SessionManager.restoreSessionFromData?4(window=None, sessionData=None)
+eric6.WebBrowser.Session.SessionManager.SessionManager.saveSession?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.selectSession?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.sessionMetaData?4(includeBackups=False)
+eric6.WebBrowser.Session.SessionManager.SessionManager.sessionsMetaDataChanged?7
+eric6.WebBrowser.Session.SessionManager.SessionManager.showSessionManagerDialog?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.shutdown?4()
+eric6.WebBrowser.Session.SessionManager.SessionManager.switchToSession?4(sessionFilePath)
+eric6.WebBrowser.Session.SessionManager.SessionManager.writeCurrentSession?4(sessionFileName)
+eric6.WebBrowser.Session.SessionManager.SessionManager?1(parent=None)
+eric6.WebBrowser.Session.SessionManager.SessionMetaData?1()
+eric6.WebBrowser.Session.SessionManagerDialog.SessionManagerDialog.ActiveSessionRole?7
+eric6.WebBrowser.Session.SessionManagerDialog.SessionManagerDialog.BackupSessionRole?7
+eric6.WebBrowser.Session.SessionManagerDialog.SessionManagerDialog.DefaultSessionRole?7
+eric6.WebBrowser.Session.SessionManagerDialog.SessionManagerDialog.SessionFileRole?7
+eric6.WebBrowser.Session.SessionManagerDialog.SessionManagerDialog.resizeEvent?4(evt)
+eric6.WebBrowser.Session.SessionManagerDialog.SessionManagerDialog.showEvent?4(evt)
+eric6.WebBrowser.Session.SessionManagerDialog.SessionManagerDialog?1(parent=None)
 eric6.WebBrowser.SiteInfo.SiteInfoDialog.SiteInfoDialog.nokStyle?7
 eric6.WebBrowser.SiteInfo.SiteInfoDialog.SiteInfoDialog.okStyle?7
 eric6.WebBrowser.SiteInfo.SiteInfoDialog.SiteInfoDialog.on_imagesTree_currentItemChanged?4(current, previous)
@@ -10941,6 +10988,8 @@
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.resultCallback?4(resDict=resultDict)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.runJavaScript?4(script, worldId=-1, callback=None)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.scroll?4(x, y)
+eric6.WebBrowser.WebBrowserPage.WebBrowserPage.scrollPosition?4()
+eric6.WebBrowser.WebBrowserPage.WebBrowserPage.scrollTo?4(pos)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.setJavaScriptEnabled?4(enable)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.setUserAgent?4(agent)
 eric6.WebBrowser.WebBrowserPage.WebBrowserPage.userAgent?4(resolveEmpty=False)
@@ -10967,8 +11016,10 @@
 eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.currentBrowser?4()
 eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.currentUrlBar?4()
 eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.currentUrlChanged?7
+eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.getSessionData?4()
 eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.getSourceFileList?4()
-eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.newBrowser?4(link=None, position=-1, background=False)
+eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.loadFromSessionData?4(sessionData)
+eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.newBrowser?4(link=None, position=-1, background=False, restoreSession=False)
 eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.newBrowserAfter?4(browser, link=None, background=False)
 eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.preferencesChanged?4()
 eric6.WebBrowser.WebBrowserTabWidget.WebBrowserTabWidget.printBrowser?4(browser=None)
@@ -10993,6 +11044,7 @@
 eric6.WebBrowser.WebBrowserView.WebBrowserView._mousePressEvent?5(evt)
 eric6.WebBrowser.WebBrowserView.WebBrowserView._mouseReleaseEvent?5(evt)
 eric6.WebBrowser.WebBrowserView.WebBrowserView._wheelEvent?5(evt)
+eric6.WebBrowser.WebBrowserView.WebBrowserView.activateSession?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.addBookmark?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.backward?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.backwardAvailable?7
@@ -11009,12 +11061,14 @@
 eric6.WebBrowser.WebBrowserView.WebBrowserView.dropEvent?4(evt)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.event?4(evt)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.eventFilter?4(obj, evt)
+eric6.WebBrowser.WebBrowserView.WebBrowserView.extractSessionMetaData?4(sessionData)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.faviconChanged?7
 eric6.WebBrowser.WebBrowserView.WebBrowserView.findNextPrev?4(txt, case, backwards, callback)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.forward?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.forwardAvailable?7
 eric6.WebBrowser.WebBrowserView.WebBrowserView.getPreview?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.getRSS?4()
+eric6.WebBrowser.WebBrowserView.WebBrowserView.getSessionData?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.hasRSS?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.hasSelection?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.highlighted?7
@@ -11026,6 +11080,7 @@
 eric6.WebBrowser.WebBrowserView.WebBrowserView.isFullScreen?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.isLoading?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.load?4(url)
+eric6.WebBrowser.WebBrowserView.WebBrowserView.loadFromSessionData?4(sessionData)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.mainWindow?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.mapToViewport?4(pos)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.paste?4()
@@ -11040,8 +11095,10 @@
 eric6.WebBrowser.WebBrowserView.WebBrowserView.selectAll?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.setSource?4(name, newTab=False)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.setZoomValue?4(value, saveValue=True)
+eric6.WebBrowser.WebBrowserView.WebBrowserView.showEvent?4(evt)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.source?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.sourceChanged?7
+eric6.WebBrowser.WebBrowserView.WebBrowserView.storeSessionData?4(data)
 eric6.WebBrowser.WebBrowserView.WebBrowserView.undo?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.unselect?4()
 eric6.WebBrowser.WebBrowserView.WebBrowserView.zoomIn?4()
@@ -11072,10 +11129,14 @@
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._historyManager?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._imageSearchEngine?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._isPrivate?8
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._lastActiveWindow?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._networkManager?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._notification?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._passwordManager?8
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._performingShutdown?8
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._performingStartup?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._personalInformationManager?8
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._sessionManager?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._speedDial?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._syncManager?8
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow._tabManager?8
@@ -11102,6 +11163,7 @@
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.featurePermissionManager?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.feedsManager?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.flashCookieManager?4()
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.forceClose?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.fromEric?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.getActions?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.getQtHelpCollectionFileName?4()
@@ -11113,6 +11175,7 @@
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.historyManager?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.icon?4(url)
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.imageSearchEngine?4()
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.isClosing?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.isFullScreenNavigationVisible?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.javascriptConsole?4()
@@ -11124,7 +11187,7 @@
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.newPrivateWindow?4(link=None)
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.newTab?4(link=None, addNextTo=None, background=False)
-eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.newWindow?4(link=None)
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.newWindow?4(link=None, restoreSession=False)
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.notificationsEnabled?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.openSearchManager?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.openUrl?4(url, title=None)
@@ -11139,6 +11202,7 @@
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.requestVirusTotalScan?4(url)
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.search?4(word)
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.searchEnginesAction?4()
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.sessionManager?4()
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.setBackwardAvailable?4(b)
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.setEventKeyboardModifiers?4(modifiers)
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.setEventMouseButtons?4(buttons)
@@ -11159,7 +11223,7 @@
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.webBrowserWindowClosed?7
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.webBrowserWindowOpened?7
 eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow.webProfile?4(private=False)
-eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow?1(home, path, parent, name, fromEric=False, initShortcutsOnly=False, searchWord=None, private=False, qthelp=False, settingsDir="")
+eric6.WebBrowser.WebBrowserWindow.WebBrowserWindow?1(home, path, parent, name, fromEric=False, initShortcutsOnly=False, searchWord=None, private=False, qthelp=False, settingsDir="", restoreSession=False)
 eric6.WebBrowser.WebInspector.WebInspector.closeEvent?4(evt)
 eric6.WebBrowser.WebInspector.WebInspector.inspectElement?4()
 eric6.WebBrowser.WebInspector.WebInspector.isEnabled?4()
--- a/APIs/Python3/eric6.bas	Thu Jul 06 18:59:43 2017 +0200
+++ b/APIs/Python3/eric6.bas	Wed Aug 02 13:28:50 2017 +0200
@@ -689,12 +689,15 @@
 SearchWidget QWidget Ui_SearchWidget
 SecurityPage ConfigurationPageBase Ui_SecurityPage
 SendRefererWhitelistDialog QDialog Ui_SendRefererWhitelistDialog
+SessionManager QObject
+SessionManagerDialog QDialog Ui_SessionManagerDialog
 SessionReader XMLStreamReaderBase
 SessionWriter XMLStreamWriterBase
 SetResolver BaseResolver
 Shell QsciScintillaCompat
 ShellAssembly QWidget
 ShellHistoryDialog QDialog Ui_ShellHistoryDialog
+ShellHistoryStyle Enum
 ShellPage ConfigurationPageBase Ui_ShellPage
 ShellWindow E5MainWindow
 Shelve HgExtension
--- a/DebugClients/Python/BreakpointWatch.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/DebugClients/Python/BreakpointWatch.py	Wed Aug 02 13:28:50 2017 +0200
@@ -83,7 +83,7 @@
     @staticmethod
     def clear_break(filename, lineno):
         """
-        Public method reimplemented from bdb.py to clear a breakpoint.
+        Static method reimplemented from bdb.py to clear a breakpoint.
         
         @param filename file name of the bp to retrieve
         @type str
@@ -98,7 +98,7 @@
     @staticmethod
     def clear_all_breaks():
         """
-        Public method to clear all breakpoints.
+        Static method to clear all breakpoints.
         """
         Breakpoint.breaks.clear()
         Breakpoint.breakInFile.clear()
@@ -107,7 +107,7 @@
     @staticmethod
     def get_break(filename, lineno):
         """
-        Public method to get the breakpoint of a particular line.
+        Static method to get the breakpoint of a particular line.
         
         Because eric6 supports only one breakpoint per line, this
         method will return only one breakpoint.
@@ -124,7 +124,7 @@
     @staticmethod
     def effectiveBreak(filename, lineno, frame):
         """
-        Public method to determine which breakpoint for this filename:lineno
+        Static method to determine which breakpoint for this filename:lineno
         is to be acted upon.
 
         Called only if we know there is a bpt at this
@@ -248,7 +248,7 @@
     @staticmethod
     def clear_watch(cond):
         """
-        Public method to clear a watch expression.
+        Static method to clear a watch expression.
         
         @param cond expression of the watch expression to be cleared
         @type str
@@ -261,14 +261,14 @@
     @staticmethod
     def clear_all_watches():
         """
-        Public method to clear all watch expressions.
+        Static method to clear all watch expressions.
         """
         del Watch.watches[:]
 
     @staticmethod
     def get_watch(cond):
         """
-        Public method to get a watch expression.
+        Static method to get a watch expression.
         
         @param cond expression of the watch expression to be cleared
         @type str
@@ -282,7 +282,7 @@
     @staticmethod
     def effectiveWatch(frame):
         """
-        Public method to determine, if a watch expression is effective.
+        Static method to determine, if a watch expression is effective.
         
         @param frame the current execution frame
         @type frame object
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Help/source.qhp	Wed Aug 02 13:28:50 2017 +0200
@@ -1224,6 +1224,10 @@
               <section title="eric6.WebBrowser.QtHelp.QtHelpDocumentationSelectionDialog" ref="eric6.WebBrowser.QtHelp.QtHelpDocumentationSelectionDialog.html" />
               <section title="eric6.WebBrowser.QtHelp.QtHelpFiltersDialog" ref="eric6.WebBrowser.QtHelp.QtHelpFiltersDialog.html" />
             </section>
+            <section title="eric6.WebBrowser.Session" ref="index-eric6.WebBrowser.Session.html">
+              <section title="eric6.WebBrowser.Session.SessionManager" ref="eric6.WebBrowser.Session.SessionManager.html" />
+              <section title="eric6.WebBrowser.Session.SessionManagerDialog" ref="eric6.WebBrowser.Session.SessionManagerDialog.html" />
+            </section>
             <section title="eric6.WebBrowser.SiteInfo" ref="index-eric6.WebBrowser.SiteInfo.html">
               <section title="eric6.WebBrowser.SiteInfo.SiteInfoDialog" ref="eric6.WebBrowser.SiteInfo.SiteInfoDialog.html" />
             </section>
@@ -3928,7 +3932,9 @@
       <keyword name="DocStyleContext.contextType" id="DocStyleContext.contextType" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.contextType" />
       <keyword name="DocStyleContext.end" id="DocStyleContext.end" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.end" />
       <keyword name="DocStyleContext.indent" id="DocStyleContext.indent" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.indent" />
+      <keyword name="DocStyleContext.setSpecial" id="DocStyleContext.setSpecial" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.setSpecial" />
       <keyword name="DocStyleContext.source" id="DocStyleContext.source" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.source" />
+      <keyword name="DocStyleContext.special" id="DocStyleContext.special" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.special" />
       <keyword name="DocStyleContext.ssource" id="DocStyleContext.ssource" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.ssource" />
       <keyword name="DocStyleContext.start" id="DocStyleContext.start" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.start" />
       <keyword name="DocumentationPlugins (Package)" id="DocumentationPlugins (Package)" ref="index-eric6.Plugins.DocumentationPlugins.html" />
@@ -11648,6 +11654,7 @@
       <keyword name="PyQt4ImportHook (Module)" id="PyQt4ImportHook (Module)" ref="eric6.Toolbox.PyQt4ImportHook.html" />
       <keyword name="PyQt4Importer" id="PyQt4Importer" ref="eric6.Toolbox.PyQt4ImportHook.html#PyQt4Importer" />
       <keyword name="PyQt4Importer (Constructor)" id="PyQt4Importer (Constructor)" ref="eric6.Toolbox.PyQt4ImportHook.html#PyQt4Importer.__init__" />
+      <keyword name="PyQt4Importer.QComboBox_currentData" id="PyQt4Importer.QComboBox_currentData" ref="eric6.Toolbox.PyQt4ImportHook.html#PyQt4Importer.QComboBox_currentData" />
       <keyword name="PyQt4Importer.find_module" id="PyQt4Importer.find_module" ref="eric6.Toolbox.PyQt4ImportHook.html#PyQt4Importer.find_module" />
       <keyword name="PyQt4Importer.load_module" id="PyQt4Importer.load_module" ref="eric6.Toolbox.PyQt4ImportHook.html#PyQt4Importer.load_module" />
       <keyword name="PyRegExpWizard" id="PyRegExpWizard" ref="eric6.Plugins.PluginWizardPyRegExp.html#PyRegExpWizard" />
@@ -12406,6 +12413,56 @@
       <keyword name="SendRefererWhitelistDialog.accept" id="SendRefererWhitelistDialog.accept" ref="eric6.WebBrowser.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.accept" />
       <keyword name="SendRefererWhitelistDialog.on_addButton_clicked" id="SendRefererWhitelistDialog.on_addButton_clicked" ref="eric6.Helpviewer.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.on_addButton_clicked" />
       <keyword name="SendRefererWhitelistDialog.on_addButton_clicked" id="SendRefererWhitelistDialog.on_addButton_clicked" ref="eric6.WebBrowser.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.on_addButton_clicked" />
+      <keyword name="Session (Package)" id="Session (Package)" ref="index-eric6.WebBrowser.Session.html" />
+      <keyword name="SessionManager" id="SessionManager" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager" />
+      <keyword name="SessionManager (Constructor)" id="SessionManager (Constructor)" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__init__" />
+      <keyword name="SessionManager (Module)" id="SessionManager (Module)" ref="eric6.WebBrowser.Session.SessionManager.html" />
+      <keyword name="SessionManager.__autoSaveSession" id="SessionManager.__autoSaveSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__autoSaveSession" />
+      <keyword name="SessionManager.__backupSavedSession" id="SessionManager.__backupSavedSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__backupSavedSession" />
+      <keyword name="SessionManager.__fillMetaDataList" id="SessionManager.__fillMetaDataList" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__fillMetaDataList" />
+      <keyword name="SessionManager.__initSessionSaveTimer" id="SessionManager.__initSessionSaveTimer" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__initSessionSaveTimer" />
+      <keyword name="SessionManager.__isActive" id="SessionManager.__isActive" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__isActive" />
+      <keyword name="SessionManager.__sessionActTriggered" id="SessionManager.__sessionActTriggered" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__sessionActTriggered" />
+      <keyword name="SessionManager.__sessionDirectoryChanged" id="SessionManager.__sessionDirectoryChanged" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__sessionDirectoryChanged" />
+      <keyword name="SessionManager.aboutToShowSessionsMenu" id="SessionManager.aboutToShowSessionsMenu" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.aboutToShowSessionsMenu" />
+      <keyword name="SessionManager.activateTimer" id="SessionManager.activateTimer" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.activateTimer" />
+      <keyword name="SessionManager.autoSaveSession" id="SessionManager.autoSaveSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.autoSaveSession" />
+      <keyword name="SessionManager.cloneSession" id="SessionManager.cloneSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.cloneSession" />
+      <keyword name="SessionManager.defaultSessionFile" id="SessionManager.defaultSessionFile" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.defaultSessionFile" />
+      <keyword name="SessionManager.deleteSession" id="SessionManager.deleteSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.deleteSession" />
+      <keyword name="SessionManager.getSessionsDirectory" id="SessionManager.getSessionsDirectory" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.getSessionsDirectory" />
+      <keyword name="SessionManager.isValidSession" id="SessionManager.isValidSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.isValidSession" />
+      <keyword name="SessionManager.lastActiveSessionFile" id="SessionManager.lastActiveSessionFile" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.lastActiveSessionFile" />
+      <keyword name="SessionManager.newSession" id="SessionManager.newSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.newSession" />
+      <keyword name="SessionManager.openSession" id="SessionManager.openSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.openSession" />
+      <keyword name="SessionManager.preferencesChanged" id="SessionManager.preferencesChanged" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.preferencesChanged" />
+      <keyword name="SessionManager.readSessionFromFile" id="SessionManager.readSessionFromFile" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.readSessionFromFile" />
+      <keyword name="SessionManager.renameSession" id="SessionManager.renameSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.renameSession" />
+      <keyword name="SessionManager.replaceSession" id="SessionManager.replaceSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.replaceSession" />
+      <keyword name="SessionManager.restoreSessionFromData" id="SessionManager.restoreSessionFromData" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.restoreSessionFromData" />
+      <keyword name="SessionManager.saveSession" id="SessionManager.saveSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.saveSession" />
+      <keyword name="SessionManager.selectSession" id="SessionManager.selectSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.selectSession" />
+      <keyword name="SessionManager.sessionMetaData" id="SessionManager.sessionMetaData" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.sessionMetaData" />
+      <keyword name="SessionManager.showSessionManagerDialog" id="SessionManager.showSessionManagerDialog" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.showSessionManagerDialog" />
+      <keyword name="SessionManager.shutdown" id="SessionManager.shutdown" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.shutdown" />
+      <keyword name="SessionManager.switchToSession" id="SessionManager.switchToSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.switchToSession" />
+      <keyword name="SessionManager.writeCurrentSession" id="SessionManager.writeCurrentSession" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.writeCurrentSession" />
+      <keyword name="SessionManagerDialog" id="SessionManagerDialog" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog" />
+      <keyword name="SessionManagerDialog (Constructor)" id="SessionManagerDialog (Constructor)" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__init__" />
+      <keyword name="SessionManagerDialog (Module)" id="SessionManagerDialog (Module)" ref="eric6.WebBrowser.Session.SessionManagerDialog.html" />
+      <keyword name="SessionManagerDialog.__cloneSession" id="SessionManagerDialog.__cloneSession" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__cloneSession" />
+      <keyword name="SessionManagerDialog.__deleteSession" id="SessionManagerDialog.__deleteSession" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__deleteSession" />
+      <keyword name="SessionManagerDialog.__newSession" id="SessionManagerDialog.__newSession" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__newSession" />
+      <keyword name="SessionManagerDialog.__refresh" id="SessionManagerDialog.__refresh" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__refresh" />
+      <keyword name="SessionManagerDialog.__renameSession" id="SessionManagerDialog.__renameSession" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__renameSession" />
+      <keyword name="SessionManagerDialog.__resizeViewHeader" id="SessionManagerDialog.__resizeViewHeader" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__resizeViewHeader" />
+      <keyword name="SessionManagerDialog.__switchToSession" id="SessionManagerDialog.__switchToSession" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__switchToSession" />
+      <keyword name="SessionManagerDialog.__updateButtons" id="SessionManagerDialog.__updateButtons" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__updateButtons" />
+      <keyword name="SessionManagerDialog.__updateSessionItem" id="SessionManagerDialog.__updateSessionItem" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.__updateSessionItem" />
+      <keyword name="SessionManagerDialog.resizeEvent" id="SessionManagerDialog.resizeEvent" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.resizeEvent" />
+      <keyword name="SessionManagerDialog.showEvent" id="SessionManagerDialog.showEvent" ref="eric6.WebBrowser.Session.SessionManagerDialog.html#SessionManagerDialog.showEvent" />
+      <keyword name="SessionMetaData" id="SessionMetaData" ref="eric6.WebBrowser.Session.SessionManager.html#SessionMetaData" />
+      <keyword name="SessionMetaData (Constructor)" id="SessionMetaData (Constructor)" ref="eric6.WebBrowser.Session.SessionManager.html#SessionMetaData.__init__" />
       <keyword name="SessionReader" id="SessionReader" ref="eric6.E5XML.SessionReader.html#SessionReader" />
       <keyword name="SessionReader (Constructor)" id="SessionReader (Constructor)" ref="eric6.E5XML.SessionReader.html#SessionReader.__init__" />
       <keyword name="SessionReader (Module)" id="SessionReader (Module)" ref="eric6.E5XML.SessionReader.html" />
@@ -12431,6 +12488,7 @@
       <keyword name="Shell (Constructor)" id="Shell (Constructor)" ref="eric6.QScintilla.Shell.html#Shell.__init__" />
       <keyword name="Shell (Module)" id="Shell (Module)" ref="eric6.QScintilla.Shell.html" />
       <keyword name="Shell.__QScintillaAutoCompletionCommand" id="Shell.__QScintillaAutoCompletionCommand" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaAutoCompletionCommand" />
+      <keyword name="Shell.__QScintillaCancel" id="Shell.__QScintillaCancel" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaCancel" />
       <keyword name="Shell.__QScintillaCharLeft" id="Shell.__QScintillaCharLeft" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaCharLeft" />
       <keyword name="Shell.__QScintillaCharLeftExtend" id="Shell.__QScintillaCharLeftExtend" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaCharLeftExtend" />
       <keyword name="Shell.__QScintillaCharRight" id="Shell.__QScintillaCharRight" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaCharRight" />
@@ -12445,7 +12503,9 @@
       <keyword name="Shell.__QScintillaHistoryUp" id="Shell.__QScintillaHistoryUp" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaHistoryUp" />
       <keyword name="Shell.__QScintillaLeftCommand" id="Shell.__QScintillaLeftCommand" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaLeftCommand" />
       <keyword name="Shell.__QScintillaLeftDeleteCommand" id="Shell.__QScintillaLeftDeleteCommand" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaLeftDeleteCommand" />
+      <keyword name="Shell.__QScintillaLineDown" id="Shell.__QScintillaLineDown" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaLineDown" />
       <keyword name="Shell.__QScintillaLineEnd" id="Shell.__QScintillaLineEnd" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaLineEnd" />
+      <keyword name="Shell.__QScintillaLineUp" id="Shell.__QScintillaLineUp" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaLineUp" />
       <keyword name="Shell.__QScintillaNewline" id="Shell.__QScintillaNewline" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaNewline" />
       <keyword name="Shell.__QScintillaRightCommand" id="Shell.__QScintillaRightCommand" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaRightCommand" />
       <keyword name="Shell.__QScintillaTab" id="Shell.__QScintillaTab" ref="eric6.QScintilla.Shell.html#Shell.__QScintillaTab" />
@@ -12474,10 +12534,12 @@
       <keyword name="Shell.__insertTextAtEnd" id="Shell.__insertTextAtEnd" ref="eric6.QScintilla.Shell.html#Shell.__insertTextAtEnd" />
       <keyword name="Shell.__insertTextNoEcho" id="Shell.__insertTextNoEcho" ref="eric6.QScintilla.Shell.html#Shell.__insertTextNoEcho" />
       <keyword name="Shell.__isCursorOnLastLine" id="Shell.__isCursorOnLastLine" ref="eric6.QScintilla.Shell.html#Shell.__isCursorOnLastLine" />
+      <keyword name="Shell.__isHistoryIndexValid" id="Shell.__isHistoryIndexValid" ref="eric6.QScintilla.Shell.html#Shell.__isHistoryIndexValid" />
       <keyword name="Shell.__middleMouseButton" id="Shell.__middleMouseButton" ref="eric6.QScintilla.Shell.html#Shell.__middleMouseButton" />
       <keyword name="Shell.__raw_input" id="Shell.__raw_input" ref="eric6.QScintilla.Shell.html#Shell.__raw_input" />
       <keyword name="Shell.__reset" id="Shell.__reset" ref="eric6.QScintilla.Shell.html#Shell.__reset" />
       <keyword name="Shell.__resetAndClear" id="Shell.__resetAndClear" ref="eric6.QScintilla.Shell.html#Shell.__resetAndClear" />
+      <keyword name="Shell.__resetIncrementalHistorySearch" id="Shell.__resetIncrementalHistorySearch" ref="eric6.QScintilla.Shell.html#Shell.__resetIncrementalHistorySearch" />
       <keyword name="Shell.__resizeLinenoMargin" id="Shell.__resizeLinenoMargin" ref="eric6.QScintilla.Shell.html#Shell.__resizeLinenoMargin" />
       <keyword name="Shell.__rsearchHistory" id="Shell.__rsearchHistory" ref="eric6.QScintilla.Shell.html#Shell.__rsearchHistory" />
       <keyword name="Shell.__searchHistory" id="Shell.__searchHistory" ref="eric6.QScintilla.Shell.html#Shell.__searchHistory" />
@@ -12485,9 +12547,11 @@
       <keyword name="Shell.__searchPrev" id="Shell.__searchPrev" ref="eric6.QScintilla.Shell.html#Shell.__searchPrev" />
       <keyword name="Shell.__setAutoCompletion" id="Shell.__setAutoCompletion" ref="eric6.QScintilla.Shell.html#Shell.__setAutoCompletion" />
       <keyword name="Shell.__setCallTips" id="Shell.__setCallTips" ref="eric6.QScintilla.Shell.html#Shell.__setCallTips" />
+      <keyword name="Shell.__setHistoryIndex" id="Shell.__setHistoryIndex" ref="eric6.QScintilla.Shell.html#Shell.__setHistoryIndex" />
       <keyword name="Shell.__setMargin0" id="Shell.__setMargin0" ref="eric6.QScintilla.Shell.html#Shell.__setMargin0" />
       <keyword name="Shell.__setMonospaced" id="Shell.__setMonospaced" ref="eric6.QScintilla.Shell.html#Shell.__setMonospaced" />
       <keyword name="Shell.__setTextDisplay" id="Shell.__setTextDisplay" ref="eric6.QScintilla.Shell.html#Shell.__setTextDisplay" />
+      <keyword name="Shell.__setupCursorKeys" id="Shell.__setupCursorKeys" ref="eric6.QScintilla.Shell.html#Shell.__setupCursorKeys" />
       <keyword name="Shell.__showCompletions" id="Shell.__showCompletions" ref="eric6.QScintilla.Shell.html#Shell.__showCompletions" />
       <keyword name="Shell.__showLanguageMenu" id="Shell.__showLanguageMenu" ref="eric6.QScintilla.Shell.html#Shell.__showLanguageMenu" />
       <keyword name="Shell.__startDebugClient" id="Shell.__startDebugClient" ref="eric6.QScintilla.Shell.html#Shell.__startDebugClient" />
@@ -12515,8 +12579,11 @@
       <keyword name="Shell.gestureEvent" id="Shell.gestureEvent" ref="eric6.QScintilla.Shell.html#Shell.gestureEvent" />
       <keyword name="Shell.getClientType" id="Shell.getClientType" ref="eric6.QScintilla.Shell.html#Shell.getClientType" />
       <keyword name="Shell.getHistory" id="Shell.getHistory" ref="eric6.QScintilla.Shell.html#Shell.getHistory" />
+      <keyword name="Shell.getHistoryIndex" id="Shell.getHistoryIndex" ref="eric6.QScintilla.Shell.html#Shell.getHistoryIndex" />
       <keyword name="Shell.handlePreferencesChanged" id="Shell.handlePreferencesChanged" ref="eric6.QScintilla.Shell.html#Shell.handlePreferencesChanged" />
+      <keyword name="Shell.historyStyle" id="Shell.historyStyle" ref="eric6.QScintilla.Shell.html#Shell.historyStyle" />
       <keyword name="Shell.insert" id="Shell.insert" ref="eric6.QScintilla.Shell.html#Shell.insert" />
+      <keyword name="Shell.isHistoryEnabled" id="Shell.isHistoryEnabled" ref="eric6.QScintilla.Shell.html#Shell.isHistoryEnabled" />
       <keyword name="Shell.keyPressEvent" id="Shell.keyPressEvent" ref="eric6.QScintilla.Shell.html#Shell.keyPressEvent" />
       <keyword name="Shell.loadHistory" id="Shell.loadHistory" ref="eric6.QScintilla.Shell.html#Shell.loadHistory" />
       <keyword name="Shell.mousePressEvent" id="Shell.mousePressEvent" ref="eric6.QScintilla.Shell.html#Shell.mousePressEvent" />
@@ -12543,6 +12610,7 @@
       <keyword name="ShellHistoryDialog.on_historyList_itemDoubleClicked" id="ShellHistoryDialog.on_historyList_itemDoubleClicked" ref="eric6.QScintilla.ShellHistoryDialog.html#ShellHistoryDialog.on_historyList_itemDoubleClicked" />
       <keyword name="ShellHistoryDialog.on_historyList_itemSelectionChanged" id="ShellHistoryDialog.on_historyList_itemSelectionChanged" ref="eric6.QScintilla.ShellHistoryDialog.html#ShellHistoryDialog.on_historyList_itemSelectionChanged" />
       <keyword name="ShellHistoryDialog.on_reloadButton_clicked" id="ShellHistoryDialog.on_reloadButton_clicked" ref="eric6.QScintilla.ShellHistoryDialog.html#ShellHistoryDialog.on_reloadButton_clicked" />
+      <keyword name="ShellHistoryStyle" id="ShellHistoryStyle" ref="eric6.QScintilla.Shell.html#ShellHistoryStyle" />
       <keyword name="ShellPage" id="ShellPage" ref="eric6.Preferences.ConfigurationPages.ShellPage.html#ShellPage" />
       <keyword name="ShellPage (Constructor)" id="ShellPage (Constructor)" ref="eric6.Preferences.ConfigurationPages.ShellPage.html#ShellPage.__init__" />
       <keyword name="ShellPage (Module)" id="ShellPage (Module)" ref="eric6.Preferences.ConfigurationPages.ShellPage.html" />
@@ -12567,6 +12635,7 @@
       <keyword name="ShellWindow.__createViewActions" id="ShellWindow.__createViewActions" ref="eric6.QScintilla.ShellWindow.html#ShellWindow.__createViewActions" />
       <keyword name="ShellWindow.__doClearRestart" id="ShellWindow.__doClearRestart" ref="eric6.QScintilla.ShellWindow.html#ShellWindow.__doClearRestart" />
       <keyword name="ShellWindow.__doRestart" id="ShellWindow.__doRestart" ref="eric6.QScintilla.ShellWindow.html#ShellWindow.__doRestart" />
+      <keyword name="ShellWindow.__historyStyleChanged" id="ShellWindow.__historyStyleChanged" ref="eric6.QScintilla.ShellWindow.html#ShellWindow.__historyStyleChanged" />
       <keyword name="ShellWindow.__newWindow" id="ShellWindow.__newWindow" ref="eric6.QScintilla.ShellWindow.html#ShellWindow.__newWindow" />
       <keyword name="ShellWindow.__readSettings" id="ShellWindow.__readSettings" ref="eric6.QScintilla.ShellWindow.html#ShellWindow.__readSettings" />
       <keyword name="ShellWindow.__readShortcut" id="ShellWindow.__readShortcut" ref="eric6.QScintilla.ShellWindow.html#ShellWindow.__readShortcut" />
@@ -15793,6 +15862,8 @@
       <keyword name="WebBrowserPage.runJavaScript" id="WebBrowserPage.runJavaScript" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.runJavaScript" />
       <keyword name="WebBrowserPage.save" id="WebBrowserPage.save" ref="eric6.Preferences.ConfigurationPages.WebBrowserPage.html#WebBrowserPage.save" />
       <keyword name="WebBrowserPage.scroll" id="WebBrowserPage.scroll" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.scroll" />
+      <keyword name="WebBrowserPage.scrollPosition" id="WebBrowserPage.scrollPosition" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.scrollPosition" />
+      <keyword name="WebBrowserPage.scrollTo" id="WebBrowserPage.scrollTo" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.scrollTo" />
       <keyword name="WebBrowserPage.setJavaScriptEnabled" id="WebBrowserPage.setJavaScriptEnabled" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.setJavaScriptEnabled" />
       <keyword name="WebBrowserPage.setUserAgent" id="WebBrowserPage.setUserAgent" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.setUserAgent" />
       <keyword name="WebBrowserPage.userAgent" id="WebBrowserPage.userAgent" ref="eric6.WebBrowser.WebBrowserPage.html#WebBrowserPage.userAgent" />
@@ -15857,7 +15928,9 @@
       <keyword name="WebBrowserTabWidget.closedTabsManager" id="WebBrowserTabWidget.closedTabsManager" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.closedTabsManager" />
       <keyword name="WebBrowserTabWidget.currentBrowser" id="WebBrowserTabWidget.currentBrowser" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.currentBrowser" />
       <keyword name="WebBrowserTabWidget.currentUrlBar" id="WebBrowserTabWidget.currentUrlBar" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.currentUrlBar" />
+      <keyword name="WebBrowserTabWidget.getSessionData" id="WebBrowserTabWidget.getSessionData" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.getSessionData" />
       <keyword name="WebBrowserTabWidget.getSourceFileList" id="WebBrowserTabWidget.getSourceFileList" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.getSourceFileList" />
+      <keyword name="WebBrowserTabWidget.loadFromSessionData" id="WebBrowserTabWidget.loadFromSessionData" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.loadFromSessionData" />
       <keyword name="WebBrowserTabWidget.newBrowser" id="WebBrowserTabWidget.newBrowser" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.newBrowser" />
       <keyword name="WebBrowserTabWidget.newBrowserAfter" id="WebBrowserTabWidget.newBrowserAfter" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.newBrowserAfter" />
       <keyword name="WebBrowserTabWidget.preferencesChanged" id="WebBrowserTabWidget.preferencesChanged" ref="eric6.WebBrowser.WebBrowserTabWidget.html#WebBrowserTabWidget.preferencesChanged" />
@@ -15918,6 +15991,7 @@
       <keyword name="WebBrowserView.__searchRequested" id="WebBrowserView.__searchRequested" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__searchRequested" />
       <keyword name="WebBrowserView.__sendLink" id="WebBrowserView.__sendLink" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__sendLink" />
       <keyword name="WebBrowserView.__setRwhvqt" id="WebBrowserView.__setRwhvqt" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__setRwhvqt" />
+      <keyword name="WebBrowserView.__showEventSlot" id="WebBrowserView.__showEventSlot" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__showEventSlot" />
       <keyword name="WebBrowserView.__showTabCrashPage" id="WebBrowserView.__showTabCrashPage" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__showTabCrashPage" />
       <keyword name="WebBrowserView.__urlChanged" id="WebBrowserView.__urlChanged" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__urlChanged" />
       <keyword name="WebBrowserView.__virusTotal" id="WebBrowserView.__virusTotal" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.__virusTotal" />
@@ -15930,6 +16004,7 @@
       <keyword name="WebBrowserView._mousePressEvent" id="WebBrowserView._mousePressEvent" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView._mousePressEvent" />
       <keyword name="WebBrowserView._mouseReleaseEvent" id="WebBrowserView._mouseReleaseEvent" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView._mouseReleaseEvent" />
       <keyword name="WebBrowserView._wheelEvent" id="WebBrowserView._wheelEvent" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView._wheelEvent" />
+      <keyword name="WebBrowserView.activateSession" id="WebBrowserView.activateSession" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.activateSession" />
       <keyword name="WebBrowserView.addBookmark" id="WebBrowserView.addBookmark" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.addBookmark" />
       <keyword name="WebBrowserView.backward" id="WebBrowserView.backward" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.backward" />
       <keyword name="WebBrowserView.checkRSS" id="WebBrowserView.checkRSS" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.checkRSS" />
@@ -15945,10 +16020,12 @@
       <keyword name="WebBrowserView.dropEvent" id="WebBrowserView.dropEvent" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.dropEvent" />
       <keyword name="WebBrowserView.event" id="WebBrowserView.event" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.event" />
       <keyword name="WebBrowserView.eventFilter" id="WebBrowserView.eventFilter" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.eventFilter" />
+      <keyword name="WebBrowserView.extractSessionMetaData" id="WebBrowserView.extractSessionMetaData" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.extractSessionMetaData" />
       <keyword name="WebBrowserView.findNextPrev" id="WebBrowserView.findNextPrev" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.findNextPrev" />
       <keyword name="WebBrowserView.forward" id="WebBrowserView.forward" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.forward" />
       <keyword name="WebBrowserView.getPreview" id="WebBrowserView.getPreview" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.getPreview" />
       <keyword name="WebBrowserView.getRSS" id="WebBrowserView.getRSS" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.getRSS" />
+      <keyword name="WebBrowserView.getSessionData" id="WebBrowserView.getSessionData" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.getSessionData" />
       <keyword name="WebBrowserView.hasRSS" id="WebBrowserView.hasRSS" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.hasRSS" />
       <keyword name="WebBrowserView.hasSelection" id="WebBrowserView.hasSelection" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.hasSelection" />
       <keyword name="WebBrowserView.home" id="WebBrowserView.home" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.home" />
@@ -15959,6 +16036,7 @@
       <keyword name="WebBrowserView.isFullScreen" id="WebBrowserView.isFullScreen" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.isFullScreen" />
       <keyword name="WebBrowserView.isLoading" id="WebBrowserView.isLoading" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.isLoading" />
       <keyword name="WebBrowserView.load" id="WebBrowserView.load" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.load" />
+      <keyword name="WebBrowserView.loadFromSessionData" id="WebBrowserView.loadFromSessionData" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.loadFromSessionData" />
       <keyword name="WebBrowserView.mainWindow" id="WebBrowserView.mainWindow" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.mainWindow" />
       <keyword name="WebBrowserView.mapToViewport" id="WebBrowserView.mapToViewport" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.mapToViewport" />
       <keyword name="WebBrowserView.paste" id="WebBrowserView.paste" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.paste" />
@@ -15972,7 +16050,9 @@
       <keyword name="WebBrowserView.selectAll" id="WebBrowserView.selectAll" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.selectAll" />
       <keyword name="WebBrowserView.setSource" id="WebBrowserView.setSource" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.setSource" />
       <keyword name="WebBrowserView.setZoomValue" id="WebBrowserView.setZoomValue" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.setZoomValue" />
+      <keyword name="WebBrowserView.showEvent" id="WebBrowserView.showEvent" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.showEvent" />
       <keyword name="WebBrowserView.source" id="WebBrowserView.source" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.source" />
+      <keyword name="WebBrowserView.storeSessionData" id="WebBrowserView.storeSessionData" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.storeSessionData" />
       <keyword name="WebBrowserView.undo" id="WebBrowserView.undo" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.undo" />
       <keyword name="WebBrowserView.unselect" id="WebBrowserView.unselect" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.unselect" />
       <keyword name="WebBrowserView.zoomIn" id="WebBrowserView.zoomIn" ref="eric6.WebBrowser.WebBrowserView.html#WebBrowserView.zoomIn" />
@@ -16020,7 +16100,6 @@
       <keyword name="WebBrowserWindow.__bookmarkAllCallback" id="WebBrowserWindow.__bookmarkAllCallback" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__bookmarkAllCallback" />
       <keyword name="WebBrowserWindow.__clearIconsDatabase" id="WebBrowserWindow.__clearIconsDatabase" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__clearIconsDatabase" />
       <keyword name="WebBrowserWindow.__clearPrivateData" id="WebBrowserWindow.__clearPrivateData" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__clearPrivateData" />
-      <keyword name="WebBrowserWindow.__closeAllWindows" id="WebBrowserWindow.__closeAllWindows" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__closeAllWindows" />
       <keyword name="WebBrowserWindow.__copy" id="WebBrowserWindow.__copy" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__copy" />
       <keyword name="WebBrowserWindow.__createTextEncodingAction" id="WebBrowserWindow.__createTextEncodingAction" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__createTextEncodingAction" />
       <keyword name="WebBrowserWindow.__createTextEncodingSubmenu" id="WebBrowserWindow.__createTextEncodingSubmenu" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__createTextEncodingSubmenu" />
@@ -16068,6 +16147,7 @@
       <keyword name="WebBrowserWindow.__setTextEncoding" id="WebBrowserWindow.__setTextEncoding" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__setTextEncoding" />
       <keyword name="WebBrowserWindow.__setUserStyleSheet" id="WebBrowserWindow.__setUserStyleSheet" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__setUserStyleSheet" />
       <keyword name="WebBrowserWindow.__setupFilterCombo" id="WebBrowserWindow.__setupFilterCombo" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__setupFilterCombo" />
+      <keyword name="WebBrowserWindow.__shallShutDown" id="WebBrowserWindow.__shallShutDown" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__shallShutDown" />
       <keyword name="WebBrowserWindow.__showAcceptedLanguages" id="WebBrowserWindow.__showAcceptedLanguages" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showAcceptedLanguages" />
       <keyword name="WebBrowserWindow.__showAdBlockDialog" id="WebBrowserWindow.__showAdBlockDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showAdBlockDialog" />
       <keyword name="WebBrowserWindow.__showBookmarksDialog" id="WebBrowserWindow.__showBookmarksDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showBookmarksDialog" />
@@ -16087,6 +16167,7 @@
       <keyword name="WebBrowserWindow.__showPersonalInformationDialog" id="WebBrowserWindow.__showPersonalInformationDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showPersonalInformationDialog" />
       <keyword name="WebBrowserWindow.__showPreferences" id="WebBrowserWindow.__showPreferences" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showPreferences" />
       <keyword name="WebBrowserWindow.__showSearchWindow" id="WebBrowserWindow.__showSearchWindow" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showSearchWindow" />
+      <keyword name="WebBrowserWindow.__showSessionManagerDialog" id="WebBrowserWindow.__showSessionManagerDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showSessionManagerDialog" />
       <keyword name="WebBrowserWindow.__showSiteinfoDialog" id="WebBrowserWindow.__showSiteinfoDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showSiteinfoDialog" />
       <keyword name="WebBrowserWindow.__showSyncDialog" id="WebBrowserWindow.__showSyncDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showSyncDialog" />
       <keyword name="WebBrowserWindow.__showTabManager" id="WebBrowserWindow.__showTabManager" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showTabManager" />
@@ -16095,6 +16176,7 @@
       <keyword name="WebBrowserWindow.__showUserAgentsDialog" id="WebBrowserWindow.__showUserAgentsDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showUserAgentsDialog" />
       <keyword name="WebBrowserWindow.__showWebIconsDialog" id="WebBrowserWindow.__showWebIconsDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showWebIconsDialog" />
       <keyword name="WebBrowserWindow.__showZoomValuesDialog" id="WebBrowserWindow.__showZoomValuesDialog" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__showZoomValuesDialog" />
+      <keyword name="WebBrowserWindow.__shutdownWindow" id="WebBrowserWindow.__shutdownWindow" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__shutdownWindow" />
       <keyword name="WebBrowserWindow.__stopLoading" id="WebBrowserWindow.__stopLoading" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__stopLoading" />
       <keyword name="WebBrowserWindow.__switchTab" id="WebBrowserWindow.__switchTab" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__switchTab" />
       <keyword name="WebBrowserWindow.__syncTOC" id="WebBrowserWindow.__syncTOC" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.__syncTOC" />
@@ -16134,6 +16216,7 @@
       <keyword name="WebBrowserWindow.featurePermissionManager" id="WebBrowserWindow.featurePermissionManager" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.featurePermissionManager" />
       <keyword name="WebBrowserWindow.feedsManager" id="WebBrowserWindow.feedsManager" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.feedsManager" />
       <keyword name="WebBrowserWindow.flashCookieManager" id="WebBrowserWindow.flashCookieManager" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.flashCookieManager" />
+      <keyword name="WebBrowserWindow.forceClose" id="WebBrowserWindow.forceClose" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.forceClose" />
       <keyword name="WebBrowserWindow.fromEric" id="WebBrowserWindow.fromEric" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.fromEric" />
       <keyword name="WebBrowserWindow.getActions" id="WebBrowserWindow.getActions" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.getActions" />
       <keyword name="WebBrowserWindow.getQtHelpCollectionFileName" id="WebBrowserWindow.getQtHelpCollectionFileName" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.getQtHelpCollectionFileName" />
@@ -16145,6 +16228,7 @@
       <keyword name="WebBrowserWindow.historyManager" id="WebBrowserWindow.historyManager" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.historyManager" />
       <keyword name="WebBrowserWindow.icon" id="WebBrowserWindow.icon" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.icon" />
       <keyword name="WebBrowserWindow.imageSearchEngine" id="WebBrowserWindow.imageSearchEngine" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.imageSearchEngine" />
+      <keyword name="WebBrowserWindow.isClosing" id="WebBrowserWindow.isClosing" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.isClosing" />
       <keyword name="WebBrowserWindow.isFullScreenNavigationVisible" id="WebBrowserWindow.isFullScreenNavigationVisible" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.isFullScreenNavigationVisible" />
       <keyword name="WebBrowserWindow.isPrivate" id="WebBrowserWindow.isPrivate" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.isPrivate" />
       <keyword name="WebBrowserWindow.javascriptConsole" id="WebBrowserWindow.javascriptConsole" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.javascriptConsole" />
@@ -16171,6 +16255,7 @@
       <keyword name="WebBrowserWindow.requestVirusTotalScan" id="WebBrowserWindow.requestVirusTotalScan" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.requestVirusTotalScan" />
       <keyword name="WebBrowserWindow.search" id="WebBrowserWindow.search" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.search" />
       <keyword name="WebBrowserWindow.searchEnginesAction" id="WebBrowserWindow.searchEnginesAction" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.searchEnginesAction" />
+      <keyword name="WebBrowserWindow.sessionManager" id="WebBrowserWindow.sessionManager" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.sessionManager" />
       <keyword name="WebBrowserWindow.setBackwardAvailable" id="WebBrowserWindow.setBackwardAvailable" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.setBackwardAvailable" />
       <keyword name="WebBrowserWindow.setEventKeyboardModifiers" id="WebBrowserWindow.setEventKeyboardModifiers" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.setEventKeyboardModifiers" />
       <keyword name="WebBrowserWindow.setEventMouseButtons" id="WebBrowserWindow.setEventMouseButtons" ref="eric6.WebBrowser.WebBrowserWindow.html#WebBrowserWindow.setEventMouseButtons" />
@@ -18205,6 +18290,8 @@
       <file>eric6.WebBrowser.QtHelp.QtHelpDocumentationSelectionDialog.html</file>
       <file>eric6.WebBrowser.QtHelp.QtHelpFiltersDialog.html</file>
       <file>eric6.WebBrowser.SearchWidget.html</file>
+      <file>eric6.WebBrowser.Session.SessionManager.html</file>
+      <file>eric6.WebBrowser.Session.SessionManagerDialog.html</file>
       <file>eric6.WebBrowser.SiteInfo.SiteInfoDialog.html</file>
       <file>eric6.WebBrowser.SpeedDial.Page.html</file>
       <file>eric6.WebBrowser.SpeedDial.PageThumbnailer.html</file>
@@ -18428,6 +18515,7 @@
       <file>index-eric6.WebBrowser.Passwords.html</file>
       <file>index-eric6.WebBrowser.PersonalInformationManager.html</file>
       <file>index-eric6.WebBrowser.QtHelp.html</file>
+      <file>index-eric6.WebBrowser.Session.html</file>
       <file>index-eric6.WebBrowser.SiteInfo.html</file>
       <file>index-eric6.WebBrowser.SpeedDial.html</file>
       <file>index-eric6.WebBrowser.StatusBar.html</file>
--- a/Documentation/Source/eric6.DebugClients.Python.BreakpointWatch.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.DebugClients.Python.BreakpointWatch.html	Wed Aug 02 13:28:50 2017 +0200
@@ -88,16 +88,16 @@
 <table>
 <tr>
 <td><a href="#Breakpoint.clear_all_breaks">clear_all_breaks</a></td>
-<td>Public method to clear all breakpoints.</td>
+<td>Static method to clear all breakpoints.</td>
 </tr><tr>
 <td><a href="#Breakpoint.clear_break">clear_break</a></td>
-<td>Public method reimplemented from bdb.py to clear a breakpoint.</td>
+<td>Static method reimplemented from bdb.py to clear a breakpoint.</td>
 </tr><tr>
 <td><a href="#Breakpoint.effectiveBreak">effectiveBreak</a></td>
-<td>Public method to determine which breakpoint for this filename:lineno is to be acted upon.</td>
+<td>Static method to determine which breakpoint for this filename:lineno is to be acted upon.</td>
 </tr><tr>
 <td><a href="#Breakpoint.get_break">get_break</a></td>
-<td>Public method to get the breakpoint of a particular line.</td>
+<td>Static method to get the breakpoint of a particular line.</td>
 </tr>
 </table>
 <a NAME="Breakpoint.__init__" ID="Breakpoint.__init__"></a>
@@ -138,12 +138,12 @@
 <h4>Breakpoint.clear_all_breaks (static)</h4>
 <b>clear_all_breaks</b>(<i></i>)
 <p>
-        Public method to clear all breakpoints.
+        Static method to clear all breakpoints.
 </p><a NAME="Breakpoint.clear_break" ID="Breakpoint.clear_break"></a>
 <h4>Breakpoint.clear_break (static)</h4>
 <b>clear_break</b>(<i>lineno</i>)
 <p>
-        Public method reimplemented from bdb.py to clear a breakpoint.
+        Static method reimplemented from bdb.py to clear a breakpoint.
 </p><dl>
 <dt><i>filename</i> (str)</dt>
 <dd>
@@ -156,7 +156,7 @@
 <h4>Breakpoint.effectiveBreak (static)</h4>
 <b>effectiveBreak</b>(<i>lineno, frame</i>)
 <p>
-        Public method to determine which breakpoint for this filename:lineno
+        Static method to determine which breakpoint for this filename:lineno
         is to be acted upon.
 </p><p>
         Called only if we know there is a bpt at this
@@ -188,7 +188,7 @@
 <h4>Breakpoint.get_break (static)</h4>
 <b>get_break</b>(<i>lineno</i>)
 <p>
-        Public method to get the breakpoint of a particular line.
+        Static method to get the breakpoint of a particular line.
 </p><p>
         Because eric6 supports only one breakpoint per line, this
         method will return only one breakpoint.
@@ -251,16 +251,16 @@
 <table>
 <tr>
 <td><a href="#Watch.clear_all_watches">clear_all_watches</a></td>
-<td>Public method to clear all watch expressions.</td>
+<td>Static method to clear all watch expressions.</td>
 </tr><tr>
 <td><a href="#Watch.clear_watch">clear_watch</a></td>
-<td>Public method to clear a watch expression.</td>
+<td>Static method to clear a watch expression.</td>
 </tr><tr>
 <td><a href="#Watch.effectiveWatch">effectiveWatch</a></td>
-<td>Public method to determine, if a watch expression is effective.</td>
+<td>Static method to determine, if a watch expression is effective.</td>
 </tr><tr>
 <td><a href="#Watch.get_watch">get_watch</a></td>
-<td>Public method to get a watch expression.</td>
+<td>Static method to get a watch expression.</td>
 </tr>
 </table>
 <a NAME="Watch.__init__" ID="Watch.__init__"></a>
@@ -301,12 +301,12 @@
 <h4>Watch.clear_all_watches (static)</h4>
 <b>clear_all_watches</b>(<i></i>)
 <p>
-        Public method to clear all watch expressions.
+        Static method to clear all watch expressions.
 </p><a NAME="Watch.clear_watch" ID="Watch.clear_watch"></a>
 <h4>Watch.clear_watch (static)</h4>
 <b>clear_watch</b>(<i></i>)
 <p>
-        Public method to clear a watch expression.
+        Static method to clear a watch expression.
 </p><dl>
 <dt><i>cond</i> (str)</dt>
 <dd>
@@ -316,7 +316,7 @@
 <h4>Watch.effectiveWatch (static)</h4>
 <b>effectiveWatch</b>(<i></i>)
 <p>
-        Public method to determine, if a watch expression is effective.
+        Static method to determine, if a watch expression is effective.
 </p><dl>
 <dt><i>frame</i> (frame object)</dt>
 <dd>
@@ -337,7 +337,7 @@
 <h4>Watch.get_watch (static)</h4>
 <b>get_watch</b>(<i></i>)
 <p>
-        Public method to get a watch expression.
+        Static method to get a watch expression.
 </p><dl>
 <dt><i>cond</i> (str)</dt>
 <dd>
--- a/Documentation/Source/eric6.E5Gui.E5SimpleHelpDialog.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.E5Gui.E5SimpleHelpDialog.html	Wed Aug 02 13:28:50 2017 +0200
@@ -67,7 +67,7 @@
 </table>
 <a NAME="E5SimpleHelpDialog.__init__" ID="E5SimpleHelpDialog.__init__"></a>
 <h4>E5SimpleHelpDialog (Constructor)</h4>
-<b>E5SimpleHelpDialog</b>(<i>title="", label="", help="", parent=None</i>)
+<b>E5SimpleHelpDialog</b>(<i>title="", label="", helpStr="", parent=None</i>)
 <p>
         Constructor
 </p><dl>
@@ -77,7 +77,7 @@
 </dd><dt><i>label</i> (str)</dt>
 <dd>
 label for the help
-</dd><dt><i>help</i> (str)</dt>
+</dd><dt><i>helpStr</i> (str)</dt>
 <dd>
 HTML help text
 </dd><dt><i>parent</i> (QWidget)</dt>
--- a/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html	Wed Aug 02 13:28:50 2017 +0200
@@ -866,9 +866,15 @@
 <td><a href="#DocStyleContext.indent">indent</a></td>
 <td>Public method to get the indentation of the first line.</td>
 </tr><tr>
+<td><a href="#DocStyleContext.setSpecial">setSpecial</a></td>
+<td>Public method to set a special attribute for the context.</td>
+</tr><tr>
 <td><a href="#DocStyleContext.source">source</a></td>
 <td>Public method to get the source.</td>
 </tr><tr>
+<td><a href="#DocStyleContext.special">special</a></td>
+<td>Public method to get the special context attribute string.</td>
+</tr><tr>
 <td><a href="#DocStyleContext.ssource">ssource</a></td>
 <td>Public method to get the joined source lines.</td>
 </tr><tr>
@@ -926,6 +932,16 @@
 <dd>
 indentation string (string)
 </dd>
+</dl><a NAME="DocStyleContext.setSpecial" ID="DocStyleContext.setSpecial"></a>
+<h4>DocStyleContext.setSpecial</h4>
+<b>setSpecial</b>(<i>special</i>)
+<p>
+        Public method to set a special attribute for the context.
+</p><dl>
+<dt><i>special</i> (str)</dt>
+<dd>
+attribute string
+</dd>
 </dl><a NAME="DocStyleContext.source" ID="DocStyleContext.source"></a>
 <h4>DocStyleContext.source</h4>
 <b>source</b>(<i></i>)
@@ -936,6 +952,21 @@
 <dd>
 source (list of string)
 </dd>
+</dl><a NAME="DocStyleContext.special" ID="DocStyleContext.special"></a>
+<h4>DocStyleContext.special</h4>
+<b>special</b>(<i></i>)
+<p>
+        Public method to get the special context attribute string.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+attribute string
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
 </dl><a NAME="DocStyleContext.ssource" ID="DocStyleContext.ssource"></a>
 <h4>DocStyleContext.ssource</h4>
 <b>ssource</b>(<i></i>)
--- a/Documentation/Source/eric6.QScintilla.Shell.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.QScintilla.Shell.html	Wed Aug 02 13:28:50 2017 +0200
@@ -35,6 +35,9 @@
 </tr><tr>
 <td><a href="#ShellAssembly">ShellAssembly</a></td>
 <td>Class implementing the containing widget for the shell.</td>
+</tr><tr>
+<td><a href="#ShellHistoryStyle">ShellHistoryStyle</a></td>
+<td>Class defining the shell history styles.</td>
 </tr>
 </table>
 <h3>Functions</h3>
@@ -51,10 +54,14 @@
     Python interpreter.
 </p><h3>Signals</h3>
 <dl>
-<dt>searchStringFound(found)</dt>
+<dt>historyStyleChanged(ShellHistoryStyle)</dt>
+<dd>
+emitted to indicate a
+        change of the history style
+</dd><dt>searchStringFound(bool)</dt>
 <dd>
 emitted to indicate the search
-        result (boolean)
+        result
 </dd>
 </dl>
 <h3>Derived from</h3>
@@ -76,6 +83,9 @@
 <td><a href="#Shell.__QScintillaAutoCompletionCommand">__QScintillaAutoCompletionCommand</a></td>
 <td>Private method to handle a command for autocompletion only.</td>
 </tr><tr>
+<td><a href="#Shell.__QScintillaCancel">__QScintillaCancel</a></td>
+<td>Private method to handle the ESC command.</td>
+</tr><tr>
 <td><a href="#Shell.__QScintillaCharLeft">__QScintillaCharLeft</a></td>
 <td>Private method to handle the Cursor Left command.</td>
 </tr><tr>
@@ -107,10 +117,10 @@
 <td>Private method to handle the Delete Word Right command.</td>
 </tr><tr>
 <td><a href="#Shell.__QScintillaHistoryDown">__QScintillaHistoryDown</a></td>
-<td>Private method to handle the Ctrl+Down key.</td>
+<td>Private method to handle the history down command.</td>
 </tr><tr>
 <td><a href="#Shell.__QScintillaHistoryUp">__QScintillaHistoryUp</a></td>
-<td>Private method to handle the Ctrl+Up key.</td>
+<td>Private method to handle the history up command.</td>
 </tr><tr>
 <td><a href="#Shell.__QScintillaLeftCommand">__QScintillaLeftCommand</a></td>
 <td>Private method to handle a QScintilla command working to the left.</td>
@@ -118,9 +128,15 @@
 <td><a href="#Shell.__QScintillaLeftDeleteCommand">__QScintillaLeftDeleteCommand</a></td>
 <td>Private method to handle a QScintilla delete command working to the left.</td>
 </tr><tr>
+<td><a href="#Shell.__QScintillaLineDown">__QScintillaLineDown</a></td>
+<td>Private method to handle the cursor down command.</td>
+</tr><tr>
 <td><a href="#Shell.__QScintillaLineEnd">__QScintillaLineEnd</a></td>
 <td>Private method to handle the End key.</td>
 </tr><tr>
+<td><a href="#Shell.__QScintillaLineUp">__QScintillaLineUp</a></td>
+<td>Private method to handle the cursor up command.</td>
+</tr><tr>
 <td><a href="#Shell.__QScintillaNewline">__QScintillaNewline</a></td>
 <td>Private method to handle the Return key.</td>
 </tr><tr>
@@ -205,6 +221,9 @@
 <td><a href="#Shell.__isCursorOnLastLine">__isCursorOnLastLine</a></td>
 <td>Private method to check, if the cursor is on the last line.</td>
 </tr><tr>
+<td><a href="#Shell.__isHistoryIndexValid">__isHistoryIndexValid</a></td>
+<td>Private method to test, if the history index is valid.</td>
+</tr><tr>
 <td><a href="#Shell.__middleMouseButton">__middleMouseButton</a></td>
 <td>Private method to handle the middle mouse button press.</td>
 </tr><tr>
@@ -217,6 +236,9 @@
 <td><a href="#Shell.__resetAndClear">__resetAndClear</a></td>
 <td>Private slot to handle the 'reset and clear' context menu entry.</td>
 </tr><tr>
+<td><a href="#Shell.__resetIncrementalHistorySearch">__resetIncrementalHistorySearch</a></td>
+<td>Private method to reset the incremental history search.</td>
+</tr><tr>
 <td><a href="#Shell.__resizeLinenoMargin">__resizeLinenoMargin</a></td>
 <td>Private slot to resize the line numbers margin.</td>
 </tr><tr>
@@ -238,6 +260,9 @@
 <td><a href="#Shell.__setCallTips">__setCallTips</a></td>
 <td>Private method to configure the calltips function.</td>
 </tr><tr>
+<td><a href="#Shell.__setHistoryIndex">__setHistoryIndex</a></td>
+<td>Private method to set the initial history index.</td>
+</tr><tr>
 <td><a href="#Shell.__setMargin0">__setMargin0</a></td>
 <td>Private method to configure margin 0.</td>
 </tr><tr>
@@ -247,6 +272,9 @@
 <td><a href="#Shell.__setTextDisplay">__setTextDisplay</a></td>
 <td>Private method to configure the text display.</td>
 </tr><tr>
+<td><a href="#Shell.__setupCursorKeys">__setupCursorKeys</a></td>
+<td>Private method to setup the cursor up and down mode.</td>
+</tr><tr>
 <td><a href="#Shell.__showCompletions">__showCompletions</a></td>
 <td>Private method to display the possible completions.</td>
 </tr><tr>
@@ -328,12 +356,21 @@
 <td><a href="#Shell.getHistory">getHistory</a></td>
 <td>Public method to get the history for the given client type.</td>
 </tr><tr>
+<td><a href="#Shell.getHistoryIndex">getHistoryIndex</a></td>
+<td>Public method to get the current value of the history index.</td>
+</tr><tr>
 <td><a href="#Shell.handlePreferencesChanged">handlePreferencesChanged</a></td>
 <td>Public slot to handle the preferencesChanged signal.</td>
 </tr><tr>
+<td><a href="#Shell.historyStyle">historyStyle</a></td>
+<td>Public method to get the shell history style.</td>
+</tr><tr>
 <td><a href="#Shell.insert">insert</a></td>
 <td>Public slot to insert text at the current cursor position.</td>
 </tr><tr>
+<td><a href="#Shell.isHistoryEnabled">isHistoryEnabled</a></td>
+<td>Public method to check, if the history is enabled.</td>
+</tr><tr>
 <td><a href="#Shell.keyPressEvent">keyPressEvent</a></td>
 <td>Protected method to handle the user input a key at a time.</td>
 </tr><tr>
@@ -405,7 +442,12 @@
 <dd>
 QScintilla command
 </dd>
-</dl><a NAME="Shell.__QScintillaCharLeft" ID="Shell.__QScintillaCharLeft"></a>
+</dl><a NAME="Shell.__QScintillaCancel" ID="Shell.__QScintillaCancel"></a>
+<h4>Shell.__QScintillaCancel</h4>
+<b>__QScintillaCancel</b>(<i></i>)
+<p>
+        Private method to handle the ESC command.
+</p><a NAME="Shell.__QScintillaCharLeft" ID="Shell.__QScintillaCharLeft"></a>
 <h4>Shell.__QScintillaCharLeft</h4>
 <b>__QScintillaCharLeft</b>(<i></i>)
 <p>
@@ -464,7 +506,7 @@
 <h4>Shell.__QScintillaHistoryDown</h4>
 <b>__QScintillaHistoryDown</b>(<i>cmd</i>)
 <p>
-        Private method to handle the Ctrl+Down key.
+        Private method to handle the history down command.
 </p><dl>
 <dt><i>cmd</i></dt>
 <dd>
@@ -474,7 +516,7 @@
 <h4>Shell.__QScintillaHistoryUp</h4>
 <b>__QScintillaHistoryUp</b>(<i>cmd</i>)
 <p>
-        Private method to handle the Ctrl+Up key.
+        Private method to handle the history up command.
 </p><dl>
 <dt><i>cmd</i></dt>
 <dd>
@@ -505,6 +547,16 @@
 <dd>
 shell method to execute
 </dd>
+</dl><a NAME="Shell.__QScintillaLineDown" ID="Shell.__QScintillaLineDown"></a>
+<h4>Shell.__QScintillaLineDown</h4>
+<b>__QScintillaLineDown</b>(<i>cmd</i>)
+<p>
+        Private method to handle the cursor down command.
+</p><dl>
+<dt><i>cmd</i></dt>
+<dd>
+QScintilla command
+</dd>
 </dl><a NAME="Shell.__QScintillaLineEnd" ID="Shell.__QScintillaLineEnd"></a>
 <h4>Shell.__QScintillaLineEnd</h4>
 <b>__QScintillaLineEnd</b>(<i>cmd</i>)
@@ -515,6 +567,16 @@
 <dd>
 QScintilla command
 </dd>
+</dl><a NAME="Shell.__QScintillaLineUp" ID="Shell.__QScintillaLineUp"></a>
+<h4>Shell.__QScintillaLineUp</h4>
+<b>__QScintillaLineUp</b>(<i>cmd</i>)
+<p>
+        Private method to handle the cursor up command.
+</p><dl>
+<dt><i>cmd</i></dt>
+<dd>
+QScintilla command
+</dd>
 </dl><a NAME="Shell.__QScintillaNewline" ID="Shell.__QScintillaNewline"></a>
 <h4>Shell.__QScintillaNewline</h4>
 <b>__QScintillaNewline</b>(<i>cmd</i>)
@@ -697,13 +759,16 @@
         Private method to open the configuration dialog.
 </p><a NAME="Shell.__executeCommand" ID="Shell.__executeCommand"></a>
 <h4>Shell.__executeCommand</h4>
-<b>__executeCommand</b>(<i>cmd</i>)
+<b>__executeCommand</b>(<i>cmd, historyIndex=None</i>)
 <p>
         Private slot to execute a command.
 </p><dl>
-<dt><i>cmd</i></dt>
+<dt><i>cmd</i> (str)</dt>
 <dd>
-command to be executed by debug client (string)
+command to be executed by debug client
+</dd><dt><i>historyIndex</i> (int)</dt>
+<dd>
+history index to be set
 </dd>
 </dl><a NAME="Shell.__find" ID="Shell.__find"></a>
 <h4>Shell.__find</h4>
@@ -784,6 +849,21 @@
 <dd>
 flag indicating that the cursor is on the last line (boolean)
 </dd>
+</dl><a NAME="Shell.__isHistoryIndexValid" ID="Shell.__isHistoryIndexValid"></a>
+<h4>Shell.__isHistoryIndexValid</h4>
+<b>__isHistoryIndexValid</b>(<i></i>)
+<p>
+        Private method to test, if the history index is valid.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating validity
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
 </dl><a NAME="Shell.__middleMouseButton" ID="Shell.__middleMouseButton"></a>
 <h4>Shell.__middleMouseButton</h4>
 <b>__middleMouseButton</b>(<i></i>)
@@ -812,6 +892,11 @@
 <b>__resetAndClear</b>(<i></i>)
 <p>
         Private slot to handle the 'reset and clear' context menu entry.
+</p><a NAME="Shell.__resetIncrementalHistorySearch" ID="Shell.__resetIncrementalHistorySearch"></a>
+<h4>Shell.__resetIncrementalHistorySearch</h4>
+<b>__resetIncrementalHistorySearch</b>(<i></i>)
+<p>
+        Private method to reset the incremental history search.
 </p><a NAME="Shell.__resizeLinenoMargin" ID="Shell.__resizeLinenoMargin"></a>
 <h4>Shell.__resizeLinenoMargin</h4>
 <b>__resizeLinenoMargin</b>(<i></i>)
@@ -823,17 +908,23 @@
 <p>
         Private method used to reverse search the history.
 </p><dl>
-<dt><i>txt</i></dt>
+<dt><i>txt</i> (str)</dt>
 <dd>
-text to match at the beginning (string)
-</dd><dt><i>startIdx</i></dt>
+text to match at the beginning
+</dd><dt><i>startIdx</i> (int)</dt>
 <dd>
-index to start search from (integer)
+index to start search from
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-index of found entry (integer)
+tuple containing the index of found entry and a flag indicating
+            that something was found
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (int, bool)
 </dd>
 </dl><a NAME="Shell.__searchHistory" ID="Shell.__searchHistory"></a>
 <h4>Shell.__searchHistory</h4>
@@ -841,17 +932,23 @@
 <p>
         Private method used to search the history.
 </p><dl>
-<dt><i>txt</i></dt>
+<dt><i>txt</i> (str)</dt>
 <dd>
-text to match at the beginning (string)
-</dd><dt><i>startIdx</i></dt>
+text to match at the beginning
+</dd><dt><i>startIdx</i> (int)</dt>
 <dd>
-index to start search from (integer)
+index to start search from
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-index of found entry (integer)
+tuple containing the index of found entry and a flag indicating
+            that something was found
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (int, bool)
 </dd>
 </dl><a NAME="Shell.__searchNext" ID="Shell.__searchNext"></a>
 <h4>Shell.__searchNext</h4>
@@ -883,6 +980,16 @@
 <dd>
 of the calltips set to set (string)
 </dd>
+</dl><a NAME="Shell.__setHistoryIndex" ID="Shell.__setHistoryIndex"></a>
+<h4>Shell.__setHistoryIndex</h4>
+<b>__setHistoryIndex</b>(<i>index=None</i>)
+<p>
+        Private method to set the initial history index.
+</p><dl>
+<dt><i>index</i> (int or None)</dt>
+<dd>
+index value to be set
+</dd>
 </dl><a NAME="Shell.__setMargin0" ID="Shell.__setMargin0"></a>
 <h4>Shell.__setMargin0</h4>
 <b>__setMargin0</b>(<i></i>)
@@ -903,6 +1010,11 @@
 <b>__setTextDisplay</b>(<i></i>)
 <p>
         Private method to configure the text display.
+</p><a NAME="Shell.__setupCursorKeys" ID="Shell.__setupCursorKeys"></a>
+<h4>Shell.__setupCursorKeys</h4>
+<b>__setupCursorKeys</b>(<i></i>)
+<p>
+        Private method to setup the cursor up and down mode.
 </p><a NAME="Shell.__showCompletions" ID="Shell.__showCompletions"></a>
 <h4>Shell.__showCompletions</h4>
 <b>__showCompletions</b>(<i>completions, text</i>)
@@ -1085,14 +1197,17 @@
 </dd>
 </dl><a NAME="Shell.executeLines" ID="Shell.executeLines"></a>
 <h4>Shell.executeLines</h4>
-<b>executeLines</b>(<i>lines</i>)
+<b>executeLines</b>(<i>lines, historyIndex=None</i>)
 <p>
         Public method to execute a set of lines as multiple commands.
 </p><dl>
-<dt><i>lines</i></dt>
+<dt><i>lines</i> (str)</dt>
 <dd>
-multiple lines of text to be executed as single
-            commands (string)
+multiple lines of text to be executed as
+            single commands
+</dd><dt><i>historyIndex</i> (int)</dt>
+<dd>
+history index to be set
 </dd>
 </dl><a NAME="Shell.focusInEvent" ID="Shell.focusInEvent"></a>
 <h4>Shell.focusInEvent</h4>
@@ -1168,12 +1283,42 @@
 <dd>
 reference to the history list (list of strings)
 </dd>
+</dl><a NAME="Shell.getHistoryIndex" ID="Shell.getHistoryIndex"></a>
+<h4>Shell.getHistoryIndex</h4>
+<b>getHistoryIndex</b>(<i></i>)
+<p>
+        Public method to get the current value of the history index.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+history index
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+int
+</dd>
 </dl><a NAME="Shell.handlePreferencesChanged" ID="Shell.handlePreferencesChanged"></a>
 <h4>Shell.handlePreferencesChanged</h4>
 <b>handlePreferencesChanged</b>(<i></i>)
 <p>
         Public slot to handle the preferencesChanged signal.
-</p><a NAME="Shell.insert" ID="Shell.insert"></a>
+</p><a NAME="Shell.historyStyle" ID="Shell.historyStyle"></a>
+<h4>Shell.historyStyle</h4>
+<b>historyStyle</b>(<i></i>)
+<p>
+        Public method to get the shell history style.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+shell history style
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+ShellHistoryStyle
+</dd>
+</dl><a NAME="Shell.insert" ID="Shell.insert"></a>
 <h4>Shell.insert</h4>
 <b>insert</b>(<i>txt</i>)
 <p>
@@ -1185,6 +1330,21 @@
 <dd>
 text to be inserted (string)
 </dd>
+</dl><a NAME="Shell.isHistoryEnabled" ID="Shell.isHistoryEnabled"></a>
+<h4>Shell.isHistoryEnabled</h4>
+<b>isHistoryEnabled</b>(<i></i>)
+<p>
+        Public method to check, if the history is enabled.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating if history is enabled
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
 </dl><a NAME="Shell.keyPressEvent" ID="Shell.keyPressEvent"></a>
 <h4>Shell.keyPressEvent</h4>
 <b>keyPressEvent</b>(<i>ev</i>)
@@ -1378,5 +1538,31 @@
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="ShellHistoryStyle" ID="ShellHistoryStyle"></a>
+<h2>ShellHistoryStyle</h2>
+<p>
+    Class defining the shell history styles.
+</p>
+<h3>Derived from</h3>
+Enum
+<h3>Class Attributes</h3>
+<table>
+<tr><td>Disabled</td></tr><tr><td>LinuxStyle</td></tr><tr><td>WindowsStyle</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/Documentation/Source/eric6.QScintilla.ShellHistoryDialog.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.QScintilla.ShellHistoryDialog.html	Wed Aug 02 13:28:50 2017 +0200
@@ -92,13 +92,13 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>history</i></dt>
+<dt><i>history</i> (list of str)</dt>
 <dd>
-reference to the current shell history (list of strings)
-</dd><dt><i>vm</i></dt>
+reference to the current shell history
+</dd><dt><i>vm</i> (ViewManager)</dt>
 <dd>
 reference to the viewmanager object
-</dd><dt><i>shell</i></dt>
+</dd><dt><i>shell</i> (Shell)</dt>
 <dd>
 reference to the shell object
 </dd>
@@ -110,7 +110,13 @@
 </p><dl>
 <dt>Returns:</dt>
 <dd>
-list of history entries (list of strings)
+tuple containing the list of history entries and the
+            current row
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (list of str, int)
 </dd>
 </dl><a NAME="ShellHistoryDialog.on_copyButton_clicked" ID="ShellHistoryDialog.on_copyButton_clicked"></a>
 <h4>ShellHistoryDialog.on_copyButton_clicked</h4>
--- a/Documentation/Source/eric6.QScintilla.ShellWindow.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.QScintilla.ShellWindow.html	Wed Aug 02 13:28:50 2017 +0200
@@ -102,6 +102,9 @@
 <td><a href="#ShellWindow.__doRestart">__doRestart</a></td>
 <td>Private slot to handle the 'restart' menu entry.</td>
 </tr><tr>
+<td><a href="#ShellWindow.__historyStyleChanged">__historyStyleChanged</a></td>
+<td>Private slot to handle a change of the shell history style.</td>
+</tr><tr>
 <td><a href="#ShellWindow.__newWindow">__newWindow</a></td>
 <td>Private slot to start a new instance of eric6.</td>
 </tr><tr>
@@ -249,7 +252,17 @@
 <b>__doRestart</b>(<i></i>)
 <p>
         Private slot to handle the 'restart' menu entry.
-</p><a NAME="ShellWindow.__newWindow" ID="ShellWindow.__newWindow"></a>
+</p><a NAME="ShellWindow.__historyStyleChanged" ID="ShellWindow.__historyStyleChanged"></a>
+<h4>ShellWindow.__historyStyleChanged</h4>
+<b>__historyStyleChanged</b>(<i>historyStyle</i>)
+<p>
+        Private slot to handle a change of the shell history style.
+</p><dl>
+<dt><i>historyStyle</i> (ShellHistoryStyle)</dt>
+<dd>
+style to be used for the history
+</dd>
+</dl><a NAME="ShellWindow.__newWindow" ID="ShellWindow.__newWindow"></a>
 <h4>ShellWindow.__newWindow</h4>
 <b>__newWindow</b>(<i></i>)
 <p>
--- a/Documentation/Source/eric6.QScintilla.SpellChecker.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.QScintilla.SpellChecker.html	Wed Aug 02 13:28:50 2017 +0200
@@ -56,7 +56,7 @@
 <table>
 <tr>
 <td><a href="#SpellChecker._getDict">_getDict</a></td>
-<td>Protected classmethod to get a new dictionary.</td>
+<td>Protected class method to get a new dictionary.</td>
 </tr><tr>
 <td><a href="#SpellChecker.getAvailableLanguages">getAvailableLanguages</a></td>
 <td>Class method to get all available languages.</td>
@@ -167,7 +167,7 @@
 <h4>SpellChecker._getDict (class method)</h4>
 <b>_getDict</b>(<i>lang, pwl="", pel=""</i>)
 <p>
-        Protected classmethod to get a new dictionary.
+        Protected class method to get a new dictionary.
 </p><dl>
 <dt><i>lang</i></dt>
 <dd>
--- a/Documentation/Source/eric6.Toolbox.PyQt4ImportHook.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.Toolbox.PyQt4ImportHook.html	Wed Aug 02 13:28:50 2017 +0200
@@ -42,8 +42,8 @@
 <a NAME="PyQt4Importer" ID="PyQt4Importer"></a>
 <h2>PyQt4Importer</h2>
 <p>
-        Class implementing an importer converting PyQt5 imports to PyQt4
-        imports.
+    Class implementing an importer converting PyQt5 imports to PyQt4
+    imports.
 </p>
 <h3>Derived from</h3>
 object
@@ -70,18 +70,21 @@
 </table>
 <h3>Static Methods</h3>
 <table>
-<tr><td>None</td></tr>
+<tr>
+<td><a href="#PyQt4Importer.QComboBox_currentData">QComboBox_currentData</a></td>
+<td>Static method to emulate the currentData method of Qt5.</td>
+</tr>
 </table>
 <a NAME="PyQt4Importer.__init__" ID="PyQt4Importer.__init__"></a>
 <h4>PyQt4Importer (Constructor)</h4>
 <b>PyQt4Importer</b>(<i></i>)
 <p>
-            Constructor
+        Constructor
 </p><a NAME="PyQt4Importer.find_module" ID="PyQt4Importer.find_module"></a>
 <h4>PyQt4Importer.find_module</h4>
 <b>find_module</b>(<i>fullname, path=None</i>)
 <p>
-            Public method returning the module loader.
+        Public method returning the module loader.
 </p><dl>
 <dt><i>fullname</i></dt>
 <dd>
@@ -99,7 +102,7 @@
 <h4>PyQt4Importer.load_module</h4>
 <b>load_module</b>(<i>fullname</i>)
 <p>
-            Public method to load a module.
+        Public method to load a module.
 </p><dl>
 <dt><i>fullname</i></dt>
 <dd>
@@ -110,6 +113,29 @@
 <dd>
 reference to the loaded module (module)
 </dd>
+</dl><a NAME="PyQt4Importer.QComboBox_currentData" ID="PyQt4Importer.QComboBox_currentData"></a>
+<h4>PyQt4Importer.QComboBox_currentData (static)</h4>
+<b>QComboBox_currentData</b>(<i>role=None</i>)
+<p>
+        Static method to emulate the currentData method of Qt5.
+</p><dl>
+<dt><i>other</i> (QComboBox)</dt>
+<dd>
+reference to the combo box to get the user data of
+</dd><dt><i>role</i> (int)</dt>
+<dd>
+role of which data should be retrieved
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+stored data at current selection
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+any
+</dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
--- a/Documentation/Source/eric6.UI.EmailDialog.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.UI.EmailDialog.html	Wed Aug 02 13:28:50 2017 +0200
@@ -210,7 +210,7 @@
 <p>
         Private method to actually send the message via Google Mail.
 </p><dl>
-<dt><i>message</i> (email.mime.text.MIMEBase)</dt>
+<dt><i>msg</i> (email.mime.text.MIMEBase)</dt>
 <dd>
 email message to be sent
 </dd>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric6.WebBrowser.Session.SessionManager.html	Wed Aug 02 13:28:50 2017 +0200
@@ -0,0 +1,542 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.WebBrowser.Session.SessionManager</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric6.WebBrowser.Session.SessionManager</h1>
+<p>
+Module implementing the session manager.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#SessionManager">SessionManager</a></td>
+<td>Class implementing the session manager.</td>
+</tr><tr>
+<td><a href="#SessionMetaData">SessionMetaData</a></td>
+<td>Class implementing a data structure to store meta data for a session.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="SessionManager" ID="SessionManager"></a>
+<h2>SessionManager</h2>
+<p>
+    Class implementing the session manager.
+</p><h3>Signals</h3>
+<dl>
+<dt>sessionsMetaDataChanged()</dt>
+<dd>
+emitted to indicate a change of the
+        list of session meta data
+</dd>
+</dl>
+<h3>Derived from</h3>
+QObject
+<h3>Class Attributes</h3>
+<table>
+<tr><td>CloneSession</td></tr><tr><td>ReplaceSession</td></tr><tr><td>RestoreSession</td></tr><tr><td>SwitchSession</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr>
+<td><a href="#SessionManager.isValidSession">isValidSession</a></td>
+<td>Class method to check the validity of a session.</td>
+</tr><tr>
+<td><a href="#SessionManager.readSessionFromFile">readSessionFromFile</a></td>
+<td>Class method to read the session data from a file.</td>
+</tr><tr>
+<td><a href="#SessionManager.restoreSessionFromData">restoreSessionFromData</a></td>
+<td>Class method to restore a session from a session data dictionary.</td>
+</tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#SessionManager.__init__">SessionManager</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#SessionManager.__autoSaveSession">__autoSaveSession</a></td>
+<td>Private slot to save the current session state.</td>
+</tr><tr>
+<td><a href="#SessionManager.__backupSavedSession">__backupSavedSession</a></td>
+<td>Private method to backup the most recently saved session.</td>
+</tr><tr>
+<td><a href="#SessionManager.__fillMetaDataList">__fillMetaDataList</a></td>
+<td>Private method to fill the sessions meta data list.</td>
+</tr><tr>
+<td><a href="#SessionManager.__initSessionSaveTimer">__initSessionSaveTimer</a></td>
+<td>Private slot to initialize the auto save timer.</td>
+</tr><tr>
+<td><a href="#SessionManager.__isActive">__isActive</a></td>
+<td>Private method to check, if a given file is the active one.</td>
+</tr><tr>
+<td><a href="#SessionManager.__sessionActTriggered">__sessionActTriggered</a></td>
+<td>Private slot to handle the menu selection of a session.</td>
+</tr><tr>
+<td><a href="#SessionManager.__sessionDirectoryChanged">__sessionDirectoryChanged</a></td>
+<td>Private slot handling changes of the sessions directory.</td>
+</tr><tr>
+<td><a href="#SessionManager.aboutToShowSessionsMenu">aboutToShowSessionsMenu</a></td>
+<td>Public slot to populate the sessions selection menu.</td>
+</tr><tr>
+<td><a href="#SessionManager.activateTimer">activateTimer</a></td>
+<td>Public method to activate the session save timer.</td>
+</tr><tr>
+<td><a href="#SessionManager.autoSaveSession">autoSaveSession</a></td>
+<td>Public method to save the current session state.</td>
+</tr><tr>
+<td><a href="#SessionManager.cloneSession">cloneSession</a></td>
+<td>Public method to clone a session.</td>
+</tr><tr>
+<td><a href="#SessionManager.defaultSessionFile">defaultSessionFile</a></td>
+<td>Public method to get the name of the default session file.</td>
+</tr><tr>
+<td><a href="#SessionManager.deleteSession">deleteSession</a></td>
+<td>Public method to delete a session.</td>
+</tr><tr>
+<td><a href="#SessionManager.getSessionsDirectory">getSessionsDirectory</a></td>
+<td>Public method to get the directory sessions are stored in.</td>
+</tr><tr>
+<td><a href="#SessionManager.lastActiveSessionFile">lastActiveSessionFile</a></td>
+<td>Public method to get the name of the last active session file.</td>
+</tr><tr>
+<td><a href="#SessionManager.newSession">newSession</a></td>
+<td>Public method to start a new session.</td>
+</tr><tr>
+<td><a href="#SessionManager.openSession">openSession</a></td>
+<td>Public method to open a session from a given session file.</td>
+</tr><tr>
+<td><a href="#SessionManager.preferencesChanged">preferencesChanged</a></td>
+<td>Public slot to react upon changes of the settings.</td>
+</tr><tr>
+<td><a href="#SessionManager.renameSession">renameSession</a></td>
+<td>Public method to rename or clone a session.</td>
+</tr><tr>
+<td><a href="#SessionManager.replaceSession">replaceSession</a></td>
+<td>Public method to replace the current session with the given one.</td>
+</tr><tr>
+<td><a href="#SessionManager.saveSession">saveSession</a></td>
+<td>Public method to save the current session.</td>
+</tr><tr>
+<td><a href="#SessionManager.selectSession">selectSession</a></td>
+<td>Public method to select a session to be restored.</td>
+</tr><tr>
+<td><a href="#SessionManager.sessionMetaData">sessionMetaData</a></td>
+<td>Public method to get the sessions meta data.</td>
+</tr><tr>
+<td><a href="#SessionManager.showSessionManagerDialog">showSessionManagerDialog</a></td>
+<td>Public method to show the session manager dialog.</td>
+</tr><tr>
+<td><a href="#SessionManager.shutdown">shutdown</a></td>
+<td>Public method to perform any shutdown actions.</td>
+</tr><tr>
+<td><a href="#SessionManager.switchToSession">switchToSession</a></td>
+<td>Public method to switch the current session to the given one.</td>
+</tr><tr>
+<td><a href="#SessionManager.writeCurrentSession">writeCurrentSession</a></td>
+<td>Public method to write the current session to the given file name.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="SessionManager.isValidSession" ID="SessionManager.isValidSession"></a>
+<h4>SessionManager.isValidSession (class method)</h4>
+<b>isValidSession</b>(<i>session</i>)
+<p>
+        Class method to check the validity of a session.
+</p><dl>
+<dt><i>session</i> (dict)</dt>
+<dd>
+dictionary containing the session data
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating validity
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl><a NAME="SessionManager.readSessionFromFile" ID="SessionManager.readSessionFromFile"></a>
+<h4>SessionManager.readSessionFromFile (class method)</h4>
+<b>readSessionFromFile</b>(<i>sessionFileName</i>)
+<p>
+        Class method to read the session data from a file.
+</p><dl>
+<dt><i>sessionFileName</i> (str)</dt>
+<dd>
+file name of the session file
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+dictionary containing the session data
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
+</dl><a NAME="SessionManager.restoreSessionFromData" ID="SessionManager.restoreSessionFromData"></a>
+<h4>SessionManager.restoreSessionFromData (class method)</h4>
+<b>restoreSessionFromData</b>(<i>window=None, sessionData=None</i>)
+<p>
+        Class method to restore a session from a session data dictionary.
+</p><dl>
+<dt><i>window</i> (WebBrowserWindow)</dt>
+<dd>
+reference to main window to restore to
+</dd><dt><i>sessionData</i></dt>
+<dd>
+dictionary containing the session data
+</dd>
+</dl><a NAME="SessionManager.__init__" ID="SessionManager.__init__"></a>
+<h4>SessionManager (Constructor)</h4>
+<b>SessionManager</b>(<i>parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>parent</i> (QObject)</dt>
+<dd>
+reference to the parent object
+</dd>
+</dl><a NAME="SessionManager.__autoSaveSession" ID="SessionManager.__autoSaveSession"></a>
+<h4>SessionManager.__autoSaveSession</h4>
+<b>__autoSaveSession</b>(<i>startTimer=True</i>)
+<p>
+        Private slot to save the current session state.
+</p><dl>
+<dt><i>startTimer</i> (bool)</dt>
+<dd>
+flag indicating to restart the timer
+</dd>
+</dl><a NAME="SessionManager.__backupSavedSession" ID="SessionManager.__backupSavedSession"></a>
+<h4>SessionManager.__backupSavedSession</h4>
+<b>__backupSavedSession</b>(<i></i>)
+<p>
+        Private method to backup the most recently saved session.
+</p><a NAME="SessionManager.__fillMetaDataList" ID="SessionManager.__fillMetaDataList"></a>
+<h4>SessionManager.__fillMetaDataList</h4>
+<b>__fillMetaDataList</b>(<i></i>)
+<p>
+        Private method to fill the sessions meta data list.
+</p><p>
+        The sessions meta data list is only populated, if the variable holding
+        it is empty (i.e. it is populated on demand).
+</p><a NAME="SessionManager.__initSessionSaveTimer" ID="SessionManager.__initSessionSaveTimer"></a>
+<h4>SessionManager.__initSessionSaveTimer</h4>
+<b>__initSessionSaveTimer</b>(<i></i>)
+<p>
+        Private slot to initialize the auto save timer.
+</p><a NAME="SessionManager.__isActive" ID="SessionManager.__isActive"></a>
+<h4>SessionManager.__isActive</h4>
+<b>__isActive</b>(<i>filePath</i>)
+<p>
+        Private method to check, if a given file is the active one.
+</p><dl>
+<dt><i>filePath</i> (str or QFileInfo)</dt>
+<dd>
+path of the session file to be checked
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating the active file
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl><a NAME="SessionManager.__sessionActTriggered" ID="SessionManager.__sessionActTriggered"></a>
+<h4>SessionManager.__sessionActTriggered</h4>
+<b>__sessionActTriggered</b>(<i></i>)
+<p>
+        Private slot to handle the menu selection of a session.
+</p><a NAME="SessionManager.__sessionDirectoryChanged" ID="SessionManager.__sessionDirectoryChanged"></a>
+<h4>SessionManager.__sessionDirectoryChanged</h4>
+<b>__sessionDirectoryChanged</b>(<i></i>)
+<p>
+        Private slot handling changes of the sessions directory.
+</p><a NAME="SessionManager.aboutToShowSessionsMenu" ID="SessionManager.aboutToShowSessionsMenu"></a>
+<h4>SessionManager.aboutToShowSessionsMenu</h4>
+<b>aboutToShowSessionsMenu</b>(<i></i>)
+<p>
+        Public slot to populate the sessions selection menu.
+</p><a NAME="SessionManager.activateTimer" ID="SessionManager.activateTimer"></a>
+<h4>SessionManager.activateTimer</h4>
+<b>activateTimer</b>(<i></i>)
+<p>
+        Public method to activate the session save timer.
+</p><a NAME="SessionManager.autoSaveSession" ID="SessionManager.autoSaveSession"></a>
+<h4>SessionManager.autoSaveSession</h4>
+<b>autoSaveSession</b>(<i></i>)
+<p>
+        Public method to save the current session state.
+</p><a NAME="SessionManager.cloneSession" ID="SessionManager.cloneSession"></a>
+<h4>SessionManager.cloneSession</h4>
+<b>cloneSession</b>(<i>sessionFilePath</i>)
+<p>
+        Public method to clone a session.
+</p><dl>
+<dt><i>sessionFilePath</i> (str)</dt>
+<dd>
+file name of the session file to be cloned
+</dd>
+</dl><a NAME="SessionManager.defaultSessionFile" ID="SessionManager.defaultSessionFile"></a>
+<h4>SessionManager.defaultSessionFile</h4>
+<b>defaultSessionFile</b>(<i></i>)
+<p>
+        Public method to get the name of the default session file.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+name of the default session file
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl><a NAME="SessionManager.deleteSession" ID="SessionManager.deleteSession"></a>
+<h4>SessionManager.deleteSession</h4>
+<b>deleteSession</b>(<i>sessionFilePath</i>)
+<p>
+        Public method to delete a session.
+</p><dl>
+<dt><i>sessionFilePath</i> (str)</dt>
+<dd>
+file name of the session file to be deleted
+</dd>
+</dl><a NAME="SessionManager.getSessionsDirectory" ID="SessionManager.getSessionsDirectory"></a>
+<h4>SessionManager.getSessionsDirectory</h4>
+<b>getSessionsDirectory</b>(<i></i>)
+<p>
+        Public method to get the directory sessions are stored in.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+name of the sessions directory
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl><a NAME="SessionManager.lastActiveSessionFile" ID="SessionManager.lastActiveSessionFile"></a>
+<h4>SessionManager.lastActiveSessionFile</h4>
+<b>lastActiveSessionFile</b>(<i></i>)
+<p>
+        Public method to get the name of the last active session file.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+name of the last active session file
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl><a NAME="SessionManager.newSession" ID="SessionManager.newSession"></a>
+<h4>SessionManager.newSession</h4>
+<b>newSession</b>(<i></i>)
+<p>
+        Public method to start a new session.
+</p><a NAME="SessionManager.openSession" ID="SessionManager.openSession"></a>
+<h4>SessionManager.openSession</h4>
+<b>openSession</b>(<i>sessionFilePath, flags=0</i>)
+<p>
+        Public method to open a session from a given session file.
+</p><dl>
+<dt><i>sessionFilePath</i> (str)</dt>
+<dd>
+name of the session file to get session from
+</dd><dt><i>flags</i> (int)</dt>
+<dd>
+flags determining the open mode
+</dd>
+</dl><a NAME="SessionManager.preferencesChanged" ID="SessionManager.preferencesChanged"></a>
+<h4>SessionManager.preferencesChanged</h4>
+<b>preferencesChanged</b>(<i></i>)
+<p>
+        Public slot to react upon changes of the settings.
+</p><a NAME="SessionManager.renameSession" ID="SessionManager.renameSession"></a>
+<h4>SessionManager.renameSession</h4>
+<b>renameSession</b>(<i>sessionFilePath, flags=0</i>)
+<p>
+        Public method to rename or clone a session.
+</p><dl>
+<dt><i>sessionFilePath</i> (str)</dt>
+<dd>
+name of the session file
+</dd><dt><i>flags</i> (int)</dt>
+<dd>
+flags determining a rename or clone operation
+</dd>
+</dl><a NAME="SessionManager.replaceSession" ID="SessionManager.replaceSession"></a>
+<h4>SessionManager.replaceSession</h4>
+<b>replaceSession</b>(<i>sessionFilePath</i>)
+<p>
+        Public method to replace the current session with the given one.
+</p><dl>
+<dt><i>sessionFilePath</i> (str)</dt>
+<dd>
+file name of the session file to replace with
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating success
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl><a NAME="SessionManager.saveSession" ID="SessionManager.saveSession"></a>
+<h4>SessionManager.saveSession</h4>
+<b>saveSession</b>(<i></i>)
+<p>
+        Public method to save the current session.
+</p><a NAME="SessionManager.selectSession" ID="SessionManager.selectSession"></a>
+<h4>SessionManager.selectSession</h4>
+<b>selectSession</b>(<i></i>)
+<p>
+        Public method to select a session to be restored.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+name of the session file to be restored
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl><a NAME="SessionManager.sessionMetaData" ID="SessionManager.sessionMetaData"></a>
+<h4>SessionManager.sessionMetaData</h4>
+<b>sessionMetaData</b>(<i>includeBackups=False</i>)
+<p>
+        Public method to get the sessions meta data.
+</p><dl>
+<dt><i>includeBackups</i> (bool)</dt>
+<dd>
+flag indicating to include backup sessions
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+list of session meta data
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+list of SessionMetaData
+</dd>
+</dl><a NAME="SessionManager.showSessionManagerDialog" ID="SessionManager.showSessionManagerDialog"></a>
+<h4>SessionManager.showSessionManagerDialog</h4>
+<b>showSessionManagerDialog</b>(<i></i>)
+<p>
+        Public method to show the session manager dialog.
+</p><a NAME="SessionManager.shutdown" ID="SessionManager.shutdown"></a>
+<h4>SessionManager.shutdown</h4>
+<b>shutdown</b>(<i></i>)
+<p>
+        Public method to perform any shutdown actions.
+</p><a NAME="SessionManager.switchToSession" ID="SessionManager.switchToSession"></a>
+<h4>SessionManager.switchToSession</h4>
+<b>switchToSession</b>(<i>sessionFilePath</i>)
+<p>
+        Public method to switch the current session to the given one.
+</p><dl>
+<dt><i>sessionFilePath</i> (str)</dt>
+<dd>
+file name of the session file to switch to
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating success
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl><a NAME="SessionManager.writeCurrentSession" ID="SessionManager.writeCurrentSession"></a>
+<h4>SessionManager.writeCurrentSession</h4>
+<b>writeCurrentSession</b>(<i>sessionFileName</i>)
+<p>
+        Public method to write the current session to the given file name.
+</p><dl>
+<dt><i>sessionFileName</i> (str)</dt>
+<dd>
+file name of the session
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="SessionMetaData" ID="SessionMetaData"></a>
+<h2>SessionMetaData</h2>
+<p>
+    Class implementing a data structure to store meta data for a session.
+</p>
+<h3>Derived from</h3>
+object
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#SessionMetaData.__init__">SessionMetaData</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="SessionMetaData.__init__" ID="SessionMetaData.__init__"></a>
+<h4>SessionMetaData (Constructor)</h4>
+<b>SessionMetaData</b>(<i></i>)
+<p>
+        Constructor
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric6.WebBrowser.Session.SessionManagerDialog.html	Wed Aug 02 13:28:50 2017 +0200
@@ -0,0 +1,184 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.WebBrowser.Session.SessionManagerDialog</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric6.WebBrowser.Session.SessionManagerDialog</h1>
+<p>
+Module implementing a dialog to manage sessions.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#SessionManagerDialog">SessionManagerDialog</a></td>
+<td>Class documentation goes here.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr /><hr />
+<a NAME="SessionManagerDialog" ID="SessionManagerDialog"></a>
+<h2>SessionManagerDialog</h2>
+<p>
+    Class documentation goes here.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_SessionManagerDialog
+<h3>Class Attributes</h3>
+<table>
+<tr><td>ActiveSessionRole</td></tr><tr><td>BackupSessionRole</td></tr><tr><td>DefaultSessionRole</td></tr><tr><td>SessionFileRole</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#SessionManagerDialog.__init__">SessionManagerDialog</a></td>
+<td>Constructor</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__cloneSession">__cloneSession</a></td>
+<td>Private slot to clone the selected session.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__deleteSession">__deleteSession</a></td>
+<td>Private slot to delete the selected session.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__newSession">__newSession</a></td>
+<td>Private slot to create a new session.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__refresh">__refresh</a></td>
+<td>Private slot to refresh the list of sessions.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__renameSession">__renameSession</a></td>
+<td>Private slot to rename the selected session.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__resizeViewHeader">__resizeViewHeader</a></td>
+<td>Private method to resize the session column of the list.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__switchToSession">__switchToSession</a></td>
+<td>Private slot to switch to the selected session.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__updateButtons">__updateButtons</a></td>
+<td>Private method to update the button state.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.__updateSessionItem">__updateSessionItem</a></td>
+<td>Private method to set various item properties.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.resizeEvent">resizeEvent</a></td>
+<td>Protected method handling the dialog being resized.</td>
+</tr><tr>
+<td><a href="#SessionManagerDialog.showEvent">showEvent</a></td>
+<td>Protected method handling the dialog being shown.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="SessionManagerDialog.__init__" ID="SessionManagerDialog.__init__"></a>
+<h4>SessionManagerDialog (Constructor)</h4>
+<b>SessionManagerDialog</b>(<i>parent=None</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>parent</i> (QWidget)</dt>
+<dd>
+reference to the parent widget
+</dd>
+</dl><a NAME="SessionManagerDialog.__cloneSession" ID="SessionManagerDialog.__cloneSession"></a>
+<h4>SessionManagerDialog.__cloneSession</h4>
+<b>__cloneSession</b>(<i></i>)
+<p>
+        Private slot to clone the selected session.
+</p><a NAME="SessionManagerDialog.__deleteSession" ID="SessionManagerDialog.__deleteSession"></a>
+<h4>SessionManagerDialog.__deleteSession</h4>
+<b>__deleteSession</b>(<i></i>)
+<p>
+        Private slot to delete the selected session.
+</p><a NAME="SessionManagerDialog.__newSession" ID="SessionManagerDialog.__newSession"></a>
+<h4>SessionManagerDialog.__newSession</h4>
+<b>__newSession</b>(<i></i>)
+<p>
+        Private slot to create a new session.
+</p><a NAME="SessionManagerDialog.__refresh" ID="SessionManagerDialog.__refresh"></a>
+<h4>SessionManagerDialog.__refresh</h4>
+<b>__refresh</b>(<i></i>)
+<p>
+        Private slot to refresh the list of sessions.
+</p><a NAME="SessionManagerDialog.__renameSession" ID="SessionManagerDialog.__renameSession"></a>
+<h4>SessionManagerDialog.__renameSession</h4>
+<b>__renameSession</b>(<i></i>)
+<p>
+        Private slot to rename the selected session.
+</p><a NAME="SessionManagerDialog.__resizeViewHeader" ID="SessionManagerDialog.__resizeViewHeader"></a>
+<h4>SessionManagerDialog.__resizeViewHeader</h4>
+<b>__resizeViewHeader</b>(<i></i>)
+<p>
+        Private method to resize the session column of the list.
+</p><a NAME="SessionManagerDialog.__switchToSession" ID="SessionManagerDialog.__switchToSession"></a>
+<h4>SessionManagerDialog.__switchToSession</h4>
+<b>__switchToSession</b>(<i></i>)
+<p>
+        Private slot to switch to the selected session.
+</p><a NAME="SessionManagerDialog.__updateButtons" ID="SessionManagerDialog.__updateButtons"></a>
+<h4>SessionManagerDialog.__updateButtons</h4>
+<b>__updateButtons</b>(<i></i>)
+<p>
+        Private method to update the button state.
+</p><a NAME="SessionManagerDialog.__updateSessionItem" ID="SessionManagerDialog.__updateSessionItem"></a>
+<h4>SessionManagerDialog.__updateSessionItem</h4>
+<b>__updateSessionItem</b>(<i>itm</i>)
+<p>
+        Private method to set various item properties.
+</p><dl>
+<dt><i>itm</i> (QTreeWidgetItem)</dt>
+<dd>
+reference to the item to be updated
+</dd>
+</dl><a NAME="SessionManagerDialog.resizeEvent" ID="SessionManagerDialog.resizeEvent"></a>
+<h4>SessionManagerDialog.resizeEvent</h4>
+<b>resizeEvent</b>(<i>evt</i>)
+<p>
+        Protected method handling the dialog being resized.
+</p><dl>
+<dt><i>evt</i> (QResizeEvent)</dt>
+<dd>
+reference to the event object
+</dd>
+</dl><a NAME="SessionManagerDialog.showEvent" ID="SessionManagerDialog.showEvent"></a>
+<h4>SessionManagerDialog.showEvent</h4>
+<b>showEvent</b>(<i>evt</i>)
+<p>
+        Protected method handling the dialog being shown.
+</p><dl>
+<dt><i>evt</i> (QShowEvent)</dt>
+<dd>
+reference to the event object
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.WebBrowser.WebBrowserPage.html	Wed Aug 02 13:28:50 2017 +0200
@@ -120,6 +120,12 @@
 <td><a href="#WebBrowserPage.scroll">scroll</a></td>
 <td>Public method to scroll by the given amount of pixels.</td>
 </tr><tr>
+<td><a href="#WebBrowserPage.scrollPosition">scrollPosition</a></td>
+<td>Public method to get the scroll position of the web page.</td>
+</tr><tr>
+<td><a href="#WebBrowserPage.scrollTo">scrollTo</a></td>
+<td>Public method to scroll to the given position.</td>
+</tr><tr>
 <td><a href="#WebBrowserPage.setJavaScriptEnabled">setJavaScriptEnabled</a></td>
 <td>Public method to enable JavaScript.</td>
 </tr>
@@ -438,6 +444,31 @@
 <dd>
 vertical scroll value
 </dd>
+</dl><a NAME="WebBrowserPage.scrollPosition" ID="WebBrowserPage.scrollPosition"></a>
+<h4>WebBrowserPage.scrollPosition</h4>
+<b>scrollPosition</b>(<i></i>)
+<p>
+            Public method to get the scroll position of the web page.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+scroll position
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+QPointF
+</dd>
+</dl><a NAME="WebBrowserPage.scrollTo" ID="WebBrowserPage.scrollTo"></a>
+<h4>WebBrowserPage.scrollTo</h4>
+<b>scrollTo</b>(<i>pos</i>)
+<p>
+        Public method to scroll to the given position.
+</p><dl>
+<dt><i>pos</i> (QPointF)</dt>
+<dd>
+position to scroll to
+</dd>
 </dl><a NAME="WebBrowserPage.setJavaScriptEnabled" ID="WebBrowserPage.setJavaScriptEnabled"></a>
 <h4>WebBrowserPage.setJavaScriptEnabled</h4>
 <b>setJavaScriptEnabled</b>(<i>enable</i>)
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserTabWidget.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.WebBrowser.WebBrowserTabWidget.html	Wed Aug 02 13:28:50 2017 +0200
@@ -212,9 +212,15 @@
 <td><a href="#WebBrowserTabWidget.currentUrlBar">currentUrlBar</a></td>
 <td>Public method to get a reference to the current url bar.</td>
 </tr><tr>
+<td><a href="#WebBrowserTabWidget.getSessionData">getSessionData</a></td>
+<td>Public method to populate the session data.</td>
+</tr><tr>
 <td><a href="#WebBrowserTabWidget.getSourceFileList">getSourceFileList</a></td>
 <td>Public method to get a list of all opened Qt help files.</td>
 </tr><tr>
+<td><a href="#WebBrowserTabWidget.loadFromSessionData">loadFromSessionData</a></td>
+<td>Public method to load the session data.</td>
+</tr><tr>
 <td><a href="#WebBrowserTabWidget.newBrowser">newBrowser</a></td>
 <td>Public method to create a new web browser tab.</td>
 </tr><tr>
@@ -611,6 +617,21 @@
 <dd>
 reference to the current url bar (UrlBar)
 </dd>
+</dl><a NAME="WebBrowserTabWidget.getSessionData" ID="WebBrowserTabWidget.getSessionData"></a>
+<h4>WebBrowserTabWidget.getSessionData</h4>
+<b>getSessionData</b>(<i></i>)
+<p>
+        Public method to populate the session data.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+dictionary containing the session data
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
 </dl><a NAME="WebBrowserTabWidget.getSourceFileList" ID="WebBrowserTabWidget.getSourceFileList"></a>
 <h4>WebBrowserTabWidget.getSourceFileList</h4>
 <b>getSourceFileList</b>(<i></i>)
@@ -621,23 +642,37 @@
 <dd>
 dictionary with tab id as key and host/namespace as value
 </dd>
+</dl><a NAME="WebBrowserTabWidget.loadFromSessionData" ID="WebBrowserTabWidget.loadFromSessionData"></a>
+<h4>WebBrowserTabWidget.loadFromSessionData</h4>
+<b>loadFromSessionData</b>(<i>sessionData</i>)
+<p>
+        Public method to load the session data.
+</p><dl>
+<dt><i>sessionData</i> (dict)</dt>
+<dd>
+dictionary containing the session data as
+            generated by getSessionData()
+</dd>
 </dl><a NAME="WebBrowserTabWidget.newBrowser" ID="WebBrowserTabWidget.newBrowser"></a>
 <h4>WebBrowserTabWidget.newBrowser</h4>
-<b>newBrowser</b>(<i>link=None, position=-1, background=False</i>)
+<b>newBrowser</b>(<i>link=None, position=-1, background=False, restoreSession=False</i>)
 <p>
         Public method to create a new web browser tab.
 </p><dl>
-<dt><i>link</i></dt>
+<dt><i>link</i> (str or QUrl)</dt>
 <dd>
-link to be shown (string or QUrl)
-</dd><dt><i>position=</i></dt>
+link to be shown
+</dd><dt><i>position=</i> (int)</dt>
 <dd>
 position to create the new tab at or -1 to add it
-            to the end (integer)
-</dd><dt><i>background=</i></dt>
+            to the end
+</dd><dt><i>background=</i> (bool)</dt>
 <dd>
 flag indicating to open the tab in the
-            background (bool)
+            background
+</dd><dt><i>restoreSession=</i> (bool)</dt>
+<dd>
+flag indicating a restore session action
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserView.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.WebBrowser.WebBrowserView.html	Wed Aug 02 13:28:50 2017 +0200
@@ -219,6 +219,9 @@
 <td><a href="#WebBrowserView.__setRwhvqt">__setRwhvqt</a></td>
 <td>Private slot to set widget that receives input events.</td>
 </tr><tr>
+<td><a href="#WebBrowserView.__showEventSlot">__showEventSlot</a></td>
+<td>Private slot to perform actions when the view is shown and the event loop is running.</td>
+</tr><tr>
 <td><a href="#WebBrowserView.__showTabCrashPage">__showTabCrashPage</a></td>
 <td>Private slot to show the tab crash page.</td>
 </tr><tr>
@@ -255,6 +258,9 @@
 <td><a href="#WebBrowserView._wheelEvent">_wheelEvent</a></td>
 <td>Protected method to handle wheel events.</td>
 </tr><tr>
+<td><a href="#WebBrowserView.activateSession">activateSession</a></td>
+<td>Public slot to activate a restored session.</td>
+</tr><tr>
 <td><a href="#WebBrowserView.addBookmark">addBookmark</a></td>
 <td>Public slot to bookmark the current page.</td>
 </tr><tr>
@@ -300,6 +306,9 @@
 <td><a href="#WebBrowserView.eventFilter">eventFilter</a></td>
 <td>Public method to process event for other objects.</td>
 </tr><tr>
+<td><a href="#WebBrowserView.extractSessionMetaData">extractSessionMetaData</a></td>
+<td>Public method to extract some session meta data elements needed by the tab widget in case of deferred loading.</td>
+</tr><tr>
 <td><a href="#WebBrowserView.findNextPrev">findNextPrev</a></td>
 <td>Public slot to find the next occurrence of a text.</td>
 </tr><tr>
@@ -312,6 +321,9 @@
 <td><a href="#WebBrowserView.getRSS">getRSS</a></td>
 <td>Public method to get the extracted RSS feeds.</td>
 </tr><tr>
+<td><a href="#WebBrowserView.getSessionData">getSessionData</a></td>
+<td>Public method to populate the session data.</td>
+</tr><tr>
 <td><a href="#WebBrowserView.hasRSS">hasRSS</a></td>
 <td>Public method to check, if the loaded page has RSS links.</td>
 </tr><tr>
@@ -342,6 +354,9 @@
 <td><a href="#WebBrowserView.load">load</a></td>
 <td>Public method to load a web site.</td>
 </tr><tr>
+<td><a href="#WebBrowserView.loadFromSessionData">loadFromSessionData</a></td>
+<td>Public method to load the session data.</td>
+</tr><tr>
 <td><a href="#WebBrowserView.mainWindow">mainWindow</a></td>
 <td>Public method to get a reference to the main window.</td>
 </tr><tr>
@@ -381,9 +396,15 @@
 <td><a href="#WebBrowserView.setZoomValue">setZoomValue</a></td>
 <td>Public method to set the zoom value.</td>
 </tr><tr>
+<td><a href="#WebBrowserView.showEvent">showEvent</a></td>
+<td>Protected method to handle show events.</td>
+</tr><tr>
 <td><a href="#WebBrowserView.source">source</a></td>
 <td>Public method to return the URL of the loaded page.</td>
 </tr><tr>
+<td><a href="#WebBrowserView.storeSessionData">storeSessionData</a></td>
+<td>Public method to store session data to be restored later on.</td>
+</tr><tr>
 <td><a href="#WebBrowserView.undo">undo</a></td>
 <td>Public slot to undo the last edit action.</td>
 </tr><tr>
@@ -792,6 +813,12 @@
 <b>__setRwhvqt</b>(<i></i>)
 <p>
         Private slot to set widget that receives input events.
+</p><a NAME="WebBrowserView.__showEventSlot" ID="WebBrowserView.__showEventSlot"></a>
+<h4>WebBrowserView.__showEventSlot</h4>
+<b>__showEventSlot</b>(<i></i>)
+<p>
+        Private slot to perform actions when the view is shown and the event
+        loop is running.
 </p><a NAME="WebBrowserView.__showTabCrashPage" ID="WebBrowserView.__showTabCrashPage"></a>
 <h4>WebBrowserView.__showTabCrashPage</h4>
 <b>__showTabCrashPage</b>(<i>status</i>)
@@ -905,7 +932,12 @@
 <dd>
 reference to the wheel event (QWheelEvent)
 </dd>
-</dl><a NAME="WebBrowserView.addBookmark" ID="WebBrowserView.addBookmark"></a>
+</dl><a NAME="WebBrowserView.activateSession" ID="WebBrowserView.activateSession"></a>
+<h4>WebBrowserView.activateSession</h4>
+<b>activateSession</b>(<i></i>)
+<p>
+        Public slot to activate a restored session.
+</p><a NAME="WebBrowserView.addBookmark" ID="WebBrowserView.addBookmark"></a>
 <h4>WebBrowserView.addBookmark</h4>
 <b>addBookmark</b>(<i></i>)
 <p>
@@ -1052,6 +1084,28 @@
 <dd>
 bool
 </dd>
+</dl><a NAME="WebBrowserView.extractSessionMetaData" ID="WebBrowserView.extractSessionMetaData"></a>
+<h4>WebBrowserView.extractSessionMetaData</h4>
+<b>extractSessionMetaData</b>(<i>sessionData</i>)
+<p>
+        Public method to extract some session meta data elements needed by the
+        tab widget in case of deferred loading.
+</p><dl>
+<dt><i>sessionData</i> (dict)</dt>
+<dd>
+dictionary containing the session data as
+            generated by getSessionData()
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing the title, URL and web icon
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (str, str, QIcon)
+</dd>
 </dl><a NAME="WebBrowserView.findNextPrev" ID="WebBrowserView.findNextPrev"></a>
 <h4>WebBrowserView.findNextPrev</h4>
 <b>findNextPrev</b>(<i>txt, case, backwards, callback</i>)
@@ -1101,6 +1155,21 @@
 <dd>
 list of RSS feeds (list of tuples of two strings)
 </dd>
+</dl><a NAME="WebBrowserView.getSessionData" ID="WebBrowserView.getSessionData"></a>
+<h4>WebBrowserView.getSessionData</h4>
+<b>getSessionData</b>(<i></i>)
+<p>
+        Public method to populate the session data.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+dictionary containing the session data
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
 </dl><a NAME="WebBrowserView.hasRSS" ID="WebBrowserView.hasRSS"></a>
 <h4>WebBrowserView.hasRSS</h4>
 <b>hasRSS</b>(<i></i>)
@@ -1211,6 +1280,17 @@
 <dd>
 URL to be loaded
 </dd>
+</dl><a NAME="WebBrowserView.loadFromSessionData" ID="WebBrowserView.loadFromSessionData"></a>
+<h4>WebBrowserView.loadFromSessionData</h4>
+<b>loadFromSessionData</b>(<i>sessionData</i>)
+<p>
+        Public method to load the session data.
+</p><dl>
+<dt><i>sessionData</i> (dict)</dt>
+<dd>
+dictionary containing the session data as
+            generated by getSessionData()
+</dd>
 </dl><a NAME="WebBrowserView.mainWindow" ID="WebBrowserView.mainWindow"></a>
 <h4>WebBrowserView.mainWindow</h4>
 <b>mainWindow</b>(<i></i>)
@@ -1328,6 +1408,16 @@
 flag indicating to save the zoom value with the
             zoom manager
 </dd>
+</dl><a NAME="WebBrowserView.showEvent" ID="WebBrowserView.showEvent"></a>
+<h4>WebBrowserView.showEvent</h4>
+<b>showEvent</b>(<i>evt</i>)
+<p>
+        Protected method to handle show events.
+</p><dl>
+<dt><i>evt</i> (QShowEvent)</dt>
+<dd>
+reference to the show event object
+</dd>
 </dl><a NAME="WebBrowserView.source" ID="WebBrowserView.source"></a>
 <h4>WebBrowserView.source</h4>
 <b>source</b>(<i></i>)
@@ -1338,6 +1428,16 @@
 <dd>
 URL loaded in the help browser (QUrl)
 </dd>
+</dl><a NAME="WebBrowserView.storeSessionData" ID="WebBrowserView.storeSessionData"></a>
+<h4>WebBrowserView.storeSessionData</h4>
+<b>storeSessionData</b>(<i>data</i>)
+<p>
+        Public method to store session data to be restored later on.
+</p><dl>
+<dt><i>data</i> (dict)</dt>
+<dd>
+dictionary with session data to be restored
+</dd>
 </dl><a NAME="WebBrowserView.undo" ID="WebBrowserView.undo"></a>
 <h4>WebBrowserView.undo</h4>
 <b>undo</b>(<i></i>)
--- a/Documentation/Source/eric6.WebBrowser.WebBrowserWindow.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/eric6.WebBrowser.WebBrowserWindow.html	Wed Aug 02 13:28:50 2017 +0200
@@ -67,7 +67,7 @@
 E5MainWindow
 <h3>Class Attributes</h3>
 <table>
-<tr><td>BrowserWindows</td></tr><tr><td>_adblockManager</td></tr><tr><td>_autoScroller</td></tr><tr><td>_bookmarksManager</td></tr><tr><td>_cookieJar</td></tr><tr><td>_downloadManager</td></tr><tr><td>_featurePermissionManager</td></tr><tr><td>_feedsManager</td></tr><tr><td>_flashCookieManager</td></tr><tr><td>_fromEric</td></tr><tr><td>_greaseMonkeyManager</td></tr><tr><td>_helpEngine</td></tr><tr><td>_historyManager</td></tr><tr><td>_imageSearchEngine</td></tr><tr><td>_isPrivate</td></tr><tr><td>_networkManager</td></tr><tr><td>_notification</td></tr><tr><td>_passwordManager</td></tr><tr><td>_personalInformationManager</td></tr><tr><td>_speedDial</td></tr><tr><td>_syncManager</td></tr><tr><td>_tabManager</td></tr><tr><td>_useQtHelp</td></tr><tr><td>_userAgentsManager</td></tr><tr><td>_webProfile</td></tr>
+<tr><td>BrowserWindows</td></tr><tr><td>_adblockManager</td></tr><tr><td>_autoScroller</td></tr><tr><td>_bookmarksManager</td></tr><tr><td>_cookieJar</td></tr><tr><td>_downloadManager</td></tr><tr><td>_featurePermissionManager</td></tr><tr><td>_feedsManager</td></tr><tr><td>_flashCookieManager</td></tr><tr><td>_fromEric</td></tr><tr><td>_greaseMonkeyManager</td></tr><tr><td>_helpEngine</td></tr><tr><td>_historyManager</td></tr><tr><td>_imageSearchEngine</td></tr><tr><td>_isPrivate</td></tr><tr><td>_lastActiveWindow</td></tr><tr><td>_networkManager</td></tr><tr><td>_notification</td></tr><tr><td>_passwordManager</td></tr><tr><td>_performingShutdown</td></tr><tr><td>_performingStartup</td></tr><tr><td>_personalInformationManager</td></tr><tr><td>_sessionManager</td></tr><tr><td>_speedDial</td></tr><tr><td>_syncManager</td></tr><tr><td>_tabManager</td></tr><tr><td>_useQtHelp</td></tr><tr><td>_userAgentsManager</td></tr><tr><td>_webProfile</td></tr>
 </table>
 <h3>Class Methods</h3>
 <table>
@@ -102,6 +102,9 @@
 <td><a href="#WebBrowserWindow.getQtHelpCollectionFileName">getQtHelpCollectionFileName</a></td>
 <td>Class method to determine the name of the QtHelp collection file.</td>
 </tr><tr>
+<td><a href="#WebBrowserWindow.getWindow">getWindow</a></td>
+<td>Class method to get a reference to the most recent active web browser window.</td>
+</tr><tr>
 <td><a href="#WebBrowserWindow.greaseMonkeyManager">greaseMonkeyManager</a></td>
 <td>Class method to get a reference to the GreaseMonkey manager.</td>
 </tr><tr>
@@ -138,6 +141,9 @@
 <td><a href="#WebBrowserWindow.personalInformationManager">personalInformationManager</a></td>
 <td>Class method to get a reference to the personal information manager.</td>
 </tr><tr>
+<td><a href="#WebBrowserWindow.sessionManager">sessionManager</a></td>
+<td>Class method to get a reference to the session manager.</td>
+</tr><tr>
 <td><a href="#WebBrowserWindow.setUseQtHelp">setUseQtHelp</a></td>
 <td>Class method to set the QtHelp usage.</td>
 </tr><tr>
@@ -211,9 +217,6 @@
 <td><a href="#WebBrowserWindow.__clearPrivateData">__clearPrivateData</a></td>
 <td>Private slot to clear the private data.</td>
 </tr><tr>
-<td><a href="#WebBrowserWindow.__closeAllWindows">__closeAllWindows</a></td>
-<td>Private slot to close all windows.</td>
-</tr><tr>
 <td><a href="#WebBrowserWindow.__copy">__copy</a></td>
 <td>Private slot called to handle the copy action.</td>
 </tr><tr>
@@ -355,6 +358,9 @@
 <td><a href="#WebBrowserWindow.__setupFilterCombo">__setupFilterCombo</a></td>
 <td>Private slot to setup the filter combo box.</td>
 </tr><tr>
+<td><a href="#WebBrowserWindow.__shallShutDown">__shallShutDown</a></td>
+<td>Private method to check, if the application should be shut down.</td>
+</tr><tr>
 <td><a href="#WebBrowserWindow.__showAcceptedLanguages">__showAcceptedLanguages</a></td>
 <td>Private slot to configure the accepted languages for web pages.</td>
 </tr><tr>
@@ -412,6 +418,9 @@
 <td><a href="#WebBrowserWindow.__showSearchWindow">__showSearchWindow</a></td>
 <td>Private method to show the search window.</td>
 </tr><tr>
+<td><a href="#WebBrowserWindow.__showSessionManagerDialog">__showSessionManagerDialog</a></td>
+<td>Private slot to show the session manager dialog.</td>
+</tr><tr>
 <td><a href="#WebBrowserWindow.__showSiteinfoDialog">__showSiteinfoDialog</a></td>
 <td>Private slot to show the site info dialog.</td>
 </tr><tr>
@@ -436,6 +445,9 @@
 <td><a href="#WebBrowserWindow.__showZoomValuesDialog">__showZoomValuesDialog</a></td>
 <td>Private slot to show the zoom values management dialog.</td>
 </tr><tr>
+<td><a href="#WebBrowserWindow.__shutdownWindow">__shutdownWindow</a></td>
+<td>Private method to shut down a web browser window.</td>
+</tr><tr>
 <td><a href="#WebBrowserWindow.__stopLoading">__stopLoading</a></td>
 <td>Private slot called to handle loading of the current page.</td>
 </tr><tr>
@@ -526,6 +538,9 @@
 <td><a href="#WebBrowserWindow.eventMouseButtons">eventMouseButtons</a></td>
 <td>Public method to get the last recorded mouse buttons.</td>
 </tr><tr>
+<td><a href="#WebBrowserWindow.forceClose">forceClose</a></td>
+<td>Public method to force closing the window.</td>
+</tr><tr>
 <td><a href="#WebBrowserWindow.fromEric">fromEric</a></td>
 <td>Public method to check, if the web browser was called from within the eric IDE.</td>
 </tr><tr>
@@ -535,12 +550,12 @@
 <td><a href="#WebBrowserWindow.getSourceFileList">getSourceFileList</a></td>
 <td>Public method to get a list of all opened source files.</td>
 </tr><tr>
-<td><a href="#WebBrowserWindow.getWindow">getWindow</a></td>
-<td>Public method to get a reference to the most recent active web browser window.</td>
-</tr><tr>
 <td><a href="#WebBrowserWindow.hideFullScreenNavigation">hideFullScreenNavigation</a></td>
 <td>Public slot to hide full screen navigation.</td>
 </tr><tr>
+<td><a href="#WebBrowserWindow.isClosing">isClosing</a></td>
+<td>Public method to test, if the window is closing.</td>
+</tr><tr>
 <td><a href="#WebBrowserWindow.isFullScreenNavigationVisible">isFullScreenNavigationVisible</a></td>
 <td>Public method to check, if full screen navigation is active.</td>
 </tr><tr>
@@ -750,6 +765,22 @@
 <dd>
 str
 </dd>
+</dl><a NAME="WebBrowserWindow.getWindow" ID="WebBrowserWindow.getWindow"></a>
+<h4>WebBrowserWindow.getWindow (class method)</h4>
+<b>getWindow</b>(<i></i>)
+<p>
+        Class method to get a reference to the most recent active
+        web browser window.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+reference to most recent web browser window
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+WebBrowserWindow
+</dd>
 </dl><a NAME="WebBrowserWindow.greaseMonkeyManager" ID="WebBrowserWindow.greaseMonkeyManager"></a>
 <h4>WebBrowserWindow.greaseMonkeyManager (class method)</h4>
 <b>greaseMonkeyManager</b>(<i></i>)
@@ -886,6 +917,21 @@
 reference to the personal information manager
             (PersonalInformationManager)
 </dd>
+</dl><a NAME="WebBrowserWindow.sessionManager" ID="WebBrowserWindow.sessionManager"></a>
+<h4>WebBrowserWindow.sessionManager (class method)</h4>
+<b>sessionManager</b>(<i></i>)
+<p>
+        Class method to get a reference to the session manager.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+reference to the session manager
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+SessionManager
+</dd>
 </dl><a NAME="WebBrowserWindow.setUseQtHelp" ID="WebBrowserWindow.setUseQtHelp"></a>
 <h4>WebBrowserWindow.setUseQtHelp (class method)</h4>
 <b>setUseQtHelp</b>(<i>use</i>)
@@ -979,42 +1025,45 @@
 </dd>
 </dl><a NAME="WebBrowserWindow.__init__" ID="WebBrowserWindow.__init__"></a>
 <h4>WebBrowserWindow (Constructor)</h4>
-<b>WebBrowserWindow</b>(<i>home, path, parent, name, fromEric=False, initShortcutsOnly=False, searchWord=None, private=False, qthelp=False, settingsDir=""</i>)
+<b>WebBrowserWindow</b>(<i>home, path, parent, name, fromEric=False, initShortcutsOnly=False, searchWord=None, private=False, qthelp=False, settingsDir="", restoreSession=False</i>)
 <p>
         Constructor
 </p><dl>
-<dt><i>home</i></dt>
+<dt><i>home</i> (str)</dt>
 <dd>
-the URL to be shown (string)
-</dd><dt><i>path</i></dt>
+the URL to be shown
+</dd><dt><i>path</i> (str)</dt>
 <dd>
-the path of the working dir (usually '.') (string)
-</dd><dt><i>parent</i></dt>
+the path of the working dir (usually '.')
+</dd><dt><i>parent</i> (QWidget)</dt>
 <dd>
-parent widget of this window (QWidget)
-</dd><dt><i>name</i></dt>
+parent widget of this window
+</dd><dt><i>name</i> (str)</dt>
 <dd>
-name of this window (string)
-</dd><dt><i>fromEric</i></dt>
+name of this window
+</dd><dt><i>fromEric</i> (bool)</dt>
 <dd>
 flag indicating whether it was called from within
-            eric6 (boolean)
-</dd><dt><i>initShortcutsOnly=</i></dt>
+            eric6
+</dd><dt><i>initShortcutsOnly=</i> (bool)</dt>
 <dd>
 flag indicating to just initialize the
-            keyboard shortcuts (boolean)
-</dd><dt><i>searchWord=</i></dt>
+            keyboard shortcuts
+</dd><dt><i>searchWord=</i> (str)</dt>
 <dd>
-word to search for (string)
-</dd><dt><i>private=</i></dt>
+word to search for
+</dd><dt><i>private=</i> (bool)</dt>
 <dd>
-flag indicating a private browsing window (bool)
-</dd><dt><i>qthelp=</i></dt>
+flag indicating a private browsing window
+</dd><dt><i>qthelp=</i> (bool)</dt>
 <dd>
-flag indicating to enable the QtHelp support (bool)
-</dd><dt><i>settingsDir=</i></dt>
+flag indicating to enable the QtHelp support
+</dd><dt><i>settingsDir=</i> (str)</dt>
 <dd>
-directory to be used for the settings files (str)
+directory to be used for the settings files
+</dd><dt><i>restoreSession=</i> (bool)</dt>
+<dd>
+flag indicating a restore session action
 </dd>
 </dl><a NAME="WebBrowserWindow.__TBMenuTriggered" ID="WebBrowserWindow.__TBMenuTriggered"></a>
 <h4>WebBrowserWindow.__TBMenuTriggered</h4>
@@ -1090,18 +1139,10 @@
         Private slot to add a new bookmarks folder.
 </p><a NAME="WebBrowserWindow.__appFocusChanged" ID="WebBrowserWindow.__appFocusChanged"></a>
 <h4>WebBrowserWindow.__appFocusChanged</h4>
-<b>__appFocusChanged</b>(<i>old, now</i>)
+<b>__appFocusChanged</b>(<i></i>)
 <p>
         Private slot to handle a change of the focus.
-</p><dl>
-<dt><i>old</i></dt>
-<dd>
-reference to the widget, that lost focus (QWidget or None)
-</dd><dt><i>now</i></dt>
-<dd>
-reference to the widget having the focus (QWidget or None)
-</dd>
-</dl><a NAME="WebBrowserWindow.__backward" ID="WebBrowserWindow.__backward"></a>
+</p><a NAME="WebBrowserWindow.__backward" ID="WebBrowserWindow.__backward"></a>
 <h4>WebBrowserWindow.__backward</h4>
 <b>__backward</b>(<i></i>)
 <p>
@@ -1135,11 +1176,6 @@
 <b>__clearPrivateData</b>(<i></i>)
 <p>
         Private slot to clear the private data.
-</p><a NAME="WebBrowserWindow.__closeAllWindows" ID="WebBrowserWindow.__closeAllWindows"></a>
-<h4>WebBrowserWindow.__closeAllWindows</h4>
-<b>__closeAllWindows</b>(<i></i>)
-<p>
-        Private slot to close all windows.
 </p><a NAME="WebBrowserWindow.__copy" ID="WebBrowserWindow.__copy"></a>
 <h4>WebBrowserWindow.__copy</h4>
 <b>__copy</b>(<i></i>)
@@ -1470,7 +1506,22 @@
 <b>__setupFilterCombo</b>(<i></i>)
 <p>
         Private slot to setup the filter combo box.
-</p><a NAME="WebBrowserWindow.__showAcceptedLanguages" ID="WebBrowserWindow.__showAcceptedLanguages"></a>
+</p><a NAME="WebBrowserWindow.__shallShutDown" ID="WebBrowserWindow.__shallShutDown"></a>
+<h4>WebBrowserWindow.__shallShutDown</h4>
+<b>__shallShutDown</b>(<i></i>)
+<p>
+        Private method to check, if the application should be shut down.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a shut down
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl><a NAME="WebBrowserWindow.__showAcceptedLanguages" ID="WebBrowserWindow.__showAcceptedLanguages"></a>
 <h4>WebBrowserWindow.__showAcceptedLanguages</h4>
 <b>__showAcceptedLanguages</b>(<i></i>)
 <p>
@@ -1575,6 +1626,11 @@
 <b>__showSearchWindow</b>(<i></i>)
 <p>
         Private method to show the search window.
+</p><a NAME="WebBrowserWindow.__showSessionManagerDialog" ID="WebBrowserWindow.__showSessionManagerDialog"></a>
+<h4>WebBrowserWindow.__showSessionManagerDialog</h4>
+<b>__showSessionManagerDialog</b>(<i></i>)
+<p>
+        Private slot to show the session manager dialog.
 </p><a NAME="WebBrowserWindow.__showSiteinfoDialog" ID="WebBrowserWindow.__showSiteinfoDialog"></a>
 <h4>WebBrowserWindow.__showSiteinfoDialog</h4>
 <b>__showSiteinfoDialog</b>(<i></i>)
@@ -1615,7 +1671,17 @@
 <b>__showZoomValuesDialog</b>(<i></i>)
 <p>
         Private slot to show the zoom values management dialog.
-</p><a NAME="WebBrowserWindow.__stopLoading" ID="WebBrowserWindow.__stopLoading"></a>
+</p><a NAME="WebBrowserWindow.__shutdownWindow" ID="WebBrowserWindow.__shutdownWindow"></a>
+<h4>WebBrowserWindow.__shutdownWindow</h4>
+<b>__shutdownWindow</b>(<i></i>)
+<p>
+        Private method to shut down a web browser window.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating successful shutdown (boolean)
+</dd>
+</dl><a NAME="WebBrowserWindow.__stopLoading" ID="WebBrowserWindow.__stopLoading"></a>
 <h4>WebBrowserWindow.__stopLoading</h4>
 <b>__stopLoading</b>(<i></i>)
 <p>
@@ -1869,7 +1935,12 @@
 <dd>
 mouse buttons (Qt.MouseButtons)
 </dd>
-</dl><a NAME="WebBrowserWindow.fromEric" ID="WebBrowserWindow.fromEric"></a>
+</dl><a NAME="WebBrowserWindow.forceClose" ID="WebBrowserWindow.forceClose"></a>
+<h4>WebBrowserWindow.forceClose</h4>
+<b>forceClose</b>(<i></i>)
+<p>
+        Public method to force closing the window.
+</p><a NAME="WebBrowserWindow.fromEric" ID="WebBrowserWindow.fromEric"></a>
 <h4>WebBrowserWindow.fromEric</h4>
 <b>fromEric</b>(<i></i>)
 <p>
@@ -1905,28 +1976,27 @@
 <dd>
 dictionary with tab id as key and host/namespace as value
 </dd>
-</dl><a NAME="WebBrowserWindow.getWindow" ID="WebBrowserWindow.getWindow"></a>
-<h4>WebBrowserWindow.getWindow</h4>
-<b>getWindow</b>(<i></i>)
-<p>
-        Public method to get a reference to the most recent active
-        web browser window.
-</p><dl>
-<dt>Returns:</dt>
-<dd>
-reference to most recent web browser window
-</dd>
-</dl><dl>
-<dt>Return Type:</dt>
-<dd>
-WebBrowserWindow
-</dd>
 </dl><a NAME="WebBrowserWindow.hideFullScreenNavigation" ID="WebBrowserWindow.hideFullScreenNavigation"></a>
 <h4>WebBrowserWindow.hideFullScreenNavigation</h4>
 <b>hideFullScreenNavigation</b>(<i></i>)
 <p>
         Public slot to hide full screen navigation.
-</p><a NAME="WebBrowserWindow.isFullScreenNavigationVisible" ID="WebBrowserWindow.isFullScreenNavigationVisible"></a>
+</p><a NAME="WebBrowserWindow.isClosing" ID="WebBrowserWindow.isClosing"></a>
+<h4>WebBrowserWindow.isClosing</h4>
+<b>isClosing</b>(<i></i>)
+<p>
+        Public method to test, if the window is closing.
+</p><dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating that the window is closing
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl><a NAME="WebBrowserWindow.isFullScreenNavigationVisible" ID="WebBrowserWindow.isFullScreenNavigationVisible"></a>
 <h4>WebBrowserWindow.isFullScreenNavigationVisible</h4>
 <b>isFullScreenNavigationVisible</b>(<i></i>)
 <p>
@@ -2030,13 +2100,16 @@
 </dd>
 </dl><a NAME="WebBrowserWindow.newWindow" ID="WebBrowserWindow.newWindow"></a>
 <h4>WebBrowserWindow.newWindow</h4>
-<b>newWindow</b>(<i>link=None</i>)
+<b>newWindow</b>(<i>link=None, restoreSession=False</i>)
 <p>
         Public slot called to open a new web browser window.
 </p><dl>
 <dt><i>link</i> (str or QUrl)</dt>
 <dd>
 URL to be displayed in the new window
+</dd><dt><i>restoreSession</i> (bool)</dt>
+<dd>
+flag indicating a restore session action
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/index-eric6.WebBrowser.Session.html	Wed Aug 02 13:28:50 2017 +0200
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.WebBrowser.Session</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body>
+<h1>eric6.WebBrowser.Session</h1>
+<p>
+Package implementing the session related functionality.
+</p>
+
+
+<h3>Modules</h3>
+<table>
+<tr>
+<td><a href="eric6.WebBrowser.Session.SessionManager.html">SessionManager</a></td>
+<td>Module implementing the session manager.</td>
+</tr><tr>
+<td><a href="eric6.WebBrowser.Session.SessionManagerDialog.html">SessionManagerDialog</a></td>
+<td>Module implementing a dialog to manage sessions.</td>
+</tr>
+</table>
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/index-eric6.WebBrowser.html	Thu Jul 06 18:59:43 2017 +0200
+++ b/Documentation/Source/index-eric6.WebBrowser.html	Wed Aug 02 13:28:50 2017 +0200
@@ -88,6 +88,9 @@
 <td><a href="index-eric6.WebBrowser.QtHelp.html">QtHelp</a></td>
 <td>Package containing the interface to QtHelp.</td>
 </tr><tr>
+<td><a href="index-eric6.WebBrowser.Session.html">Session</a></td>
+<td>Package implementing the session related functionality.</td>
+</tr><tr>
 <td><a href="index-eric6.WebBrowser.SiteInfo.html">SiteInfo</a></td>
 <td>Package implementing the site info widgets.</td>
 </tr><tr>
--- a/E5Gui/E5Application.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/E5Gui/E5Application.py	Wed Aug 02 13:28:50 2017 +0200
@@ -26,6 +26,11 @@
         super(E5Application, self).__init__(argv)
         
         QCoreApplication.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)
+        try:
+            QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
+            # __IGNORE_EXCEPTION__
+        except AttributeError:
+            pass
         
         self.__objectRegistry = {}
         self.__pluginObjectRegistry = {}
--- a/E5Gui/E5SimpleHelpDialog.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/E5Gui/E5SimpleHelpDialog.py	Wed Aug 02 13:28:50 2017 +0200
@@ -19,7 +19,7 @@
     """
     Class implementing a dialog to show some help text.
     """
-    def __init__(self, title="", label="", help="", parent=None):
+    def __init__(self, title="", label="", helpStr="", parent=None):
         """
         Constructor
         
@@ -27,7 +27,7 @@
         @type str
         @param label label for the help
         @type str
-        @param help HTML help text
+        @param helpStr HTML help text
         @type str
         @param parent reference to the parent widget
         @type QWidget
@@ -41,4 +41,4 @@
             self.helpLabel.setText(label)
         else:
             self.helpLabel.hide()
-        self.helpEdit.setHtml(help)
+        self.helpEdit.setHtml(helpStr)
--- a/Globals/__init__.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Globals/__init__.py	Wed Aug 02 13:28:50 2017 +0200
@@ -141,11 +141,10 @@
         else:
             cdn = ".eric6"
             
-        hp = QDir.homePath()
-        dn = QDir(hp)
-        dn.mkdir(cdn)
-        hp += "/" + cdn
-    return QDir.toNativeSeparators(hp)
+        hp = os.path.join(os.path.expanduser("~"), cdn)
+        if not os.path.exists(hp):
+            os.mkdir(hp)
+    return hp
 
 
 def setConfigDir(d):
--- a/Plugins/CheckerPlugins/CodeStyleChecker/DocStyleChecker.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Plugins/CheckerPlugins/CodeStyleChecker/DocStyleChecker.py	Wed Aug 02 13:28:50 2017 +0200
@@ -51,6 +51,7 @@
         self.__start = startLine
         self.__indent = ""
         self.__type = contextType
+        self.__special = ""
         
         # ensure first line is left justified
         if self.__source:
@@ -105,6 +106,24 @@
         @return context type (string)
         """
         return self.__type
+    
+    def setSpecial(self, special):
+        """
+        Public method to set a special attribute for the context.
+        
+        @param special attribute string
+        @type str
+        """
+        self.__special = special
+    
+    def special(self):
+        """
+        Public method to get the special context attribute string.
+        
+        @return attribute string
+        @rtype str
+        """
+        return self.__special
 
 
 class DocStyleChecker(object):
@@ -619,9 +638,17 @@
                         end = line - 1, char
                         startLine = classContext.start() + start[0]
                         endLine = classContext.start() + end[0]
-                        contexts.append(DocStyleContext(
+                        context = DocStyleContext(
                             self.__source[startLine:endLine],
-                            startLine, "def"))
+                            startLine, "def")
+                        if startLine > 0:
+                            if self.__source[startLine - 1].strip() == \
+                                    "@staticmethod":
+                                context.setSpecial("staticmethod")
+                            elif self.__source[startLine - 1].strip() == \
+                                    "@classmethod":
+                                context.setSpecial("classmethod")
+                        contexts.append(context)
                 except StopIteration:
                     pass
             self.__methodsCache = contexts
@@ -1356,6 +1383,45 @@
                 if firstWord != 'special':
                     self.__error(docstringContext.start() + lineNumber, 0,
                                  "D232", 'special')
+            elif context.special() == "staticmethod":
+                secondWord = summary.strip().split(None, 2)[1].lower()
+                if firstWord != 'static' and secondWord != 'static':
+                    self.__error(docstringContext.start() + lineNumber, 0,
+                                 "D232", 'static')
+                elif secondWord == 'static':
+                    if functionName.startswith(('__', 'on_')):
+                        if firstWord != 'private':
+                            self.__error(docstringContext.start() + lineNumber,
+                                         0, "D232", 'private static')
+                    elif functionName.startswith('_') or \
+                            functionName.endswith('Event'):
+                        if firstWord != 'protected':
+                            self.__error(docstringContext.start() + lineNumber,
+                                         0, "D232", 'protected static')
+                    else:
+                        if firstWord != 'public':
+                            self.__error(docstringContext.start() + lineNumber,
+                                         0, "D232", 'public static')
+            elif arguments.startswith(('cls,', 'cls)')) or \
+                    context.special() == "classmethod":
+                secondWord = summary.strip().split(None, 2)[1].lower()
+                if firstWord != 'class' and secondWord != 'class':
+                    self.__error(docstringContext.start() + lineNumber, 0,
+                                 "D232", 'class')
+                elif secondWord == 'class':
+                    if functionName.startswith(('__', 'on_')):
+                        if firstWord != 'private':
+                            self.__error(docstringContext.start() + lineNumber,
+                                         0, "D232", 'private class')
+                    elif functionName.startswith('_') or \
+                            functionName.endswith('Event'):
+                        if firstWord != 'protected':
+                            self.__error(docstringContext.start() + lineNumber,
+                                         0, "D232", 'protected class')
+                    else:
+                        if firstWord != 'public':
+                            self.__error(docstringContext.start() + lineNumber,
+                                         0, "D232", 'public class')
             elif functionName.startswith(('__', 'on_')):
                 if firstWord != 'private':
                     self.__error(docstringContext.start() + lineNumber, 0,
@@ -1365,10 +1431,6 @@
                 if firstWord != 'protected':
                     self.__error(docstringContext.start() + lineNumber, 0,
                                  "D232", 'protected')
-            elif arguments.startswith(('cls,', 'cls)')):
-                if firstWord != 'class':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'class')
             else:
                 if firstWord != 'public':
                     self.__error(docstringContext.start() + lineNumber, 0,
--- a/Preferences/ConfigurationPages/ShellPage.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Preferences/ConfigurationPages/ShellPage.py	Wed Aug 02 13:28:50 2017 +0200
@@ -22,6 +22,8 @@
 except AttributeError:
     MonospacedFontsOption = QFontDialog.FontDialogOptions(0x10)
 
+from QScintilla.Shell import ShellHistoryStyle
+
 
 class ShellPage(ConfigurationPageBase, Ui_ShellPage):
     """
@@ -35,6 +37,13 @@
         self.setupUi(self)
         self.setObjectName("ShellPage")
         
+        self.shellHistoryStyleComboBox.addItem(
+            self.tr("Disabled"), ShellHistoryStyle.Disabled.value)
+        self.shellHistoryStyleComboBox.addItem(
+            self.tr("Linux Style"), ShellHistoryStyle.LinuxStyle.value)
+        self.shellHistoryStyleComboBox.addItem(
+            self.tr("Windows Style"), ShellHistoryStyle.WindowsStyle.value)
+        
         # set initial values
         self.shellLinenoCheckBox.setChecked(
             Preferences.getShell("LinenoMargin"))
@@ -48,6 +57,13 @@
             Preferences.getShell("SyntaxHighlightingEnabled"))
         self.shellHistorySpinBox.setValue(
             Preferences.getShell("MaxHistoryEntries"))
+        index = self.shellHistoryStyleComboBox.findData(
+            Preferences.getShell("HistoryStyle").value)
+        self.shellHistoryStyleComboBox.setCurrentIndex(index)
+        self.shellHistoryWrapCheckBox.setChecked(
+            Preferences.getShell("HistoryWrap"))
+        self.shellHistoryCursorKeysCheckBox.setChecked(
+            Preferences.getShell("HistoryNavigateByCursor"))
         self.stdOutErrCheckBox.setChecked(
             Preferences.getShell("ShowStdOutErr"))
         
@@ -81,6 +97,15 @@
             "MaxHistoryEntries",
             self.shellHistorySpinBox.value())
         Preferences.setShell(
+            "HistoryStyle",
+            ShellHistoryStyle(self.shellHistoryStyleComboBox.currentData()))
+        Preferences.setShell(
+            "HistoryWrap",
+            self.shellHistoryWrapCheckBox.isChecked())
+        Preferences.setShell(
+            "HistoryNavigateByCursor",
+            self.shellHistoryCursorKeysCheckBox.isChecked())
+        Preferences.setShell(
             "ShowStdOutErr",
             self.stdOutErrCheckBox.isChecked())
         
--- a/Preferences/ConfigurationPages/ShellPage.ui	Thu Jul 06 18:59:43 2017 +0200
+++ b/Preferences/ConfigurationPages/ShellPage.ui	Wed Aug 02 13:28:50 2017 +0200
@@ -86,59 +86,95 @@
     </layout>
    </item>
    <item>
-    <layout class="QHBoxLayout">
-     <item>
-      <widget class="QLabel" name="textLabel1_20">
-       <property name="text">
-        <string>max. History Entries:</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QSpinBox" name="shellHistorySpinBox">
-       <property name="toolTip">
-        <string>Enter the number of history entries allowed</string>
-       </property>
-       <property name="minimum">
-        <number>10</number>
-       </property>
-       <property name="maximum">
-        <number>1000</number>
-       </property>
-       <property name="singleStep">
-        <number>10</number>
-       </property>
-       <property name="value">
-        <number>100</number>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer>
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeType">
-        <enum>QSizePolicy::Expanding</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="QCheckBox" name="stdOutErrCheckBox">
-     <property name="toolTip">
-      <string>Select to show debuggee stdout and stderr</string>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>History</string>
      </property>
-     <property name="text">
-      <string>Show stdout and stderr of debuggee</string>
-     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QLabel" name="textLabel1_20">
+        <property name="text">
+         <string>max. History Entries:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QSpinBox" name="shellHistorySpinBox">
+        <property name="toolTip">
+         <string>Enter the number of history entries allowed</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+        </property>
+        <property name="minimum">
+         <number>10</number>
+        </property>
+        <property name="maximum">
+         <number>1000</number>
+        </property>
+        <property name="singleStep">
+         <number>10</number>
+        </property>
+        <property name="value">
+         <number>100</number>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <spacer>
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeType">
+         <enum>QSizePolicy::Expanding</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>343</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Navigation Style:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1" colspan="2">
+       <widget class="QComboBox" name="shellHistoryStyleComboBox">
+        <property name="toolTip">
+         <string>Select the history style</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0" colspan="3">
+       <widget class="QCheckBox" name="shellHistoryWrapCheckBox">
+        <property name="toolTip">
+         <string>Select to wrap around while navigating through the history</string>
+        </property>
+        <property name="text">
+         <string>Wrap around while navigating</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="0" colspan="3">
+       <widget class="QCheckBox" name="shellHistoryCursorKeysCheckBox">
+        <property name="toolTip">
+         <string>Select to make Up- and Down-keys move in history</string>
+        </property>
+        <property name="whatsThis">
+         <string>&lt;b&gt;Up/Down keys navigate in history&lt;b&gt;
+&lt;p&gt;Select this entry to make Up- and Down-keys navigate in history. If unselected history navigation may be performed by Ctrl-Up or Ctrl-Down.&lt;/p&gt;</string>
+        </property>
+        <property name="text">
+         <string>Up/Down keys navigate in history</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
     </widget>
    </item>
    <item>
@@ -219,6 +255,16 @@
     </widget>
    </item>
    <item>
+    <widget class="QCheckBox" name="stdOutErrCheckBox">
+     <property name="toolTip">
+      <string>Select to show debuggee stdout and stderr</string>
+     </property>
+     <property name="text">
+      <string>Show stdout and stderr of debuggee</string>
+     </property>
+    </widget>
+   </item>
+   <item>
     <spacer>
      <property name="orientation">
       <enum>Qt::Vertical</enum>
@@ -240,6 +286,13 @@
   <tabstop>shellWordWrapCheckBox</tabstop>
   <tabstop>shellCTEnabledCheckBox</tabstop>
   <tabstop>shellHistorySpinBox</tabstop>
+  <tabstop>shellHistoryStyleComboBox</tabstop>
+  <tabstop>shellHistoryWrapCheckBox</tabstop>
+  <tabstop>shellHistoryCursorKeysCheckBox</tabstop>
+  <tabstop>monospacedFontButton</tabstop>
+  <tabstop>monospacedCheckBox</tabstop>
+  <tabstop>linenumbersFontButton</tabstop>
+  <tabstop>stdOutErrCheckBox</tabstop>
  </tabstops>
  <resources/>
  <connections/>
--- a/Preferences/ConfigurationPages/WebBrowserPage.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Preferences/ConfigurationPages/WebBrowserPage.py	Wed Aug 02 13:28:50 2017 +0200
@@ -92,8 +92,17 @@
         
         self.startupCombo.setCurrentIndex(
             Preferences.getWebBrowser("StartupBehavior"))
+        self.newTabCombo.setCurrentIndex(
+            Preferences.getWebBrowser("NewTabBehavior"))
         self.homePageEdit.setText(
             Preferences.getWebBrowser("HomePage"))
+        self.loadTabOnActivationCheckBox.setChecked(
+            Preferences.getWebBrowser("LoadTabOnActivation"))
+        
+        self.saveSessionCheckBox.setChecked(
+            Preferences.getWebBrowser("SessionAutoSave"))
+        self.sessionTimerSpinBox.setValue(
+            Preferences.getWebBrowser("SessionAutoSaveInterval"))
         
         self.defaultSchemeCombo.setCurrentIndex(
             self.defaultSchemeCombo.findText(
@@ -243,8 +252,21 @@
             "StartupBehavior",
             self.startupCombo.currentIndex())
         Preferences.setWebBrowser(
+            "NewTabBehavior",
+            self.newTabCombo.currentIndex())
+        Preferences.setWebBrowser(
             "HomePage",
             self.homePageEdit.text())
+        Preferences.setWebBrowser(
+            "LoadTabOnActivation",
+            self.loadTabOnActivationCheckBox.isChecked())
+        
+        Preferences.setWebBrowser(
+            "SessionAutoSave",
+            self.saveSessionCheckBox.isChecked())
+        Preferences.setWebBrowser(
+            "SessionAutoSaveInterval",
+            self.sessionTimerSpinBox.value())
         
         Preferences.setWebBrowser(
             "DefaultScheme",
@@ -340,11 +362,16 @@
         
         @param index index of the selected entry (integer)
         """
-        enable = index == 0
+        # set state of the home page related items
+        enable = index == 1
         self.homePageLabel.setEnabled(enable)
         self.homePageEdit.setEnabled(enable)
         self.defaultHomeButton.setEnabled(enable)
         self.setCurrentPageButton.setEnabled(enable)
+        
+        # set state of the session related items
+        self.loadTabOnActivationCheckBox.setEnabled(
+            index in [3, 4])
     
     @pyqtSlot()
     def on_refererWhitelistButton_clicked(self):
--- a/Preferences/ConfigurationPages/WebBrowserPage.ui	Thu Jul 06 18:59:43 2017 +0200
+++ b/Preferences/ConfigurationPages/WebBrowserPage.ui	Wed Aug 02 13:28:50 2017 +0200
@@ -150,6 +150,11 @@
         </property>
         <item>
          <property name="text">
+          <string>Show Empty Page</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
           <string>Show Home Page</string>
          </property>
         </item>
@@ -160,26 +165,60 @@
         </item>
         <item>
          <property name="text">
-          <string>Show Empty Page</string>
+          <string>Restore Session</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Select Session</string>
          </property>
         </item>
        </widget>
       </item>
       <item row="1" column="0">
+       <widget class="QLabel" name="label_12">
+        <property name="text">
+         <string>On new tab:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1" colspan="3">
+       <widget class="QComboBox" name="newTabCombo">
+        <property name="toolTip">
+         <string>Select the behavior of new tabs</string>
+        </property>
+        <item>
+         <property name="text">
+          <string>Show Empty Page</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Show Home Page</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Show Speed Dial</string>
+         </property>
+        </item>
+       </widget>
+      </item>
+      <item row="2" column="0">
        <widget class="QLabel" name="homePageLabel">
         <property name="text">
          <string>Home Page:</string>
         </property>
        </widget>
       </item>
-      <item row="1" column="1" colspan="3">
+      <item row="2" column="1" colspan="3">
        <widget class="QLineEdit" name="homePageEdit">
         <property name="toolTip">
          <string>Enter the desired home page</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="3" column="1">
        <widget class="QPushButton" name="setCurrentPageButton">
         <property name="toolTip">
          <string>Press to set the current page as the home page</string>
@@ -189,7 +228,7 @@
         </property>
        </widget>
       </item>
-      <item row="2" column="2">
+      <item row="3" column="2">
        <widget class="QPushButton" name="defaultHomeButton">
         <property name="toolTip">
          <string>Press to set the default home page</string>
@@ -199,7 +238,7 @@
         </property>
        </widget>
       </item>
-      <item row="2" column="3">
+      <item row="3" column="3">
        <spacer name="horizontalSpacer_2">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
@@ -212,6 +251,86 @@
         </property>
        </spacer>
       </item>
+      <item row="4" column="0" colspan="4">
+       <widget class="QCheckBox" name="loadTabOnActivationCheckBox">
+        <property name="toolTip">
+         <string>Select to load restored tabs when they are activated</string>
+        </property>
+        <property name="text">
+         <string>Load tabs when activated</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+     <zorder>label</zorder>
+     <zorder>startupCombo</zorder>
+     <zorder>homePageLabel</zorder>
+     <zorder>homePageEdit</zorder>
+     <zorder>setCurrentPageButton</zorder>
+     <zorder>defaultHomeButton</zorder>
+     <zorder>label_12</zorder>
+     <zorder>newTabCombo</zorder>
+     <zorder>loadTabOnActivationCheckBox</zorder>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox_8">
+     <property name="title">
+      <string>Sessions</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_6">
+      <item row="0" column="0" colspan="3">
+       <widget class="QCheckBox" name="saveSessionCheckBox">
+        <property name="toolTip">
+         <string>Select to save sessions automatically</string>
+        </property>
+        <property name="text">
+         <string>Save sessions automatically</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_13">
+        <property name="text">
+         <string>Session Timer:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QSpinBox" name="sessionTimerSpinBox">
+        <property name="toolTip">
+         <string>Enter the time to save sessions</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+        </property>
+        <property name="suffix">
+         <string> s</string>
+        </property>
+        <property name="minimum">
+         <number>10</number>
+        </property>
+        <property name="maximum">
+         <number>180</number>
+        </property>
+        <property name="singleStep">
+         <number>1</number>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <spacer name="horizontalSpacer_8">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>443</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
      </layout>
     </widget>
    </item>
@@ -813,9 +932,13 @@
   <tabstop>screenCaptureCheckBox</tabstop>
   <tabstop>webGLCheckBox</tabstop>
   <tabstop>startupCombo</tabstop>
+  <tabstop>newTabCombo</tabstop>
   <tabstop>homePageEdit</tabstop>
   <tabstop>setCurrentPageButton</tabstop>
   <tabstop>defaultHomeButton</tabstop>
+  <tabstop>loadTabOnActivationCheckBox</tabstop>
+  <tabstop>saveSessionCheckBox</tabstop>
+  <tabstop>sessionTimerSpinBox</tabstop>
   <tabstop>defaultSchemeCombo</tabstop>
   <tabstop>jsOpenWindowsCheckBox</tabstop>
   <tabstop>jsClipboardCheckBox</tabstop>
--- a/Preferences/__init__.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Preferences/__init__.py	Wed Aug 02 13:28:50 2017 +0200
@@ -62,6 +62,8 @@
     from WebBrowser.FlashCookieManager.FlashCookieUtilities import \
         flashDataPathForOS
 
+from QScintilla.Shell import ShellHistoryStyle
+
 
 class Prefs(object):
     """
@@ -1032,8 +1034,18 @@
         "StatusBarVisible": True,
         "SaveGeometry": True,
         "WebBrowserState": QByteArray(),
-        "StartupBehavior": 1,      # show speed dial
+        "StartupBehavior": 2,       # show speed dial
+        # 0     open empty page
+        # 1     open home page
+        # 2     open speed dial
+        # 3     restore last session
+        # 4     ask user for session
+        "NewTabBehavior": 2,        # show speed dial
+        # 0     open empty page
+        # 1     open home page
+        # 2     open speed dial
         "HomePage": "eric:home",
+        "LoadTabOnActivation": True,
         "WarnOnMultipleClose": True,
         "DefaultScheme": "https://",
         "UserStyleSheet": "",
@@ -1103,6 +1115,10 @@
         # Flash Cookie Manager: identical to helpDefaults
         # PIM:                  identical to helpDefaults
         # VirusTotal:           identical to helpDefaults
+        # Sessions
+        "SessionAutoSave": True,
+        "SessionAutoSaveInterval": 15,  # interval in seconds
+        "SessionLastActivePath": "",
     }
     if QWebEngineSettings:
         webBrowserDefaults["HelpViewerType"] = 1      # eric browser
@@ -1211,6 +1227,9 @@
         "CallTipsEnabled": True,
         "WrapEnabled": True,
         "MaxHistoryEntries": 100,
+        "HistoryStyle": ShellHistoryStyle.LinuxStyle,
+        "HistoryWrap": False,
+        "HistoryNavigateByCursor": False,
         "SyntaxHighlightingEnabled": True,
         "ShowStdOutErr": True,
         "UseMonospacedFont": False,
@@ -2408,6 +2427,9 @@
     elif key in ["MaxHistoryEntries"]:
         return int(prefClass.settings.value(
             "Shell/" + key, prefClass.shellDefaults[key]))
+    elif key in ["HistoryStyle"]:
+        return ShellHistoryStyle(int(prefClass.settings.value(
+            "Shell/" + key, prefClass.shellDefaults[key].value)))
     else:
         return toBool(prefClass.settings.value(
             "Shell/" + key, prefClass.shellDefaults[key]))
@@ -2423,6 +2445,8 @@
     """
     if key in ["MonospacedFont", "MarginsFont"]:
         prefClass.settings.setValue("Shell/" + key, value.toString())
+    elif key in ["HistoryStyle"]:
+        prefClass.settings.setValue("Shell/" + key, value.value)
     else:
         prefClass.settings.setValue("Shell/" + key, value)
 
@@ -2870,6 +2894,7 @@
                  "MinimumFontSize", "MinimumLogicalFontSize",
                  "DiskCacheSize", "AcceptCookies", "KeepCookiesUntil",
                  "AdBlockUpdatePeriod", "TabManagerGroupByType",
+                 "SessionAutoSaveInterval", "NewTabBehavior",
                  ]:
         return int(prefClass.settings.value(
             "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
@@ -2893,6 +2918,7 @@
                  "PrintElementBackgrounds", "AllowRunningInsecureContent",
                  "SpellCheckEnabled", "ShowToolbars", "MenuBarVisible",
                  "BookmarksToolBarVisible", "StatusBarVisible",
+                 "SessionAutoSave", "LoadTabOnActivation",
                  ]:
         return toBool(prefClass.settings.value(
             "WebBrowser/" + key, prefClass.webBrowserDefaults[key]))
--- a/QScintilla/SearchReplaceWidget.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/QScintilla/SearchReplaceWidget.py	Wed Aug 02 13:28:50 2017 +0200
@@ -337,7 +337,7 @@
             if self.__replace:
                 self.__setReplaceSelectionEnabled(False)
                 self.__setReplaceAndSearchEnabled(False)
-                self.__setReplaceAllEnabled(False)
+                self.__setReplaceAllEnabled(True)
 
     @pyqtSlot()
     def on_findNextButton_clicked(self):
--- a/QScintilla/Shell.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/QScintilla/Shell.py	Wed Aug 02 13:28:50 2017 +0200
@@ -12,6 +12,11 @@
 import sys
 import re
 
+try:
+    from enum import Enum
+except ImportError:
+    from ThirdParty.enum import Enum
+
 from PyQt5.QtCore import pyqtSignal, QFileInfo, Qt, QEvent
 from PyQt5.QtGui import QClipboard, QPalette, QFont
 from PyQt5.QtWidgets import QDialog, QInputDialog, QApplication, QMenu, \
@@ -83,6 +88,15 @@
         return self.__shell
 
 
+class ShellHistoryStyle(Enum):
+    """
+    Class defining the shell history styles.
+    """
+    Disabled = 0
+    LinuxStyle = 1
+    WindowsStyle = 2
+
+
 class Shell(QsciScintillaCompat):
     """
     Class implementing a graphical Python shell.
@@ -90,10 +104,13 @@
     A user can enter commands that are executed in the remote
     Python interpreter.
     
-    @signal searchStringFound(found) emitted to indicate the search
-        result (boolean)
+    @signal searchStringFound(bool) emitted to indicate the search
+        result
+    @signal historyStyleChanged(ShellHistoryStyle) emitted to indicate a
+        change of the history style
     """
     searchStringFound = pyqtSignal(bool)
+    historyStyleChanged = pyqtSignal(ShellHistoryStyle)
     
     def __init__(self, dbs, vm, windowedVariant, parent=None):
         """
@@ -127,9 +144,11 @@
                 """<b>The Shell Window</b>"""
                 """<p>You can use the cursor keys while entering commands."""
                 """ There is also a history of commands that can be recalled"""
-                """ using the up and down cursor keys. Pressing the up or"""
-                """ down key after some text has been entered will start an"""
-                """ incremental search.</p>"""
+                """ using the up and down cursor keys while holding down the"""
+                """ Ctrl-key. This can be switched to just the up and down"""
+                """ cursor keys on the Shell page of the configuration"""
+                """ dialog. Pressing these keys after some text has been"""
+                """ entered will start an incremental search.</p>"""
                 """<p>The shell has some special commands. 'reset' kills the"""
                 """ shell and starts a new one. 'clear' clears the display"""
                 """ of the shell window. 'start' is used to switch the shell"""
@@ -152,9 +171,11 @@
                 """ command while the program being debugged is running.</p>"""
                 """<p>You can use the cursor keys while entering commands."""
                 """ There is also a history of commands that can be recalled"""
-                """ using the up and down cursor keys. Pressing the up or"""
-                """ down key after some text has been entered will start an"""
-                """ incremental search.</p>"""
+                """ using the up and down cursor keys while holding down the"""
+                """ Ctrl-key. This can be switched to just the up and down"""
+                """ cursor keys on the Shell page of the configuration"""
+                """ dialog. Pressing these keys after some text has been"""
+                """ entered will start an incremental search.</p>"""
                 """<p>The shell has some special commands. 'reset' kills the"""
                 """ shell and starts a new one. 'clear' clears the display"""
                 """ of the shell window. 'start' is used to switch the shell"""
@@ -203,17 +224,19 @@
         self.lexer_ = None
         self.completionText = ""
         
+        self.clientType = ''
+        
         # Initialize history
-        self.historyLists = {}
-        self.maxHistoryEntries = Preferences.getShell("MaxHistoryEntries")
-        self.history = []
-        self.histidx = -1
+        self.__historyLists = {}
+        self.__maxHistoryEntries = Preferences.getShell("MaxHistoryEntries")
+        self.__historyStyle = Preferences.getShell("HistoryStyle")
+        self.__historyWrap = Preferences.getShell("HistoryWrap")
+        self.__history = []
+        self.__setHistoryIndex()
         # remove obsolete shell histories (Python and Ruby)
         for clientType in ["Python", "Ruby"]:
             Preferences.Prefs.settings.remove("Shell/Histories/" + clientType)
         
-        self.clientType = ''
-        
         # clear QScintilla defined keyboard commands
         # we do our own handling through the view manager
         self.clearAlternateKeys()
@@ -253,7 +276,8 @@
             self.menu.addAction(self.tr('Cut'), self.cut)
             self.menu.addAction(self.tr('Copy'), self.copy)
             self.menu.addAction(self.tr('Paste'), self.paste)
-            self.menu.addMenu(self.hmenu)
+            self.menu.addMenu(self.hmenu).setEnabled(self.isHistoryEnabled())
+            
             self.menu.addSeparator()
             self.menu.addAction(self.tr('Find'), self.__find)
             self.menu.addSeparator()
@@ -297,10 +321,6 @@
             QsciScintilla.SCI_WORDRIGHT: self.__QScintillaWordRight,
             QsciScintilla.SCI_VCHOME: self.__QScintillaVCHome,
             QsciScintilla.SCI_LINEEND: self.__QScintillaLineEnd,
-            QsciScintilla.SCI_LINEUP: self.__QScintillaCommand,
-            QsciScintilla.SCI_LINEDOWN: self.__QScintillaCommand,
-            QsciScintilla.SCI_LINESCROLLUP: self.__QScintillaHistoryUp,
-            QsciScintilla.SCI_LINESCROLLDOWN: self.__QScintillaHistoryDown,
             
             QsciScintilla.SCI_PAGEUP: self.__QScintillaAutoCompletionCommand,
             QsciScintilla.SCI_PAGEDOWN: self.__QScintillaAutoCompletionCommand,
@@ -312,10 +332,32 @@
             QsciScintilla.SCI_WORDRIGHTEXTEND: self.extendSelectionWordRight,
             QsciScintilla.SCI_VCHOMEEXTEND: self.__QScintillaVCHomeExtend,
             QsciScintilla.SCI_LINEENDEXTEND: self.extendSelectionToEOL,
+            
+            QsciScintilla.SCI_CANCEL: self.__QScintillaCancel,
         }
+        self.__setupCursorKeys()
         
         self.grabGesture(Qt.PinchGesture)
-        
+    
+    def __setupCursorKeys(self):
+        """
+        Private method to setup the cursor up and down mode.
+        """
+        if Preferences.getShell("HistoryNavigateByCursor"):
+            self.supportedEditorCommands.update({
+                QsciScintilla.SCI_LINEUP: self.__QScintillaHistoryUp,
+                QsciScintilla.SCI_LINEDOWN: self.__QScintillaHistoryDown,
+                QsciScintilla.SCI_LINESCROLLUP: self.__QScintillaLineUp,
+                QsciScintilla.SCI_LINESCROLLDOWN: self.__QScintillaLineDown,
+            })
+        else:
+            self.supportedEditorCommands.update({
+                QsciScintilla.SCI_LINEUP: self.__QScintillaLineUp,
+                QsciScintilla.SCI_LINEDOWN: self.__QScintillaLineDown,
+                QsciScintilla.SCI_LINESCROLLUP: self.__QScintillaHistoryUp,
+                QsciScintilla.SCI_LINESCROLLDOWN: self.__QScintillaHistoryDown,
+            })
+    
     def __showLanguageMenu(self):
         """
         Private slot to prepare the language submenu.
@@ -338,7 +380,7 @@
         """
         Public method to shutdown the shell.
         """
-        for clientType in self.historyLists:
+        for clientType in self.__historyLists:
             self.saveHistory(clientType)
         
     def __bindLexer(self, language='Python3'):
@@ -549,21 +591,66 @@
         self.clientCapabilities = cap
         if clType != self.clientType:
             self.clientType = clType
-            self.__bindLexer(clType)
+            self.__bindLexer(self.clientType)
             self.__setTextDisplay()
             self.__setMargin0()
-            self.__setAutoCompletion(clType)
-            self.__setCallTips(clType)
+            self.__setAutoCompletion(self.clientType)
+            self.__setCallTips(self.clientType)
             self.racEnabled = \
                 Preferences.getShell("AutoCompletionEnabled") and \
                 (cap & HasCompleter) > 0
             
-            if clType not in self.historyLists:
+            if self.clientType not in self.__historyLists:
                 # load history list
-                self.loadHistory(clType)
-            self.history = self.historyLists[clType]
-            self.histidx = -1
+                self.loadHistory(self.clientType)
+            self.__history = self.__historyLists[self.clientType]
+            self.__setHistoryIndex()
+    
+    def __setHistoryIndex(self, index=None):
+        """
+        Private method to set the initial history index.
         
+        @param index index value to be set
+        @type int or None
+        """
+        if index is None:
+            # determine based on history style
+            if self.clientType and \
+                    self.__historyStyle == ShellHistoryStyle.WindowsStyle:
+                idx = int(Preferences.Prefs.settings.value(
+                    "Shell/HistoryIndexes/" + self.clientType, -1))
+                if idx >= len(self.__history):
+                    idx = -1
+                self.__histidx = idx
+            else:
+                self.__histidx = -1
+        else:
+            self.__histidx = index
+            if self.__histidx >= len(self.__history):
+                self.__histidx = -1
+            if self.clientType and \
+                    self.__historyStyle == ShellHistoryStyle.WindowsStyle:
+                Preferences.Prefs.settings.setValue(
+                    "Shell/HistoryIndexes/" + self.clientType, self.__histidx)
+    
+    def __isHistoryIndexValid(self):
+        """
+        Private method to test, if the history index is valid.
+        
+        @return flag indicating validity
+        @rtype bool
+        """
+        return (0 <= self.__histidx < len(self.__history))
+    
+    def getHistoryIndex(self):
+        """
+        Public method to get the current value of the history index.
+        
+        @return history index
+        @rtype int
+        """
+        return self.__histidx
+    
     def loadHistory(self, clientType):
         """
         Public method to load the history for the given client type.
@@ -572,9 +659,9 @@
         """
         hl = Preferences.Prefs.settings.value("Shell/Histories/" + clientType)
         if hl is not None:
-            self.historyLists[clientType] = hl[-self.maxHistoryEntries:]
+            self.__historyLists[clientType] = hl[-self.__maxHistoryEntries:]
         else:
-            self.historyLists[clientType] = []
+            self.__historyLists[clientType] = []
         
     def reloadHistory(self):
         """
@@ -582,8 +669,8 @@
         type.
         """
         self.loadHistory(self.clientType)
-        self.history = self.historyLists[self.clientType]
-        self.histidx = -1
+        self.__history = self.__historyLists[self.clientType]
+        self.__setHistoryIndex()
         
     def saveHistory(self, clientType):
         """
@@ -591,9 +678,10 @@
         
         @param clientType type of the debug client (string)
         """
-        if clientType in self.historyLists:
+        if clientType in self.__historyLists:
             Preferences.Prefs.settings.setValue(
-                "Shell/Histories/" + clientType, self.historyLists[clientType])
+                "Shell/Histories/" + clientType,
+                self.__historyLists[clientType])
         
     def getHistory(self, clientType):
         """
@@ -604,9 +692,9 @@
         @return reference to the history list (list of strings)
         """
         if clientType is None:
-            return self.history
-        elif clientType in self.historyLists:
-            return self.historyLists[clientType]
+            return self.__history
+        elif clientType in self.__historyLists:
+            return self.__historyLists[clientType]
         else:
             return []
         
@@ -615,23 +703,26 @@
         Public slot to clear the current history.
         """
         if self.clientType:
-            self.historyLists[self.clientType] = []
-            self.history = self.historyLists[self.clientType]
+            self.__historyLists[self.clientType] = []
+            self.__history = self.__historyLists[self.clientType]
         else:
-            self.history = []
-        self.histidx = -1
+            self.__history = []
+        self.__setHistoryIndex(index=-1)
         
     def selectHistory(self):
         """
         Public slot to select a history entry to execute.
         """
+        current = self.__histidx
+        if current == -1:
+            current = len(self.__history) - 1
         cmd, ok = QInputDialog.getItem(
             self,
             self.tr("Select History"),
             self.tr("Select the history entry to execute"
                     " (most recent shown last)."),
-            self.history,
-            0, False)
+            self.__history,
+            current, False)
         if ok:
             self.__insertHistory(cmd)
         
@@ -640,11 +731,11 @@
         Public slot to show the shell history dialog.
         """
         from .ShellHistoryDialog import ShellHistoryDialog
-        dlg = ShellHistoryDialog(self.history, self.vm, self)
+        dlg = ShellHistoryDialog(self.__history, self.vm, self)
         if dlg.exec_() == QDialog.Accepted:
-            self.historyLists[self.clientType] = dlg.getHistory()
-            self.history = self.historyLists[self.clientType]
-            self.histidx = -1
+            self.__historyLists[self.clientType], idx = dlg.getHistory()
+            self.__history = self.__historyLists[self.clientType]
+            self.__setHistoryIndex(index=idx)
         
     def clearAllHistories(self):
         """
@@ -652,7 +743,7 @@
         """
         Preferences.Prefs.settings.beginGroup("Shell/Histories")
         for clientType in Preferences.Prefs.settings.childKeys():
-            self.historyLists[clientType] = []
+            self.__historyLists[clientType] = []
             self.saveHistory(clientType)
         Preferences.Prefs.settings.endGroup()
         
@@ -905,12 +996,15 @@
         lines = QApplication.clipboard().text(QClipboard.Selection)
         self.executeLines(lines)
         
-    def executeLines(self, lines):
+    def executeLines(self, lines, historyIndex=None):
         """
         Public method to execute a set of lines as multiple commands.
         
-        @param lines multiple lines of text to be executed as single
-            commands (string)
+        @param lines multiple lines of text to be executed as
+            single commands
+        @type str
+        @param historyIndex history index to be set
+        @type int
         """
         for line in lines.splitlines(True):
             if line.endswith("\r\n"):
@@ -931,7 +1025,7 @@
                 elif cmd.startswith(sys.ps2):
                     cmd = cmd[len(sys.ps2):]
                 
-                self.__executeCommand(cmd)
+                self.__executeCommand(cmd, historyIndex=historyIndex)
                 if self.interruptCommandExecution:
                     self.__executeCommand("")
                     break
@@ -1336,69 +1430,114 @@
             self.SendScintilla(cmd)
         elif self.__isCursorOnLastLine():
             self.moveCursorToEOL()
+    
+    def __QScintillaLineUp(self, cmd):
+        """
+        Private method to handle the cursor up command.
         
+        @param cmd QScintilla command
+        """
+        self.SendScintilla(QsciScintilla.SCI_LINEUP)
+    
+    def __QScintillaLineDown(self, cmd):
+        """
+        Private method to handle the cursor down command.
+        
+        @param cmd QScintilla command
+        """
+        self.SendScintilla(QsciScintilla.SCI_LINEDOWN)
+    
     def __QScintillaHistoryUp(self, cmd):
         """
-        Private method to handle the Ctrl+Up key.
+        Private method to handle the history up command.
         
         @param cmd QScintilla command
         """
-        line, col = self.__getEndPos()
-        buf = self.text(line)
-        if buf.startswith(sys.ps1):
-            buf = buf.replace(sys.ps1, "")
-        if buf.startswith(sys.ps2):
-            buf = buf.replace(sys.ps2, "")
-        if buf and self.incrementalSearchActive:
-            if self.incrementalSearchString:
-                idx = self.__rsearchHistory(self.incrementalSearchString,
-                                            self.histidx)
-                if idx >= 0:
-                    self.histidx = idx
+        if self.isHistoryEnabled():
+            line, col = self.__getEndPos()
+            buf = self.text(line)
+            if buf.startswith(sys.ps1):
+                buf = buf.replace(sys.ps1, "")
+            if buf.startswith(sys.ps2):
+                buf = buf.replace(sys.ps2, "")
+            if buf and self.incrementalSearchActive:
+                if self.incrementalSearchString and \
+                   buf.startswith(self.incrementalSearchString):
+                    idx, found = self.__rsearchHistory(
+                        self.incrementalSearchString, self.__histidx)
+                    if found and idx >= 0:
+                        self.__setHistoryIndex(index=idx)
+                        self.__useHistory()
+                else:
+                    idx, found = self.__rsearchHistory(buf)
+                    if found and idx >= 0:
+                        self.__setHistoryIndex(index=idx)
+                        self.incrementalSearchString = buf
+                        self.__useHistory()
+            else:
+                if self.__historyWrap:
+                    if self.__histidx < 0:
+                        # wrap around
+                        self.__setHistoryIndex(index=len(self.__history) - 1)
+                    else:
+                        self.__setHistoryIndex(index=self.__histidx - 1)
                     self.__useHistory()
-            else:
-                idx = self.__rsearchHistory(buf)
-                if idx >= 0:
-                    self.histidx = idx
-                    self.incrementalSearchString = buf
-                    self.__useHistory()
-        else:
-            if self.histidx < 0:
-                self.histidx = len(self.history)
-            if self.histidx > 0:
-                self.histidx = self.histidx - 1
-                self.__useHistory()
-        
+                else:
+                    if self.__histidx < 0:
+                        self.__setHistoryIndex(index=len(self.__history) - 1)
+                        self.__useHistory()
+                    elif self.__histidx > 0:
+                        self.__setHistoryIndex(index=self.__histidx - 1)
+                        self.__useHistory()
+    
     def __QScintillaHistoryDown(self, cmd):
         """
-        Private method to handle the Ctrl+Down key.
+        Private method to handle the history down command.
         
         @param cmd QScintilla command
         """
-        line, col = self.__getEndPos()
-        buf = self.text(line)
-        if buf.startswith(sys.ps1):
-            buf = buf.replace(sys.ps1, "")
-        if buf.startswith(sys.ps2):
-            buf = buf.replace(sys.ps2, "")
-        if buf and self.incrementalSearchActive:
-            if self.incrementalSearchString:
-                idx = self.__searchHistory(
-                    self.incrementalSearchString, self.histidx)
-                if idx >= 0:
-                    self.histidx = idx
+        if self.isHistoryEnabled():
+            line, col = self.__getEndPos()
+            buf = self.text(line)
+            if buf.startswith(sys.ps1):
+                buf = buf.replace(sys.ps1, "")
+            if buf.startswith(sys.ps2):
+                buf = buf.replace(sys.ps2, "")
+            if buf and self.incrementalSearchActive:
+                if self.incrementalSearchString and \
+                   buf.startswith(self.incrementalSearchString):
+                    idx, found = self.__searchHistory(
+                        self.incrementalSearchString, self.__histidx)
+                    if found and idx >= 0:
+                        self.__setHistoryIndex(index=idx)
+                        self.__useHistory()
+                else:
+                    idx, found = self.__searchHistory(buf)
+                    if found and idx >= 0:
+                        self.__setHistoryIndex(index=idx)
+                        self.incrementalSearchString = buf
+                        self.__useHistory()
+            else:
+                if self.__historyWrap:
+                    if self.__histidx >= len(self.__history) - 1:
+                        # wrap around
+                        self.__setHistoryIndex(index=0)
+                    else:
+                        self.__setHistoryIndex(index=self.__histidx + 1)
                     self.__useHistory()
-            else:
-                idx = self.__searchHistory(buf)
-                if idx >= 0:
-                    self.histidx = idx
-                    self.incrementalSearchString = buf
-                    self.__useHistory()
-        else:
-            if self.histidx >= 0 and self.histidx < len(self.history):
-                self.histidx += 1
-                self.__useHistory()
-        
+                else:
+                    if self.__isHistoryIndexValid():
+                        self.__setHistoryIndex(index=self.__histidx + 1)
+                        self.__useHistory()
+    
+    def __QScintillaCancel(self):
+        """
+        Private method to handle the ESC command.
+        """
+        if self.incrementalSearchActive:
+            self.__resetIncrementalHistorySearch()
+        self.__insertHistory("")
+    
     def __QScintillaCharLeftExtend(self):
         """
         Private method to handle the Extend Selection Left command.
@@ -1437,22 +1576,38 @@
         if self.isListActive() or self.isCallTipActive():
             self.SendScintilla(cmd)
         
-    def __executeCommand(self, cmd):
+    def __executeCommand(self, cmd, historyIndex=None):
         """
         Private slot to execute a command.
         
-        @param cmd command to be executed by debug client (string)
+        @param cmd command to be executed by debug client
+        @type str
+        @param historyIndex history index to be set
+        @type int
         """
         if not self.inRawMode:
             self.inCommandExecution = True
             self.interruptCommandExecution = False
             if not cmd:
+                # make sure cmd is a string
                 cmd = ''
-            if len(self.history) == 0 or self.history[-1] != cmd:
-                if len(self.history) == self.maxHistoryEntries:
-                    del self.history[0]
-                self.history.append(cmd)
-            self.histidx = -1
+            
+            # History Handling
+            if self.isHistoryEnabled():
+                if cmd != "" and (
+                        len(self.__history) == 0 or self.__history[-1] != cmd):
+                    if len(self.__history) == self.__maxHistoryEntries:
+                        del self.__history[0]
+                    self.__history.append(cmd)
+                if self.__historyStyle == ShellHistoryStyle.LinuxStyle:
+                    self.__setHistoryIndex(index=-1)
+                elif self.__historyStyle == ShellHistoryStyle.WindowsStyle:
+                    if historyIndex is None:
+                        if cmd != self.__history[self.__histidx - 1]:
+                            self.__setHistoryIndex(index=-1)
+                    else:
+                        self.__setHistoryIndex(historyIndex)
+            
             if cmd.startswith('start '):
                 if not self.passive:
                     cmdList = cmd.split(None, 1)
@@ -1522,12 +1677,11 @@
         """
         Private method to display a command from the history.
         """
-        if self.histidx < len(self.history):
-            cmd = self.history[self.histidx]
+        if self.__isHistoryIndexValid():
+            cmd = self.__history[self.__histidx]
         else:
             cmd = ""
-            self.incrementalSearchString = ""
-            self.incrementalSearchActive = False
+            self.__resetIncrementalHistorySearch()
         
         self.__insertHistory(cmd)
 
@@ -1542,40 +1696,58 @@
                           self.prline, self.lineLength(self.prline))
         self.removeSelectedText()
         self.__insertText(cmd)
-        
+    
+    def __resetIncrementalHistorySearch(self):
+        """
+        Private method to reset the incremental history search.
+        """
+        self.incrementalSearchString = ""
+        self.incrementalSearchActive = False
+    
     def __searchHistory(self, txt, startIdx=-1):
         """
         Private method used to search the history.
         
-        @param txt text to match at the beginning (string)
-        @param startIdx index to start search from (integer)
-        @return index of found entry (integer)
+        @param txt text to match at the beginning
+        @type str
+        @param startIdx index to start search from
+        @type int
+        @return tuple containing the index of found entry and a flag indicating
+            that something was found
+        @rtype tuple of (int, bool)
         """
         if startIdx == -1:
             idx = 0
         else:
             idx = startIdx + 1
-        while idx < len(self.history) and \
-                not self.history[idx].startswith(txt):
+        while idx < len(self.__history) and \
+                not self.__history[idx].startswith(txt):
             idx += 1
-        return idx
+        found = (idx < len(self.__history) and
+                 self.__history[idx].startswith(txt))
+        return idx, found
         
     def __rsearchHistory(self, txt, startIdx=-1):
         """
         Private method used to reverse search the history.
         
-        @param txt text to match at the beginning (string)
-        @param startIdx index to start search from (integer)
-        @return index of found entry (integer)
+        @param txt text to match at the beginning
+        @type str
+        @param startIdx index to start search from
+        @type int
+        @return tuple containing the index of found entry and a flag indicating
+            that something was found
+        @rtype tuple of (int, bool)
         """
         if startIdx == -1:
-            idx = len(self.history) - 1
+            idx = len(self.__history) - 1
         else:
             idx = startIdx - 1
         while idx >= 0 and \
-                not self.history[idx].startswith(txt):
+                not self.__history[idx].startswith(txt):
             idx -= 1
-        return idx
+        found = idx >= 0 and self.__history[idx].startswith(txt)
+        return idx, found
         
     def focusNextPrevChild(self, nextChild):
         """
@@ -1649,10 +1821,17 @@
         self.__setCallTips()
         
         # do the history related stuff
-        self.maxHistoryEntries = Preferences.getShell("MaxHistoryEntries")
-        for key in list(self.historyLists.keys()):
-            self.historyLists[key] = \
-                self.historyLists[key][-self.maxHistoryEntries:]
+        self.__maxHistoryEntries = Preferences.getShell("MaxHistoryEntries")
+        for key in list(self.__historyLists.keys()):
+            self.__historyLists[key] = \
+                self.__historyLists[key][-self.__maxHistoryEntries:]
+        self.__historyStyle = Preferences.getShell("HistoryStyle")
+        self.__historyWrap = Preferences.getShell("HistoryWrap")
+        self.__setHistoryIndex()
+        if not self.__windowed:
+            self.hmenu.menuAction().setEnabled(self.isHistoryEnabled())
+        self.__setupCursorKeys()
+        self.historyStyleChanged.emit(self.__historyStyle)
         
         # do stdout /stderr stuff
         showStdOutErr = Preferences.getShell("ShowStdOutErr")
@@ -1898,3 +2077,21 @@
             txt, False, caseSensitive, wholeWord, False,
             forward=False, line=line, index=index)
         self.searchStringFound.emit(ok)
+    
+    def historyStyle(self):
+        """
+        Public method to get the shell history style.
+        
+        @return shell history style
+        @rtype ShellHistoryStyle
+        """
+        return self.__historyStyle
+    
+    def isHistoryEnabled(self):
+        """
+        Public method to check, if the history is enabled.
+        
+        @return flag indicating if history is enabled
+        @rtype bool
+        """
+        return self.__historyStyle != ShellHistoryStyle.Disabled
--- a/QScintilla/ShellHistoryDialog.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/QScintilla/ShellHistoryDialog.py	Wed Aug 02 13:28:50 2017 +0200
@@ -11,7 +11,7 @@
 
 import os
 
-from PyQt5.QtCore import pyqtSlot, QItemSelectionModel
+from PyQt5.QtCore import pyqtSlot, Qt, QItemSelectionModel
 from PyQt5.QtWidgets import QListWidgetItem, QDialog
 
 from .Ui_ShellHistoryDialog import Ui_ShellHistoryDialog
@@ -25,20 +25,27 @@
         """
         Constructor
         
-        @param history reference to the current shell history (list of strings)
+        @param history reference to the current shell history
+        @type list of str
         @param vm reference to the viewmanager object
+        @type ViewManager
         @param shell reference to the shell object
+        @type Shell
         """
         super(ShellHistoryDialog, self).__init__(shell)
         self.setupUi(self)
         
+        self.__vm = vm
+        self.__shell = shell
+        
         self.historyList.addItems(history)
-        self.historyList.setCurrentRow(
-            self.historyList.count() - 1, QItemSelectionModel.Clear)
+        index = shell.getHistoryIndex()
+        if index < 0 or index >= len(history):
+            self.historyList.setCurrentRow(
+                self.historyList.count() - 1, QItemSelectionModel.Select)
+        else:
+            self.historyList.setCurrentRow(index, QItemSelectionModel.Select)
         self.historyList.scrollToItem(self.historyList.currentItem())
-        
-        self.vm = vm
-        self.shell = shell
     
     @pyqtSlot()
     def on_historyList_itemSelectionChanged(self):
@@ -47,7 +54,7 @@
         """
         selected = len(self.historyList.selectedItems()) > 0
         self.copyButton.setEnabled(selected and
-                                   self.vm.activeWindow() is not None)
+                                   self.__vm.activeWindow() is not None)
         self.deleteButton.setEnabled(selected)
         self.executeButton.setEnabled(selected)
     
@@ -77,7 +84,7 @@
         """
         Private slot to copy the selected entries to the current editor.
         """
-        aw = self.vm.activeWindow()
+        aw = self.__vm.activeWindow()
         if aw is not None:
             lines = []
             for index in range(self.historyList.count()):
@@ -102,7 +109,9 @@
             if itm.isSelected():
                 lines.append(itm.text())
         cmds = os.linesep.join(lines) + os.linesep
-        self.shell.executeLines(cmds)
+        self.__shell.executeLines(
+            cmds,
+            historyIndex=self.historyList.currentRow())
         
         # reload the list because shell modified it
         self.on_reloadButton_clicked()
@@ -112,20 +121,29 @@
         """
         Private slot to reload the history.
         """
-        history = self.shell.getHistory(None)
+        history = self.__shell.getHistory(None)
+        index = self.__shell.getHistoryIndex()
+        
         self.historyList.clear()
         self.historyList.addItems(history)
-        self.historyList.setCurrentRow(
-            self.historyList.count() - 1, QItemSelectionModel.Clear)
+        if index < 0 or index >= len(history):
+            self.historyList.setCurrentRow(
+                self.historyList.count() - 1, QItemSelectionModel.Select)
+        else:
+            self.historyList.setCurrentRow(index, QItemSelectionModel.Select)
         self.historyList.scrollToItem(self.historyList.currentItem())
         
+        self.historyList.setFocus(Qt.OtherFocusReason)
+        
     def getHistory(self):
         """
         Public method to retrieve the history from the dialog.
         
-        @return list of history entries (list of strings)
+        @return tuple containing the list of history entries and the
+            current row
+        @rtype tuple of (list of str, int)
         """
         history = []
         for index in range(self.historyList.count()):
             history.append(self.historyList.item(index).text())
-        return history
+        return history, self.historyList.currentRow()
--- a/QScintilla/ShellWindow.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/QScintilla/ShellWindow.py	Wed Aug 02 13:28:50 2017 +0200
@@ -92,6 +92,8 @@
         
         self.__readSettings()
         
+        self.__shell.historyStyleChanged.connect(self.__historyStyleChanged)
+        
         # now start the debug client
         self.__debugServer.startClient(False)
         
@@ -1132,6 +1134,7 @@
         self.__historyMenu.addAction(self.selectHistoryAct)
         self.__historyMenu.addAction(self.showHistoryAct)
         self.__historyMenu.addAction(self.clearHistoryAct)
+        self.__historyMenu.setEnabled(self.__shell.isHistoryEnabled())
         
         self.__startMenu = self.menuBar().addMenu(self.tr("&Start"))
         self.__startMenu.aboutToShow.connect(self.__showLanguageMenu)
@@ -1203,10 +1206,11 @@
         viewtb.addAction(self.zoomResetAct)
         viewtb.addAction(self.zoomToAct)
         
-        historytb = self.addToolBar(self.tr("History"))
-        historytb.setIconSize(UI.Config.ToolBarIconSize)
-        historytb.addAction(self.showHistoryAct)
-        historytb.addAction(self.clearHistoryAct)
+        self.__historyToolbar = self.addToolBar(self.tr("History"))
+        self.__historyToolbar.setIconSize(UI.Config.ToolBarIconSize)
+        self.__historyToolbar.addAction(self.showHistoryAct)
+        self.__historyToolbar.addAction(self.clearHistoryAct)
+        self.__historyToolbar.setEnabled(self.__shell.isHistoryEnabled())
         
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setIconSize(UI.Config.ToolBarIconSize)
@@ -1235,3 +1239,14 @@
         
         self.__sbZoom.valueChanged.connect(self.__zoomTo)
         self.__sbZoom.setValue(0)
+    
+    def __historyStyleChanged(self, historyStyle):
+        """
+        Private slot to handle a change of the shell history style.
+        
+        @param historyStyle style to be used for the history
+        @type ShellHistoryStyle
+        """
+        enabled = self.__shell.isHistoryEnabled()
+        self.__historyMenu.setEnabled(enabled)
+        self.__historyToolbar.setEnabled(enabled)
--- a/QScintilla/SpellChecker.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/QScintilla/SpellChecker.py	Wed Aug 02 13:28:50 2017 +0200
@@ -129,7 +129,7 @@
     @classmethod
     def _getDict(cls, lang, pwl="", pel=""):
         """
-        Protected classmethod to get a new dictionary.
+        Protected class method to get a new dictionary.
         
         @param lang the language to be used as the default (string).
             The string should be in language locale format (e.g. en_US, de).
--- a/Templates/TemplatePropertiesDialog.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Templates/TemplatePropertiesDialog.py	Wed Aug 02 13:28:50 2017 +0200
@@ -117,11 +117,11 @@
             self.__helpDialog = E5SimpleHelpDialog(
                 title=self.tr("Template Help"),
                 label=self.tr("<b>Template Help</b>"),
-                help=self.tr(
+                helpStr=self.tr(
                     """<p>To use variables in a template, you just have to"""
-                    """ enclose the variablename with $-characters. When you"""
-                    """ use the template, you will then be asked for a value"""
-                    """ for this variable.</p>"""
+                    """ enclose the variable name with $-characters. When"""
+                    """ you use the template, you will then be asked for a"""
+                    """ value for this variable.</p>"""
                     """<p>Example template: This is a $VAR$</p>"""
                     """<p>When you use this template you will be prompted"""
                     """ for a value for the variable $VAR$. Any occurrences"""
@@ -133,9 +133,9 @@
                     """ automatically be replaced with a single $-character"""
                     """ when you use the template.</p>"""
                     """<p>If you want a variables contents to be treated"""
-                    """ specially, the variablename must be followed by a"""
-                    """ ': and one formatting specifier (e.g. $VAR:ml$). The"""
-                    """ supported specifiers are:"""
+                    """ specially, the variable name must be followed by a"""
+                    """ ':' and one formatting specifier (e.g. $VAR:ml$)."""
+                    """ The supported specifiers are:"""
                     """<table>"""
                     """<tr><td>ml</td><td>Specifies a multiline formatting."""
                     """ The first line of the variable contents is prefixed"""
@@ -146,7 +146,7 @@
                     """</td></tr>"""
                     """<tr><td>rl</td><td>Specifies a repeated line"""
                     """ formatting. Each line of the variable contents is"""
-                    """ prefixed with the string occuring before the"""
+                    """ prefixed with the string occurring before the"""
                     """ variable on the same line of the template."""
                     """</td></tr>"""
                     """</table></p>"""
@@ -157,16 +157,25 @@
                     """<td>today's date in ISO format (YYYY-MM-DD)</td></tr>"""
                     """<tr><td>year</td>"""
                     """<td>the current year</td></tr>"""
+                    """<tr><td>time</td>"""
+                    """<td>current time in ISO format (hh:mm:ss)</td></tr>"""
                     """<tr><td>project_name</td>"""
                     """<td>the name of the project (if any)</td></tr>"""
                     """<tr><td>project_path</td>"""
                     """<td>the path of the project (if any)</td></tr>"""
                     """<tr><td>path_name</td>"""
                     """<td>full path of the current file</td></tr>"""
+                    """<tr><td>path_name_rel</td>"""
+                    """<td>project relative path of the current file</td>"""
+                    """</tr>"""
                     """<tr><td>dir_name</td>"""
-                    """<td>full path of the parent directory</td></tr>"""
+                    """<td>full path of the current file's directory</td>"""
+                    """</tr>"""
+                    """<tr><td>dir_name_rel</td>"""
+                    """<td>project relative path of the current file's"""
+                    """ directory</td></tr>"""
                     """<tr><td>file_name</td>"""
-                    """<td>the current file name (without directory)"""
+                    """<td>the current file's name (without directory)"""
                     """</td></tr>"""
                     """<tr><td>base_name</td>"""
                     """<td>like <i>file_name</i>, but without extension"""
--- a/Templates/TemplateViewer.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Templates/TemplateViewer.py	Wed Aug 02 13:28:50 2017 +0200
@@ -632,11 +632,14 @@
         """
         project = e5App().getObject("Project")
         editor = self.viewmanager.activeWindow()
-        today = datetime.datetime.now().date()
+        now = datetime.datetime.now()
         sepchar = Preferences.getTemplates("SeparatorChar")
         keyfmt = sepchar + "{0}" + sepchar
-        varValues = {keyfmt.format('date'): today.isoformat(),
-                     keyfmt.format('year'): str(today.year)}
+        varValues = {
+            keyfmt.format('date'): now.date().isoformat(),
+            keyfmt.format('year'): str(now.date().year),
+            keyfmt.format('time'): now.time().strftime("%H:%M:%S"),
+        }
 
         if project.name:
             varValues[keyfmt.format('project_name')] = project.name
@@ -650,9 +653,13 @@
             base_name, ext = os.path.splitext(file_name)
             if ext:
                 ext = ext[1:]
+            path_name_rel = project.getRelativePath(path_name)
+            dir_name_rel = project.getRelativePath(dir_name)
             varValues.update({
                 keyfmt.format('path_name'): path_name,
+                keyfmt.format('path_name_rel'): path_name_rel,
                 keyfmt.format('dir_name'): dir_name,
+                keyfmt.format('dir_name_rel'): dir_name_rel,
                 keyfmt.format('file_name'): file_name,
                 keyfmt.format('base_name'): base_name,
                 keyfmt.format('ext'): ext
--- a/Toolbox/PyQt4ImportHook.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/Toolbox/PyQt4ImportHook.py	Wed Aug 02 13:28:50 2017 +0200
@@ -10,6 +10,82 @@
 from __future__ import unicode_literals
 
 import sys
+import importlib
+
+
+class PyQt4Importer(object):
+    """
+    Class implementing an importer converting PyQt5 imports to PyQt4
+    imports.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.__path = None
+    
+    def find_module(self, fullname, path=None):
+        """
+        Public method returning the module loader.
+        
+        @param fullname name of the module to be loaded (string)
+        @param path path to resolve the module name (string)
+        @return module loader object
+        """
+        if fullname.startswith("PyQt5"):
+            self.__path = path
+            return self
+        
+        return None
+    
+    @staticmethod
+    def QComboBox_currentData(other, role=None):
+        """
+        Static method to emulate the currentData method of Qt5.
+        
+        @param other reference to the combo box to get the user data of
+        @type QComboBox
+        @param role role of which data should be retrieved
+        @type int
+        @return stored data at current selection
+        @rtype any
+        """
+        import PyQt4.Qt
+        if role is None:
+            role = PyQt4.Qt.Qt.UserRole
+        
+        idx = other.currentIndex()
+        return other.itemData(idx, role)
+    
+    def load_module(self, fullname):
+        """
+        Public method to load a module.
+        
+        @param fullname name of the module to be loaded (string)
+        @return reference to the loaded module (module)
+        """
+        if fullname in ["PyQt5.QtWidgets", "PyQt5.QtPrintSupport"]:
+            newname = "PyQt4.QtGui"
+        elif fullname in ["PyQt5.QtWebKitWidgets"]:
+            newname = "PyQt4.QtWebKit"
+        else:
+            newname = fullname.replace("PyQt5", "PyQt4")
+        
+        module = importlib.import_module(newname)
+        sys.modules[fullname] = module
+        if fullname == "PyQt5.QtCore":
+            import PyQt4.QtGui
+            module.qInstallMessageHandler = module.qInstallMsgHandler
+            module.QItemSelectionModel = PyQt4.QtGui.QItemSelectionModel
+            module.QItemSelection = PyQt4.QtGui.QItemSelection
+            module.QSortFilterProxyModel = \
+                PyQt4.QtGui.QSortFilterProxyModel
+            module.QAbstractProxyModel = PyQt4.QtGui.QAbstractProxyModel
+            module.QStringListModel = PyQt4.QtGui.QStringListModel
+            
+            PyQt4.QtGui.QComboBox.currentData = self.QComboBox_currentData
+        return module
+
 try:
     if "--pyqt4" in sys.argv:
         sys.argv.remove("--pyqt4")
@@ -17,60 +93,6 @@
         raise ImportError
     import PyQt5    # __IGNORE_WARNING__
 except ImportError:
-    import importlib
-
-    class PyQt4Importer(object):
-        """
-        Class implementing an importer converting PyQt5 imports to PyQt4
-        imports.
-        """
-        def __init__(self):
-            """
-            Constructor
-            """
-            self.__path = None
-        
-        def find_module(self, fullname, path=None):
-            """
-            Public method returning the module loader.
-            
-            @param fullname name of the module to be loaded (string)
-            @param path path to resolve the module name (string)
-            @return module loader object
-            """
-            if fullname.startswith("PyQt5"):
-                self.__path = path
-                return self
-            
-            return None
-        
-        def load_module(self, fullname):
-            """
-            Public method to load a module.
-            
-            @param fullname name of the module to be loaded (string)
-            @return reference to the loaded module (module)
-            """
-            if fullname in ["PyQt5.QtWidgets", "PyQt5.QtPrintSupport"]:
-                newname = "PyQt4.QtGui"
-            elif fullname in ["PyQt5.QtWebKitWidgets"]:
-                newname = "PyQt4.QtWebKit"
-            else:
-                newname = fullname.replace("PyQt5", "PyQt4")
-            
-            module = importlib.import_module(newname)
-            sys.modules[fullname] = module
-            if fullname == "PyQt5.QtCore":
-                import PyQt4.QtGui
-                module.qInstallMessageHandler = module.qInstallMsgHandler
-                module.QItemSelectionModel = PyQt4.QtGui.QItemSelectionModel
-                module.QItemSelection = PyQt4.QtGui.QItemSelection
-                module.QSortFilterProxyModel = \
-                    PyQt4.QtGui.QSortFilterProxyModel
-                module.QAbstractProxyModel = PyQt4.QtGui.QAbstractProxyModel
-                module.QStringListModel = PyQt4.QtGui.QStringListModel
-            return module
-
     sys.meta_path.insert(0, PyQt4Importer())
     
     if sys.version_info[0] == 2:
--- a/UI/EmailDialog.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/UI/EmailDialog.py	Wed Aug 02 13:28:50 2017 +0200
@@ -166,9 +166,9 @@
         if self.__helpDialog is None:
             try:
                 from E5Network.E5GoogleMail import GoogleMailHelp
-                help = GoogleMailHelp()
+                helpStr = GoogleMailHelp()
             except ImportError:
-                help = self.tr(
+                helpStr = self.tr(
                     "<p>The Google Mail Client API is not installed."
                     " Use <code>pip install --upgrade google-api-python-client"
                     "</code> to install it.</p>")
@@ -176,7 +176,7 @@
             from E5Gui.E5SimpleHelpDialog import E5SimpleHelpDialog
             self.__helpDialog = E5SimpleHelpDialog(
                 title=self.tr("Gmail API Help"),
-                help=help, parent=self)
+                helpStr=helpStr, parent=self)
         
         self.__helpDialog.show()
     
@@ -393,12 +393,11 @@
                 return False
         return True
     
-
     def __sendmailGoogle(self, msg):
         """
         Private method to actually send the message via Google Mail.
         
-        @param message email message to be sent
+        @param msg email message to be sent
         @type email.mime.text.MIMEBase
         @return flag indicating success
         @rtype bool
--- a/UI/Previewers/PreviewerHTML.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/UI/Previewers/PreviewerHTML.py	Wed Aug 02 13:28:50 2017 +0200
@@ -246,21 +246,24 @@
                 frame.scrollBarMaximum(Qt.Vertical) == pos.y()
         else:
             from PyQt5.QtCore import QPoint
-            pos = self.__execJavaScript(
-                "(function() {"
-                "var res = {"
-                "    x: 0,"
-                "    y: 0,"
-                "};"
-                "res.x = window.scrollX;"
-                "res.y = window.scrollY;"
-                "return res;"
-                "})()"
-            )
-            if pos is not None:
-                pos = QPoint(pos["x"], pos["y"])
-            else:
-                pos = QPoint(0, 0)
+            try:
+                pos = self.previewView.scrollPosition()
+            except AttributeError:
+                pos = self.__execJavaScript(
+                    "(function() {"
+                    "var res = {"
+                    "    x: 0,"
+                    "    y: 0,"
+                    "};"
+                    "res.x = window.scrollX;"
+                    "res.y = window.scrollY;"
+                    "return res;"
+                    "})()"
+                )
+                if pos is not None:
+                    pos = QPoint(pos["x"], pos["y"])
+                else:
+                    pos = QPoint(0, 0)
             self.__scrollBarPositions[self.__previewedPath] = pos
             self.__hScrollBarAtEnd[self.__previewedPath] = False
             self.__vScrollBarAtEnd[self.__previewedPath] = False
--- a/WebBrowser/CookieJar/CookieJar.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/WebBrowser/CookieJar/CookieJar.py	Wed Aug 02 13:28:50 2017 +0200
@@ -214,14 +214,16 @@
         if self.__acceptCookies == self.AcceptOnlyFromSitesNavigatedTo:
             mainWindow = WebBrowserWindow.mainWindow()
             if mainWindow is not None:
-                url = mainWindow.getWindow().currentBrowser().url()
-                if url.isValid():
-                    host = url.host()
-                else:
-                    host = ""
-                res = self.__matchDomain(cookieDomain, host)
-                if not res:
-                    return True
+                browser = mainWindow.getWindow().currentBrowser()
+                if browser is not None:
+                    url = browser.url()
+                    if url.isValid():
+                        host = url.host()
+                    else:
+                        host = ""
+                    res = self.__matchDomain(cookieDomain, host)
+                    if not res:
+                        return True
         
         if self.__filterTrackingCookies and cookie.name().startsWith(b"__utm"):
             return True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/Session/SessionManager.py	Wed Aug 02 13:28:50 2017 +0200
@@ -0,0 +1,716 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the session manager.
+"""
+
+from __future__ import unicode_literals
+
+import os
+import json
+
+from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QObject, QTimer, QDir, \
+    QFile, QFileInfo, QFileSystemWatcher, QByteArray, QDateTime
+from PyQt5.QtWidgets import QMenu, QAction, QActionGroup, QApplication, \
+    QInputDialog, QLineEdit, QDialog, QDialogButtonBox, QLabel, QComboBox, \
+    QVBoxLayout
+
+from E5Gui import E5MessageBox
+
+import Utilities
+import Preferences
+
+
+class SessionMetaData(object):
+    """
+    Class implementing a data structure to store meta data for a session.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.name = ""
+        self.filePath = ""
+        self.isActive = False
+        self.isDefault = False
+        self.isBackup = False
+
+
+class SessionManager(QObject):
+    """
+    Class implementing the session manager.
+    
+    @signal sessionsMetaDataChanged() emitted to indicate a change of the
+        list of session meta data
+    """
+    sessionsMetaDataChanged = pyqtSignal()
+    
+    SwitchSession = 1
+    CloneSession = 2
+    ReplaceSession = SwitchSession | 4
+    RestoreSession = 8
+    
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object
+        @type QObject
+        """
+        super(SessionManager, self).__init__(parent)
+        
+        sessionsDirName = self.getSessionsDirectory()
+        sessionsDir = QDir(sessionsDirName)
+        if not sessionsDir.exists():
+            sessionsDir.mkpath(sessionsDirName)
+        
+        self.__sessionMetaData = []
+        # list containing meta data about saved sessions
+        
+        self.__sessionDefault = os.path.join(sessionsDirName, "session.json")
+        self.__sessionBackup1 = os.path.join(sessionsDirName,
+                                             "session.json.old")
+        self.__sessionBackup2 = os.path.join(sessionsDirName,
+                                             "session.json.old1")
+        
+        self.__lastActiveSession = Preferences.getWebBrowser(
+            "SessionLastActivePath")
+        if not QFile.exists(self.__lastActiveSession):
+            self.__lastActiveSession = self.__sessionDefault
+        
+        self.__sessionsDirectoryWatcher = \
+            QFileSystemWatcher([self.getSessionsDirectory()], self)
+        self.__sessionsDirectoryWatcher.directoryChanged.connect(
+            self.__sessionDirectoryChanged)
+        
+        self.__backupSavedSession()
+        
+        self.__autoSaveTimer = None
+        self.__shutdown = False
+    
+    def activateTimer(self):
+        """
+        Public method to activate the session save timer.
+        """
+        if self.__autoSaveTimer is None:
+            self.__autoSaveTimer = QTimer()
+            self.__autoSaveTimer.setSingleShot(True)
+            self.__autoSaveTimer.timeout.connect(self.__autoSaveSession)
+            self.__initSessionSaveTimer()
+    
+    def preferencesChanged(self):
+        """
+        Public slot to react upon changes of the settings.
+        """
+        self.__initSessionSaveTimer()
+    
+    def getSessionsDirectory(self):
+        """
+        Public method to get the directory sessions are stored in.
+        
+        @return name of the sessions directory
+        @rtype str
+        """
+        return os.path.join(Utilities.getConfigDir(),
+                            "web_browser", "sessions")
+    
+    def defaultSessionFile(self):
+        """
+        Public method to get the name of the default session file.
+        
+        @return name of the default session file
+        @rtype str
+        """
+        return self.__sessionDefault
+    
+    def lastActiveSessionFile(self):
+        """
+        Public method to get the name of the last active session file.
+        
+        @return name of the last active session file
+        @rtype str
+        """
+        return self.__lastActiveSession
+    
+    def shutdown(self):
+        """
+        Public method to perform any shutdown actions.
+        """
+        self.__autoSaveTimer.stop()
+        if not self.__shutdown:
+            self.__autoSaveSession(startTimer=False)
+        self.__shutdown = True
+    
+    def autoSaveSession(self):
+        """
+        Public method to save the current session state.
+        """
+        self.__autoSaveSession(startTimer=False)
+    
+    def __initSessionSaveTimer(self):
+        """
+        Private slot to initialize the auto save timer.
+        """
+        self.__autoSaveInterval = Preferences.getWebBrowser(
+            "SessionAutoSaveInterval") * 1000
+        
+        if Preferences.getWebBrowser("SessionAutoSave"):
+            if not self.__autoSaveTimer.isActive():
+                self.__autoSaveTimer.start(self.__autoSaveInterval)
+        else:
+            self.__autoSaveTimer.stop()
+    
+    @pyqtSlot()
+    def __autoSaveSession(self, startTimer=True):
+        """
+        Private slot to save the current session state.
+        
+        @param startTimer flag indicating to restart the timer
+        @type bool
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        
+        if not WebBrowserWindow.isPrivate():
+            Preferences.setWebBrowser("SessionLastActivePath",
+                                      self.__lastActiveSession)
+            self.writeCurrentSession(self.__lastActiveSession)
+        
+        if startTimer:
+            self.__autoSaveTimer.start(self.__autoSaveInterval)
+    
+    def writeCurrentSession(self, sessionFileName):
+        """
+        Public method to write the current session to the given file name.
+        
+        @param sessionFileName file name of the session
+        @type str
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        
+        sessionData = {"Windows": []}
+        
+        activeWindow = WebBrowserWindow.getWindow()
+        for window in WebBrowserWindow.mainWindows():
+            data = window.tabWidget().getSessionData()
+            
+            # add window geometry
+            geometry = window.saveGeometry()
+            data["WindowGeometry"] = bytes(geometry.toBase64()).decode("ascii")
+            
+            sessionData["Windows"].append(data)
+            
+            if window is activeWindow:
+                sessionData["CurrentWindowIndex"] = \
+                    len(sessionData["Windows"]) - 1
+        
+        if sessionData["Windows"]:
+            sessionFile = open(sessionFileName, "w")
+            json.dump(sessionData, sessionFile, indent=2)
+            sessionFile.close()
+    
+    @classmethod
+    def readSessionFromFile(cls, sessionFileName):
+        """
+        Class method to read the session data from a file.
+        
+        @param sessionFileName file name of the session file
+        @type str
+        @return dictionary containing the session data
+        @rtype dict
+        """
+        try:
+            sessionFile = open(sessionFileName, "r")
+            sessionData = json.load(sessionFile)
+            sessionFile.close()
+            if not cls.isValidSession(sessionData):
+                sessionData = {}
+        except (IOError, OSError):
+            sessionData = {}
+        
+        return sessionData
+    
+    @classmethod
+    def isValidSession(cls, session):
+        """
+        Class method to check the validity of a session.
+        
+        @param session dictionary containing the session data
+        @type dict
+        @return flag indicating validity
+        @rtype bool
+        """
+        if not session:
+            return False
+        
+        if "Windows" not in session:
+            return False
+        
+        if not session["Windows"]:
+            return False
+        
+        return True
+    
+    def __backupSavedSession(self):
+        """
+        Private method to backup the most recently saved session.
+        """
+        if QFile.exists(self.__lastActiveSession):
+            
+            if QFile.exists(self.__sessionBackup1):
+                QFile.remove(self.__sessionBackup2)
+                QFile.copy(self.__sessionBackup1, self.__sessionBackup2)
+            
+            QFile.remove(self.__sessionBackup1)
+            QFile.copy(self.__lastActiveSession, self.__sessionBackup1)
+    
+    def sessionMetaData(self, includeBackups=False):
+        """
+        Public method to get the sessions meta data.
+        
+        @param includeBackups flag indicating to include backup sessions
+        @type bool
+        @return list of session meta data
+        @rtype list of SessionMetaData
+        """
+        self.__fillMetaDataList()
+        
+        metaDataList = self.__sessionMetaData[:]
+        
+        if includeBackups and QFile.exists(self.__sessionBackup1):
+            data = SessionMetaData()
+            data.name = self.tr("Backup 1")
+            data.filePath = self.__sessionBackup1
+            data.isBackup = True
+            metaDataList.append(data)
+        
+        if includeBackups and QFile.exists(self.__sessionBackup2):
+            data = SessionMetaData()
+            data.name = self.tr("Backup 2")
+            data.filePath = self.__sessionBackup2
+            data.isBackup = True
+            metaDataList.append(data)
+        
+        return metaDataList
+    
+    def __fillMetaDataList(self):
+        """
+        Private method to fill the sessions meta data list.
+        
+        The sessions meta data list is only populated, if the variable holding
+        it is empty (i.e. it is populated on demand).
+        """
+        if self.__sessionMetaData:
+            return
+        
+        sessionFilesInfoList = QDir(self.getSessionsDirectory()).entryInfoList(
+            ["*.json"], QDir.Files, QDir.Time)
+        
+        for sessionFileInfo in sessionFilesInfoList:
+            sessionData = self.readSessionFromFile(
+                sessionFileInfo.absoluteFilePath())
+            if not sessionData or not sessionData["Windows"]:
+                continue
+            
+            data = SessionMetaData()
+            data.name = sessionFileInfo.baseName()
+            data.filePath = sessionFileInfo.canonicalFilePath()
+            
+            if sessionFileInfo == QFileInfo(self.defaultSessionFile()):
+                data.name = self.tr("Default Session")
+                data.isDefault = True
+            
+            if self.__isActive(sessionFileInfo):
+                data.isActive = True
+            
+            if data.isDefault:
+                # default session is always first
+                self.__sessionMetaData.insert(0, data)
+            else:
+                self.__sessionMetaData.append(data)
+    
+    def __isActive(self, filePath):
+        """
+        Private method to check, if a given file is the active one.
+        
+        @param filePath path of the session file to be checked
+        @type str or QFileInfo
+        @return flag indicating the active file
+        @rtype bool
+        """
+        return QFileInfo(filePath) == QFileInfo(self.__lastActiveSession)
+    
+    @pyqtSlot()
+    def __sessionDirectoryChanged(self):
+        """
+        Private slot handling changes of the sessions directory.
+        """
+        self.__sessionMetaData = []
+        
+        self.sessionsMetaDataChanged.emit()
+    
+    @pyqtSlot()
+    def aboutToShowSessionsMenu(self):
+        """
+        Public slot to populate the sessions selection menu.
+        """
+        menu = self.sender()
+        if isinstance(menu, QMenu):
+            menu.clear()
+            
+            actionGroup = QActionGroup(menu)
+            sessions = self.sessionMetaData(includeBackups=False)
+            for session in sessions:
+                act = menu.addAction(session.name)
+                act.setCheckable(True)
+                act.setChecked(session.isActive)
+                act.setData(session.filePath)
+                actionGroup.addAction(act)
+                act.triggered.connect(self.__sessionActTriggered)
+    
+    @pyqtSlot()
+    def __sessionActTriggered(self):
+        """
+        Private slot to handle the menu selection of a session.
+        """
+        act = self.sender()
+        if isinstance(act, QAction):
+            path = act.data()
+            self.switchToSession(path)
+    
+    def openSession(self, sessionFilePath, flags=0):
+        """
+        Public method to open a session from a given session file.
+        
+        @param sessionFilePath name of the session file to get session from
+        @type str
+        @param flags flags determining the open mode
+        @type int
+        """
+        if self.__isActive(sessionFilePath):
+            return
+        
+        sessionData = self.readSessionFromFile(sessionFilePath)
+        if not sessionData or not sessionData["Windows"]:
+            return
+        
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        window = WebBrowserWindow.mainWindow()
+        
+        if ((flags & SessionManager.SwitchSession) ==
+                SessionManager.SwitchSession):
+            # save the current session
+            self.writeCurrentSession(self.__lastActiveSession)
+            
+            # create new window for the new session
+            window = window.newWindow(restoreSession=True)
+            
+            # close all existing windows
+            for win in WebBrowserWindow.mainWindows()[:]:
+                if win is not window:
+                    win.forceClose()
+            
+            if not ((flags & SessionManager.ReplaceSession) ==
+                    SessionManager.ReplaceSession):
+                self.__lastActiveSession = \
+                    QFileInfo(sessionFilePath).canonicalFilePath()
+                self.__sessionMetaData = []
+        
+        self.restoreSessionFromData(window, sessionData)
+    
+    @classmethod
+    def restoreSessionFromData(cls, window=None, sessionData=None):
+        """
+        Class method to restore a session from a session data dictionary.
+        
+        @param window reference to main window to restore to
+        @type WebBrowserWindow
+        @param sessionData dictionary containing the session data
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        if window is None:
+            window = WebBrowserWindow.mainWindow()
+        
+        QApplication.setOverrideCursor(Qt.WaitCursor)
+        # restore session for first window
+        data = sessionData["Windows"].pop(0)
+        window.tabWidget().loadFromSessionData(data)
+        if "WindowGeometry" in data:
+            geometry = QByteArray.fromBase64(
+                data["WindowGeometry"].encode("ascii"))
+            window.restoreGeometry(geometry)
+        QApplication.processEvents()
+        
+        # restore additional windows
+        for data in sessionData["Windows"]:
+            window = WebBrowserWindow.mainWindow()\
+                .newWindow(restoreSession=True)
+            window.tabWidget().loadFromSessionData(data)
+            if "WindowGeometry" in data:
+                geometry = QByteArray.fromBase64(
+                    data["WindowGeometry"].encode("ascii"))
+                window.restoreGeometry(geometry)
+            QApplication.processEvents()
+        QApplication.restoreOverrideCursor()
+        
+        if "CurrentWindowIndex" in sessionData:
+            currentWindowIndex = sessionData["CurrentWindowIndex"]
+            try:
+                currentWindow = \
+                    WebBrowserWindow.mainWindows()[currentWindowIndex]
+                QTimer.singleShot(0, lambda: currentWindow.raise_())
+            except IndexError:
+                # ignore it
+                pass
+    
+    def renameSession(self, sessionFilePath, flags=0):
+        """
+        Public method to rename or clone a session.
+        
+        @param sessionFilePath name of the session file
+        @type str
+        @param flags flags determining a rename or clone operation
+        @type int
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        
+        suggestedName = QFileInfo(sessionFilePath).baseName()
+        if flags & SessionManager.CloneSession:
+            suggestedName += "_cloned"
+            title = self.tr("Clone Session")
+        else:
+            suggestedName += "_renamed"
+            title = self.tr("Rename Session")
+        newName, ok = QInputDialog.getText(
+            WebBrowserWindow.getWindow(),
+            title,
+            self.tr("Please enter a new name:"),
+            QLineEdit.Normal,
+            suggestedName)
+        
+        if not ok:
+            return
+        
+        if not newName.endswith(".json"):
+            newName += ".json"
+        
+        newSessionPath = os.path.join(self.getSessionsDirectory(), newName)
+        if os.path.exists(newSessionPath):
+            E5MessageBox.information(
+                WebBrowserWindow.getWindow(),
+                title,
+                self.tr("""The session file "{0}" exists already. Please"""
+                        """ enter another name.""").format(newName))
+            self.renameSession(sessionFilePath, flags)
+            return
+        
+        if flags & SessionManager.CloneSession:
+            if not QFile.copy(sessionFilePath, newSessionPath):
+                E5MessageBox.critical(
+                    WebBrowserWindow.getWindow(),
+                    title,
+                    self.tr("""An error occurred while cloning the session"""
+                            """ file."""))
+                return
+        else:
+            if not QFile.rename(sessionFilePath, newSessionPath):
+                E5MessageBox.critical(
+                    WebBrowserWindow.getWindow(),
+                    title,
+                    self.tr("""An error occurred while renaming the session"""
+                            """ file."""))
+                return
+            if self.__isActive(sessionFilePath):
+                self.__lastActiveSession = newSessionPath
+                self.__sessionMetaData = []
+    
+    def saveSession(self):
+        """
+        Public method to save the current session.
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        newName, ok = QInputDialog.getText(
+            WebBrowserWindow.getWindow(),
+            self.tr("Save Session"),
+            self.tr("Please enter a name for the session:"),
+            QLineEdit.Normal,
+            self.tr("Saved Session ({0})").format(
+                QDateTime.currentDateTime().toString("yyyy-MM-dd HH-mm-ss")))
+        
+        if not ok:
+            return
+        
+        if not newName.endswith(".json"):
+            newName += ".json"
+        
+        newSessionPath = os.path.join(self.getSessionsDirectory(), newName)
+        if os.path.exists(newSessionPath):
+            E5MessageBox.information(
+                WebBrowserWindow.getWindow(),
+                self.tr("Save Session"),
+                self.tr("""The session file "{0}" exists already. Please"""
+                        """ enter another name.""").format(newName))
+            self.saveSession()
+            return
+        
+        self.writeCurrentSession(newSessionPath)
+    
+    def replaceSession(self, sessionFilePath):
+        """
+        Public method to replace the current session with the given one.
+        
+        @param sessionFilePath file name of the session file to replace with
+        @type str
+        @return flag indicating success
+        @rtype bool
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        res = E5MessageBox.yesNo(
+            WebBrowserWindow.getWindow(),
+            self.tr("Restore Backup"),
+            self.tr("""Are you sure you want to replace the current"""
+                    """ session?"""))
+        if res:
+            self.openSession(sessionFilePath, SessionManager.ReplaceSession)
+            return True
+        else:
+            return False
+    
+    def switchToSession(self, sessionFilePath):
+        """
+        Public method to switch the current session to the given one.
+        
+        @param sessionFilePath file name of the session file to switch to
+        @type str
+        @return flag indicating success
+        @rtype bool
+        """
+        self.openSession(sessionFilePath, SessionManager.SwitchSession)
+        return True
+    
+    def cloneSession(self, sessionFilePath):
+        """
+        Public method to clone a session.
+        
+        @param sessionFilePath file name of the session file to be cloned
+        @type str
+        """
+        self.renameSession(sessionFilePath, SessionManager.CloneSession)
+    
+    def deleteSession(self, sessionFilePath):
+        """
+        Public method to delete a session.
+        
+        @param sessionFilePath file name of the session file to be deleted
+        @type str
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        res = E5MessageBox.yesNo(
+            WebBrowserWindow.getWindow(),
+            self.tr("Delete Session"),
+            self.tr("""Are you sure you want to delete session "{0}"?""")
+            .format(QFileInfo(sessionFilePath).baseName()))
+        if res:
+            QFile.remove(sessionFilePath)
+    
+    def newSession(self):
+        """
+        Public method to start a new session.
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        newName, ok = QInputDialog.getText(
+            WebBrowserWindow.getWindow(),
+            self.tr("New Session"),
+            self.tr("Please enter a name for the new session:"),
+            QLineEdit.Normal,
+            self.tr("New Session ({0})").format(
+                QDateTime.currentDateTime().toString("yyyy-MM-dd HH-mm-ss")))
+        
+        if not ok:
+            return
+        
+        if not newName.endswith(".json"):
+            newName += ".json"
+        
+        newSessionPath = os.path.join(self.getSessionsDirectory(), newName)
+        if os.path.exists(newSessionPath):
+            E5MessageBox.information(
+                WebBrowserWindow.getWindow(),
+                self.tr("New Session"),
+                self.tr("""The session file "{0}" exists already. Please"""
+                        """ enter another name.""").format(newName))
+            self.newSession()
+            return
+        
+        self.writeCurrentSession(self.__lastActiveSession)
+        
+        # create new window for the new session and close all existing windows
+        window = WebBrowserWindow.mainWindow().newWindow()
+        for win in WebBrowserWindow.mainWindows():
+            if win is not window:
+                win.forceClose()
+        
+        self.__lastActiveSession = newSessionPath
+        self.__autoSaveSession()
+    
+    def showSessionManagerDialog(self):
+        """
+        Public method to show the session manager dialog.
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        from .SessionManagerDialog import SessionManagerDialog
+        
+        dlg = SessionManagerDialog(WebBrowserWindow.getWindow())
+        dlg.open()
+    
+    def selectSession(self):
+        """
+        Public method to select a session to be restored.
+        
+        @return name of the session file to be restored
+        @rtype str
+        """
+        from WebBrowser.WebBrowserWindow import WebBrowserWindow
+        
+        self.__fillMetaDataList()
+        
+        if self.__sessionMetaData:
+            # skip, if no session file available
+            dlg = QDialog(WebBrowserWindow.getWindow(),
+                          Qt.WindowStaysOnTopHint)
+            lbl = QLabel(self.tr("Please select the startup session:"))
+            combo = QComboBox(dlg)
+            buttonBox = QDialogButtonBox(
+                QDialogButtonBox.Ok | QDialogButtonBox.Cancel, dlg)
+            buttonBox.accepted.connect(dlg.accept)
+            buttonBox.rejected.connect(dlg.reject)
+            
+            layout = QVBoxLayout()
+            layout.addWidget(lbl)
+            layout.addWidget(combo)
+            layout.addWidget(buttonBox)
+            dlg.setLayout(layout)
+            
+            lastActiveSessionFileInfo = QFileInfo(self.__lastActiveSession)
+            
+            for metaData in self.__sessionMetaData:
+                if QFileInfo(metaData.filePath) != lastActiveSessionFileInfo:
+                    combo.addItem(metaData.name, metaData.filePath)
+                else:
+                    combo.insertItem(
+                        0,
+                        self.tr("{0} (last session)").format(metaData.name),
+                        metaData.filePath
+                    )
+            combo.setCurrentIndex(0)
+            
+            if dlg.exec_() == QDialog.Accepted:
+                session = combo.currentData()
+                if session is None:
+                    self.__lastActiveSession = self.__sessionDefault
+                else:
+                    self.__lastActiveSession = session
+        
+        return self.__lastActiveSession
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/Session/SessionManagerDialog.py	Wed Aug 02 13:28:50 2017 +0200
@@ -0,0 +1,227 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to manage sessions.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import pyqtSlot, Qt, QFileInfo
+from PyQt5.QtGui import QPalette
+from PyQt5.QtWidgets import QDialog, QTreeWidgetItem
+
+from .Ui_SessionManagerDialog import Ui_SessionManagerDialog
+
+from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
+
+class SessionManagerDialog(QDialog, Ui_SessionManagerDialog):
+    """
+    Class documentation goes here.
+    """
+    SessionFileRole = Qt.UserRole
+    BackupSessionRole = Qt.UserRole + 1
+    ActiveSessionRole = Qt.UserRole + 2
+    DefaultSessionRole = Qt.UserRole + 3
+    
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent widget
+        @type QWidget
+        """
+        super(SessionManagerDialog, self).__init__(parent)
+        self.setupUi(self)
+        self.setAttribute(Qt.WA_DeleteOnClose)
+        
+        self.newButton.clicked.connect(self.__newSession)
+        self.renameButton.clicked.connect(self.__renameSession)
+        self.cloneButton.clicked.connect(self.__cloneSession)
+        self.deleteButton.clicked.connect(self.__deleteSession)
+        self.switchButton.clicked.connect(self.__switchToSession)
+        self.sessionsList.currentItemChanged.connect(self.__updateButtons)
+        
+        self.__refresh()
+        WebBrowserWindow.sessionManager().sessionsMetaDataChanged.connect(
+            self.__refresh)
+    
+    @pyqtSlot()
+    def __refresh(self):
+        """
+        Private slot to refresh the list of sessions.
+        """
+        self.sessionsList.clear()
+        
+        sessions = WebBrowserWindow.sessionManager().sessionMetaData(
+            includeBackups=True)
+        for session in sessions:
+            itm = QTreeWidgetItem()
+            itm.setText(0, session.name)
+            itm.setText(1, QFileInfo(session.filePath).lastModified()
+                        .toString("yyyy-MM-dd hh:mm"))
+            itm.setData(0, SessionManagerDialog.SessionFileRole,
+                        session.filePath)
+            itm.setData(0, SessionManagerDialog.BackupSessionRole,
+                        session.isBackup)
+            itm.setData(0, SessionManagerDialog.ActiveSessionRole,
+                        session.isActive)
+            itm.setData(0, SessionManagerDialog.DefaultSessionRole,
+                        session.isDefault)
+            self.__updateSessionItem(itm)
+            self.sessionsList.addTopLevelItem(itm)
+        
+        self.__updateButtons()
+    
+    def __updateButtons(self):
+        """
+        Private method to update the button state.
+        """
+        itm = self.sessionsList.currentItem()
+        if itm:
+            isBackup = itm.data(0, SessionManagerDialog.BackupSessionRole)
+            isActive = itm.data(0, SessionManagerDialog.ActiveSessionRole)
+            isDefault = itm.data(0, SessionManagerDialog.DefaultSessionRole)
+            
+            self.renameButton.setEnabled(not isDefault and not isBackup)
+            self.cloneButton.setEnabled(not isBackup)
+            self.deleteButton.setEnabled(not isBackup and not isDefault and
+                                         not isActive)
+            self.switchButton.setEnabled(not isActive)
+            if isBackup:
+                self.switchButton.setText(self.tr("Restore"))
+            else:
+                self.switchButton.setText(self.tr("Switch To"))
+        else:
+            self.renameButton.setEnabled(False)
+            self.cloneButton.setEnabled(False)
+            self.deleteButton.setEnabled(False)
+            self.switchButton.setEnabled(False)
+            self.switchButton.setText(self.tr("Switch To"))
+    
+    def __updateSessionItem(self, itm):
+        """
+        Private method to set various item properties.
+        
+        @param itm reference to the item to be updated
+        @type QTreeWidgetItem
+        """
+        isBackup = itm.data(0, SessionManagerDialog.BackupSessionRole)
+        isActive = itm.data(0, SessionManagerDialog.ActiveSessionRole)
+        isDefault = itm.data(0, SessionManagerDialog.DefaultSessionRole)
+        
+        font = itm.font(0)
+        
+        if isBackup:
+            color = self.palette().color(QPalette.Disabled,
+                                         QPalette.WindowText)
+            itm.setForeground(0, color)
+            itm.setForeground(1, color)
+        
+        if isActive:
+            font.setBold(True)
+            itm.setFont(0, font)
+            itm.setFont(1, font)
+        
+        if isDefault:
+            font.setItalic(True)
+            itm.setFont(0, font)
+            itm.setFont(1, font)
+    
+    def showEvent(self, evt):
+        """
+        Protected method handling the dialog being shown.
+        
+        @param evt reference to the event object
+        @type QShowEvent
+        """
+        super(SessionManagerDialog, self).showEvent(evt)
+        self.__resizeViewHeader()
+    
+    def resizeEvent(self, evt):
+        """
+        Protected method handling the dialog being resized.
+        
+        @param evt reference to the event object
+        @type QResizeEvent
+        """
+        super(SessionManagerDialog, self).resizeEvent(evt)
+        self.__resizeViewHeader()
+    
+    def __resizeViewHeader(self):
+        """
+        Private method to resize the session column of the list.
+        """
+        headerWidth = self.sessionsList.header().width()
+        self.sessionsList.header().resizeSection(
+            0, headerWidth - headerWidth / 2.5)
+    
+    @pyqtSlot()
+    def __newSession(self):
+        """
+        Private slot to create a new session.
+        """
+        WebBrowserWindow.sessionManager().newSession()
+    
+    @pyqtSlot()
+    def __renameSession(self):
+        """
+        Private slot to rename the selected session.
+        """
+        itm = self.sessionsList.currentItem()
+        if itm is None:
+            return
+        
+        filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
+        if filePath:
+            WebBrowserWindow.sessionManager().renameSession(filePath)
+    
+    @pyqtSlot()
+    def __cloneSession(self):
+        """
+        Private slot to clone the selected session.
+        """
+        itm = self.sessionsList.currentItem()
+        if itm is None:
+            return
+        
+        filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
+        if filePath:
+            WebBrowserWindow.sessionManager().cloneSession(filePath)
+    
+    @pyqtSlot()
+    def __deleteSession(self):
+        """
+        Private slot to delete the selected session.
+        """
+        itm = self.sessionsList.currentItem()
+        if itm is None:
+            return
+        
+        filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
+        if filePath:
+            WebBrowserWindow.sessionManager().deleteSession(filePath)
+    
+    @pyqtSlot()
+    def __switchToSession(self):
+        """
+        Private slot to switch to the selected session.
+        """
+        itm = self.sessionsList.currentItem()
+        if itm is None:
+            return
+        
+        filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
+        if filePath:
+            if itm.data(0, SessionManagerDialog.BackupSessionRole):
+                res = WebBrowserWindow.sessionManager()\
+                    .replaceSession(filePath)
+            else:
+                res = WebBrowserWindow.sessionManager()\
+                    .switchToSession(filePath)
+            
+            if res:
+                self.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/Session/SessionManagerDialog.ui	Wed Aug 02 13:28:50 2017 +0200
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SessionManagerDialog</class>
+ <widget class="QDialog" name="SessionManagerDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>400</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Session Manager</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QTreeWidget" name="sessionsList">
+     <property name="toolTip">
+      <string>Shows a list of available sessions</string>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string>Session</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Last Modified</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QPushButton" name="newButton">
+       <property name="toolTip">
+        <string>Press to create a new session</string>
+       </property>
+       <property name="text">
+        <string>New</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="renameButton">
+       <property name="toolTip">
+        <string>Press to rename the selected session</string>
+       </property>
+       <property name="text">
+        <string>Rename</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cloneButton">
+       <property name="toolTip">
+        <string>Press to clone the selected session</string>
+       </property>
+       <property name="text">
+        <string>Clone</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="deleteButton">
+       <property name="toolTip">
+        <string>Press to delete the selected session</string>
+       </property>
+       <property name="text">
+        <string>Delete</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="switchButton">
+       <property name="toolTip">
+        <string>Press to switch to the selected session</string>
+       </property>
+       <property name="text">
+        <string>Switch To</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0" colspan="2">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>SessionManagerDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>SessionManagerDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebBrowser/Session/__init__.py	Wed Aug 02 13:28:50 2017 +0200
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package implementing the session related functionality.
+"""
--- a/WebBrowser/WebBrowserPage.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/WebBrowser/WebBrowserPage.py	Wed Aug 02 13:28:50 2017 +0200
@@ -14,7 +14,7 @@
 except NameError:
     pass
 
-from PyQt5.QtCore import pyqtSlot, QUrl, QTimer, QEventLoop, QPoint
+from PyQt5.QtCore import pyqtSlot, QUrl, QTimer, QEventLoop, QPoint, QPointF
 from PyQt5.QtGui import QDesktopServices
 from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineSettings, \
     QWebEngineScript
@@ -253,6 +253,18 @@
             WebBrowserPage.SafeJsWorld
         )
     
+    def scrollTo(self, pos):
+        """
+        Public method to scroll to the given position.
+        
+        @param pos position to scroll to
+        @type QPointF
+        """
+        self.runJavaScript(
+            "window.scrollTo({0}, {1});".format(pos.x(), pos.y()),
+            WebBrowserPage.SafeJsWorld
+        )
+    
     def mapToViewport(self, pos):
         """
         Public method to map a position to the viewport.
@@ -375,3 +387,30 @@
             @rtype QIcon
             """
             return self.view().icon()
+    
+    if not hasattr(QWebEnginePage, "scrollPosition"):
+        def scrollPosition(self):
+            """
+            Public method to get the scroll position of the web page.
+            
+            @return scroll position
+            @rtype QPointF
+            """
+            pos = self.execJavaScript(
+                "(function() {"
+                "var res = {"
+                "    x: 0,"
+                "    y: 0,"
+                "};"
+                "res.x = window.scrollX;"
+                "res.y = window.scrollY;"
+                "return res;"
+                "})()",
+                WebBrowserPage.SafeJsWorld
+            )
+            if pos is not None:
+                pos = QPointF(pos["x"], pos["y"])
+            else:
+                pos = QPointF(0.0, 0.0)
+            
+            return pos
--- a/WebBrowser/WebBrowserTabBar.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/WebBrowser/WebBrowserTabBar.py	Wed Aug 02 13:28:50 2017 +0200
@@ -52,25 +52,27 @@
         if indexedBrowser.progress() != 0:
             return
         
-        w = self.tabSizeHint(self.__currentTabPreviewIndex).width()
-        h = int(w * currentBrowser.height() / currentBrowser.width())
-        
-        self.__previewPopup = E5PassivePopup(self)
-        self.__previewPopup.setFrameShape(QFrame.StyledPanel)
-        self.__previewPopup.setFrameShadow(QFrame.Plain)
-        self.__previewPopup.setFixedSize(w, h)
-        
-        label = QLabel()
-        label.setPixmap(indexedBrowser.getPreview().scaled(w, h))
-        
-        self.__previewPopup.setView(label)
-        self.__previewPopup.layout().setAlignment(Qt.AlignTop)
-        self.__previewPopup.layout().setContentsMargins(0, 0, 0, 0)
-        
-        tr = self.tabRect(self.__currentTabPreviewIndex)
-        pos = QPoint(tr.x(), tr.y() + tr.height())
-        
-        self.__previewPopup.show(self.mapToGlobal(pos))
+        preview = indexedBrowser.getPreview()
+        if not preview.isNull():
+            w = self.tabSizeHint(self.__currentTabPreviewIndex).width()
+            h = int(w * currentBrowser.height() / currentBrowser.width())
+            
+            self.__previewPopup = E5PassivePopup(self)
+            self.__previewPopup.setFrameShape(QFrame.StyledPanel)
+            self.__previewPopup.setFrameShadow(QFrame.Plain)
+            self.__previewPopup.setFixedSize(w, h)
+            
+            label = QLabel()
+            label.setPixmap(preview.scaled(w, h))
+            
+            self.__previewPopup.setView(label)
+            self.__previewPopup.layout().setAlignment(Qt.AlignTop)
+            self.__previewPopup.layout().setContentsMargins(0, 0, 0, 0)
+            
+            tr = self.tabRect(self.__currentTabPreviewIndex)
+            pos = QPoint(tr.x(), tr.y() + tr.height())
+            
+            self.__previewPopup.show(self.mapToGlobal(pos))
     
     def mouseMoveEvent(self, evt):
         """
--- a/WebBrowser/WebBrowserTabWidget.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/WebBrowser/WebBrowserTabWidget.py	Wed Aug 02 13:28:50 2017 +0200
@@ -378,15 +378,21 @@
         """
         self.newBrowser()
     
-    def newBrowser(self, link=None, position=-1, background=False):
+    def newBrowser(self, link=None, position=-1, background=False,
+                   restoreSession=False):
         """
         Public method to create a new web browser tab.
         
-        @param link link to be shown (string or QUrl)
+        @param link link to be shown
+        @type str or QUrl
         @keyparam position position to create the new tab at or -1 to add it
-            to the end (integer)
+            to the end
+        @type int
         @keyparam background flag indicating to open the tab in the
-            background (bool)
+            background
+        @type bool
+        @keyparam restoreSession flag indicating a restore session action
+        @type bool
         @return reference to the new browser
         @rtype WebBrowserView
         """
@@ -449,11 +455,17 @@
         self.__closeButton.setEnabled(True)
         self.__navigationButton.setEnabled(True)
         
-        if not linkName:
-            if Preferences.getWebBrowser("StartupBehavior") == 0:
-                linkName = Preferences.getWebBrowser("HomePage")
-            elif Preferences.getWebBrowser("StartupBehavior") == 1:
-                linkName = "eric:speeddial"
+        if not restoreSession:
+            if not linkName:
+                if Preferences.getWebBrowser("NewTabBehavior") == 0:
+                    linkName = "about:blank"
+                elif Preferences.getWebBrowser("NewTabBehavior") == 1:
+                    linkName = Preferences.getWebBrowser("HomePage")
+                elif Preferences.getWebBrowser("NewTabBehavior") == 2:
+                    linkName = "eric:speeddial"
+        
+        if linkName == "eric:blank":
+            linkName = "about:blank"
         
         if linkName:
             browser.setSource(QUrl(linkName))
@@ -650,7 +662,7 @@
         if printDialog.exec_() == QDialog.Accepted:
             if hasattr(browser.page(), "print"):
                 # Qt >= 5.8.0
-                browser.page().execPrintPage(printer)
+                browser.page().execPrintPage(printer, 10 * 1000)
             elif hasattr(browser.page(), "printToPdf"):
                 # Qt >= 5.7.0
                 if printer.outputFormat() == QPrinter.PdfFormat:
@@ -1183,3 +1195,60 @@
         """
         self.__closedTabsButton.setEnabled(avail)
         self.__restoreClosedTabAct.setEnabled(avail)
+    
+    ####################################################
+    ## Methods below implement session related functions
+    ####################################################
+    
+    def getSessionData(self):
+        """
+        Public method to populate the session data.
+        
+        @return dictionary containing the session data
+        @rtype dict
+        """
+        sessionData = {}
+        
+        # 1. current index
+        sessionData["CurrentTabIndex"] = self.currentIndex()
+        
+        # 2. tab data
+        sessionData["Tabs"] = []
+        for index in range(self.count()):
+            browser = self.widget(index)
+            data = browser.getSessionData()
+            sessionData["Tabs"].append(data)
+        
+        return sessionData
+    
+    def loadFromSessionData(self, sessionData):
+        """
+        Public method to load the session data.
+        
+        @param sessionData dictionary containing the session data as
+            generated by getSessionData()
+        @type dict
+        """
+        tabCount = self.count()
+        
+        # 1. load tab data
+        if "Tabs" in sessionData:
+            loadTabOnActivate = \
+                Preferences.getWebBrowser("LoadTabOnActivation")
+            for data in sessionData["Tabs"]:
+                browser = self.newBrowser(restoreSession=True)
+                if loadTabOnActivate:
+                    browser.storeSessionData(data)
+                    title, urlStr, icon = browser.extractSessionMetaData(data)
+                    index = self.indexOf(browser)
+                    self.setTabText(index, title)
+                    self.setTabIcon(index, icon)
+                else:
+                    browser.loadFromSessionData(data)
+        
+        # 2. set tab index
+        if "CurrentTabIndex" in sessionData and \
+                sessionData["CurrentTabIndex"] >= 0:
+            index = tabCount + sessionData["CurrentTabIndex"]
+            self.setCurrentIndex(index)
+            self.browserAt(index).activateSession()
--- a/WebBrowser/WebBrowserView.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/WebBrowser/WebBrowserView.py	Wed Aug 02 13:28:50 2017 +0200
@@ -17,7 +17,8 @@
 import os
 
 from PyQt5.QtCore import pyqtSignal, QUrl, QFileInfo, Qt, QTimer, QEvent, \
-    QPoint, QDateTime, QStandardPaths
+    QPoint, QPointF, QDateTime, QStandardPaths, QByteArray, QIODevice, \
+    QDataStream
 from PyQt5.QtGui import QDesktopServices, QClipboard, QIcon, \
     QContextMenuEvent, QPixmap
 from PyQt5.QtWidgets import qApp, QStyle, QMenu, QApplication
@@ -123,6 +124,8 @@
         self.__inspector = None
         WebInspector.registerView(self)
         
+        self.__restoreData = None
+        
         if qVersionTuple() >= (5, 8, 0):
             if self.parentWidget() is not None:
                 self.parentWidget().installEventFilter(self)
@@ -1894,3 +1897,155 @@
         Private slot to reset all speed dials to the default pages.
         """
         self.__speedDial.resetDials()
+    
+    ###########################################################################
+    ## Methods below implement session related functions
+    ###########################################################################
+    
+    def storeSessionData(self, data):
+        """
+        Public method to store session data to be restored later on.
+        
+        @param data dictionary with session data to be restored
+        @type dict
+        """
+        self.__restoreData = data
+    
+    def __showEventSlot(self):
+        """
+        Private slot to perform actions when the view is shown and the event
+        loop is running.
+        """
+        if self.__restoreData:
+            sessionData, self.__restoreData = self.__restoreData, None
+            self.loadFromSessionData(sessionData)
+    
+    def showEvent(self, evt):
+        """
+        Protected method to handle show events.
+        
+        @param evt reference to the show event object
+        @type QShowEvent
+        """
+        super(WebBrowserView, self).showEvent(evt)
+        self.activateSession()
+    
+    def activateSession(self):
+        """
+        Public slot to activate a restored session.
+        """
+        if self.__restoreData and not self.__mw.isClosing():
+            QTimer.singleShot(0, self.__showEventSlot)
+    
+    def getSessionData(self):
+        """
+        Public method to populate the session data.
+        
+        @return dictionary containing the session data
+        @rtype dict
+        """
+        if self.__restoreData:
+            # page has not been shown yet
+            return self.__restoreData
+        
+        sessionData = {}
+        page = self.page()
+        
+        # 1. zoom factor
+        sessionData["ZoomFactor"] = page.zoomFactor()
+        
+        # 2. scroll position
+        scrollPos = page.scrollPosition()
+        sessionData["ScrollPosition"] = {
+            "x": scrollPos.x(),
+            "y": scrollPos.y(),
+        }
+        
+        # 3. page history
+        historyArray = QByteArray()
+        stream = QDataStream(historyArray, QIODevice.WriteOnly)
+        stream << page.history()
+        sessionData["History"] = str(
+            historyArray.toBase64(QByteArray.Base64UrlEncoding),
+            encoding="ascii")
+        sessionData["HistoryIndex"] = page.history().currentItemIndex()
+        
+        # 4. current URL and title
+        sessionData["Url"] = self.url().toString()
+        sessionData["Title"] = self.title()
+        
+        # 5. web icon
+        iconArray = QByteArray()
+        stream = QDataStream(iconArray, QIODevice.WriteOnly)
+        stream << page.icon()
+        sessionData["Icon"] = str(iconArray.toBase64(), encoding="ascii")
+        
+        return sessionData
+    
+    def loadFromSessionData(self, sessionData):
+        """
+        Public method to load the session data.
+        
+        @param sessionData dictionary containing the session data as
+            generated by getSessionData()
+        @type dict
+        """
+        page = self.page()
+        # blank the page
+        page.setUrl(QUrl("about:blank"))
+        
+        # 1. page history
+        if "History" in sessionData:
+            historyArray = QByteArray.fromBase64(
+                sessionData["History"].encode("ascii"),
+                QByteArray.Base64UrlEncoding)
+            stream = QDataStream(historyArray, QIODevice.ReadOnly)
+            stream >> page.history()
+            
+            if "HistoryIndex" in sessionData:
+                item = page.history().itemAt(sessionData["HistoryIndex"])
+                if item is not None:
+                    page.history().goToItem(item)
+        
+        # 2. zoom factor
+        if "ZoomFactor" in sessionData:
+            page.setZoomFactor(sessionData["ZoomFactor"])
+        
+        # 3. scroll position
+        if "ScrollPosition" in sessionData:
+            scrollPos = sessionData["ScrollPosition"]
+            page.scrollTo(QPointF(scrollPos["x"], scrollPos["y"]))
+    
+    def extractSessionMetaData(self, sessionData):
+        """
+        Public method to extract some session meta data elements needed by the
+        tab widget in case of deferred loading.
+        
+        @param sessionData dictionary containing the session data as
+            generated by getSessionData()
+        @type dict
+        @return tuple containing the title, URL and web icon
+        @rtype tuple of (str, str, QIcon)
+        """
+        if "Title" in sessionData:
+            title = sessionData["Title"]
+        else:
+            title = ""
+        
+        if "Url" in sessionData:
+            urlStr = sessionData["Url"]
+        else:
+            urlStr = ""
+        
+        if "Icon" in sessionData:
+            iconArray = QByteArray.fromBase64(
+                sessionData["Icon"].encode("ascii"))
+            stream = QDataStream(iconArray, QIODevice.ReadOnly)
+            icon = QIcon()
+            stream >> icon
+        else:
+            from .Tools import WebIconProvider
+            icon = WebIconProvider.instance().iconForUrl(
+                QUrl.fromUserInput(urlStr))
+        
+        return title, urlStr, icon
--- a/WebBrowser/WebBrowserWindow.py	Thu Jul 06 18:59:43 2017 +0200
+++ b/WebBrowser/WebBrowserWindow.py	Wed Aug 02 13:28:50 2017 +0200
@@ -107,25 +107,43 @@
     _imageSearchEngine = None
     _autoScroller = None
     _tabManager = None
+    _sessionManager = None
+    
+    _performingStartup = True
+    _performingShutdown = False
+    _lastActiveWindow = None
     
     def __init__(self, home, path, parent, name, fromEric=False,
                  initShortcutsOnly=False, searchWord=None,
-                 private=False, qthelp=False, settingsDir=""):
+                 private=False, qthelp=False, settingsDir="",
+                 restoreSession=False):
         """
         Constructor
         
-        @param home the URL to be shown (string)
-        @param path the path of the working dir (usually '.') (string)
-        @param parent parent widget of this window (QWidget)
-        @param name name of this window (string)
+        @param home the URL to be shown
+        @type str
+        @param path the path of the working dir (usually '.')
+        @type str
+        @param parent parent widget of this window
+        @type QWidget
+        @param name name of this window
+        @type str
         @param fromEric flag indicating whether it was called from within
-            eric6 (boolean)
+            eric6
+        @type bool
         @keyparam initShortcutsOnly flag indicating to just initialize the
-            keyboard shortcuts (boolean)
-        @keyparam searchWord word to search for (string)
-        @keyparam private flag indicating a private browsing window (bool)
-        @keyparam qthelp flag indicating to enable the QtHelp support (bool)
-        @keyparam settingsDir directory to be used for the settings files (str)
+            keyboard shortcuts
+        @type bool
+        @keyparam searchWord word to search for
+        @type str
+        @keyparam private flag indicating a private browsing window
+        @type bool
+        @keyparam qthelp flag indicating to enable the QtHelp support
+        @type bool
+        @keyparam settingsDir directory to be used for the settings files
+        @type str
+        @keyparam restoreSession flag indicating a restore session action
+        @type bool
         """
         self.__hideNavigationTimer = None
         
@@ -144,7 +162,6 @@
 
         self.__mHistory = []
         self.__lastConfigurationPageName = ""
-        self.__lastActiveWindow = None
         
         WebBrowserWindow._isPrivate = private
         
@@ -169,6 +186,7 @@
             
             self.__htmlFullScreen = False
             self.__windowStates = Qt.WindowNoState
+            self.__isClosing = False
             
             from .SearchWidget import SearchWidget
             from .QtHelp.HelpTocWidget import HelpTocWidget
@@ -337,8 +355,36 @@
             syncMgr.syncMessage.connect(self.statusBar().showMessage)
             syncMgr.syncError.connect(self.statusBar().showMessage)
             
-            self.__tabWidget.newBrowser(home)
-            self.__tabWidget.currentBrowser().setFocus()
+            restoreSessionData = {}
+            if WebBrowserWindow._performingStartup and not home:
+                startupBehavior = Preferences.getWebBrowser("StartupBehavior")
+                if not private and startupBehavior in [3, 4]:
+                    if startupBehavior == 3:
+                        # restore last session
+                        restoreSessionFile = \
+                            self.sessionManager().lastActiveSessionFile()
+                    elif startupBehavior == 4:
+                        # select session
+                        restoreSessionFile = \
+                            self.sessionManager().selectSession()
+                    sessionData = \
+                        self.sessionManager().readSessionFromFile(
+                            restoreSessionFile)
+                    if self.sessionManager().isValidSession(sessionData):
+                        restoreSessionData = sessionData
+                        restoreSession = True
+                else:
+                    if Preferences.getWebBrowser("StartupBehavior") == 0:
+                        home = "about:blank"
+                    elif Preferences.getWebBrowser("StartupBehavior") == 1:
+                        home = Preferences.getWebBrowser("HomePage")
+                    elif Preferences.getWebBrowser("StartupBehavior") == 2:
+                        home = "eric:speeddial"
+            
+            if not restoreSession:
+                self.__tabWidget.newBrowser(home)
+                self.__tabWidget.currentBrowser().setFocus()
+            WebBrowserWindow._performingStartup = False
             
             self.__imagesIcon = ImagesIcon(self)
             self.statusBar().addPermanentWidget(self.__imagesIcon)
@@ -409,8 +455,6 @@
             self.__virusTotal.fileScanReport.connect(
                 self.__virusTotalFileScanReport)
             
-            self.__shutdownCalled = False
-            
             self.flashCookieManager()
             
             if WebBrowserWindow._useQtHelp:
@@ -427,6 +471,14 @@
             self.__hideNavigationTimer.setSingleShot(True)
             self.__hideNavigationTimer.timeout.connect(self.__hideNavigation)
             
+            self.__forcedClose = False
+            
+            if restoreSessionData:
+                self.sessionManager().restoreSessionFromData(
+                    self, restoreSessionData)
+            
+            self.sessionManager().activateTimer()
+            
             QTimer.singleShot(0, syncMgr.loadSettings)
     
     def __del__(self):
@@ -886,7 +938,7 @@
             if self.__fromEric:
                 self.exitAct.triggered.connect(self.close)
             else:
-                self.exitAct.triggered.connect(self.__closeAllWindows)
+                self.exitAct.triggered.connect(self.shutdown)
         self.__actions.append(self.exitAct)
         
         self.backAct = E5Action(
@@ -1832,6 +1884,21 @@
             self.showTabManagerAct.triggered.connect(self.__showTabManager)
         self.__actions.append(self.showTabManagerAct)
         
+        self.showSessionsManagerAct = E5Action(
+            self.tr('Session Manager'),
+            self.tr('Session Manager...'),
+            0, 0, self, 'webbrowser_show_session_manager')
+        self.showSessionsManagerAct.setStatusTip(self.tr(
+            'Shows the session manager window'))
+        self.showSessionsManagerAct.setWhatsThis(self.tr(
+            """<b>Session Manager</b>"""
+            """<p>Shows the session manager window.</p>"""
+        ))
+        if not self.__initShortcutsOnly:
+            self.showSessionsManagerAct.triggered.connect(
+                self.__showSessionManagerDialog)
+        self.__actions.append(self.showSessionsManagerAct)
+        
         self.virustotalScanCurrentAct = E5Action(
             self.tr("Scan current site"),
             UI.PixmapCache.getIcon("virustotal.png"),
@@ -1899,6 +1966,12 @@
         menu.addAction(self.openAct)
         menu.addAction(self.openTabAct)
         menu.addSeparator()
+        if not self.isPrivate():
+            sessionsMenu = menu.addMenu(self.tr("Sessions"))
+            sessionsMenu.aboutToShow.connect(
+                self.sessionManager().aboutToShowSessionsMenu)
+            menu.addAction(self.showSessionsManagerAct)
+            menu.addSeparator()
         if self.saveAsAct is not None:
             menu.addAction(self.saveAsAct)
         menu.addAction(self.savePageScreenAct)
@@ -2078,6 +2151,13 @@
         self.__superMenu.addAction(self.openTabAct)
         self.__superMenu.addSeparator()
         
+        if not self.isPrivate():
+            sessionsMenu = self.__superMenu.addMenu(self.tr("Sessions"))
+            sessionsMenu.aboutToShow.connect(
+                self.sessionManager().aboutToShowSessionsMenu)
+            self.__superMenu.addAction(self.showSessionsManagerAct)
+            self.__superMenu.addSeparator()
+        
         menu = self.__superMenu.addMenu(self.tr("Save"))
         if self.saveAsAct:
             menu.addAction(self.saveAsAct)
@@ -2375,12 +2455,14 @@
             return self.__tabWidget.newBrowser(link, background=background)
     
     @pyqtSlot()
-    def newWindow(self, link=None):
+    def newWindow(self, link=None, restoreSession=False):
         """
         Public slot called to open a new web browser window.
         
         @param link URL to be displayed in the new window
         @type str or QUrl
+        @param restoreSession flag indicating a restore session action
+        @type bool
         @return reference to the new window
         @rtype WebBrowserWindow
         """
@@ -2391,7 +2473,8 @@
         else:
             linkName = link
         h = WebBrowserWindow(linkName, ".", self.parent(), "webbrowser",
-                             self.__fromEric, private=self.isPrivate())
+                             self.__fromEric, private=self.isPrivate(),
+                             restoreSession=restoreSession)
         h.show()
         
         self.webBrowserWindowOpened.emit(h)
@@ -2685,15 +2768,13 @@
         """
         self.__searchWidget.showFind()
         
-    def __closeAllWindows(self):
-        """
-        Private slot to close all windows.
-        """
-        for browser in WebBrowserWindow.BrowserWindows:
-            if browser != self:
-                browser.close()
+    def forceClose(self):
+        """
+        Public method to force closing the window.
+        """
+        self.__forcedClose = True
         self.close()
-        
+    
     def closeEvent(self, e):
         """
         Protected event handler for the close event.
@@ -2702,62 +2783,48 @@
             <br />This event is simply accepted after the history has been
             saved and all window references have been deleted.
         """
-        if not self.__shutdownCalled:
-            res = self.shutdown()
-            
-            if res:
-                e.accept()
-                self.webBrowserWindowClosed.emit(self)
-            else:
-                e.ignore()
+        res = self.__shutdownWindow()
+        
+        if res:
+            e.accept()
+            self.webBrowserWindowClosed.emit(self)
         else:
-            e.accept()
+            e.ignore()
     
-    def shutdown(self):
-        """
-        Public method to shut down the web browser.
+    def isClosing(self):
+        """
+        Public method to test, if the window is closing.
+        
+        @return flag indicating that the window is closing
+        @rtype bool
+        """
+        return self.__isClosing
+    
+    def __shutdownWindow(self):
+        """
+        Private method to shut down a web browser window.
         
         @return flag indicating successful shutdown (boolean)
         """
-        if not self.__tabWidget.shallShutDown():
-            return False
-        
-        if not self.downloadManager().allowQuit():
-            return False
-        
-        self.downloadManager().shutdown()
-        
-        self.cookieJar().close()
+        if not WebBrowserWindow._performingShutdown and not self.__forcedClose:
+            if not self.__tabWidget.shallShutDown():
+                return False
+        
+        self.__isClosing = True
+        
+        if not self.__fromEric:
+            if not WebBrowserWindow._performingShutdown and \
+                    len(WebBrowserWindow.BrowserWindows) == 1:
+                # shut down the session manager in case the last window is
+                # about to be closed
+                self.sessionManager().shutdown()
         
         self.__bookmarksToolBar.setModel(None)
-        self.bookmarksManager().close()
-        
-        self.historyManager().close()
-        
-        self.passwordManager().close()
-        
-        self.adBlockManager().close()
-        
-        self.userAgentsManager().close()
-        
-        self.speedDial().close()
-        
-        self.syncManager().close()
-        
-        ZoomManager.instance().close()
-        
-        WebIconProvider.instance().close()
         
         self.__virusTotal.close()
         
-        self.flashCookieManager().shutdown()
-        
         self.__navigationBar.searchEdit().openSearchManager().close()
         
-        if len(WebBrowserWindow.BrowserWindows) == 1:
-            # it is the last window
-            self.tabManager().close()
-        
         if WebBrowserWindow._useQtHelp:
             self.__searchEngine.cancelIndexing()
             self.__searchEngine.cancelSearching()
@@ -2786,12 +2853,104 @@
         except ValueError:
             pass
         
-        self.networkManager().shutdown()
-        
         if not self.__fromEric:
             Preferences.syncPreferences()
-        
-        self.__shutdownCalled = True
+            if not WebBrowserWindow._performingShutdown and \
+                    len(WebBrowserWindow.BrowserWindows) == 0:
+                # shut down the browser in case the last window was
+                # simply closed
+                self.shutdown()
+        
+        return True
+    
+    def __shallShutDown(self):
+        """
+        Private method to check, if the application should be shut down.
+        
+        @return flag indicating a shut down
+        @rtype bool
+        """
+        if Preferences.getWebBrowser("WarnOnMultipleClose"):
+            windowCount = len(WebBrowserWindow.BrowserWindows)
+            tabCount = 0
+            for browser in WebBrowserWindow.BrowserWindows:
+                tabCount += browser.tabWidget().count()
+            
+            if windowCount > 1 or tabCount > 1:
+                mb = E5MessageBox.E5MessageBox(
+                    E5MessageBox.Information,
+                    self.tr("Are you sure you want to close the web browser?"),
+                    self.tr("""Are you sure you want to close the web"""
+                            """ browser?\n"""
+                            """You have {0} windows with {1} tabs open.""")
+                    .format(windowCount, tabCount),
+                    modal=True,
+                    parent=self)
+                if self.fromEric:
+                    quitButton = mb.addButton(
+                        self.tr("&Close"), E5MessageBox.AcceptRole)
+                    quitButton.setIcon(UI.PixmapCache.getIcon("close.png"))
+                else:
+                    quitButton = mb.addButton(
+                        self.tr("&Quit"), E5MessageBox.AcceptRole)
+                    quitButton.setIcon(UI.PixmapCache.getIcon("exit.png"))
+                mb.addButton(E5MessageBox.Cancel)
+                mb.exec_()
+                return mb.clickedButton() == quitButton
+        
+        return True
+    
+    def shutdown(self):
+        """
+        Public method to shut down the web browser.
+        
+        @return flag indicating successful shutdown (boolean)
+        """
+        if not self.__shallShutDown():
+            return False
+        
+        if not self.downloadManager().allowQuit():
+            return False
+        
+        WebBrowserWindow._performingShutdown = True
+        
+        self.sessionManager().shutdown()
+        
+        self.downloadManager().shutdown()
+        
+        self.cookieJar().close()
+        
+        self.bookmarksManager().close()
+        
+        self.historyManager().close()
+        
+        self.passwordManager().close()
+        
+        self.adBlockManager().close()
+        
+        self.userAgentsManager().close()
+        
+        self.speedDial().close()
+        
+        self.syncManager().close()
+        
+        ZoomManager.instance().close()
+        
+        WebIconProvider.instance().close()
+        
+        self.flashCookieManager().shutdown()
+        
+        if len(WebBrowserWindow.BrowserWindows) == 1:
+            # it is the last window
+            self.tabManager().close()
+        
+        self.networkManager().shutdown()
+        
+        for browser in WebBrowserWindow.BrowserWindows:
+            if browser != self:
+                browser.close()
+        self.close()
+        
         return True
 
     def __backward(self):
@@ -3083,6 +3242,8 @@
             self.virustotalDomainReportAct.setEnabled(True)
         
         self.__javaScriptIcon.preferencesChanged()
+        
+        self.sessionManager().preferencesChanged()
     
     def masterPasswordChanged(self, oldPassword, newPassword):
         """
@@ -3892,28 +4053,28 @@
         """
         return cls.BrowserWindows
     
-    def __appFocusChanged(self, old, now):
+    @pyqtSlot()
+    def __appFocusChanged(self):
         """
         Private slot to handle a change of the focus.
-        
-        @param old reference to the widget, that lost focus (QWidget or None)
-        @param now reference to the widget having the focus (QWidget or None)
-        """
-        if isinstance(now, WebBrowserWindow):
-            self.__lastActiveWindow = now
+        """
+        focusWindow = e5App().activeWindow()
+        if isinstance(focusWindow, WebBrowserWindow):
+            WebBrowserWindow._lastActiveWindow = focusWindow
     
-    def getWindow(self):
-        """
-        Public method to get a reference to the most recent active
+    @classmethod
+    def getWindow(cls):
+        """
+        Class method to get a reference to the most recent active
         web browser window.
         
         @return reference to most recent web browser window
         @rtype WebBrowserWindow
         """
-        if self.__lastActiveWindow:
-            return self.__lastActiveWindow
-        
-        return self.mainWindow()
+        if cls._lastActiveWindow:
+            return cls._lastActiveWindow
+        
+        return cls.mainWindow()
     
     def openSearchManager(self):
         """
@@ -4648,3 +4809,27 @@
             cls._webProfile.scripts().insert(script)
         
         return cls._webProfile
+    
+    ####################################################
+    ## Methods below implement session related functions
+    ####################################################
+    
+    @classmethod
+    def sessionManager(cls):
+        """
+        Class method to get a reference to the session manager.
+        
+        @return reference to the session manager
+        @rtype SessionManager
+        """
+        if cls._sessionManager is None and not cls._isPrivate:
+            from .Session.SessionManager import SessionManager
+            cls._sessionManager = SessionManager()
+        
+        return cls._sessionManager
+    
+    def __showSessionManagerDialog(self):
+        """
+        Private slot to show the session manager dialog.
+        """
+        self.sessionManager().showSessionManagerDialog()
--- a/changelog	Thu Jul 06 18:59:43 2017 +0200
+++ b/changelog	Wed Aug 02 13:28:50 2017 +0200
@@ -1,5 +1,17 @@
 Change Log
 ----------
+Version 17.08:
+- bug fixes
+- Shell
+  -- added support for different history navigation styles (disabled, Linux,
+     Windows)
+  -- improved shell history dialog
+- Templates
+  - added some new predefined template variables (time, path_name_rel,
+    dir_name_rel)
+- Web Browser (NG)
+  -- added support for sessions
+
 Version 17.07:
 - bug fixes
 - Background Services
--- a/eric6.e4p	Thu Jul 06 18:59:43 2017 +0200
+++ b/eric6.e4p	Wed Aug 02 13:28:50 2017 +0200
@@ -1405,6 +1405,9 @@
     <Source>WebBrowser/QtHelp/QtHelpFiltersDialog.py</Source>
     <Source>WebBrowser/QtHelp/__init__.py</Source>
     <Source>WebBrowser/SearchWidget.py</Source>
+    <Source>WebBrowser/Session/SessionManager.py</Source>
+    <Source>WebBrowser/Session/SessionManagerDialog.py</Source>
+    <Source>WebBrowser/Session/__init__.py</Source>
     <Source>WebBrowser/SiteInfo/SiteInfoDialog.py</Source>
     <Source>WebBrowser/SiteInfo/__init__.py</Source>
     <Source>WebBrowser/SpeedDial/Page.py</Source>
@@ -1931,6 +1934,7 @@
     <Form>WebBrowser/QtHelp/QtHelpDocumentationSelectionDialog.ui</Form>
     <Form>WebBrowser/QtHelp/QtHelpFiltersDialog.ui</Form>
     <Form>WebBrowser/SearchWidget.ui</Form>
+    <Form>WebBrowser/Session/SessionManagerDialog.ui</Form>
     <Form>WebBrowser/SiteInfo/SiteInfoDialog.ui</Form>
     <Form>WebBrowser/StatusBar/JavaScriptSettingsDialog.ui</Form>
     <Form>WebBrowser/Sync/SyncCheckPage.ui</Form>
@@ -1993,14 +1997,14 @@
   <Interfaces/>
   <Others>
     <Other>.hgignore</Other>
+    <Other>APIs/Python/zope-2.10.7.api</Other>
+    <Other>APIs/Python/zope-2.11.2.api</Other>
+    <Other>APIs/Python/zope-3.3.1.api</Other>
     <Other>APIs/Python3/PyQt4.bas</Other>
     <Other>APIs/Python3/PyQt5.bas</Other>
     <Other>APIs/Python3/QScintilla2.bas</Other>
     <Other>APIs/Python3/eric6.api</Other>
     <Other>APIs/Python3/eric6.bas</Other>
-    <Other>APIs/Python/zope-2.10.7.api</Other>
-    <Other>APIs/Python/zope-2.11.2.api</Other>
-    <Other>APIs/Python/zope-3.3.1.api</Other>
     <Other>APIs/QSS/qss.api</Other>
     <Other>APIs/Ruby/Ruby-1.8.7.api</Other>
     <Other>APIs/Ruby/Ruby-1.8.7.bas</Other>
--- a/i18n/eric6_cs.ts	Thu Jul 06 18:59:43 2017 +0200
+++ b/i18n/eric6_cs.ts	Wed Aug 02 13:28:50 2017 +0200
@@ -14127,7 +14127,7 @@
         <translation>Zadejte heslo vašeho mail serveru</translation>
     </message>
     <message>
-        <location filename="../UI/EmailDialog.py" line="429"/>
+        <location filename="../UI/EmailDialog.py" line="428"/>
         <source>Attach file</source>
         <translation>Připojit soubor</translation>
     </message>
@@ -14162,7 +14162,7 @@
         <translation>&lt;p&gt;Autentizace selhala.&lt;br&gt;Důvod: {0}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../UI/EmailDialog.py" line="414"/>
+        <location filename="../UI/EmailDialog.py" line="413"/>
         <source>&lt;p&gt;Message could not be sent.&lt;br&gt;Reason: {0}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Zprávu nelze odeslat.&lt;br&gt;Důvod: {0}&lt;/p&gt;</translation>
     </message>
@@ -14182,7 +14182,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/EmailDialog.py" line="414"/>
+        <location filename="../UI/EmailDialog.py" line="413"/>
         <source>Send Message</source>
         <translation type="unfinished"></translation>
     </message>
@@ -41021,27 +41021,27 @@
 <context>
     <name>Preferences</name>
     <message>
-        <location filename="../Preferences/__init__.py" line="1564"/>
+        <location filename="../Preferences/__init__.py" line="1583"/>
         <source>Export Preferences</source>
         <translation>Předvolby exportu</translation>
     </message>
     <message>
-        <location filename="../Preferences/__init__.py" line="1592"/>
+        <location filename="../Preferences/__init__.py" line="1611"/>
         <source>Import Preferences</source>
         <translation>Předvolby importu</translation>
     </message>
     <message>
-        <location filename="../Preferences/__init__.py" line="1592"/>
+        <location filename="../Preferences/__init__.py" line="1611"/>
         <source>Properties File (*.ini);;All Files (*)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/__init__.py" line="1694"/>
+        <location filename="../Preferences/__init__.py" line="1713"/>
         <source>Select Python{0} Interpreter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/__init__.py" line="1694"/>
+        <location filename="../Preferences/__init__.py" line="1713"/>
         <source>Select the Python{0} interpreter to be used:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -41062,22 +41062,22 @@
 <context>
     <name>PreviewProcessingThread</name>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="433"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="436"/>
         <source>&lt;p&gt;No preview available for this type of file.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="565"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="568"/>
         <source>&lt;p&gt;ReStructuredText preview requires the &lt;b&gt;python-docutils&lt;/b&gt; package.&lt;br/&gt;Install it with your package manager, &apos;pip install docutils&apos; or see &lt;a href=&quot;http://pypi.python.org/pypi/docutils&quot;&gt;this page.&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="510"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="513"/>
         <source>&lt;p&gt;ReStructuredText preview requires the &lt;b&gt;sphinx&lt;/b&gt; package.&lt;br/&gt;Install it with your package manager,&apos;pip install Sphinx&apos; or see &lt;a href=&quot;http://pypi.python.org/pypi/Sphinx&quot;&gt;this page.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Alternatively you may disable Sphinx usage on the Editor, Filehandling configuration page.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="590"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="593"/>
         <source>&lt;p&gt;Markdown preview requires the &lt;b&gt;python-markdown&lt;/b&gt; package.&lt;br/&gt;Install it with your package manager, &apos;pip install docutils&apos; or see &lt;a href=&quot;http://pythonhosted.org/Markdown/install.html&quot;&gt;installation instructions.&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
@@ -51148,59 +51148,245 @@
     </message>
 </context>
 <context>
+    <name>SessionManager</name>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="286"/>
+        <source>Backup 1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="293"/>
+        <source>Backup 2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="324"/>
+        <source>Default Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="484"/>
+        <source>Clone Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="487"/>
+        <source>Rename Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="488"/>
+        <source>Please enter a new name:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="641"/>
+        <source>The session file &quot;{0}&quot; exists already. Please enter another name.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="513"/>
+        <source>An error occurred while cloning the session file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="521"/>
+        <source>An error occurred while renaming the session file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="552"/>
+        <source>Save Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="536"/>
+        <source>Please enter a name for the session:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="536"/>
+        <source>Saved Session ({0})</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="572"/>
+        <source>Restore Backup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="572"/>
+        <source>Are you sure you want to replace the current session?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="612"/>
+        <source>Delete Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="612"/>
+        <source>Are you sure you want to delete session &quot;{0}&quot;?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="641"/>
+        <source>New Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="625"/>
+        <source>Please enter a name for the new session:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="625"/>
+        <source>New Session ({0})</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="685"/>
+        <source>Please select the startup session:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManager.py" line="704"/>
+        <source>{0} (last session)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SessionManagerDialog</name>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="14"/>
+        <source>Session Manager</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="23"/>
+        <source>Shows a list of available sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="33"/>
+        <source>Session</source>
+        <translation type="unfinished">Relace</translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="38"/>
+        <source>Last Modified</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="48"/>
+        <source>Press to create a new session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="51"/>
+        <source>New</source>
+        <translation type="unfinished">Nový</translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="58"/>
+        <source>Press to rename the selected session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="61"/>
+        <source>Rename</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="68"/>
+        <source>Press to clone the selected session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="71"/>
+        <source>Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="78"/>
+        <source>Press to delete the selected session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="81"/>
+        <source>Delete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.ui" line="88"/>
+        <source>Press to switch to the selected session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.py" line="103"/>
+        <source>Switch To</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Session/SessionManagerDialog.py" line="95"/>
+        <source>Restore</source>
+        <translation type="unfinished">Obnovit</translation>
+    </message>
+</context>
+<context>
     <name>Shell</name>
     <message>
-        <location filename="../QScintilla/Shell.py" line="121"/>
+        <location filename="../QScintilla/Shell.py" line="138"/>
         <source>Shell - Passive</source>
         <translation>Shell - pasivní</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="123"/>
+        <location filename="../QScintilla/Shell.py" line="140"/>
         <source>Shell</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="227"/>
+        <location filename="../QScintilla/Shell.py" line="250"/>
         <source>Passive &gt;&gt;&gt; </source>
         <translation>Pasivní &gt;&gt;&gt; </translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="243"/>
+        <location filename="../QScintilla/Shell.py" line="266"/>
         <source>Start</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="256"/>
+        <location filename="../QScintilla/Shell.py" line="279"/>
         <source>Copy</source>
         <translation>Kopírovat</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="257"/>
+        <location filename="../QScintilla/Shell.py" line="280"/>
         <source>Paste</source>
         <translation>Vložit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="262"/>
+        <location filename="../QScintilla/Shell.py" line="286"/>
         <source>Clear</source>
         <translation>Vyčistit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="263"/>
+        <location filename="../QScintilla/Shell.py" line="287"/>
         <source>Reset</source>
         <translation>Reset</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="264"/>
+        <location filename="../QScintilla/Shell.py" line="288"/>
         <source>Reset and Clear</source>
         <translation>Reset a vyčistit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="698"/>
+        <location filename="../QScintilla/Shell.py" line="789"/>
         <source>No.</source>
         <translation>Č.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="1772"/>
+        <location filename="../QScintilla/Shell.py" line="1951"/>
         <source>Drop Error</source>
         <translation>Zahodit chybu</translation>
     </message>
@@ -51210,84 +51396,84 @@
         <translation type="obsolete">&lt;b&gt;Okno Shellu&lt;/b&gt;&lt;p&gt;Toto je jednoduchý interpretr běžící v okně. Interpretr běží nezávisle na programu, který je debugován. To znamená, že můžete spustit jakýkoliv příkaz i během debugování.&lt;/p&gt;&lt;p&gt;Během vkládání příkazu můžete použít kurzorové klávesy. Je zde také historie příkazů, která se aktivuje klávesami up a down. Stisknutím up nebo down klávesy po textu, který byl zadán se spustí inkrementální vyhledávání.&lt;/p&gt;&lt;p&gt;Shell má několik speciálních příkazů. &apos;reset&apos; zabije shell a spustí nový. &apos;clear&apos; vyčistí obsah shell okna.&apos;start&apos; se používá pro přepnutí shell jazyka a musí za ním následovat jméno podporovaného jazyka. Podporované jazyky jsou zobrazeny v seznamu, který vrací příkaz &apos;languages&apos;. Tyto příkazy (kromě &apos;languages&apos;) jsou také dostupné přes kontextové menu.&lt;/p&gt;&lt;p&gt;Stisknutím tab klávesy po nějakém vloženém textu se zobrazí seznam s nabídkou možných zakončení výrazu. Odpovídající zadání pak může být vybráno z tohoto listu. Pokud je existuje jen jedna možnost, je vložena automaticky.&lt;/p&gt;&lt;p&gt;Dokud se program neukončí, je shell v pasivním módu dostupný jen pokud se debugovaný program připojil k IDE. To je oznámeno odlišným promptem a dále v názvu titulku okna.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="695"/>
+        <location filename="../QScintilla/Shell.py" line="786"/>
         <source>Passive Debug Mode</source>
         <translation>Pasivní debug mód</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="248"/>
+        <location filename="../QScintilla/Shell.py" line="271"/>
         <source>History</source>
         <translation>Historie</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="249"/>
+        <location filename="../QScintilla/Shell.py" line="272"/>
         <source>Select entry</source>
         <translation>Vybrat vstupy</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="250"/>
+        <location filename="../QScintilla/Shell.py" line="273"/>
         <source>Show</source>
         <translation>Zobrazit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="632"/>
+        <location filename="../QScintilla/Shell.py" line="723"/>
         <source>Select History</source>
         <translation>Vybrat historii</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="632"/>
+        <location filename="../QScintilla/Shell.py" line="723"/>
         <source>Select the history entry to execute (most recent shown last).</source>
         <translation>Vybrat vstup historie pro vykonání (nejaktuálnější zobrazen poslední).</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="696"/>
+        <location filename="../QScintilla/Shell.py" line="787"/>
         <source>
 Not connected</source>
         <translation>Nepřipojen</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="269"/>
+        <location filename="../QScintilla/Shell.py" line="293"/>
         <source>Configure...</source>
         <translation>Konfigurovat...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="255"/>
+        <location filename="../QScintilla/Shell.py" line="278"/>
         <source>Cut</source>
         <translation>Vyjmout</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="700"/>
+        <location filename="../QScintilla/Shell.py" line="791"/>
         <source>{0} on {1}, {2}</source>
         <translation>{0} na {1}, {2}</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="843"/>
+        <location filename="../QScintilla/Shell.py" line="934"/>
         <source>StdOut: {0}</source>
         <translation>StdOut: {0}</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="851"/>
+        <location filename="../QScintilla/Shell.py" line="942"/>
         <source>StdErr: {0}</source>
         <translation>StdErr: {0}</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="1482"/>
+        <location filename="../QScintilla/Shell.py" line="1637"/>
         <source>Shell language &quot;{0}&quot; not supported.
 </source>
         <translation>Shell jazyk &quot;{0}&quot; není podporován.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="1772"/>
+        <location filename="../QScintilla/Shell.py" line="1951"/>
         <source>&lt;p&gt;&lt;b&gt;{0}&lt;/b&gt; is not a file.&lt;/p&gt;</source>
         <translation>&lt;p&gt;&lt;b&gt;{0}&lt;/b&gt; není soubor.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="260"/>
+        <location filename="../QScintilla/Shell.py" line="284"/>
         <source>Find</source>
         <translation type="unfinished">Hledat</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="743"/>
+        <location filename="../QScintilla/Shell.py" line="834"/>
         <source>Exception &quot;{0}&quot;
 {1}
 File: {2}, Line: {3}
@@ -51295,38 +51481,38 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="776"/>
+        <location filename="../QScintilla/Shell.py" line="867"/>
         <source>Unspecified syntax error.
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="753"/>
+        <location filename="../QScintilla/Shell.py" line="844"/>
         <source>Exception &quot;{0}&quot;
 {1}
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="778"/>
+        <location filename="../QScintilla/Shell.py" line="869"/>
         <source>Syntax error &quot;{1}&quot; in file {0} at line {2}, character {3}.
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="801"/>
+        <location filename="../QScintilla/Shell.py" line="892"/>
         <source>Signal &quot;{0}&quot; generated in file {1} at line {2}.
 Function: {3}({4})</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Shell.py" line="126"/>
-        <source>&lt;b&gt;The Shell Window&lt;/b&gt;&lt;p&gt;You can use the cursor keys while entering commands. There is also a history of commands that can be recalled using the up and down cursor keys. Pressing the up or down key after some text has been entered will start an incremental search.&lt;/p&gt;&lt;p&gt;The shell has some special commands. &apos;reset&apos; kills the shell and starts a new one. &apos;clear&apos; clears the display of the shell window. &apos;start&apos; is used to switch the shell language and must be followed by a supported language. Supported languages are listed by the &apos;languages&apos; command. &apos;quit&apos; is used to exit the application.These commands (except &apos;languages&apos;) are available through the window menus as well.&lt;/p&gt;&lt;p&gt;Pressing the Tab key after some text has been entered will show a list of possible completions. The relevant entry may be selected from this list. If only one entry is available, this will be inserted automatically.&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Shell.py" line="147"/>
-        <source>&lt;b&gt;The Shell Window&lt;/b&gt;&lt;p&gt;This is simply an interpreter running in a window. The interpreter is the one that is used to run the program being debugged. This means that you can execute any command while the program being debugged is running.&lt;/p&gt;&lt;p&gt;You can use the cursor keys while entering commands. There is also a history of commands that can be recalled using the up and down cursor keys. Pressing the up or down key after some text has been entered will start an incremental search.&lt;/p&gt;&lt;p&gt;The shell has some special commands. &apos;reset&apos; kills the shell and starts a new one. &apos;clear&apos; clears the display of the shell window. &apos;start&apos; is used to switch the shell language and must be followed by a supported language. Supported languages are listed by the &apos;languages&apos; command. These commands (except &apos;languages&apos;) are available through the context menu as well.&lt;/p&gt;&lt;p&gt;Pressing the Tab key after some text has been entered will show a list of possible completions. The relevant entry may be selected from this list. If only one entry is available, this will be inserted automatically.&lt;/p&gt;&lt;p&gt;In passive debugging mode the shell is only available after the program to be debugged has connected to the IDE until it has finished. This is indicated by a different prompt and by an indication in the window caption.&lt;/p&gt;</source>
+        <location filename="../QScintilla/Shell.py" line="143"/>
+        <source>&lt;b&gt;The Shell Window&lt;/b&gt;&lt;p&gt;You can use the cursor keys while entering commands. There is also a history of commands that can be recalled using the up and down cursor keys while holding down the Ctrl-key. This can be switched to just the up and down cursor keys on the Shell page of the configuration dialog. Pressing these keys after some text has been entered will start an incremental search.&lt;/p&gt;&lt;p&gt;The shell has some special commands. &apos;reset&apos; kills the shell and starts a new one. &apos;clear&apos; clears the display of the shell window. &apos;start&apos; is used to switch the shell language and must be followed by a supported language. Supported languages are listed by the &apos;languages&apos; command. &apos;quit&apos; is used to exit the application.These commands (except &apos;languages&apos;) are available through the window menus as well.&lt;/p&gt;&lt;p&gt;Pressing the Tab key after some text has been entered will show a list of possible completions. The relevant entry may be selected from this list. If only one entry is available, this will be inserted automatically.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Shell.py" line="166"/>
+        <source>&lt;b&gt;The Shell Window&lt;/b&gt;&lt;p&gt;This is simply an interpreter running in a window. The interpreter is the one that is used to run the program being debugged. This means that you can execute any command while the program being debugged is running.&lt;/p&gt;&lt;p&gt;You can use the cursor keys while entering commands. There is also a history of commands that can be recalled using the up and down cursor keys while holding down the Ctrl-key. This can be switched to just the up and down cursor keys on the Shell page of the configuration dialog. Pressing these keys after some text has been entered will start an incremental search.&lt;/p&gt;&lt;p&gt;The shell has some special commands. &apos;reset&apos; kills the shell and starts a new one. &apos;clear&apos; clears the display of the shell window. &apos;start&apos; is used to switch the shell language and must be followed by a supported language. Supported languages are listed by the &apos;languages&apos; command. These commands (except &apos;languages&apos;) are available through the context menu as well.&lt;/p&gt;&lt;p&gt;Pressing the Tab key after some text has been entered will show a list of possible completions. The relevant entry may be selected from this list. If only one entry is available, this will be inserted automatically.&lt;/p&gt;&lt;p&gt;In passive debugging mode the shell is only available after the program to be debugged has connected to the IDE until it has finished. This is indicated by a different prompt and by an indication in the window caption.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -51436,348 +51622,404 @@
         <translation>Zvýrazňování syntaxe zapnuto</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="93"/>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="97"/>
         <source>max. History Entries:</source>
         <translation>Max. položek v historii:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="100"/>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="104"/>
         <source>Enter the number of history entries allowed</source>
         <translation>Zadejte maximální počet položek v historii</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="137"/>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="260"/>
         <source>Select to show debuggee stdout and stderr</source>
         <translation>Vybrat pro zobrazení debugování na stdout a stderr</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="140"/>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="263"/>
         <source>Show stdout and stderr of debuggee</source>
         <translation>Zobrazit debugování na stdout a stderr</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="147"/>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="183"/>
         <source>Font</source>
         <translation>Font</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="153"/>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="189"/>
         <source>Press to select the font to be used as the monospaced font</source>
         <translation>Stisknout pro výběr fontu, který bude použit pro neproporcionální písmo</translation>
     </message>
     <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="192"/>
+        <source>Monospaced Font</source>
+        <translation>Neproporcionální font</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="202"/>
+        <source>Monospaced Text</source>
+        <translation>Neproporcionální text</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="215"/>
+        <source>Select, whether the monospaced font should be used as default</source>
+        <translation>Vybrat, má-li být jako default použit neproporcioální font</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="218"/>
+        <source>Use monospaced as default</source>
+        <translation>Neproporcionální font jako default</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="228"/>
+        <source>Line Numbers Font</source>
+        <translation>Font čísel řádek</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="244"/>
+        <source>2345</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="225"/>
+        <source>Press to select the font for the line numbers</source>
+        <translation>Stisknout pro výběr fontu pro čísla řádků v editoru</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="91"/>
+        <source>History</source>
+        <translation type="unfinished">Historie</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="142"/>
+        <source>Navigation Style:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="149"/>
+        <source>Select the history style</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="156"/>
-        <source>Monospaced Font</source>
-        <translation>Neproporcionální font</translation>
+        <source>Select to wrap around while navigating through the history</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="159"/>
+        <source>Wrap around while navigating</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="166"/>
-        <source>Monospaced Text</source>
-        <translation>Neproporcionální text</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="179"/>
-        <source>Select, whether the monospaced font should be used as default</source>
-        <translation>Vybrat, má-li být jako default použit neproporcioální font</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="182"/>
-        <source>Use monospaced as default</source>
-        <translation>Neproporcionální font jako default</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="192"/>
-        <source>Line Numbers Font</source>
-        <translation>Font čísel řádek</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="208"/>
-        <source>2345</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="189"/>
-        <source>Press to select the font for the line numbers</source>
-        <translation>Stisknout pro výběr fontu pro čísla řádků v editoru</translation>
+        <source>Select to make Up- and Down-keys move in history</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="169"/>
+        <source>&lt;b&gt;Up/Down keys navigate in history&lt;b&gt;
+&lt;p&gt;Select this entry to make Up- and Down-keys navigate in history. If unselected history navigation may be performed by Ctrl-Up or Ctrl-Down.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.ui" line="173"/>
+        <source>Up/Down keys navigate in history</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.py" line="40"/>
+        <source>Disabled</source>
+        <translation type="unfinished">Vypnuto</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.py" line="42"/>
+        <source>Linux Style</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ShellPage.py" line="44"/>
+        <source>Windows Style</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>ShellWindow</name>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="188"/>
+        <location filename="../QScintilla/ShellWindow.py" line="190"/>
         <source>Quit</source>
         <translation type="unfinished">Konec</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="188"/>
+        <location filename="../QScintilla/ShellWindow.py" line="190"/>
         <source>&amp;Quit</source>
         <translation type="unfinished">&amp;Konec</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="188"/>
+        <location filename="../QScintilla/ShellWindow.py" line="190"/>
         <source>Ctrl+Q</source>
         <comment>File|Quit</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="194"/>
+        <location filename="../QScintilla/ShellWindow.py" line="196"/>
         <source>Quit the Shell</source>
         <translation type="unfinished">Ukončit IDE</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="195"/>
+        <location filename="../QScintilla/ShellWindow.py" line="197"/>
         <source>&lt;b&gt;Quit the Shell&lt;/b&gt;&lt;p&gt;This quits the Shell window.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="203"/>
+        <location filename="../QScintilla/ShellWindow.py" line="205"/>
         <source>New Window</source>
         <translation type="unfinished">Nové okno</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="203"/>
+        <location filename="../QScintilla/ShellWindow.py" line="205"/>
         <source>New &amp;Window</source>
         <translation type="unfinished">&amp;Nové okno</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="203"/>
+        <location filename="../QScintilla/ShellWindow.py" line="205"/>
         <source>Ctrl+Shift+N</source>
         <comment>File|New Window</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="209"/>
-        <source>Open a new Shell window</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../QScintilla/ShellWindow.py" line="211"/>
+        <source>Open a new Shell window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/ShellWindow.py" line="213"/>
         <source>&lt;b&gt;New Window&lt;/b&gt;&lt;p&gt;This opens a new instance of the Shell window.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="218"/>
+        <location filename="../QScintilla/ShellWindow.py" line="220"/>
         <source>Restart</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="223"/>
-        <source>Restart the shell</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../QScintilla/ShellWindow.py" line="225"/>
+        <source>Restart the shell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/ShellWindow.py" line="227"/>
         <source>&lt;b&gt;Restart&lt;/b&gt;&lt;p&gt;Restart the shell for the currently selected language.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="232"/>
+        <location filename="../QScintilla/ShellWindow.py" line="234"/>
         <source>Restart and Clear</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="237"/>
-        <source>Clear the window and restart the shell</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../QScintilla/ShellWindow.py" line="239"/>
+        <source>Clear the window and restart the shell</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/ShellWindow.py" line="241"/>
         <source>&lt;b&gt;Restart and Clear&lt;/b&gt;&lt;p&gt;Clear the shell window and restart the shell for the currently selected language.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="874"/>
+        <location filename="../QScintilla/ShellWindow.py" line="876"/>
         <source>Show History</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="874"/>
+        <location filename="../QScintilla/ShellWindow.py" line="876"/>
         <source>&amp;Show History...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="880"/>
+        <location filename="../QScintilla/ShellWindow.py" line="882"/>
         <source>Show the shell history in a dialog</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="884"/>
+        <location filename="../QScintilla/ShellWindow.py" line="886"/>
         <source>Clear History</source>
         <translation type="unfinished">Vyčistit historii</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="884"/>
+        <location filename="../QScintilla/ShellWindow.py" line="886"/>
         <source>&amp;Clear History...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="890"/>
+        <location filename="../QScintilla/ShellWindow.py" line="892"/>
         <source>Clear the shell history</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="894"/>
+        <location filename="../QScintilla/ShellWindow.py" line="896"/>
         <source>Select History Entry</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="894"/>
+        <location filename="../QScintilla/ShellWindow.py" line="896"/>
         <source>Select History &amp;Entry</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="899"/>
+        <location filename="../QScintilla/ShellWindow.py" line="901"/>
         <source>Select an entry of the shell history</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="907"/>
+        <location filename="../QScintilla/ShellWindow.py" line="909"/>
         <source>About</source>
         <translation type="unfinished">O aplikaci</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="907"/>
+        <location filename="../QScintilla/ShellWindow.py" line="909"/>
         <source>&amp;About</source>
         <translation type="unfinished">O &amp;aplikaci</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="911"/>
-        <source>Display information about this software</source>
-        <translation type="unfinished">Zobrazit informace a tomto software</translation>
-    </message>
-    <message>
         <location filename="../QScintilla/ShellWindow.py" line="913"/>
+        <source>Display information about this software</source>
+        <translation type="unfinished">Zobrazit informace a tomto software</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/ShellWindow.py" line="915"/>
         <source>&lt;b&gt;About&lt;/b&gt;&lt;p&gt;Display some information about this software.&lt;/p&gt;</source>
         <translation type="unfinished">&lt;b&gt;O aplikaci&lt;/b&gt;&lt;p&gt;Zobrazí se informace o tomto software.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="919"/>
+        <location filename="../QScintilla/ShellWindow.py" line="921"/>
         <source>About Qt</source>
         <translation type="unfinished">O Qt</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="919"/>
+        <location filename="../QScintilla/ShellWindow.py" line="921"/>
         <source>About &amp;Qt</source>
         <translation type="unfinished">O &amp;Qt</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="923"/>
-        <source>Display information about the Qt toolkit</source>
-        <translation type="unfinished">Zobrazit informace o Qt toolkitu</translation>
-    </message>
-    <message>
         <location filename="../QScintilla/ShellWindow.py" line="925"/>
+        <source>Display information about the Qt toolkit</source>
+        <translation type="unfinished">Zobrazit informace o Qt toolkitu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/ShellWindow.py" line="927"/>
         <source>&lt;b&gt;About Qt&lt;/b&gt;&lt;p&gt;Display some information about the Qt toolkit.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="932"/>
+        <location filename="../QScintilla/ShellWindow.py" line="934"/>
         <source>What&apos;s This?</source>
         <translation type="unfinished">Co je to?</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="932"/>
+        <location filename="../QScintilla/ShellWindow.py" line="934"/>
         <source>&amp;What&apos;s This?</source>
         <translation type="unfinished">&amp;Co je to?</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="932"/>
+        <location filename="../QScintilla/ShellWindow.py" line="934"/>
         <source>Shift+F1</source>
         <comment>Help|What&apos;s This?&apos;</comment>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="938"/>
+        <location filename="../QScintilla/ShellWindow.py" line="940"/>
         <source>Context sensitive help</source>
         <translation type="unfinished">Kontextově senzitivní nápověda</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="939"/>
+        <location filename="../QScintilla/ShellWindow.py" line="941"/>
         <source>&lt;b&gt;Display context sensitive help&lt;/b&gt;&lt;p&gt;In What&apos;s This? mode, the mouse cursor shows an arrow with a question mark, and you can click on the interface elements to get a short description of what they do and how to use them. In dialogs, this feature can be accessed using the context help button in the titlebar.&lt;/p&gt;</source>
         <translation type="unfinished">&lt;b&gt;Zobrazit kontextově senzitivní nápovědu&lt;/b&gt;&lt;p&gt;V režimu &quot;Co je to?&quot; se nad různými prvky aplikace u kurzoru zobrazí otazník. Když pak kliknete na tyto prvky, zobrazí se krátký popis co daný prvek znamená a jak jej použít. V dialogových oknech se tato funkce spustí tlačítkem kontextové nápovědy na horní liště.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1075"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1077"/>
         <source>About eric6 Shell Window</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1075"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1077"/>
         <source>The eric6 Shell is a standalone shell window. It uses the same backend as the debugger of the full IDE, but is executed independently.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1103"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1105"/>
         <source>&amp;File</source>
         <translation type="unfinished">S&amp;oubor</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1112"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1114"/>
         <source>&amp;Edit</source>
         <translation type="unfinished">&amp;Edit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1123"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1125"/>
         <source>&amp;View</source>
         <translation type="unfinished">Poh&amp;led</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1130"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1132"/>
         <source>Histor&amp;y</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1136"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1139"/>
         <source>&amp;Start</source>
         <translation type="unfinished">&amp;Start</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1142"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1145"/>
         <source>&amp;Help</source>
         <translation type="unfinished">&amp;Nápověda</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1177"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1180"/>
         <source>File</source>
         <translation type="unfinished">Soubor</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1186"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1189"/>
         <source>Edit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1193"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1196"/>
         <source>Find</source>
         <translation type="unfinished">Hledat</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1199"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1202"/>
         <source>View</source>
         <translation type="unfinished">Pohled</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1206"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1209"/>
         <source>History</source>
         <translation type="unfinished">Historie</translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1211"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1215"/>
         <source>Help</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="1232"/>
+        <location filename="../QScintilla/ShellWindow.py" line="1236"/>
         <source>&lt;p&gt;This part of the status bar allows zooming the  shell.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="568"/>
+        <location filename="../QScintilla/ShellWindow.py" line="570"/>
         <source>Move forward one history entry</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/ShellWindow.py" line="578"/>
+        <location filename="../QScintilla/ShellWindow.py" line="580"/>
         <source>Move back one history entry</source>
         <translation type="unfinished"></translation>
     </message>
@@ -61266,7 +61508,7 @@
     </message>
     <message>
         <location filename="../Templates/TemplatePropertiesDialog.py" line="117"/>
-        <source>&lt;p&gt;To use variables in a template, you just have to enclose the variablename with $-characters. When you use the template, you will then be asked for a value for this variable.&lt;/p&gt;&lt;p&gt;Example template: This is a $VAR$&lt;/p&gt;&lt;p&gt;When you use this template you will be prompted for a value for the variable $VAR$. Any occurrences of $VAR$ will then be replaced with whatever you&apos;ve entered.&lt;/p&gt;&lt;p&gt;If you need a single $-character in a template, which is not used to enclose a variable, type $$(two dollar characters) instead. They will automatically be replaced with a single $-character when you use the template.&lt;/p&gt;&lt;p&gt;If you want a variables contents to be treated specially, the variablename must be followed by a &apos;: and one formatting specifier (e.g. $VAR:ml$). The supported specifiers are:&lt;table&gt;&lt;tr&gt;&lt;td&gt;ml&lt;/td&gt;&lt;td&gt;Specifies a multiline formatting. The first line of the variable contents is prefixed with the string occurring before the variable on the same line of the template. All other lines are prefixed by the same amount of whitespace as the line containing the variable.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;rl&lt;/td&gt;&lt;td&gt;Specifies a repeated line formatting. Each line of the variable contents is prefixed with the string occuring before the variable on the same line of the template.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;The following predefined variables may be used in a template:&lt;table&gt;&lt;tr&gt;&lt;td&gt;date&lt;/td&gt;&lt;td&gt;today&apos;s date in ISO format (YYYY-MM-DD)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;year&lt;/td&gt;&lt;td&gt;the current year&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;project_name&lt;/td&gt;&lt;td&gt;the name of the project (if any)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;project_path&lt;/td&gt;&lt;td&gt;the path of the project (if any)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;path_name&lt;/td&gt;&lt;td&gt;full path of the current file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dir_name&lt;/td&gt;&lt;td&gt;full path of the parent directory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;file_name&lt;/td&gt;&lt;td&gt;the current file name (without directory)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;base_name&lt;/td&gt;&lt;td&gt;like &lt;i&gt;file_name&lt;/i&gt;, but without extension&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ext&lt;/td&gt;&lt;td&gt;the extension of the current file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;cur_select&lt;/td&gt;&lt;td&gt;the currently selected text&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;insertion&lt;/td&gt;&lt;td&gt;Sets insertion point for cursor after template is inserted.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;select_start&lt;/td&gt;&lt;td&gt;Sets span of selected text in template after template is inserted (used together with &apos;select_end&apos;).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;select_end&lt;/td&gt;&lt;td&gt;Sets span of selected text in template after template is inserted (used together with &apos;select_start&apos;).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;clipboard&lt;/td&gt;&lt;td&gt;the text of the clipboard&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;If you want to change the default delimiter to anything different, please use the configuration dialog to do so.&lt;/p&gt;</source>
+        <source>&lt;p&gt;To use variables in a template, you just have to enclose the variable name with $-characters. When you use the template, you will then be asked for a value for this variable.&lt;/p&gt;&lt;p&gt;Example template: This is a $VAR$&lt;/p&gt;&lt;p&gt;When you use this template you will be prompted for a value for the variable $VAR$. Any occurrences of $VAR$ will then be replaced with whatever you&apos;ve entered.&lt;/p&gt;&lt;p&gt;If you need a single $-character in a template, which is not used to enclose a variable, type $$(two dollar characters) instead. They will automatically be replaced with a single $-character when you use the template.&lt;/p&gt;&lt;p&gt;If you want a variables contents to be treated specially, the variable name must be followed by a &apos;:&apos; and one formatting specifier (e.g. $VAR:ml$). The supported specifiers are:&lt;table&gt;&lt;tr&gt;&lt;td&gt;ml&lt;/td&gt;&lt;td&gt;Specifies a multiline formatting. The first line of the variable contents is prefixed with the string occurring before the variable on the same line of the template. All other lines are prefixed by the same amount of whitespace as the line containing the variable.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;rl&lt;/td&gt;&lt;td&gt;Specifies a repeated line formatting. Each line of the variable contents is prefixed with the string occurring before the variable on the same line of the template.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;The following predefined variables may be used in a template:&lt;table&gt;&lt;tr&gt;&lt;td&gt;date&lt;/td&gt;&lt;td&gt;today&apos;s date in ISO format (YYYY-MM-DD)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;year&lt;/td&gt;&lt;td&gt;the current year&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;time&lt;/td&gt;&lt;td&gt;current time in ISO format (hh:mm:ss)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;project_name&lt;/td&gt;&lt;td&gt;the name of the project (if any)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;project_path&lt;/td&gt;&lt;td&gt;the path of the project (if any)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;path_name&lt;/td&gt;&lt;td&gt;full path of the current file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;path_name_rel&lt;/td&gt;&lt;td&gt;project relative path of the current file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dir_name&lt;/td&gt;&lt;td&gt;full path of the current file&apos;s directory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dir_name_rel&lt;/td&gt;&lt;td&gt;project relative path of the current file&apos;s directory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;file_name&lt;/td&gt;&lt;td&gt;the current file&apos;s name (without directory)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;base_name&lt;/td&gt;&lt;td&gt;like &lt;i&gt;file_name&lt;/i&gt;, but without extension&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ext&lt;/td&gt;&lt;td&gt;the extension of the current file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;cur_select&lt;/td&gt;&lt;td&gt;the currently selected text&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;insertion&lt;/td&gt;&lt;td&gt;Sets insertion point for cursor after template is inserted.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;select_start&lt;/td&gt;&lt;td&gt;Sets span of selected text in template after template is inserted (used together with &apos;select_end&apos;).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;select_end&lt;/td&gt;&lt;td&gt;Sets span of selected text in template after template is inserted (used together with &apos;select_start&apos;).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;clipboard&lt;/td&gt;&lt;td&gt;the text of the clipboard&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;If you want to change the default delimiter to anything different, please use the configuration dialog to do so.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -61361,17 +61603,17 @@
         <translation>Nápověda šablony</translation>
     </message>
     <message>
-        <location filename="../Templates/TemplateViewer.py" line="859"/>
+        <location filename="../Templates/TemplateViewer.py" line="866"/>
         <source>Edit Template Group</source>
         <translation>Editovat skupinu šablon</translation>
     </message>
     <message>
-        <location filename="../Templates/TemplateViewer.py" line="953"/>
+        <location filename="../Templates/TemplateViewer.py" line="960"/>
         <source>Save templates</source>
         <translation>Uložit šablony</translation>
     </message>
     <message>
-        <location filename="../Templates/TemplateViewer.py" line="987"/>
+        <location filename="../Templates/TemplateViewer.py" line="994"/>
         <source>Read templates</source>
         <translation>Načíst šablony</translation>
     </message>
@@ -61386,17 +61628,17 @@
         <translation>&lt;p&gt;Opravdu chcete odebrat &lt;b&gt;{0}&lt;/b&gt;?&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Templates/TemplateViewer.py" line="859"/>
+        <location filename="../Templates/TemplateViewer.py" line="866"/>
         <source>&lt;p&gt;A template group with the name &lt;b&gt;{0}&lt;/b&gt; already exists.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Skupina šablon se jménem &lt;b&gt;{0}&lt;/b&gt; již existuje.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Templates/TemplateViewer.py" line="953"/>
+        <location filename="../Templates/TemplateViewer.py" line="960"/>
         <source>&lt;p&gt;The templates file &lt;b&gt;{0}&lt;/b&gt; could not be written.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Do souboru se šablonami &lt;b&gt;{0}&lt;/b&gt; nelze zapisovat.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Templates/TemplateViewer.py" line="987"/>
+        <location filename="../Templates/TemplateViewer.py" line="994"/>
         <source>&lt;p&gt;The templates file &lt;b&gt;{0}&lt;/b&gt; could not be read.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor se šablonami &lt;b&gt;{0}&lt;/b&gt; nelze přečíst.&lt;/p&gt;</translation>
     </message>
@@ -70849,72 +71091,72 @@
         <translation type="unfinished">Vybrat chování při spuštění</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="153"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="197"/>
         <source>Show Home Page</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="158"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="202"/>
         <source>Show Speed Dial</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="163"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="192"/>
         <source>Show Empty Page</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="171"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="210"/>
         <source>Home Page:</source>
         <translation type="unfinished">Domovská strana:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="178"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="217"/>
         <source>Enter the desired home page</source>
         <translation type="unfinished">Zadejte požadovanou domovskou stranu</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="185"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="224"/>
         <source>Press to set the current page as the home page</source>
         <translation type="unfinished">Stisknout pro nastavení aktuální strany jako domovské</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="188"/>
-        <source>Set to current page</source>
-        <translation type="unfinished">Nastavit aktuální stranu</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="195"/>
-        <source>Press to set the default home page</source>
-        <translation type="unfinished">Stisknout pro nastavení výchozí domovské strany</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="198"/>
-        <source>Set to default home page</source>
-        <translation type="unfinished">Nastavit výchozí domovskou stranu</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="221"/>
-        <source>Scheme</source>
-        <translation type="unfinished">Schéma</translation>
-    </message>
-    <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="227"/>
+        <source>Set to current page</source>
+        <translation type="unfinished">Nastavit aktuální stranu</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="234"/>
+        <source>Press to set the default home page</source>
+        <translation type="unfinished">Stisknout pro nastavení výchozí domovské strany</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="237"/>
+        <source>Set to default home page</source>
+        <translation type="unfinished">Nastavit výchozí domovskou stranu</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="340"/>
+        <source>Scheme</source>
+        <translation type="unfinished">Schéma</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="346"/>
         <source>Default Scheme:</source>
         <translation type="unfinished">Výchozí schéma:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="240"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="359"/>
         <source>Select the default scheme</source>
         <translation type="unfinished">Vybrat výchozí schéma</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="243"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="362"/>
         <source>&lt;b&gt;Default Scheme&lt;/b&gt;&lt;p&gt;Select the default scheme. This scheme is prepended to URLs, that don&apos;t contain one.&lt;/p&gt;</source>
         <translation type="unfinished">&lt;b&gt;Výchozí schéma&lt;/b&gt;&lt;p&gt;Výběr výchozího schématu. Toto schéma je predřazeno před URL, které jej neobsahují.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="256"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="375"/>
         <source>Privacy</source>
         <translation type="unfinished">Soukromí</translation>
     </message>
@@ -70924,285 +71166,285 @@
         <translation type="obsolete">Vybrat pro zapnutí JavaScriptu</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="265"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="384"/>
         <source>JavaScript</source>
         <translation type="unfinished">Zapnout JavaScript</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="271"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="390"/>
         <source>Select to allow JavaScript to open windows</source>
         <translation type="unfinished">Vybrat pro povolení JavaScriptu otevírat okna</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="274"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="393"/>
         <source>JavaScript can open windows</source>
         <translation type="unfinished">JavaScript může otevírat okna</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="281"/>
-        <source>Select to allow JavaScript to access the clipboard</source>
-        <translation type="unfinished">Vybrat pro povolení přístupu JavaScriptu do schránky</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="284"/>
-        <source>JavaScript can access clipboard</source>
-        <translation type="unfinished">JavaScript může přistupovat do schránky</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="294"/>
-        <source>Select to enable plugins in web pages</source>
-        <translation type="unfinished">Vybrat pro povolení zásuvných modulů na web stranách</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="297"/>
-        <source>Enable Plug-ins</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="311"/>
-        <source>Select to enabled the &quot;Do Not Track&quot; feature</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="314"/>
-        <source>Tell web sites I do not want to be tracked</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="323"/>
-        <source>Select to send referer headers to the server</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="326"/>
-        <source>Send Referer header to servers</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="346"/>
-        <source>Press to edit the list of whitelisted hosts</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="349"/>
-        <source>Edit Referer Whitelist ...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="361"/>
-        <source>Security</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="367"/>
-        <source>Select to enable XSS auditing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="370"/>
-        <source>&lt;b&gt;Enable XSS Auditing&lt;/b&gt;
-&lt;p&gt;This selects whether load requests should be monitored for cross-site scripting attempts. Suspicious scripts will be blocked. These will be reported in the JavaScript console. Enabling this feature might have an impact on performance.&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="374"/>
-        <source>Enable XSS Auditing</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="394"/>
-        <source>History</source>
-        <translation type="unfinished">Historie</translation>
-    </message>
-    <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="400"/>
-        <source>Remove history items:</source>
-        <translation type="unfinished">Odebrat položky historie:</translation>
+        <source>Select to allow JavaScript to access the clipboard</source>
+        <translation type="unfinished">Vybrat pro povolení přístupu JavaScriptu do schránky</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="403"/>
+        <source>JavaScript can access clipboard</source>
+        <translation type="unfinished">JavaScript může přistupovat do schránky</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="413"/>
-        <source>Select the period for expiration of history entries</source>
-        <translation type="unfinished">Vybrat interval pro vypršení platnosti položek historie</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="417"/>
-        <source>After one day</source>
-        <translation type="unfinished">Po jednom dni</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="422"/>
-        <source>After one week</source>
-        <translation type="unfinished">Po týdnu</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="427"/>
-        <source>After two weeks</source>
-        <translation type="unfinished">Po dvou týdnech</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="432"/>
-        <source>After one month</source>
-        <translation type="unfinished">Po měsíci</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="437"/>
-        <source>After one year</source>
-        <translation type="unfinished">Po roce</translation>
+        <source>Select to enable plugins in web pages</source>
+        <translation type="unfinished">Vybrat pro povolení zásuvných modulů na web stranách</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="416"/>
+        <source>Enable Plug-ins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="430"/>
+        <source>Select to enabled the &quot;Do Not Track&quot; feature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="433"/>
+        <source>Tell web sites I do not want to be tracked</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="442"/>
-        <source>Manually</source>
-        <translation type="unfinished">Ručně</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="447"/>
-        <source>On application exit</source>
-        <translation type="unfinished">Při ukončení aplikace</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="458"/>
-        <source>Browser Cache</source>
-        <translation type="unfinished">Procházet cache</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="464"/>
-        <source>Enable disk cache</source>
-        <translation type="unfinished">Zapnout disk cache</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="471"/>
-        <source>Cache size:</source>
-        <translation type="unfinished">Velikost cache:</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="478"/>
-        <source>Enter the maximum size of the disk cache</source>
-        <translation type="unfinished">Zadejte maximální velikost diskové cache</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="484"/>
-        <source> MB</source>
-        <translation type="unfinished"> MB</translation>
+        <source>Select to send referer headers to the server</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="445"/>
+        <source>Send Referer header to servers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="465"/>
+        <source>Press to edit the list of whitelisted hosts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="468"/>
+        <source>Edit Referer Whitelist ...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="480"/>
+        <source>Security</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="486"/>
+        <source>Select to enable XSS auditing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="489"/>
+        <source>&lt;b&gt;Enable XSS Auditing&lt;/b&gt;
+&lt;p&gt;This selects whether load requests should be monitored for cross-site scripting attempts. Suspicious scripts will be blocked. These will be reported in the JavaScript console. Enabling this feature might have an impact on performance.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="493"/>
+        <source>Enable XSS Auditing</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="513"/>
-        <source>Web Search</source>
-        <translation type="unfinished"></translation>
+        <source>History</source>
+        <translation type="unfinished">Historie</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="519"/>
-        <source>Language:</source>
-        <translation type="unfinished">Jazyk:</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="526"/>
-        <source>Select the language to be used for web searches</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="588"/>
-        <source>Navigation</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="594"/>
-        <source>Select to enable the spatial navigation feature</source>
-        <translation type="unfinished"></translation>
+        <source>Remove history items:</source>
+        <translation type="unfinished">Odebrat položky historie:</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="532"/>
+        <source>Select the period for expiration of history entries</source>
+        <translation type="unfinished">Vybrat interval pro vypršení platnosti položek historie</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="536"/>
+        <source>After one day</source>
+        <translation type="unfinished">Po jednom dni</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="541"/>
+        <source>After one week</source>
+        <translation type="unfinished">Po týdnu</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="546"/>
+        <source>After two weeks</source>
+        <translation type="unfinished">Po dvou týdnech</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="551"/>
+        <source>After one month</source>
+        <translation type="unfinished">Po měsíci</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="556"/>
+        <source>After one year</source>
+        <translation type="unfinished">Po roce</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="561"/>
+        <source>Manually</source>
+        <translation type="unfinished">Ručně</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="566"/>
+        <source>On application exit</source>
+        <translation type="unfinished">Při ukončení aplikace</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="577"/>
+        <source>Browser Cache</source>
+        <translation type="unfinished">Procházet cache</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="583"/>
+        <source>Enable disk cache</source>
+        <translation type="unfinished">Zapnout disk cache</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="590"/>
+        <source>Cache size:</source>
+        <translation type="unfinished">Velikost cache:</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="597"/>
+        <source>Enter the maximum size of the disk cache</source>
+        <translation type="unfinished">Zadejte maximální velikost diskové cache</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="603"/>
+        <source> MB</source>
+        <translation type="unfinished"> MB</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="632"/>
+        <source>Web Search</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="638"/>
+        <source>Language:</source>
+        <translation type="unfinished">Jazyk:</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="645"/>
+        <source>Select the language to be used for web searches</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="707"/>
+        <source>Navigation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="713"/>
+        <source>Select to enable the spatial navigation feature</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="716"/>
         <source>&lt;b&gt;Enable Spatial Navigation&lt;/b&gt;
 &lt;p&gt;This enables or disables the Spatial Navigation feature, which consists in the ability to navigate between focusable elements in a Web page, such as hyperlinks and form controls, by using Left, Right, Up and Down arrow keys. For example, if a user presses the Right key, heuristics determine whether there is an element he might be trying to reach towards the right and which element he probably wants.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="601"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="720"/>
         <source>Enable Spatial Navigation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="608"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="727"/>
         <source>Select to include links in focus chain</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="611"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="730"/>
         <source>&lt;b&gt;Include Links in Focus Chain&lt;/b&gt;
 &lt;p&gt;This selects whether hyperlinks should be included in the keyboard focus chain.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="615"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="734"/>
         <source>Include Links in Focus Chain</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="732"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="851"/>
         <source>Select to enable the Web Inspector tool</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="735"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="854"/>
         <source>Enable Web Development (Web Inspector)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="747"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="866"/>
         <source>Web Inspector Port:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="754"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="873"/>
         <source>Enter the port to be used by the web inspector</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="783"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="902"/>
         <source>&lt;font color=&quot;red&quot;&gt;&lt;b&gt;Note:&lt;/b&gt; Web Inspector settings are activated after a restart of the application.&lt;/font&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="552"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="671"/>
         <source>Image Search</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="558"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="677"/>
         <source>Default Search Engine:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="565"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="684"/>
         <source>Select the default search engine for image searches</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="654"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="773"/>
         <source>Select to enable the auto-scroller</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="657"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="776"/>
         <source>Automatic Scrolling</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="666"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="785"/>
         <source>This function is activated by a Mouse Middle Click.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="678"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="797"/>
         <source>Scroll Divider:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="685"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="804"/>
         <source>Enter the auto-scroll divider value</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="719"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="838"/>
         <source>&lt;b&gt;Note:&lt;/b&gt; Setting higher divider will slow down scrolling.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -71227,40 +71469,100 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="381"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="500"/>
         <source>Select to allow HTTPS pages to run JavaScript, CSS, plugins or web-sockets from HTTP URLs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="384"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="503"/>
         <source>Allow to run insecure contents</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="622"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="741"/>
         <source>Select to give the focus to the view whenever a navigation event occurs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="635"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="754"/>
         <source>Printing</source>
         <translation type="unfinished">Tisk</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="641"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="760"/>
         <source>Select to print the background of page elements as well</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="644"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="763"/>
         <source>Print Element Backgrounds</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="625"/>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="744"/>
         <source>Enable Focus on Navigation</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="168"/>
+        <source>Restore Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="173"/>
+        <source>Select Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="181"/>
+        <source>On new tab:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="188"/>
+        <source>Select the behavior of new tabs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="257"/>
+        <source>Select to load restored tabs when they are activated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="260"/>
+        <source>Load tabs when activated</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="279"/>
+        <source>Sessions</source>
+        <translation type="unfinished">Relace</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="285"/>
+        <source>Select to save sessions automatically</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="288"/>
+        <source>Save sessions automatically</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="295"/>
+        <source>Session Timer:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="302"/>
+        <source>Enter the time to save sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/WebBrowserPage.ui" line="308"/>
+        <source> s</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>WebBrowserSpellCheckingPage</name>
@@ -71383,32 +71685,32 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserTabWidget.py" line="444"/>
+        <location filename="../WebBrowser/WebBrowserTabWidget.py" line="450"/>
         <source>...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserTabWidget.py" line="935"/>
+        <location filename="../WebBrowser/WebBrowserTabWidget.py" line="947"/>
         <source>Loading...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserTabWidget.py" line="957"/>
+        <location filename="../WebBrowser/WebBrowserTabWidget.py" line="969"/>
         <source>Finished loading</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../WebBrowser/WebBrowserTabWidg