Removed support for Python2 and removed support for Qt4 (PyQt4 and pyside).

Sun, 21 Jun 2020 18:26:12 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 21 Jun 2020 18:26:12 +0200
changeset 7635
0cdead130a81
parent 7634
8c3d033e5044
child 7636
61566f35ab22

Removed support for Python2 and removed support for Qt4 (PyQt4 and pyside).

docs/changelog file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
eric6/APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
eric6/APIs/Python3/eric6.bas file | annotate | diff | comparison | revisions
eric6/CodeTemplates/impl_pyqt.py.tmpl file | annotate | diff | comparison | revisions
eric6/CodeTemplates/impl_pyqt.py2.tmpl file | annotate | diff | comparison | revisions
eric6/CodeTemplates/impl_pyqt5.py2.tmpl file | annotate | diff | comparison | revisions
eric6/CodeTemplates/impl_pyside.py.tmpl file | annotate | diff | comparison | revisions
eric6/CodeTemplates/impl_pyside.py2.tmpl file | annotate | diff | comparison | revisions
eric6/CodeTemplates/impl_pyside2.py2.tmpl file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/DebugClientBase.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/DebugConfig.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/ThreadExtension.py file | annotate | diff | comparison | revisions
eric6/Debugger/DebugServer.py file | annotate | diff | comparison | revisions
eric6/Debugger/DebugUI.py file | annotate | diff | comparison | revisions
eric6/Debugger/DebuggerInterfacePython.py file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Debugger.DebuggerInterfacePython.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Plugins.PluginCodeStyleChecker.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Plugins.PluginTabnanny.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Plugins.PluginWizardQFileDialog.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Plugins.WizardPlugins.FileDialogWizard.FileDialogWizardDialog.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Preferences.__init__.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Project.Project.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Project.ProjectFormsBrowser.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Project.ProjectResourcesBrowser.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Project.ProjectTranslationsBrowser.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.QScintilla.Editor.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.QScintilla.MiniEditor.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.UI.BrowserModel.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.UI.UserInterface.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Utilities.PySideImporter.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.Utilities.__init__.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/index-eric6.Preferences.ConfigurationPages.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/index-eric6.Utilities.html file | annotate | diff | comparison | revisions
eric6/DocumentationTools/__init__.py file | annotate | diff | comparison | revisions
eric6/E5XML/ProjectReader.py file | annotate | diff | comparison | revisions
eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py file | annotate | diff | comparison | revisions
eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py file | annotate | diff | comparison | revisions
eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py file | annotate | diff | comparison | revisions
eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py file | annotate | diff | comparison | revisions
eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py file | annotate | diff | comparison | revisions
eric6/Plugins/PluginCodeStyleChecker.py file | annotate | diff | comparison | revisions
eric6/Plugins/PluginSyntaxChecker.py file | annotate | diff | comparison | revisions
eric6/Plugins/PluginTabnanny.py file | annotate | diff | comparison | revisions
eric6/Plugins/PluginWizardQFileDialog.py file | annotate | diff | comparison | revisions
eric6/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationDialog.py file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/DebuggerPython2Page.py file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/DebuggerPython2Page.ui file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/HelpDocumentationPage.py file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/HelpDocumentationPage.ui file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/PythonPage.py file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/PythonPage.ui file | annotate | diff | comparison | revisions
eric6/Preferences/ConfigurationPages/QtPage.py file | annotate | diff | comparison | revisions
eric6/Preferences/ProgramsDialog.py file | annotate | diff | comparison | revisions
eric6/Preferences/__init__.py file | annotate | diff | comparison | revisions
eric6/Project/CreateDialogCodeDialog.py file | annotate | diff | comparison | revisions
eric6/Project/DebuggerPropertiesDialog.py file | annotate | diff | comparison | revisions
eric6/Project/Project.py file | annotate | diff | comparison | revisions
eric6/Project/ProjectBrowser.py file | annotate | diff | comparison | revisions
eric6/Project/ProjectFormsBrowser.py file | annotate | diff | comparison | revisions
eric6/Project/ProjectResourcesBrowser.py file | annotate | diff | comparison | revisions
eric6/Project/ProjectSourcesBrowser.py file | annotate | diff | comparison | revisions
eric6/Project/ProjectTranslationsBrowser.py file | annotate | diff | comparison | revisions
eric6/PyUnit/UnittestDialog.py file | annotate | diff | comparison | revisions
eric6/QScintilla/Editor.py file | annotate | diff | comparison | revisions
eric6/QScintilla/Lexers/LexerPython.py file | annotate | diff | comparison | revisions
eric6/QScintilla/Lexers/__init__.py file | annotate | diff | comparison | revisions
eric6/QScintilla/MiniEditor.py file | annotate | diff | comparison | revisions
eric6/QScintilla/TypingCompleters/__init__.py file | annotate | diff | comparison | revisions
eric6/UI/Browser.py file | annotate | diff | comparison | revisions
eric6/UI/BrowserModel.py file | annotate | diff | comparison | revisions
eric6/UI/UserInterface.py file | annotate | diff | comparison | revisions
eric6/Utilities/BackgroundClient.py file | annotate | diff | comparison | revisions
eric6/Utilities/BackgroundService.py file | annotate | diff | comparison | revisions
eric6/Utilities/ModuleParser.py file | annotate | diff | comparison | revisions
eric6/Utilities/PySideImporter.py file | annotate | diff | comparison | revisions
eric6/Utilities/__init__.py file | annotate | diff | comparison | revisions
eric6/VirtualEnv/VirtualenvAddEditDialog.py file | annotate | diff | comparison | revisions
eric6/VirtualEnv/VirtualenvAddEditDialog.ui file | annotate | diff | comparison | revisions
eric6/VirtualEnv/VirtualenvConfigurationDialog.ui file | annotate | diff | comparison | revisions
eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.py file | annotate | diff | comparison | revisions
eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.ui file | annotate | diff | comparison | revisions
eric6/VirtualEnv/VirtualenvManager.py file | annotate | diff | comparison | revisions
eric6/VirtualEnv/VirtualenvManagerDialog.py file | annotate | diff | comparison | revisions
eric6/WebBrowser/QtHelp/HelpDocsInstaller.py file | annotate | diff | comparison | revisions
eric6/eric6.py file | annotate | diff | comparison | revisions
eric6/i18n/eric6_cs.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_de.qm file | annotate | diff | comparison | revisions
eric6/i18n/eric6_de.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_empty.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_en.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_es.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_fr.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_it.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_pt.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_ru.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_tr.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_zh_CN.ts file | annotate | diff | comparison | revisions
--- a/docs/changelog	Sat Jun 20 17:36:20 2020 +0200
+++ b/docs/changelog	Sun Jun 21 18:26:12 2020 +0200
@@ -2,6 +2,9 @@
 ----------
 Version 20.7:
 - bug fixes
+- General
+  - removed support for Python2
+  - removed support for Qt4 (PyQt4 and pyside)
 - pip Interface
   -- added menu action for pip cache management
 - Code Style Checker
--- a/eric6.e4p	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6.e4p	Sun Jun 21 18:26:12 2020 +0200
@@ -706,7 +706,6 @@
     <Source>eric6/Preferences/ConfigurationPages/CooperationPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/CorbaPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/DebuggerGeneralPage.py</Source>
-    <Source>eric6/Preferences/ConfigurationPages/DebuggerPython2Page.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/DiffColoursPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/EditorAPIsPage.py</Source>
@@ -1873,7 +1872,6 @@
     <Form>eric6/Preferences/ConfigurationPages/CooperationPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/CorbaPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/DebuggerGeneralPage.ui</Form>
-    <Form>eric6/Preferences/ConfigurationPages/DebuggerPython2Page.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/DebuggerPython3Page.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/DiffColoursPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/EditorAPIsPage.ui</Form>
--- a/eric6/APIs/Python3/eric6.api	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/APIs/Python3/eric6.api	Sun Jun 21 18:26:12 2020 +0200
@@ -718,8 +718,7 @@
 eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.shutdown?4()
 eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.startRemote?4(port, runInConsole, venvName, originalPathString, workingDir=None)
 eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.startRemoteForProject?4(port, runInConsole, venvName, originalPathString, workingDir=None)
-eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython?1(debugServer, passive, pythonVariant)
-eric6.Debugger.DebuggerInterfacePython.createDebuggerInterfacePython2?4(debugServer, passive)
+eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython?1(debugServer, passive)
 eric6.Debugger.DebuggerInterfacePython.createDebuggerInterfacePython3?4(debugServer, passive)
 eric6.Debugger.DebuggerInterfacePython.getRegistryData?4()
 eric6.Debugger.EditBreakpointDialog.EditBreakpointDialog.getAddData?4()
@@ -3432,7 +3431,6 @@
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.removeLanguage?4(lang)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorJSON?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorJavaScript?4(fx, lang, fn, msg)
-eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorPy2?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorPy3?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorYAML?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.syntaxBatchCheck?4(argumentsList)
@@ -3555,7 +3553,6 @@
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.cancelStyleBatchCheck?4()
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.deactivate?4()
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.error?7
-eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.serviceErrorPy2?4(fx, lang, fn, msg)
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.serviceErrorPy3?4(fx, lang, fn, msg)
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.styleBatchCheck?4(argumentsList)
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.styleCheck?4(lang, filename, source, args)
@@ -3625,7 +3622,6 @@
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.indentBatchCheck?4(argumentsList)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.indentCheck?4(lang, filename, source)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.indentChecked?7
-eric6.Plugins.PluginTabnanny.TabnannyPlugin.serviceErrorPy2?4(fx, lang, fn, msg)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.serviceErrorPy3?4(fx, lang, fn, msg)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin?1(ui)
 eric6.Plugins.PluginTabnanny.author?7
@@ -6248,11 +6244,6 @@
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.setColor?4(key, bgcolour)
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel?1()
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.create?4(dlg)
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_refreshButton_clicked?4()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_venvDlgButton_clicked?4()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.save?4()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page?1()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.create?4(dlg)
 eric6.Preferences.ConfigurationPages.DebuggerPython3Page.DebuggerPython3Page.on_refreshButton_clicked?4()
 eric6.Preferences.ConfigurationPages.DebuggerPython3Page.DebuggerPython3Page.on_venvDlgButton_clicked?4()
 eric6.Preferences.ConfigurationPages.DebuggerPython3Page.DebuggerPython3Page.save?4()
@@ -6741,7 +6732,6 @@
 eric6.Preferences.getProjectBrowserFlags?4(key, prefClass=Prefs)
 eric6.Preferences.getProtobuf?4(key, prefClass=Prefs)
 eric6.Preferences.getPython?4(key, prefClass=Prefs)
-eric6.Preferences.getQt4DocDir?4(prefClass=Prefs)
 eric6.Preferences.getQt5DocDir?4(prefClass=Prefs)
 eric6.Preferences.getQt?4(key, prefClass=Prefs)
 eric6.Preferences.getQtTranslationsDir?4(prefClass=Prefs)
@@ -6999,7 +6989,6 @@
 eric6.Project.Project.Project.isProjectProtocol?4(fn)
 eric6.Project.Project.Project.isProjectResource?4(fn)
 eric6.Project.Project.Project.isProjectSource?4(fn)
-eric6.Project.Project.Project.isPy2Project?4()
 eric6.Project.Project.Project.isPy3Project?4()
 eric6.Project.Project.Project.isPythonProject?4()
 eric6.Project.Project.Project.isRubyProject?4()
@@ -8749,7 +8738,6 @@
 eric6.UI.BrowserModel.BrowserFileItem.isPixmapFile?4()
 eric6.UI.BrowserModel.BrowserFileItem.isProjectFile?4()
 eric6.UI.BrowserModel.BrowserFileItem.isProtobufFile?4()
-eric6.UI.BrowserModel.BrowserFileItem.isPython2File?4()
 eric6.UI.BrowserModel.BrowserFileItem.isPython3File?4()
 eric6.UI.BrowserModel.BrowserFileItem.isResourcesFile?4()
 eric6.UI.BrowserModel.BrowserFileItem.isRubyFile?4()
@@ -9822,7 +9810,7 @@
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_pythonExecPicker_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_remoteCheckBox_toggled?4(checked)
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_targetDirectoryPicker_textChanged?4(txt)
-eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None)
+eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None)
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.getData?4()
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_condaButton_toggled?4(checked)
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_condaCloneButton_clicked?4()
@@ -9845,7 +9833,7 @@
 eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog.on_pythonExecPicker_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog?1(venvName, venvDirectory, parent=None)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.DefaultKey?7
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.addVirtualEnv?4(venvName, venvDirectory, venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath="")
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.addVirtualEnv?4(venvName, venvDirectory, venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="")
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.createVirtualEnv?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.deleteVirtualEnvs?4(venvNames)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getDefaultEnvironment?4()
@@ -9854,15 +9842,13 @@
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvExecPath?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvInterpreter?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvNames?4(noRemote=False)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvNamesForVariant?4(variant)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvVariant?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isCondaEnvironment?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isGlobalEnvironment?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isRemoteEnvironment?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isUnique?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.removeVirtualEnvs?4(venvNames)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.renameVirtualEnv?4(oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnv?4(venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.renameVirtualEnv?4(oldVenvName, venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnv?4(venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.showVirtualenvManagerDialog?4(modal=False)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.shutdown?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.virtualEnvironmentAdded?7
--- a/eric6/APIs/Python3/eric6.bas	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/APIs/Python3/eric6.bas	Sun Jun 21 18:26:12 2020 +0200
@@ -132,7 +132,6 @@
 DebuggerPropertiesDialog QDialog Ui_DebuggerPropertiesDialog
 DebuggerPropertiesReader XMLStreamReaderBase
 DebuggerPropertiesWriter XMLStreamWriterBase
-DebuggerPython2Page ConfigurationPageBase Ui_DebuggerPython2Page
 DebuggerPython3Page ConfigurationPageBase Ui_DebuggerPython3Page
 DeepLEngine TranslationEngine
 DefaultResolver BaseResolver
--- a/eric6/CodeTemplates/impl_pyqt.py.tmpl	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PyQt4.QtCore import pyqtSlot
-from PyQt4.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super($CLASSNAME$, self).__init__(parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyqt.py2.tmpl	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PyQt4.QtCore import pyqtSignature
-from PyQt4.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        $SUPERCLASS$.__init__(self, parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyqt5.py2.tmpl	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PyQt5.QtCore import pyqtSlot
-from PyQt5.QtWidgets import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super($CLASSNAME$, self).__init__(parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyside.py.tmpl	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PySide.QtCore import Slot
-from PySide.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        $SUPERCLASS$.__init__(self, parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyside.py2.tmpl	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PySide.QtCore import Slot
-from PySide.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        $SUPERCLASS$.__init__(self, parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyside2.py2.tmpl	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PySide2.QtCore import Slot
-from PySide2.QtWidgets import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super($CLASSNAME$, self).__init__(parent)
-        self.setupUi(self)
--- a/eric6/DebugClients/Python/DebugClientBase.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/DebugClients/Python/DebugClientBase.py	Sun Jun 21 18:26:12 2020 +0200
@@ -1590,7 +1590,7 @@
         
     def __formatQtVariable(self, value, qttype):
         """
-        Private method to produce a formatted output of a simple Qt4/Qt5 type.
+        Private method to produce a formatted output of a simple Qt5 type.
         
         @param value variable to be formatted
         @param qttype type of the Qt variable to be formatted (string)
--- a/eric6/DebugClients/Python/DebugConfig.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/DebugClients/Python/DebugConfig.py	Sun Jun 21 18:26:12 2020 +0200
@@ -26,7 +26,7 @@
 
 BatchSize = 200
 ConfigQtNames = (
-    'PyQt5.', 'PyQt4.', 'PySide2.', 'PySide.', 'Shiboken.EnumType'
+    'PyQt5.', 'PySide2.', 'Shiboken.EnumType'
 )
 ConfigKnownQtTypes = (
     '.QChar', '.QByteArray', '.QString', '.QStringList', '.QPoint', '.QPointF',
--- a/eric6/DebugClients/Python/ThreadExtension.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/DebugClients/Python/ThreadExtension.py	Sun Jun 21 18:26:12 2020 +0200
@@ -260,9 +260,9 @@
         if fullname in sys.modules or not self.debugging:
             return None
         
-        if fullname in [self.threadModName, 'PyQt4.QtCore', 'PyQt5.QtCore',
-                        'PySide.QtCore', 'PySide2.QtCore', 'greenlet',
-                        'threading'] and self.enableImportHooks:
+        if fullname in [self.threadModName, 'PyQt5.QtCore', 'PySide2.QtCore',
+                        'greenlet', 'threading'
+                        ] and self.enableImportHooks:
             # Disable hook to be able to import original module
             self.enableImportHooks = False
             return self
@@ -372,9 +372,8 @@
             module._DummyThread = DummyThreadWrapper
         
         # Add hook for *.QThread
-        elif (fullname in ['PyQt4.QtCore', 'PyQt5.QtCore',
-                           'PySide.QtCore', 'PySide2.QtCore'] and
-                self.qtThreadAttached is False):
+        elif (fullname in ['PyQt5.QtCore', 'PySide2.QtCore'] and
+              self.qtThreadAttached is False):
             self.qtThreadAttached = True
             # _debugClient as a class attribute can't be accessed in following
             # class. Therefore we need a global variable.
--- a/eric6/Debugger/DebugServer.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Debugger/DebugServer.py	Sun Jun 21 18:26:12 2020 +0200
@@ -9,7 +9,6 @@
 
 
 import os
-import sys
 
 from PyQt5.QtCore import pyqtSignal, QModelIndex
 from PyQt5.QtNetwork import (
@@ -216,14 +215,6 @@
         self.clientType = Preferences.Prefs.settings.value('DebugClient/Type')
         if self.clientType is None:
             self.clientType = 'Python3'
-        # Change clientType if dependent interpreter does not exist anymore
-        # (maybe deinstalled,...)
-        elif self.clientType == 'Python2' and Preferences.getDebugger(
-                "Python2VirtualEnv") == '' and sys.version_info[0] >= 3:
-            self.clientType = 'Python3'
-        elif self.clientType == 'Python3' and Preferences.getDebugger(
-                "Python3VirtualEnv") == '' and sys.version_info[0] == 2:
-            self.clientType = 'Python2'
         
         self.lastClientType = ''
         self.__autoClearShell = False
--- a/eric6/Debugger/DebugUI.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Debugger/DebugUI.py	Sun Jun 21 18:26:12 2020 +0200
@@ -828,9 +828,7 @@
                     cap = self.debugServer.getClientCapabilities(language)
                     break
             else:
-                if editor.isPy2File():
-                    cap = self.debugServer.getClientCapabilities('Python2')
-                elif editor.isPy3File():
+                if editor.isPy3File():
                     cap = self.debugServer.getClientCapabilities('Python3')
                 elif editor.isRubyFile():
                     cap = self.debugServer.getClientCapabilities('Ruby')
--- a/eric6/Debugger/DebuggerInterfacePython.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Debugger/DebuggerInterfacePython.py	Sun Jun 21 18:26:12 2020 +0200
@@ -33,10 +33,10 @@
 
 class DebuggerInterfacePython(QObject):
     """
-    Class implementing the debugger interface for the debug server for Python 2
-    and Python 3.
+    Class implementing the debugger interface for the debug server for
+    Python 3.
     """
-    def __init__(self, debugServer, passive, pythonVariant):
+    def __init__(self, debugServer, passive):
         """
         Constructor
         
@@ -44,8 +44,6 @@
         @type DebugServer
         @param passive flag indicating passive connection mode
         @type bool
-        @param pythonVariant Python variant to instantiate for
-        @type str (one of Python2 or Python3)
         """
         super(DebuggerInterfacePython, self).__init__()
         
@@ -55,7 +53,6 @@
         self.debugServer = debugServer
         self.passive = passive
         self.process = None
-        self.__variant = pythonVariant
         self.__startedVenv = ""
         
         self.qsock = None
@@ -171,15 +168,11 @@
         global origPathEnv
         
         if not venvName:
-            if self.__variant == "Python2":
-                venvName = Preferences.getDebugger("Python2VirtualEnv")
-            else:
-                venvName = Preferences.getDebugger("Python3VirtualEnv")
+            venvName = Preferences.getDebugger("Python3VirtualEnv")
         venvManager = e5App().getObject("VirtualEnvManager")
         interpreter = venvManager.getVirtualenvInterpreter(venvName)
         execPath = venvManager.getVirtualenvExecPath(venvName)
-        if (interpreter == "" and
-                int(self.__variant[-1]) == sys.version_info[0]):
+        if interpreter == "":
             # use the interpreter used to run eric for identical variants
             interpreter = sys.executable.replace("w.exe", ".exe")
         if interpreter == "":
@@ -187,36 +180,25 @@
                 None,
                 self.tr("Start Debugger"),
                 self.tr(
-                    """<p>No suitable {0} environment configured.</p>""")
-                .format(self.__variant))
+                    """<p>No suitable Python3 environment configured.</p>""")
+            )
             return None, False, ""
         
-        if self.__variant == "Python2":
-            debugClientType = Preferences.getDebugger("DebugClientType")
-        else:
-            debugClientType = Preferences.getDebugger("DebugClientType3")
+        debugClientType = Preferences.getDebugger("DebugClientType3")
         if debugClientType == "standard":
             debugClient = os.path.join(getConfig('ericDir'),
                                        "DebugClients", "Python",
                                        "DebugClient.py")
         else:
-            if self.__variant == "Python2":
-                debugClient = Preferences.getDebugger("DebugClient")
-            else:
-                debugClient = Preferences.getDebugger("DebugClient3")
+            debugClient = Preferences.getDebugger("DebugClient3")
             if debugClient == "":
                 debugClient = os.path.join(sys.path[0],
                                            "DebugClients", "Python",
                                            "DebugClient.py")
         
-        if self.__variant == "Python2":
-            redirect = str(Preferences.getDebugger("PythonRedirect"))
-            noencoding = (Preferences.getDebugger("PythonNoEncoding") and
-                          '--no-encoding' or '')
-        else:
-            redirect = str(Preferences.getDebugger("Python3Redirect"))
-            noencoding = (Preferences.getDebugger("Python3NoEncoding") and
-                          '--no-encoding' or '')
+        redirect = str(Preferences.getDebugger("Python3Redirect"))
+        noencoding = (Preferences.getDebugger("Python3NoEncoding") and
+                      '--no-encoding' or '')
         
         if Preferences.getDebugger("RemoteDbgEnabled"):
             ipaddr = self.debugServer.getHostAddress(False)
@@ -354,9 +336,7 @@
         if not venvName:
             venvName = project.getDebugProperty("VIRTUALENV")
         if not venvName:
-            if project.getProjectLanguage() == "Python2":
-                venvName = Preferences.getDebugger("Python2VirtualEnv")
-            elif project.getProjectLanguage() == "Python3":
+            if project.getProjectLanguage() == "Python3":
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
         
         redirect = str(project.getDebugProperty("REDIRECT"))
@@ -375,8 +355,8 @@
                 None,
                 self.tr("Start Debugger"),
                 self.tr(
-                    """<p>No suitable {0} environment configured.</p>""")
-                .format(self.__variant))
+                    """<p>No suitable Python3 environment configured.</p>""")
+            )
             return None, self.__isNetworked, ""
         
         if project.getDebugProperty("REMOTEDEBUGGER"):
@@ -1305,21 +1285,6 @@
         self.qsock.flush()
 
 
-def createDebuggerInterfacePython2(debugServer, passive):
-    """
-    Module function to create a debugger interface instance.
-    
-        
-    @param debugServer reference to the debug server
-    @type DebugServer
-    @param passive flag indicating passive connection mode
-    @type bool
-    @return instantiated debugger interface
-    @rtype DebuggerInterfacePython
-    """
-    return DebuggerInterfacePython(debugServer, passive, "Python2")
-    
-
 def createDebuggerInterfacePython3(debugServer, passive):
     """
     Module function to create a debugger interface instance.
@@ -1332,7 +1297,7 @@
     @return instantiated debugger interface
     @rtype DebuggerInterfacePython
     """
-    return DebuggerInterfacePython(debugServer, passive, "Python3")
+    return DebuggerInterfacePython(debugServer, passive)
 
 
 def getRegistryData():
@@ -1345,13 +1310,6 @@
         function
     @rtype list of tuple of (str, int, list of str, function)
     """
-    py2Exts = []
-    for ext in Preferences.getDebugger("PythonExtensions").split():
-        if ext.startswith("."):
-            py2Exts.append(ext)
-        else:
-            py2Exts.append(".{0}".format(ext))
-    
     py3Exts = []
     for ext in Preferences.getDebugger("Python3Extensions").split():
         if ext.startswith("."):
@@ -1360,13 +1318,6 @@
             py3Exts.append(".{0}".format(ext))
     
     registryData = []
-    if py2Exts and (Preferences.getDebugger("Python2VirtualEnv") or
-                    sys.version_info[0] == 2):
-        registryData.append(
-            ("Python2", ClientDefaultCapabilities, py2Exts,
-             createDebuggerInterfacePython2)
-        )
-    
     if py3Exts and (Preferences.getDebugger("Python3VirtualEnv") or
                     sys.version_info[0] >= 3):
         registryData.append(
Binary file eric6/Documentation/Help/source.qch has changed
--- a/eric6/Documentation/Help/source.qhp	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Help/source.qhp	Sun Jun 21 18:26:12 2020 +0200
@@ -735,7 +735,6 @@
               <section title="eric6.Preferences.ConfigurationPages.CooperationPage" ref="eric6.Preferences.ConfigurationPages.CooperationPage.html" />
               <section title="eric6.Preferences.ConfigurationPages.CorbaPage" ref="eric6.Preferences.ConfigurationPages.CorbaPage.html" />
               <section title="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html" />
-              <section title="eric6.Preferences.ConfigurationPages.DebuggerPython2Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html" />
               <section title="eric6.Preferences.ConfigurationPages.DebuggerPython3Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html" />
               <section title="eric6.Preferences.ConfigurationPages.DiffColoursPage" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html" />
               <section title="eric6.Preferences.ConfigurationPages.EditorAPIsPage" ref="eric6.Preferences.ConfigurationPages.EditorAPIsPage.html" />
@@ -2183,7 +2182,6 @@
       <keyword name="BrowserFileItem.isPixmapFile" id="BrowserFileItem.isPixmapFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPixmapFile" />
       <keyword name="BrowserFileItem.isProjectFile" id="BrowserFileItem.isProjectFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isProjectFile" />
       <keyword name="BrowserFileItem.isProtobufFile" id="BrowserFileItem.isProtobufFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isProtobufFile" />
-      <keyword name="BrowserFileItem.isPython2File" id="BrowserFileItem.isPython2File" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPython2File" />
       <keyword name="BrowserFileItem.isPython3File" id="BrowserFileItem.isPython3File" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPython3File" />
       <keyword name="BrowserFileItem.isResourcesFile" id="BrowserFileItem.isResourcesFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isResourcesFile" />
       <keyword name="BrowserFileItem.isRubyFile" id="BrowserFileItem.isRubyFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isRubyFile" />
@@ -2599,7 +2597,6 @@
       <keyword name="CodeStyleCheckerPlugin.batchJobDone" id="CodeStyleCheckerPlugin.batchJobDone" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.batchJobDone" />
       <keyword name="CodeStyleCheckerPlugin.cancelStyleBatchCheck" id="CodeStyleCheckerPlugin.cancelStyleBatchCheck" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.cancelStyleBatchCheck" />
       <keyword name="CodeStyleCheckerPlugin.deactivate" id="CodeStyleCheckerPlugin.deactivate" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.deactivate" />
-      <keyword name="CodeStyleCheckerPlugin.serviceErrorPy2" id="CodeStyleCheckerPlugin.serviceErrorPy2" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.serviceErrorPy2" />
       <keyword name="CodeStyleCheckerPlugin.serviceErrorPy3" id="CodeStyleCheckerPlugin.serviceErrorPy3" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.serviceErrorPy3" />
       <keyword name="CodeStyleCheckerPlugin.styleBatchCheck" id="CodeStyleCheckerPlugin.styleBatchCheck" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.styleBatchCheck" />
       <keyword name="CodeStyleCheckerPlugin.styleCheck" id="CodeStyleCheckerPlugin.styleCheck" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.styleCheck" />
@@ -3541,13 +3538,6 @@
       <keyword name="DebuggerPropertiesWriter (Constructor)" id="DebuggerPropertiesWriter (Constructor)" ref="eric6.E5XML.DebuggerPropertiesWriter.html#DebuggerPropertiesWriter.__init__" />
       <keyword name="DebuggerPropertiesWriter (Module)" id="DebuggerPropertiesWriter (Module)" ref="eric6.E5XML.DebuggerPropertiesWriter.html" />
       <keyword name="DebuggerPropertiesWriter.writeXML" id="DebuggerPropertiesWriter.writeXML" ref="eric6.E5XML.DebuggerPropertiesWriter.html#DebuggerPropertiesWriter.writeXML" />
-      <keyword name="DebuggerPython2Page" id="DebuggerPython2Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page" />
-      <keyword name="DebuggerPython2Page (Constructor)" id="DebuggerPython2Page (Constructor)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.__init__" />
-      <keyword name="DebuggerPython2Page (Module)" id="DebuggerPython2Page (Module)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html" />
-      <keyword name="DebuggerPython2Page.__populateAndSetVenvComboBox" id="DebuggerPython2Page.__populateAndSetVenvComboBox" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.__populateAndSetVenvComboBox" />
-      <keyword name="DebuggerPython2Page.on_refreshButton_clicked" id="DebuggerPython2Page.on_refreshButton_clicked" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.on_refreshButton_clicked" />
-      <keyword name="DebuggerPython2Page.on_venvDlgButton_clicked" id="DebuggerPython2Page.on_venvDlgButton_clicked" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.on_venvDlgButton_clicked" />
-      <keyword name="DebuggerPython2Page.save" id="DebuggerPython2Page.save" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.save" />
       <keyword name="DebuggerPython3Page" id="DebuggerPython3Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html#DebuggerPython3Page" />
       <keyword name="DebuggerPython3Page (Constructor)" id="DebuggerPython3Page (Constructor)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html#DebuggerPython3Page.__init__" />
       <keyword name="DebuggerPython3Page (Module)" id="DebuggerPython3Page (Module)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html" />
@@ -9882,7 +9872,6 @@
       <keyword name="MiniEditor.__getWord" id="MiniEditor.__getWord" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__getWord" />
       <keyword name="MiniEditor.__initContextMenu" id="MiniEditor.__initContextMenu" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__initContextMenu" />
       <keyword name="MiniEditor.__initContextMenuLanguages" id="MiniEditor.__initContextMenuLanguages" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__initContextMenuLanguages" />
-      <keyword name="MiniEditor.__isPy2File" id="MiniEditor.__isPy2File" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__isPy2File" />
       <keyword name="MiniEditor.__languageMenuTriggered" id="MiniEditor.__languageMenuTriggered" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__languageMenuTriggered" />
       <keyword name="MiniEditor.__loadEditorConfig" id="MiniEditor.__loadEditorConfig" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__loadEditorConfig" />
       <keyword name="MiniEditor.__loadEditorConfigObject" id="MiniEditor.__loadEditorConfigObject" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__loadEditorConfigObject" />
@@ -11301,7 +11290,6 @@
       <keyword name="Project.isProjectProtocol" id="Project.isProjectProtocol" ref="eric6.Project.Project.html#Project.isProjectProtocol" />
       <keyword name="Project.isProjectResource" id="Project.isProjectResource" ref="eric6.Project.Project.html#Project.isProjectResource" />
       <keyword name="Project.isProjectSource" id="Project.isProjectSource" ref="eric6.Project.Project.html#Project.isProjectSource" />
-      <keyword name="Project.isPy2Project" id="Project.isPy2Project" ref="eric6.Project.Project.html#Project.isPy2Project" />
       <keyword name="Project.isPy3Project" id="Project.isPy3Project" ref="eric6.Project.Project.html#Project.isPy3Project" />
       <keyword name="Project.isPythonProject" id="Project.isPythonProject" ref="eric6.Project.Project.html#Project.isPythonProject" />
       <keyword name="Project.isRubyProject" id="Project.isRubyProject" ref="eric6.Project.Project.html#Project.isRubyProject" />
@@ -14458,7 +14446,6 @@
       <keyword name="SyntaxCheckService.removeLanguage" id="SyntaxCheckService.removeLanguage" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.removeLanguage" />
       <keyword name="SyntaxCheckService.serviceErrorJSON" id="SyntaxCheckService.serviceErrorJSON" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorJSON" />
       <keyword name="SyntaxCheckService.serviceErrorJavaScript" id="SyntaxCheckService.serviceErrorJavaScript" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorJavaScript" />
-      <keyword name="SyntaxCheckService.serviceErrorPy2" id="SyntaxCheckService.serviceErrorPy2" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorPy2" />
       <keyword name="SyntaxCheckService.serviceErrorPy3" id="SyntaxCheckService.serviceErrorPy3" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorPy3" />
       <keyword name="SyntaxCheckService.serviceErrorYAML" id="SyntaxCheckService.serviceErrorYAML" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorYAML" />
       <keyword name="SyntaxCheckService.syntaxBatchCheck" id="SyntaxCheckService.syntaxBatchCheck" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.syntaxBatchCheck" />
@@ -14635,7 +14622,6 @@
       <keyword name="TabnannyPlugin.deactivate" id="TabnannyPlugin.deactivate" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.deactivate" />
       <keyword name="TabnannyPlugin.indentBatchCheck" id="TabnannyPlugin.indentBatchCheck" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.indentBatchCheck" />
       <keyword name="TabnannyPlugin.indentCheck" id="TabnannyPlugin.indentCheck" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.indentCheck" />
-      <keyword name="TabnannyPlugin.serviceErrorPy2" id="TabnannyPlugin.serviceErrorPy2" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.serviceErrorPy2" />
       <keyword name="TabnannyPlugin.serviceErrorPy3" id="TabnannyPlugin.serviceErrorPy3" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.serviceErrorPy3" />
       <keyword name="Tabview" id="Tabview" ref="eric6.Plugins.ViewManagerPlugins.Tabview.Tabview.html#Tabview" />
       <keyword name="Tabview (Constructor)" id="Tabview (Constructor)" ref="eric6.Plugins.ViewManagerPlugins.Tabview.Tabview.html#Tabview.__init__" />
@@ -15429,12 +15415,9 @@
       <keyword name="UserInterface.__showPluginInfo" id="UserInterface.__showPluginInfo" ref="eric6.UI.UserInterface.html#UserInterface.__showPluginInfo" />
       <keyword name="UserInterface.__showPluginToolsMenu" id="UserInterface.__showPluginToolsMenu" ref="eric6.UI.UserInterface.html#UserInterface.__showPluginToolsMenu" />
       <keyword name="UserInterface.__showPrevious" id="UserInterface.__showPrevious" ref="eric6.UI.UserInterface.html#UserInterface.__showPrevious" />
-      <keyword name="UserInterface.__showPyQt4Doc" id="UserInterface.__showPyQt4Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showPyQt4Doc" />
       <keyword name="UserInterface.__showPyQt5Doc" id="UserInterface.__showPyQt5Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showPyQt5Doc" />
       <keyword name="UserInterface.__showPySideDoc" id="UserInterface.__showPySideDoc" ref="eric6.UI.UserInterface.html#UserInterface.__showPySideDoc" />
-      <keyword name="UserInterface.__showPython2Doc" id="UserInterface.__showPython2Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showPython2Doc" />
       <keyword name="UserInterface.__showPythonDoc" id="UserInterface.__showPythonDoc" ref="eric6.UI.UserInterface.html#UserInterface.__showPythonDoc" />
-      <keyword name="UserInterface.__showQt4Doc" id="UserInterface.__showQt4Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showQt4Doc" />
       <keyword name="UserInterface.__showQt5Doc" id="UserInterface.__showQt5Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showQt5Doc" />
       <keyword name="UserInterface.__showQtDoc" id="UserInterface.__showQtDoc" ref="eric6.UI.UserInterface.html#UserInterface.__showQtDoc" />
       <keyword name="UserInterface.__showSettingsMenu" id="UserInterface.__showSettingsMenu" ref="eric6.UI.UserInterface.html#UserInterface.__showSettingsMenu" />
@@ -16139,8 +16122,6 @@
       <keyword name="VirtualenvManager.getVirtualenvExecPath" id="VirtualenvManager.getVirtualenvExecPath" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvExecPath" />
       <keyword name="VirtualenvManager.getVirtualenvInterpreter" id="VirtualenvManager.getVirtualenvInterpreter" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvInterpreter" />
       <keyword name="VirtualenvManager.getVirtualenvNames" id="VirtualenvManager.getVirtualenvNames" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvNames" />
-      <keyword name="VirtualenvManager.getVirtualenvNamesForVariant" id="VirtualenvManager.getVirtualenvNamesForVariant" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvNamesForVariant" />
-      <keyword name="VirtualenvManager.getVirtualenvVariant" id="VirtualenvManager.getVirtualenvVariant" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvVariant" />
       <keyword name="VirtualenvManager.isCondaEnvironment" id="VirtualenvManager.isCondaEnvironment" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isCondaEnvironment" />
       <keyword name="VirtualenvManager.isGlobalEnvironment" id="VirtualenvManager.isGlobalEnvironment" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isGlobalEnvironment" />
       <keyword name="VirtualenvManager.isRemoteEnvironment" id="VirtualenvManager.isRemoteEnvironment" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isRemoteEnvironment" />
@@ -17171,7 +17152,6 @@
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.CooperationPage.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.CorbaPage.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#create" />
-      <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.EditorAPIsPage.html#create" />
@@ -17235,7 +17215,6 @@
       <keyword name="createConfigurationPage" id="createConfigurationPage" ref="eric6.Plugins.PluginVcsPySvn.html#createConfigurationPage" />
       <keyword name="createConfigurationPage" id="createConfigurationPage" ref="eric6.Plugins.PluginVcsSubversion.html#createConfigurationPage" />
       <keyword name="createDebuggerInterfaceNone" id="createDebuggerInterfaceNone" ref="eric6.Debugger.DebuggerInterfaceNone.html#createDebuggerInterfaceNone" />
-      <keyword name="createDebuggerInterfacePython2" id="createDebuggerInterfacePython2" ref="eric6.Debugger.DebuggerInterfacePython.html#createDebuggerInterfacePython2" />
       <keyword name="createDebuggerInterfacePython3" id="createDebuggerInterfacePython3" ref="eric6.Debugger.DebuggerInterfacePython.html#createDebuggerInterfacePython3" />
       <keyword name="createDefaultConfig" id="createDefaultConfig" ref="eric6.Plugins.VcsPlugins.vcsPySvn.SvnUtilities.html#createDefaultConfig" />
       <keyword name="createDefaultConfig" id="createDefaultConfig" ref="eric6.Plugins.VcsPlugins.vcsSubversion.SvnUtilities.html#createDefaultConfig" />
@@ -17527,7 +17506,6 @@
       <keyword name="getPythonModulesDirectory" id="getPythonModulesDirectory" ref="eric6.Globals.__init__.html#getPythonModulesDirectory" />
       <keyword name="getPythonVersion" id="getPythonVersion" ref="eric6.Utilities.__init__.html#getPythonVersion" />
       <keyword name="getQt" id="getQt" ref="eric6.Preferences.__init__.html#getQt" />
-      <keyword name="getQt4DocDir" id="getQt4DocDir" ref="eric6.Preferences.__init__.html#getQt4DocDir" />
       <keyword name="getQt5DocDir" id="getQt5DocDir" ref="eric6.Preferences.__init__.html#getQt5DocDir" />
       <keyword name="getQtBinariesPath" id="getQtBinariesPath" ref="eric6.Globals.__init__.html#getQtBinariesPath" />
       <keyword name="getQtMacBundle" id="getQtMacBundle" ref="eric6.Utilities.__init__.html#getQtMacBundle" />
@@ -18637,7 +18615,6 @@
       <file>eric6.Preferences.ConfigurationPages.CooperationPage.html</file>
       <file>eric6.Preferences.ConfigurationPages.CorbaPage.html</file>
       <file>eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html</file>
-      <file>eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html</file>
       <file>eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html</file>
       <file>eric6.Preferences.ConfigurationPages.DiffColoursPage.html</file>
       <file>eric6.Preferences.ConfigurationPages.EditorAPIsPage.html</file>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html	Sun Jun 21 18:26:12 2020 +0200
@@ -140,7 +140,7 @@
 </tr>
 <tr>
 <td><a href="#DebugClientBase.__formatQtVariable">__formatQtVariable</a></td>
-<td>Private method to produce a formatted output of a simple Qt4/Qt5 type.</td>
+<td>Private method to produce a formatted output of a simple Qt5 type.</td>
 </tr>
 <tr>
 <td><a href="#DebugClientBase.__formatVariablesList">__formatVariablesList</a></td>
@@ -467,7 +467,7 @@
 <b>__formatQtVariable</b>(<i>value, qttype</i>)
 
 <p>
-        Private method to produce a formatted output of a simple Qt4/Qt5 type.
+        Private method to produce a formatted output of a simple Qt5 type.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.Debugger.DebuggerInterfacePython.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Debugger.DebuggerInterfacePython.html	Sun Jun 21 18:26:12 2020 +0200
@@ -36,7 +36,7 @@
 
 <tr>
 <td><a href="#DebuggerInterfacePython">DebuggerInterfacePython</a></td>
-<td>Class implementing the debugger interface for the debug server for Python 2 and Python 3.</td>
+<td>Class implementing the debugger interface for the debug server for Python 3.</td>
 </tr>
 </table>
 <h3>Functions</h3>
@@ -44,10 +44,6 @@
 <table>
 
 <tr>
-<td><a href="#createDebuggerInterfacePython2">createDebuggerInterfacePython2</a></td>
-<td>Module function to create a debugger interface instance.</td>
-</tr>
-<tr>
 <td><a href="#createDebuggerInterfacePython3">createDebuggerInterfacePython3</a></td>
 <td>Module function to create a debugger interface instance.</td>
 </tr>
@@ -62,8 +58,8 @@
 <h2>DebuggerInterfacePython</h2>
 
 <p>
-    Class implementing the debugger interface for the debug server for Python 2
-    and Python 3.
+    Class implementing the debugger interface for the debug server for
+    Python 3.
 </p>
 <h3>Derived from</h3>
 QObject
@@ -282,7 +278,7 @@
 
 <a NAME="DebuggerInterfacePython.__init__" ID="DebuggerInterfacePython.__init__"></a>
 <h4>DebuggerInterfacePython (Constructor)</h4>
-<b>DebuggerInterfacePython</b>(<i>debugServer, passive, pythonVariant</i>)
+<b>DebuggerInterfacePython</b>(<i>debugServer, passive</i>)
 
 <p>
         Constructor
@@ -297,10 +293,6 @@
 <dd>
 flag indicating passive connection mode
 </dd>
-<dt><i>pythonVariant</i> (str (one of Python2 or Python3))</dt>
-<dd>
-Python variant to instantiate for
-</dd>
 </dl>
 <a NAME="DebuggerInterfacePython.__askForkTo" ID="DebuggerInterfacePython.__askForkTo"></a>
 <h4>DebuggerInterfacePython.__askForkTo</h4>
@@ -1224,42 +1216,6 @@
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
-<a NAME="createDebuggerInterfacePython2" ID="createDebuggerInterfacePython2"></a>
-<h2>createDebuggerInterfacePython2</h2>
-<b>createDebuggerInterfacePython2</b>(<i>debugServer, passive</i>)
-
-<p>
-    Module function to create a debugger interface instance.
-</p>
-<p>
-
-</p>
-<dl>
-
-<dt><i>debugServer</i> (DebugServer)</dt>
-<dd>
-reference to the debug server
-</dd>
-<dt><i>passive</i> (bool)</dt>
-<dd>
-flag indicating passive connection mode
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-instantiated debugger interface
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-DebuggerInterfacePython
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
 <a NAME="createDebuggerInterfacePython3" ID="createDebuggerInterfacePython3"></a>
 <h2>createDebuggerInterfacePython3</h2>
 <b>createDebuggerInterfacePython3</b>(<i>debugServer, passive</i>)
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html	Sun Jun 21 18:26:12 2020 +0200
@@ -136,10 +136,6 @@
 <td>Public method handling service errors for JavaScript.</td>
 </tr>
 <tr>
-<td><a href="#SyntaxCheckService.serviceErrorPy2">serviceErrorPy2</a></td>
-<td>Public method handling service errors for Python 2.</td>
-</tr>
-<tr>
 <td><a href="#SyntaxCheckService.serviceErrorPy3">serviceErrorPy3</a></td>
 <td>Public method handling service errors for Python 2.</td>
 </tr>
@@ -374,32 +370,6 @@
 message text (string)
 </dd>
 </dl>
-<a NAME="SyntaxCheckService.serviceErrorPy2" ID="SyntaxCheckService.serviceErrorPy2"></a>
-<h4>SyntaxCheckService.serviceErrorPy2</h4>
-<b>serviceErrorPy2</b>(<i>fx, lang, fn, msg</i>)
-
-<p>
-        Public method handling service errors for Python 2.
-</p>
-<dl>
-
-<dt><i>fx</i></dt>
-<dd>
-service name (string)
-</dd>
-<dt><i>lang</i></dt>
-<dd>
-language (string)
-</dd>
-<dt><i>fn</i></dt>
-<dd>
-file name (string)
-</dd>
-<dt><i>msg</i></dt>
-<dd>
-message text (string)
-</dd>
-</dl>
 <a NAME="SyntaxCheckService.serviceErrorPy3" ID="SyntaxCheckService.serviceErrorPy3"></a>
 <h4>SyntaxCheckService.serviceErrorPy3</h4>
 <b>serviceErrorPy3</b>(<i>fx, lang, fn, msg</i>)
--- a/eric6/Documentation/Source/eric6.Plugins.PluginCodeStyleChecker.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.PluginCodeStyleChecker.html	Sun Jun 21 18:26:12 2020 +0200
@@ -150,10 +150,6 @@
 <td>Public method to deactivate this plugin.</td>
 </tr>
 <tr>
-<td><a href="#CodeStyleCheckerPlugin.serviceErrorPy2">serviceErrorPy2</a></td>
-<td>Public slot handling service errors for Python 2.</td>
-</tr>
-<tr>
 <td><a href="#CodeStyleCheckerPlugin.serviceErrorPy3">serviceErrorPy3</a></td>
 <td>Public slot handling service errors for Python 2.</td>
 </tr>
@@ -391,32 +387,6 @@
 <p>
         Public method to deactivate this plugin.
 </p>
-<a NAME="CodeStyleCheckerPlugin.serviceErrorPy2" ID="CodeStyleCheckerPlugin.serviceErrorPy2"></a>
-<h4>CodeStyleCheckerPlugin.serviceErrorPy2</h4>
-<b>serviceErrorPy2</b>(<i>fx, lang, fn, msg</i>)
-
-<p>
-        Public slot handling service errors for Python 2.
-</p>
-<dl>
-
-<dt><i>fx</i></dt>
-<dd>
-service name (string)
-</dd>
-<dt><i>lang</i></dt>
-<dd>
-language (string)
-</dd>
-<dt><i>fn</i></dt>
-<dd>
-file name (string)
-</dd>
-<dt><i>msg</i></dt>
-<dd>
-message text (string)
-</dd>
-</dl>
 <a NAME="CodeStyleCheckerPlugin.serviceErrorPy3" ID="CodeStyleCheckerPlugin.serviceErrorPy3"></a>
 <h4>CodeStyleCheckerPlugin.serviceErrorPy3</h4>
 <b>serviceErrorPy3</b>(<i>fx, lang, fn, msg</i>)
--- a/eric6/Documentation/Source/eric6.Plugins.PluginTabnanny.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.PluginTabnanny.html	Sun Jun 21 18:26:12 2020 +0200
@@ -154,10 +154,6 @@
 <td>Public method to prepare an indentation check on one Python source file.</td>
 </tr>
 <tr>
-<td><a href="#TabnannyPlugin.serviceErrorPy2">serviceErrorPy2</a></td>
-<td>Public slot handling service errors for Python 2.</td>
-</tr>
-<tr>
 <td><a href="#TabnannyPlugin.serviceErrorPy3">serviceErrorPy3</a></td>
 <td>Public slot handling service errors for Python 2.</td>
 </tr>
@@ -403,32 +399,6 @@
 string containing the code to check (string)
 </dd>
 </dl>
-<a NAME="TabnannyPlugin.serviceErrorPy2" ID="TabnannyPlugin.serviceErrorPy2"></a>
-<h4>TabnannyPlugin.serviceErrorPy2</h4>
-<b>serviceErrorPy2</b>(<i>fx, lang, fn, msg</i>)
-
-<p>
-        Public slot handling service errors for Python 2.
-</p>
-<dl>
-
-<dt><i>fx</i></dt>
-<dd>
-service name (string)
-</dd>
-<dt><i>lang</i></dt>
-<dd>
-language (string)
-</dd>
-<dt><i>fn</i></dt>
-<dd>
-file name (string)
-</dd>
-<dt><i>msg</i></dt>
-<dd>
-message text (string)
-</dd>
-</dl>
 <a NAME="TabnannyPlugin.serviceErrorPy3" ID="TabnannyPlugin.serviceErrorPy3"></a>
 <h4>TabnannyPlugin.serviceErrorPy3</h4>
 <b>serviceErrorPy3</b>(<i>fx, lang, fn, msg</i>)
--- a/eric6/Documentation/Source/eric6.Plugins.PluginWizardQFileDialog.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.PluginWizardQFileDialog.html	Sun Jun 21 18:26:12 2020 +0200
@@ -141,7 +141,7 @@
 <dt><i>variant</i> (int)</dt>
 <dd>
 variant of code to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
 </dd>
 </dl>
 <dl>
--- a/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.FileDialogWizard.FileDialogWizardDialog.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.FileDialogWizard.FileDialogWizardDialog.html	Sun Jun 21 18:26:12 2020 +0200
@@ -98,7 +98,7 @@
 </tr>
 <tr>
 <td><a href="#FileDialogWizardDialog.getCode">getCode</a></td>
-<td>Public method to get the source code for Qt4 and Qt5.</td>
+<td>Public method to get the source code for Qt5.</td>
 </tr>
 <tr>
 <td><a href="#FileDialogWizardDialog.on_bTest_clicked">on_bTest_clicked</a></td>
@@ -131,7 +131,7 @@
 <dt><i>dialogVariant</i> (int)</dt>
 <dd>
 variant of the file dialog to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
 </dd>
 <dt><i>parent</i> (QWidget)</dt>
 <dd>
@@ -211,7 +211,7 @@
 <b>getCode</b>(<i>indLevel, indString</i>)
 
 <p>
-        Public method to get the source code for Qt4 and Qt5.
+        Public method to get the source code for Qt5.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-<title>eric6.Preferences.ConfigurationPages.DebuggerPython2Page</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.Preferences.ConfigurationPages.DebuggerPython2Page</h1>
-
-<p>
-Module implementing the Debugger Python2 configuration page.
-</p>
-<h3>Global Attributes</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Classes</h3>
-
-<table>
-
-<tr>
-<td><a href="#DebuggerPython2Page">DebuggerPython2Page</a></td>
-<td>Class implementing the Debugger Python2 configuration page.</td>
-</tr>
-</table>
-<h3>Functions</h3>
-
-<table>
-
-<tr>
-<td><a href="#create">create</a></td>
-<td>Module function to create the configuration page.</td>
-</tr>
-</table>
-<hr />
-<hr />
-<a NAME="DebuggerPython2Page" ID="DebuggerPython2Page"></a>
-<h2>DebuggerPython2Page</h2>
-
-<p>
-    Class implementing the Debugger Python2 configuration page.
-</p>
-<h3>Derived from</h3>
-ConfigurationPageBase, Ui_DebuggerPython2Page
-<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="#DebuggerPython2Page.__init__">DebuggerPython2Page</a></td>
-<td>Constructor</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.__populateAndSetVenvComboBox">__populateAndSetVenvComboBox</a></td>
-<td>Private method to populate and set the virtual environment combo box.</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.on_refreshButton_clicked">on_refreshButton_clicked</a></td>
-<td>Private slot handling a click of the refresh button.</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.on_venvDlgButton_clicked">on_venvDlgButton_clicked</a></td>
-<td>Private slot to show the virtual environment manager dialog.</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.save">save</a></td>
-<td>Public slot to save the Debugger Python configuration.</td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="DebuggerPython2Page.__init__" ID="DebuggerPython2Page.__init__"></a>
-<h4>DebuggerPython2Page (Constructor)</h4>
-<b>DebuggerPython2Page</b>(<i></i>)
-
-<p>
-        Constructor
-</p>
-<a NAME="DebuggerPython2Page.__populateAndSetVenvComboBox" ID="DebuggerPython2Page.__populateAndSetVenvComboBox"></a>
-<h4>DebuggerPython2Page.__populateAndSetVenvComboBox</h4>
-<b>__populateAndSetVenvComboBox</b>(<i></i>)
-
-<p>
-        Private method to populate and set the virtual environment combo box.
-</p>
-<a NAME="DebuggerPython2Page.on_refreshButton_clicked" ID="DebuggerPython2Page.on_refreshButton_clicked"></a>
-<h4>DebuggerPython2Page.on_refreshButton_clicked</h4>
-<b>on_refreshButton_clicked</b>(<i></i>)
-
-<p>
-        Private slot handling a click of the refresh button.
-</p>
-<a NAME="DebuggerPython2Page.on_venvDlgButton_clicked" ID="DebuggerPython2Page.on_venvDlgButton_clicked"></a>
-<h4>DebuggerPython2Page.on_venvDlgButton_clicked</h4>
-<b>on_venvDlgButton_clicked</b>(<i></i>)
-
-<p>
-        Private slot to show the virtual environment manager dialog.
-</p>
-<a NAME="DebuggerPython2Page.save" ID="DebuggerPython2Page.save"></a>
-<h4>DebuggerPython2Page.save</h4>
-<b>save</b>(<i></i>)
-
-<p>
-        Public slot to save the Debugger Python configuration.
-</p>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
-<a NAME="create" ID="create"></a>
-<h2>create</h2>
-<b>create</b>(<i>dlg</i>)
-
-<p>
-    Module function to create the configuration page.
-</p>
-<dl>
-
-<dt><i>dlg</i></dt>
-<dd>
-reference to the configuration dialog
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-reference to the instantiated page (ConfigurationPageBase)
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-</body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Preferences.__init__.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.__init__.html	Sun Jun 21 18:26:12 2020 +0200
@@ -198,10 +198,6 @@
 <td>Module function to retrieve the various Qt settings.</td>
 </tr>
 <tr>
-<td><a href="#getQt4DocDir">getQt4DocDir</a></td>
-<td>Module function to retrieve the Qt4DocDir setting.</td>
-</tr>
-<tr>
 <td><a href="#getQt5DocDir">getQt5DocDir</a></td>
 <td>Module function to retrieve the Qt5DocDir setting.</td>
 </tr>
@@ -1522,29 +1518,6 @@
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
-<a NAME="getQt4DocDir" ID="getQt4DocDir"></a>
-<h2>getQt4DocDir</h2>
-<b>getQt4DocDir</b>(<i>prefClass=Prefs</i>)
-
-<p>
-    Module function to retrieve the Qt4DocDir setting.
-</p>
-<dl>
-
-<dt><i>prefClass</i></dt>
-<dd>
-preferences class used as the storage area
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-the requested Qt4DocDir setting (string)
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
 <a NAME="getQt5DocDir" ID="getQt5DocDir"></a>
 <h2>getQt5DocDir</h2>
 <b>getQt5DocDir</b>(<i>prefClass=Prefs</i>)
--- a/eric6/Documentation/Source/eric6.Project.Project.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.Project.html	Sun Jun 21 18:26:12 2020 +0200
@@ -905,16 +905,12 @@
 <td>Public method used to check, if the passed in filename belongs to the project sources.</td>
 </tr>
 <tr>
-<td><a href="#Project.isPy2Project">isPy2Project</a></td>
-<td>Public method to check, if this project is a Python2 project.</td>
-</tr>
-<tr>
 <td><a href="#Project.isPy3Project">isPy3Project</a></td>
 <td>Public method to check, if this project is a Python3 project.</td>
 </tr>
 <tr>
 <td><a href="#Project.isPythonProject">isPythonProject</a></td>
-<td>Public method to check, if this project is a Python2 or Python3 project.</td>
+<td>Public method to check, if this project is a Python3 or MicroPython project.</td>
 </tr>
 <tr>
 <td><a href="#Project.isRubyProject">isRubyProject</a></td>
@@ -3397,19 +3393,6 @@
 flag indicating membership (boolean)
 </dd>
 </dl>
-<a NAME="Project.isPy2Project" ID="Project.isPy2Project"></a>
-<h4>Project.isPy2Project</h4>
-<b>isPy2Project</b>(<i></i>)
-
-<p>
-        Public method to check, if this project is a Python2 project.
-</p>
-<dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a Python2 project (boolean)
-</dd>
-</dl>
 <a NAME="Project.isPy3Project" ID="Project.isPy3Project"></a>
 <h4>Project.isPy3Project</h4>
 <b>isPy3Project</b>(<i></i>)
@@ -3428,7 +3411,7 @@
 <b>isPythonProject</b>(<i></i>)
 
 <p>
-        Public method to check, if this project is a Python2 or Python3
+        Public method to check, if this project is a Python3 or MicroPython
         project.
 </p>
 <dl>
--- a/eric6/Documentation/Source/eric6.Project.ProjectFormsBrowser.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.ProjectFormsBrowser.html	Sun Jun 21 18:26:12 2020 +0200
@@ -145,7 +145,7 @@
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__generateDialogCode">__generateDialogCode</a></td>
-<td>Private method to generate dialog code for the form (Qt4 only).</td>
+<td>Private method to generate dialog code for the form (Qt only).</td>
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__newForm">__newForm</a></td>
@@ -165,11 +165,11 @@
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__readStderr">__readStderr</a></td>
-<td>Private slot to handle the readyReadStandardError signal of the pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.</td>
+<td>Private slot to handle the readyReadStandardError signal of the pyuic5/pyside2-uic process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__readStdout">__readStdout</a></td>
-<td>Private slot to handle the readyReadStandardOutput signal of the pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.</td>
+<td>Private slot to handle the readyReadStandardOutput signal of the pyuic5/pyside2-uic process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__resetUiCompiler">__resetUiCompiler</a></td>
@@ -369,7 +369,7 @@
 <b>__generateDialogCode</b>(<i></i>)
 
 <p>
-        Private method to generate dialog code for the form (Qt4 only).
+        Private method to generate dialog code for the form (Qt only).
 </p>
 <a NAME="ProjectFormsBrowser.__newForm" ID="ProjectFormsBrowser.__newForm"></a>
 <h4>ProjectFormsBrowser.__newForm</h4>
@@ -413,7 +413,7 @@
 
 <p>
         Private slot to handle the readyReadStandardError signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
 </p>
 <a NAME="ProjectFormsBrowser.__readStdout" ID="ProjectFormsBrowser.__readStdout"></a>
 <h4>ProjectFormsBrowser.__readStdout</h4>
@@ -421,7 +421,7 @@
 
 <p>
         Private slot to handle the readyReadStandardOutput signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
 </p>
 <a NAME="ProjectFormsBrowser.__resetUiCompiler" ID="ProjectFormsBrowser.__resetUiCompiler"></a>
 <h4>ProjectFormsBrowser.__resetUiCompiler</h4>
--- a/eric6/Documentation/Source/eric6.Project.ProjectResourcesBrowser.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.ProjectResourcesBrowser.html	Sun Jun 21 18:26:12 2020 +0200
@@ -136,11 +136,11 @@
 </tr>
 <tr>
 <td><a href="#ProjectResourcesBrowser.__readStderr">__readStderr</a></td>
-<td>Private slot to handle the readyReadStandardError signal of the pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.</td>
+<td>Private slot to handle the readyReadStandardError signal of the pyrcc5/pyside2-rcc/ process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectResourcesBrowser.__readStdout">__readStdout</a></td>
-<td>Private slot to handle the readyReadStandardOutput signal of the pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.</td>
+<td>Private slot to handle the readyReadStandardOutput signal of the pyrcc5/pyside2-rcc process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectResourcesBrowser.__showContextMenu">__showContextMenu</a></td>
@@ -351,7 +351,7 @@
 
 <p>
         Private slot to handle the readyReadStandardError signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc/ process.
 </p>
 <a NAME="ProjectResourcesBrowser.__readStdout" ID="ProjectResourcesBrowser.__readStdout"></a>
 <h4>ProjectResourcesBrowser.__readStdout</h4>
@@ -359,7 +359,7 @@
 
 <p>
         Private slot to handle the readyReadStandardOutput signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc process.
 </p>
 <a NAME="ProjectResourcesBrowser.__showContextMenu" ID="ProjectResourcesBrowser.__showContextMenu"></a>
 <h4>ProjectResourcesBrowser.__showContextMenu</h4>
--- a/eric6/Documentation/Source/eric6.Project.ProjectTranslationsBrowser.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.ProjectTranslationsBrowser.html	Sun Jun 21 18:26:12 2020 +0200
@@ -130,7 +130,7 @@
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__generateTSFile">__generateTSFile</a></td>
-<td>Private method used to run pylupdate4/pylupdate5/pyside-lupdate to generate the .ts files.</td>
+<td>Private method used to run pylupdate5/pyside2-lupdate to generate the .ts files.</td>
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__generateTSFileDone">__generateTSFileDone</a></td>
@@ -150,7 +150,7 @@
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__readStderrLupdate">__readStderrLupdate</a></td>
-<td>Private slot to handle the readyReadStandardError signal of the pylupdate4/pylupdate5/pyside-lupdate/pyside2-lupdate process.</td>
+<td>Private slot to handle the readyReadStandardError signal of the pylupdate5/pyside2-lupdate process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__readStdout">__readStdout</a></td>
@@ -335,7 +335,7 @@
 <b>__generateTSFile</b>(<i>noobsolete=False, generateAll=True</i>)
 
 <p>
-        Private method used to run pylupdate4/pylupdate5/pyside-lupdate to
+        Private method used to run pylupdate5/pyside2-lupdate to
         generate the .ts files.
 </p>
 <dl>
@@ -419,7 +419,7 @@
 
 <p>
         Private slot to handle the readyReadStandardError signal of the
-        pylupdate4/pylupdate5/pyside-lupdate/pyside2-lupdate process.
+        pylupdate5/pyside2-lupdate process.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Sun Jun 21 18:26:12 2020 +0200
@@ -434,7 +434,7 @@
 </tr>
 <tr>
 <td><a href="#Editor.__getPyVersion">__getPyVersion</a></td>
-<td>Private method to return the Python main version (2 or 3) or 0 if it's not a Python file at all.</td>
+<td>Private method to return the Python main version or 0 if it's not a Python file at all.</td>
 </tr>
 <tr>
 <td><a href="#Editor.__getSaveFileName">__getSaveFileName</a></td>
@@ -2549,13 +2549,13 @@
 <b>__getPyVersion</b>(<i></i>)
 
 <p>
-        Private method to return the Python main version (2 or 3) or 0 if it's
+        Private method to return the Python main version or 0 if it's
         not a Python file at all.
 </p>
 <dl>
 <dt>Returns:</dt>
 <dd>
-Python version (2 or 3) or 0 if it's not a Python file (int)
+Python version or 0 if it's not a Python file (int)
 </dd>
 </dl>
 <a NAME="Editor.__getSaveFileName" ID="Editor.__getSaveFileName"></a>
@@ -5569,7 +5569,13 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating a Python2 file (boolean)
+flag reporting always False
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl>
 <a NAME="Editor.isPy3File" ID="Editor.isPy3File"></a>
@@ -5595,7 +5601,7 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating a Python (2 or 3) file (boolean)
+flag indicating a Python3 file (boolean)
 </dd>
 </dl>
 <a NAME="Editor.isRubyFile" ID="Editor.isRubyFile"></a>
--- a/eric6/Documentation/Source/eric6.QScintilla.MiniEditor.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.MiniEditor.html	Sun Jun 21 18:26:12 2020 +0200
@@ -185,10 +185,6 @@
 <td>Private method used to setup the Languages context sub menu.</td>
 </tr>
 <tr>
-<td><a href="#MiniEditor.__isPy2File">__isPy2File</a></td>
-<td>Private method to return a flag indicating a Python 2 file.</td>
-</tr>
-<tr>
 <td><a href="#MiniEditor.__languageMenuTriggered">__languageMenuTriggered</a></td>
 <td>Private method to handle the selection of a lexer language.</td>
 </tr>
@@ -749,19 +745,6 @@
 reference to the generated menu (QMenu)
 </dd>
 </dl>
-<a NAME="MiniEditor.__isPy2File" ID="MiniEditor.__isPy2File"></a>
-<h4>MiniEditor.__isPy2File</h4>
-<b>__isPy2File</b>(<i></i>)
-
-<p>
-        Private method to return a flag indicating a Python 2 file.
-</p>
-<dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a Python 2 file (boolean)
-</dd>
-</dl>
 <a NAME="MiniEditor.__languageMenuTriggered" ID="MiniEditor.__languageMenuTriggered"></a>
 <h4>MiniEditor.__languageMenuTriggered</h4>
 <b>__languageMenuTriggered</b>(<i>act</i>)
--- a/eric6/Documentation/Source/eric6.UI.BrowserModel.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.UI.BrowserModel.html	Sun Jun 21 18:26:12 2020 +0200
@@ -913,10 +913,6 @@
 <td>Public method to check, if this file is a Google Protocol Buffer file.</td>
 </tr>
 <tr>
-<td><a href="#BrowserFileItem.isPython2File">isPython2File</a></td>
-<td>Public method to check, if this file is a Python script.</td>
-</tr>
-<tr>
 <td><a href="#BrowserFileItem.isPython3File">isPython3File</a></td>
 <td>Public method to check, if this file is a Python3 script.</td>
 </tr>
@@ -1143,19 +1139,6 @@
 bool
 </dd>
 </dl>
-<a NAME="BrowserFileItem.isPython2File" ID="BrowserFileItem.isPython2File"></a>
-<h4>BrowserFileItem.isPython2File</h4>
-<b>isPython2File</b>(<i></i>)
-
-<p>
-        Public method to check, if this file is a Python script.
-</p>
-<dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a Python file (boolean)
-</dd>
-</dl>
 <a NAME="BrowserFileItem.isPython3File" ID="BrowserFileItem.isPython3File"></a>
 <h4>BrowserFileItem.isPython3File</h4>
 <b>isPython3File</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.UI.UserInterface.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.UI.UserInterface.html	Sun Jun 21 18:26:12 2020 +0200
@@ -671,30 +671,18 @@
 <td>Private slot used to show the previous tab or file.</td>
 </tr>
 <tr>
-<td><a href="#UserInterface.__showPyQt4Doc">__showPyQt4Doc</a></td>
-<td>Private slot to show the PyQt4 documentation.</td>
-</tr>
-<tr>
 <td><a href="#UserInterface.__showPyQt5Doc">__showPyQt5Doc</a></td>
 <td>Private slot to show the PyQt5 documentation.</td>
 </tr>
 <tr>
 <td><a href="#UserInterface.__showPySideDoc">__showPySideDoc</a></td>
-<td>Private slot to show the PySide/PySide2 documentation.</td>
-</tr>
-<tr>
-<td><a href="#UserInterface.__showPython2Doc">__showPython2Doc</a></td>
-<td>Private slot to show the Python 2 documentation.</td>
+<td>Private slot to show the PySide2 documentation.</td>
 </tr>
 <tr>
 <td><a href="#UserInterface.__showPythonDoc">__showPythonDoc</a></td>
 <td>Private slot to show the Python 3 documentation.</td>
 </tr>
 <tr>
-<td><a href="#UserInterface.__showQt4Doc">__showQt4Doc</a></td>
-<td>Private slot to show the Qt4 documentation.</td>
-</tr>
-<tr>
 <td><a href="#UserInterface.__showQt5Doc">__showQt5Doc</a></td>
 <td>Private slot to show the Qt5 documentation.</td>
 </tr>
@@ -2302,13 +2290,6 @@
 <p>
         Private slot used to show the previous tab or file.
 </p>
-<a NAME="UserInterface.__showPyQt4Doc" ID="UserInterface.__showPyQt4Doc"></a>
-<h4>UserInterface.__showPyQt4Doc</h4>
-<b>__showPyQt4Doc</b>(<i></i>)
-
-<p>
-        Private slot to show the PyQt4 documentation.
-</p>
 <a NAME="UserInterface.__showPyQt5Doc" ID="UserInterface.__showPyQt5Doc"></a>
 <h4>UserInterface.__showPyQt5Doc</h4>
 <b>__showPyQt5Doc</b>(<i></i>)
@@ -2318,25 +2299,18 @@
 </p>
 <a NAME="UserInterface.__showPySideDoc" ID="UserInterface.__showPySideDoc"></a>
 <h4>UserInterface.__showPySideDoc</h4>
-<b>__showPySideDoc</b>(<i>variant</i>)
+<b>__showPySideDoc</b>(<i>variant="2"</i>)
 
 <p>
-        Private slot to show the PySide/PySide2 documentation.
+        Private slot to show the PySide2 documentation.
 </p>
 <dl>
 
 <dt><i>variant</i> (str)</dt>
 <dd>
-PySide variant (1 or 2)
+PySide variant (2)
 </dd>
 </dl>
-<a NAME="UserInterface.__showPython2Doc" ID="UserInterface.__showPython2Doc"></a>
-<h4>UserInterface.__showPython2Doc</h4>
-<b>__showPython2Doc</b>(<i></i>)
-
-<p>
-        Private slot to show the Python 2 documentation.
-</p>
 <a NAME="UserInterface.__showPythonDoc" ID="UserInterface.__showPythonDoc"></a>
 <h4>UserInterface.__showPythonDoc</h4>
 <b>__showPythonDoc</b>(<i></i>)
@@ -2344,13 +2318,6 @@
 <p>
         Private slot to show the Python 3 documentation.
 </p>
-<a NAME="UserInterface.__showQt4Doc" ID="UserInterface.__showQt4Doc"></a>
-<h4>UserInterface.__showQt4Doc</h4>
-<b>__showQt4Doc</b>(<i></i>)
-
-<p>
-        Private slot to show the Qt4 documentation.
-</p>
 <a NAME="UserInterface.__showQt5Doc" ID="UserInterface.__showQt5Doc"></a>
 <h4>UserInterface.__showQt5Doc</h4>
 <b>__showQt5Doc</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Utilities.PySideImporter.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.PySideImporter.html	Sun Jun 21 18:26:12 2020 +0200
@@ -23,7 +23,7 @@
 <h1>eric6.Utilities.PySideImporter</h1>
 
 <p>
-Module to check for the presence of PySide/PySide2 by importing it.
+Module to check for the presence of PySide2 by importing it.
 </p>
 <h3>Global Attributes</h3>
 
--- a/eric6/Documentation/Source/eric6.Utilities.__init__.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.__init__.html	Sun Jun 21 18:26:12 2020 +0200
@@ -61,7 +61,7 @@
 </tr>
 <tr>
 <td><a href="#checkPyside">checkPyside</a></td>
-<td>Module function to check the presence of PySide/PySide2.</td>
+<td>Module function to check the presence of PySide2.</td>
 </tr>
 <tr>
 <td><a href="#compactPath">compactPath</a></td>
@@ -141,7 +141,7 @@
 </tr>
 <tr>
 <td><a href="#generatePySideToolPath">generatePySideToolPath</a></td>
-<td>Module function to generate the executable path for a PySide/PySide2 tool.</td>
+<td>Module function to generate the executable path for a PySide2 tool.</td>
 </tr>
 <tr>
 <td><a href="#generateQtToolName">generateQtToolName</a></td>
@@ -583,26 +583,25 @@
 <b>checkPyside</b>(<i>variant="2"</i>)
 
 <p>
-    Module function to check the presence of PySide/PySide2.
+    Module function to check the presence of PySide2.
 </p>
 <dl>
 
 <dt><i>variant</i> (str)</dt>
 <dd>
-indicator for the PySide variant
+indicator for the PySide variant (not used)
 </dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-list of two flags indicating the presence of PySide/PySide2 for
-        Python2 and PySide/PySide2 for Python3
+flags indicating the presence of PySide2
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (bool, bool)
+bool
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -762,7 +761,7 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-Python version if file is Python2 or Python3 (int)
+Python version if file is Python3 (int)
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -1160,7 +1159,7 @@
 <b>generatePySideToolPath</b>(<i>toolname, variant="2"</i>)
 
 <p>
-    Module function to generate the executable path for a PySide/PySide2 tool.
+    Module function to generate the executable path for a PySide2 tool.
 </p>
 <dl>
 
@@ -1170,13 +1169,13 @@
 </dd>
 <dt><i>variant</i> (str)</dt>
 <dd>
-indicator for the PySide variant
+indicator for the PySide variant (not used)
 </dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-the PySide/PySide2 tool path with extension
+the PySide2 tool path with extension
 </dd>
 </dl>
 <dl>
--- a/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html	Sun Jun 21 18:26:12 2020 +0200
@@ -113,7 +113,7 @@
 
 <a NAME="VirtualenvAddEditDialog.__init__" ID="VirtualenvAddEditDialog.__init__"></a>
 <h4>VirtualenvAddEditDialog (Constructor)</h4>
-<b>VirtualenvAddEditDialog</b>(<i>manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None</i>)
+<b>VirtualenvAddEditDialog</b>(<i>manager, venvName="", venvDirectory="", venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None</i>)
 
 <p>
         Constructor
@@ -136,10 +136,6 @@
 <dd>
 Python interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
@@ -180,17 +176,16 @@
 <dt>Returns:</dt>
 <dd>
 tuple containing the logical name, the directory, the
-            interpreter of the virtual environment, the Python variant,
-            a flag indicating a global environment, a flag indicating an
-            Anaconda environment, aflag indicating a remotely accessed
-            environment and a string to be prepended to the PATH environment
-            variable
+            interpreter of the virtual environment, a flag indicating a
+            global environment, a flag indicating an Anaconda environment,
+            a flag indicating a remotely accessed environment and a string
+            to be prepended to the PATH environment variable
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (str, str, str, int, bool, bool, bool, str)
+tuple of (str, str, str, bool, bool, bool, str)
 </dd>
 </dl>
 <a NAME="VirtualenvAddEditDialog.on_anacondaCheckBox_clicked" ID="VirtualenvAddEditDialog.on_anacondaCheckBox_clicked"></a>
--- a/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.html	Sun Jun 21 18:26:12 2020 +0200
@@ -132,14 +132,13 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-tuple containing the path of the selected Python interpreter
-            and the Python variant
+path of the selected Python interpreter
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (str, int)
+str
 </dd>
 </dl>
 <a NAME="VirtualenvInterpreterSelectionDialog.on_pythonExecPicker_textChanged" ID="VirtualenvInterpreterSelectionDialog.on_pythonExecPicker_textChanged"></a>
--- a/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html	Sun Jun 21 18:26:12 2020 +0200
@@ -140,14 +140,6 @@
 <td>Public method to get a list of defined virtual environments.</td>
 </tr>
 <tr>
-<td><a href="#VirtualenvManager.getVirtualenvNamesForVariant">getVirtualenvNamesForVariant</a></td>
-<td>Public method to get a list of virtual environments for a given Python variant.</td>
-</tr>
-<tr>
-<td><a href="#VirtualenvManager.getVirtualenvVariant">getVirtualenvVariant</a></td>
-<td>Public method to get the variant of a virtual environment.</td>
-</tr>
-<tr>
 <td><a href="#VirtualenvManager.isCondaEnvironment">isCondaEnvironment</a></td>
 <td>Public method to test, if a given environment is an Anaconda environment.</td>
 </tr>
@@ -247,7 +239,7 @@
 </p>
 <a NAME="VirtualenvManager.addVirtualEnv" ID="VirtualenvManager.addVirtualEnv"></a>
 <h4>VirtualenvManager.addVirtualEnv</h4>
-<b>addVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath=""</i>)
+<b>addVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath=""</i>)
 
 <p>
         Public method to add a virtual environment.
@@ -266,10 +258,6 @@
 <dd>
 interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
@@ -460,59 +448,6 @@
 list of str
 </dd>
 </dl>
-<a NAME="VirtualenvManager.getVirtualenvNamesForVariant" ID="VirtualenvManager.getVirtualenvNamesForVariant"></a>
-<h4>VirtualenvManager.getVirtualenvNamesForVariant</h4>
-<b>getVirtualenvNamesForVariant</b>(<i>variant</i>)
-
-<p>
-        Public method to get a list of virtual environments for a given
-        Python variant.
-</p>
-<dl>
-
-<dt><i>variant</i> (int)</dt>
-<dd>
-Python variant (2 or 3)
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-list of defined virtual environments
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-list of str
-</dd>
-</dl>
-<a NAME="VirtualenvManager.getVirtualenvVariant" ID="VirtualenvManager.getVirtualenvVariant"></a>
-<h4>VirtualenvManager.getVirtualenvVariant</h4>
-<b>getVirtualenvVariant</b>(<i>venvName</i>)
-
-<p>
-        Public method to get the variant of a virtual environment.
-</p>
-<dl>
-
-<dt><i>venvName</i> (str)</dt>
-<dd>
-logical name for the virtual environment
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-Python variant of the environment
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-str
-</dd>
-</dl>
 <a NAME="VirtualenvManager.isCondaEnvironment" ID="VirtualenvManager.isCondaEnvironment"></a>
 <h4>VirtualenvManager.isCondaEnvironment</h4>
 <b>isCondaEnvironment</b>(<i>venvName</i>)
@@ -635,7 +570,7 @@
 </dl>
 <a NAME="VirtualenvManager.renameVirtualEnv" ID="VirtualenvManager.renameVirtualEnv"></a>
 <h4>VirtualenvManager.renameVirtualEnv</h4>
-<b>renameVirtualEnv</b>(<i>oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath</i>)
+<b>renameVirtualEnv</b>(<i>oldVenvName, venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath</i>)
 
 <p>
         Public method to substitute a virtual environment entry with a new
@@ -659,10 +594,6 @@
 <dd>
 interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
@@ -683,7 +614,7 @@
 </dl>
 <a NAME="VirtualenvManager.setVirtualEnv" ID="VirtualenvManager.setVirtualEnv"></a>
 <h4>VirtualenvManager.setVirtualEnv</h4>
-<b>setVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath</i>)
+<b>setVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath</i>)
 
 <p>
         Public method to change a virtual environment.
@@ -702,10 +633,6 @@
 <dd>
 interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
--- a/eric6/Documentation/Source/index-eric6.Preferences.ConfigurationPages.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/index-eric6.Preferences.ConfigurationPages.html	Sun Jun 21 18:26:12 2020 +0200
@@ -54,10 +54,6 @@
 <td>Module implementing the Debugger General configuration page.</td>
 </tr>
 <tr>
-<td><a href="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html">DebuggerPython2Page</a></td>
-<td>Module implementing the Debugger Python2 configuration page.</td>
-</tr>
-<tr>
 <td><a href="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html">DebuggerPython3Page</a></td>
 <td>Module implementing the Debugger Python3 configuration page.</td>
 </tr>
--- a/eric6/Documentation/Source/index-eric6.Utilities.html	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Documentation/Source/index-eric6.Utilities.html	Sun Jun 21 18:26:12 2020 +0200
@@ -79,7 +79,7 @@
 </tr>
 <tr>
 <td><a href="eric6.Utilities.PySideImporter.html">PySideImporter</a></td>
-<td>Module to check for the presence of PySide/PySide2 by importing it.</td>
+<td>Module to check for the presence of PySide2 by importing it.</td>
 </tr>
 <tr>
 <td><a href="eric6.Utilities.__init__.html">Utilities</a></td>
--- a/eric6/DocumentationTools/__init__.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/DocumentationTools/__init__.py	Sun Jun 21 18:26:12 2020 +0200
@@ -8,7 +8,6 @@
 """
 
 supportedExtensionsDictForApis = {
-    "Python2": [".py2", ".pyw2", ".ptl"],
     "Python3": [".py", ".pyw", ".py3", ".pyw3"],
     "Ruby": [".rb"]
 }
--- a/eric6/E5XML/ProjectReader.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/E5XML/ProjectReader.py	Sun Jun 21 18:26:12 2020 +0200
@@ -68,8 +68,8 @@
                     )
                     self.project.pdata["PROGLANGUAGE"] = self.readElementText()
                     if self.project.pdata["PROGLANGUAGE"] == "Python":
-                        # convert Python to the more specific Python2
-                        self.project.pdata["PROGLANGUAGE"] = "Python2"
+                        # convert Python to the more specific Python3
+                        self.project.pdata["PROGLANGUAGE"] = "Python3"
                 elif self.name() == "ProjectType":
                     self.project.pdata["PROJECTTYPE"] = self.readElementText()
                 elif self.name() == "Description":
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py	Sun Jun 21 18:26:12 2020 +0200
@@ -364,14 +364,6 @@
         fixer = None
     
     if not errors:
-        # avoid 'Encoding declaration in unicode string' exception on Python2
-        if sys.version_info[0] == 2:
-            if encoding == 'utf-8-bom':
-                enc = 'utf-8'
-            else:
-                enc = encoding
-            source = [line.encode(enc) for line in source]
-        
         if includeMessages:
             select = [s.strip() for s in
                       includeMessages.split(',') if s.strip()]
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py	Sun Jun 21 18:26:12 2020 +0200
@@ -240,8 +240,6 @@
         else:
             file_enc = filename
         
-        # It also encode the code back to avoid 'Encoding declaration in
-        # unicode string' exception on Python2
         codestring = normalizeCode(codestring)
         
         # Check for VCS conflict markers
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py	Sun Jun 21 18:26:12 2020 +0200
@@ -195,22 +195,6 @@
         """
         self.error.emit(fn, msg)
     
-    def serviceErrorPy2(self, fx, lang, fn, msg):
-        """
-        Public method handling service errors for Python 2.
-        
-        @param fx service name (string)
-        @param lang language (string)
-        @param fn file name (string)
-        @param msg message text (string)
-        """
-        if fx in ['Python2Syntax', 'batch_Python2Syntax']:
-            if fx == 'Python2Syntax':
-                self.__serviceError(fn, msg)
-            else:
-                self.__serviceError(self.tr("Python 2 batch check"), msg)
-                self.batchJobDone(fx, lang)
-    
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
         Public method handling service errors for Python 2.
@@ -283,7 +267,6 @@
         @param lang language (string)
         """
         if fx in [
-            'Python2Syntax', 'batch_Python2Syntax',
             'Python3Syntax', 'batch_Python3Syntax',
             'JavaScriptSyntax', 'batch_JavaScriptSyntax',
             'YAMLSyntax', 'batch_YAMLSyntax',
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py	Sun Jun 21 18:26:12 2020 +0200
@@ -4,7 +4,7 @@
 #
 # Original (c) 2005 Divmod, Inc.  See __init__.py file for details
 #
-# This module is based on pyflakes for Python2 and Python3, but was modified to
+# This module is based on pyflakes, but was modified to
 # be integrated into eric6
 
 """
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py	Sun Jun 21 18:26:12 2020 +0200
@@ -179,7 +179,6 @@
     @return translated and formatted message (string)
     """
     if message_id in _messages:
-        # Avoid leading "u" at Python2 unicode strings
         msg = _messages[message_id].replace("{0!r}", "'{0}'")
         msg = msg.replace("{1!r}", "'{1}'")
         return msg.format(*message_args)
--- a/eric6/Plugins/PluginCodeStyleChecker.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/PluginCodeStyleChecker.py	Sun Jun 21 18:26:12 2020 +0200
@@ -72,11 +72,6 @@
         path = os.path.join(
             os.path.dirname(__file__), 'CheckerPlugins', 'CodeStyleChecker')
         self.backgroundService.serviceConnect(
-            'style', 'Python2', path, 'CodeStyleChecker',
-            self.__translateStyleCheck,
-            onErrorCallback=self.serviceErrorPy2,
-            onBatchDone=self.batchJobDone)
-        self.backgroundService.serviceConnect(
             'style', 'Python3', path, 'CodeStyleChecker',
             self.__translateStyleCheck,
             onErrorCallback=self.serviceErrorPy3,
@@ -96,22 +91,6 @@
         """
         self.error.emit(fn, msg)
     
-    def serviceErrorPy2(self, fx, lang, fn, msg):
-        """
-        Public slot handling service errors for Python 2.
-        
-        @param fx service name (string)
-        @param lang language (string)
-        @param fn file name (string)
-        @param msg message text (string)
-        """
-        if fx in ['style', 'batch_style'] and lang == 'Python2':
-            if fx == 'style':
-                self.__serviceError(fn, msg)
-            else:
-                self.__serviceError(self.tr("Python 2 batch check"), msg)
-                self.batchJobDone(fx, lang)
-    
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
         Public slot handling service errors for Python 2.
@@ -179,7 +158,7 @@
         """
         if lang is None:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-        if lang not in ['Python2', 'Python3']:
+        if lang != 'Python3':
             return
         
         data = [source, args]
@@ -195,30 +174,27 @@
         @type list of tuple of (str, str, list)
         """
         data = {
-            "Python2": [],
             "Python3": [],
         }
         for filename, source, args in argumentsList:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-            if lang not in ['Python2', 'Python3']:
+            if lang != 'Python3':
                 continue
             else:
                 data[lang].append((filename, source, args))
         
         self.queuedBatches = []
-        for lang in ['Python2', 'Python3']:
-            if data[lang]:
-                self.queuedBatches.append(lang)
-                self.backgroundService.enqueueRequest('batch_style', lang, "",
-                                                      data[lang])
-                self.batchesFinished = False
+        if data['Python3']:
+            self.queuedBatches.append('Python3')
+            self.backgroundService.enqueueRequest('batch_style', 'Python3', "",
+                                                  data['Python3'])
+            self.batchesFinished = False
     
     def cancelStyleBatchCheck(self):
         """
         Public method to cancel all batch jobs.
         """
-        for lang in ['Python2', 'Python3']:
-            self.backgroundService.requestCancel('batch_style', lang)
+        self.backgroundService.requestCancel('batch_style', 'Python3')
     
     def __translateStyleCheck(self, fn, codeStyleCheckerStats, results):
         """
@@ -340,7 +316,7 @@
         if menuName == "Checks" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
                 e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"])
+                ["Python3", "MicroPython"])
     
     def __projectBrowserShowMenu(self, menuName, menu):
         """
@@ -353,7 +329,7 @@
         if (
             menuName == "Checks" and
             e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"]
+                ["Python3", "MicroPython"]
         ):
             self.__projectBrowserMenu = menu
             if self.__projectBrowserAct is None:
--- a/eric6/Plugins/PluginSyntaxChecker.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/PluginSyntaxChecker.py	Sun Jun 21 18:26:12 2020 +0200
@@ -66,20 +66,12 @@
                             'SyntaxChecker')
         
         self.syntaxCheckService.addLanguage(
-            'Python2', 'Python2', path, 'SyntaxCheck',
-            self.__getPythonOptions,
-            lambda: Preferences.getPython("PythonExtensions"),
-            self.__translateSyntaxCheck,
-            self.syntaxCheckService.serviceErrorPy2)
-        
-        self.syntaxCheckService.addLanguage(
             'Python3', 'Python3', path, 'SyntaxCheck',
             self.__getPythonOptions,
             lambda: Preferences.getPython("Python3Extensions"),
             self.__translateSyntaxCheck,
             self.syntaxCheckService.serviceErrorPy3)
         
-        # Jasy isn't yet compatible to Python2
         self.syntaxCheckService.addLanguage(
             'JavaScript', 'Python3', path,
             'jsCheckSyntax',
--- a/eric6/Plugins/PluginTabnanny.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/PluginTabnanny.py	Sun Jun 21 18:26:12 2020 +0200
@@ -68,11 +68,6 @@
         path = os.path.join(
             os.path.dirname(__file__), 'CheckerPlugins', 'Tabnanny')
         self.backgroundService.serviceConnect(
-            'indent', 'Python2', path, 'Tabnanny',
-            lambda *args: self.indentChecked.emit(*args),
-            onErrorCallback=self.serviceErrorPy2,
-            onBatchDone=self.batchJobDone)
-        self.backgroundService.serviceConnect(
             'indent', 'Python3', path, 'Tabnanny',
             lambda *args: self.indentChecked.emit(*args),
             onErrorCallback=self.serviceErrorPy3,
@@ -90,22 +85,6 @@
         """
         self.error.emit(fn, msg)
     
-    def serviceErrorPy2(self, fx, lang, fn, msg):
-        """
-        Public slot handling service errors for Python 2.
-        
-        @param fx service name (string)
-        @param lang language (string)
-        @param fn file name (string)
-        @param msg message text (string)
-        """
-        if fx in ['indent', 'batch_indent'] and lang == 'Python2':
-            if fx == 'indent':
-                self.__serviceError(fn, msg)
-            else:
-                self.__serviceError(self.tr("Python 2 batch check"), msg)
-                self.batchJobDone(fx, lang)
-    
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
         Public slot handling service errors for Python 2.
@@ -164,7 +143,7 @@
         """
         if lang is None:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-        if lang not in ['Python2', 'Python3']:
+        if lang != 'Python3':
             return
         
         self.backgroundService.enqueueRequest(
@@ -179,30 +158,27 @@
             containing filename and source (string, string)
         """
         data = {
-            "Python2": [],
             "Python3": [],
         }
         for filename, source in argumentsList:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-            if lang not in ['Python2', 'Python3']:
+            if lang != 'Python3':
                 continue
             else:
                 data[lang].append((filename, source))
         
         self.queuedBatches = []
-        for lang in ['Python2', 'Python3']:
-            if data[lang]:
-                self.queuedBatches.append(lang)
-                self.backgroundService.enqueueRequest('batch_indent', lang, "",
-                                                      data[lang])
-                self.batchesFinished = False
+        if data['Python3']:
+            self.queuedBatches.append('Python3')
+            self.backgroundService.enqueueRequest(
+                'batch_indent', 'Python3', "", data['Python3'])
+            self.batchesFinished = False
     
     def cancelIndentBatchCheck(self):
         """
         Public method to cancel all batch jobs.
         """
-        for lang in ['Python2', 'Python3']:
-            self.backgroundService.requestCancel('batch_style', lang)
+        self.backgroundService.requestCancel('batch_style', 'Python3')
     
     def activate(self):
         """
@@ -292,7 +268,7 @@
         if menuName == "Checks" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
                 e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"])
+                ["Python3", "MicroPython"])
     
     def __projectBrowserShowMenu(self, menuName, menu):
         """
@@ -305,7 +281,7 @@
         if (
             menuName == "Checks" and
             e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"]
+                ["Python3", "MicroPython"]
         ):
             self.__projectBrowserMenu = menu
             if self.__projectBrowserAct is None:
--- a/eric6/Plugins/PluginWizardQFileDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/PluginWizardQFileDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -48,8 +48,8 @@
         super(FileDialogWizard, self).__init__(ui)
         self.__ui = ui
         
-        # PyQt4 or PyQt5
-        self.__pyqtRe = re.compile(r"(?:import|from)\s+PyQt([45])")
+        # PyQt5
+        self.__pyqtRe = re.compile(r"(?:import|from)\s+PyQt([5])")
 
     def activate(self):
         """
@@ -124,7 +124,7 @@
         @param editor reference to the current editor
         @type Editor
         @param variant variant of code to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
         @type int
         @return the generated code (string)
         """
@@ -166,7 +166,7 @@
                     # unknown
                     dialogVariant = 0
                 else:
-                    # PyQt4 or PyQt5
+                    # PyQt5
                     dialogVariant = int(match.group(1))
             elif variant == "E5FileDialog":
                 # E5FileDialog
--- a/eric6/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -34,7 +34,7 @@
         Constructor
         
         @param dialogVariant variant of the file dialog to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
         @type int
         @param parent parent widget
         @type QWidget
@@ -71,7 +71,7 @@
             self.pyqtComboBox.setCurrentIndex(0)
             self.pyqtComboBox.setEnabled(False)
         else:
-            self.pyqtComboBox.addItems(["PyQt5", "PyQt4"])
+            self.pyqtComboBox.addItems(["PyQt5"])
             self.setWindowTitle(self.tr("QFileDialog Wizard"))
             if self.__dialogVariant == 5:
                 self.pyqtComboBox.setCurrentIndex(0)
@@ -113,9 +113,9 @@
         
         @param txt text of the selected combo box entry (string)
         """
-        self.rfOpenFile.setEnabled(txt in ("eric", "PyQt4"))
-        self.rfOpenFiles.setEnabled(txt in ("eric", "PyQt4"))
-        self.rfSaveFile.setEnabled(txt in ("eric", "PyQt4"))
+        self.rfOpenFile.setEnabled(txt == "eric")
+        self.rfOpenFiles.setEnabled(txt == "eric")
+        self.rfSaveFile.setEnabled(txt == "eric")
         
         self.rOpenFileUrl.setEnabled(txt == "PyQt5")
         self.rOpenFileUrls.setEnabled(txt == "PyQt5")
@@ -143,8 +143,6 @@
             self.__dialogVariant = -1
         elif txt == "PyQt5":
             self.__dialogVariant = 5
-        elif txt == "PyQt4":
-            self.__dialogVariant = 4
         else:
             # default is PyQt5
             self.__dialogVariant = 5
@@ -364,7 +362,7 @@
     
     def getCode(self, indLevel, indString):
         """
-        Public method to get the source code for Qt4 and Qt5.
+        Public method to get the source code for Qt5.
         
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
--- a/eric6/Preferences/ConfigurationDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ConfigurationDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -222,9 +222,6 @@
                 "debuggerGeneralPage":
                 [self.tr("General"), "preferences-debugger",
                  "DebuggerGeneralPage", "0debuggerPage", None],
-                "debuggerPython2Page":
-                [self.tr("Python2"), "preferences-pyDebugger",
-                 "DebuggerPython2Page", "0debuggerPage", None],
                 "debuggerPython3Page":
                 [self.tr("Python3"), "preferences-pyDebugger",
                  "DebuggerPython3Page", "0debuggerPage", None],
--- a/eric6/Preferences/ConfigurationPages/DebuggerPython2Page.py	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2006 - 2020 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing the Debugger Python2 configuration page.
-"""
-
-
-from PyQt5.QtCore import pyqtSlot
-
-from E5Gui.E5Application import e5App
-from E5Gui.E5PathPicker import E5PathPickerModes
-
-from .ConfigurationPageBase import ConfigurationPageBase
-from .Ui_DebuggerPython2Page import Ui_DebuggerPython2Page
-
-import Preferences
-import UI.PixmapCache
-
-
-class DebuggerPython2Page(ConfigurationPageBase, Ui_DebuggerPython2Page):
-    """
-    Class implementing the Debugger Python2 configuration page.
-    """
-    def __init__(self):
-        """
-        Constructor
-        """
-        super(DebuggerPython2Page, self).__init__()
-        self.setupUi(self)
-        self.setObjectName("DebuggerPython2Page")
-        
-        try:
-            self.__virtualenvManager = e5App().getObject("VirtualEnvManager")
-        except KeyError:
-            from VirtualEnv.VirtualenvManager import VirtualenvManager
-            self.__virtualenvManager = VirtualenvManager()
-        
-        self.venvDlgButton.setIcon(UI.PixmapCache.getIcon("virtualenv"))
-        
-        self.debugClientPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.debugClientPicker.setToolTip(self.tr(
-            "Press to select the Debug Client via a file selection dialog"))
-        self.debugClientPicker.setFilters(self.tr("Python Files (*.py *.py2)"))
-        
-        self.__populateAndSetVenvComboBox()
-        
-        # set initial values
-        dct = Preferences.getDebugger("DebugClientType")
-        if dct == "standard":
-            self.standardButton.setChecked(True)
-        else:
-            self.customButton.setChecked(True)
-        self.debugClientPicker.setText(
-            Preferences.getDebugger("DebugClient"), toNative=False)
-        self.pyRedirectCheckBox.setChecked(
-            Preferences.getDebugger("PythonRedirect"))
-        self.pyNoEncodingCheckBox.setChecked(
-            Preferences.getDebugger("PythonNoEncoding"))
-        self.sourceExtensionsEdit.setText(
-            Preferences.getDebugger("PythonExtensions"))
-    
-    def save(self):
-        """
-        Public slot to save the Debugger Python configuration.
-        """
-        Preferences.setDebugger(
-            "Python2VirtualEnv",
-            self.venvComboBox.currentText())
-        if self.standardButton.isChecked():
-            dct = "standard"
-        else:
-            dct = "custom"
-        Preferences.setDebugger("DebugClientType", dct)
-        Preferences.setDebugger(
-            "DebugClient",
-            self.debugClientPicker.text(toNative=False))
-        Preferences.setDebugger(
-            "PythonRedirect",
-            self.pyRedirectCheckBox.isChecked())
-        Preferences.setDebugger(
-            "PythonNoEncoding",
-            self.pyNoEncodingCheckBox.isChecked())
-    
-    def __populateAndSetVenvComboBox(self):
-        """
-        Private method to populate and set the virtual environment combo box.
-        """
-        self.venvComboBox.clear()
-        self.venvComboBox.addItems(
-            [""] +
-            sorted(self.__virtualenvManager.getVirtualenvNamesForVariant(2))
-        )
-        
-        # set initial value
-        venvName = Preferences.getDebugger("Python2VirtualEnv")
-        if venvName:
-            index = self.venvComboBox.findText(venvName)
-            if index < 0:
-                index = 0
-            self.venvComboBox.setCurrentIndex(index)
-    
-    @pyqtSlot()
-    def on_refreshButton_clicked(self):
-        """
-        Private slot handling a click of the refresh button.
-        """
-        self.sourceExtensionsEdit.setText(
-            Preferences.getDebugger("PythonExtensions"))
-    
-    @pyqtSlot()
-    def on_venvDlgButton_clicked(self):
-        """
-        Private slot to show the virtual environment manager dialog.
-        """
-        self.__virtualenvManager.showVirtualenvManagerDialog(modal=True)
-        self.__populateAndSetVenvComboBox()
-        self.activateWindow()
-        self.raise_()
-    
-
-def create(dlg):
-    """
-    Module function to create the configuration page.
-    
-    @param dlg reference to the configuration dialog
-    @return reference to the instantiated page (ConfigurationPageBase)
-    """
-    page = DebuggerPython2Page()
-    return page
--- a/eric6/Preferences/ConfigurationPages/DebuggerPython2Page.ui	Sat Jun 20 17:36:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,241 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>DebuggerPython2Page</class>
- <widget class="QWidget" name="DebuggerPython2Page">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>455</width>
-    <height>500</height>
-   </rect>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout_3">
-   <item>
-    <widget class="QLabel" name="headerLabel">
-     <property name="text">
-      <string>&lt;b&gt;Configure Python2 Debugger&lt;/b&gt;</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="Line" name="line11_2">
-     <property name="frameShape">
-      <enum>QFrame::HLine</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Sunken</enum>
-     </property>
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox_4">
-     <property name="title">
-      <string>Python2 Virtual Environment</string>
-     </property>
-     <layout class="QHBoxLayout" name="horizontalLayout_2">
-      <item>
-       <widget class="QComboBox" name="venvComboBox">
-        <property name="toolTip">
-         <string>Select the virtual environment to be used</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QToolButton" name="venvDlgButton">
-        <property name="toolTip">
-         <string>Press to open the virtual environment manager dialog</string>
-        </property>
-        <property name="text">
-         <string notr="true"/>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox_2">
-     <property name="title">
-      <string>Debug Client Type</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="1" column="0" colspan="2">
-       <widget class="E5PathPicker" name="debugClientPicker" native="true">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the path of the Debug Client to be used.  Leave empty to use the default.</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="QRadioButton" name="standardButton">
-        <property name="toolTip">
-         <string>Select the standard debug client</string>
-        </property>
-        <property name="text">
-         <string>Standard</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QRadioButton" name="customButton">
-        <property name="toolTip">
-         <string>Select the custom selected debug client</string>
-        </property>
-        <property name="text">
-         <string>Custom</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox_3">
-     <property name="title">
-      <string>Source association</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout">
-      <item>
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Please configure the associated file extensions on the 'Python' page.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="sourceExtensionsEdit">
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <layout class="QHBoxLayout" name="horizontalLayout">
-        <item>
-         <spacer name="horizontalSpacer">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QPushButton" name="refreshButton">
-          <property name="toolTip">
-           <string>Press to update the display of the source associations</string>
-          </property>
-          <property name="text">
-           <string>Refresh</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="horizontalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QCheckBox" name="pyRedirectCheckBox">
-     <property name="toolTip">
-      <string>Select, to redirect stdin, stdout and stderr of the program being debugged to the eric6 IDE</string>
-     </property>
-     <property name="text">
-      <string>Redirect stdin/stdout/stderr</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QCheckBox" name="pyNoEncodingCheckBox">
-     <property name="toolTip">
-      <string>Select to not set the debug client encoding</string>
-     </property>
-     <property name="text">
-      <string>Don't set the encoding of the debug client</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer>
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>435</width>
-       <height>21</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>E5PathPicker</class>
-   <extends>QWidget</extends>
-   <header>E5Gui/E5PathPicker.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <tabstops>
-  <tabstop>venvComboBox</tabstop>
-  <tabstop>venvDlgButton</tabstop>
-  <tabstop>standardButton</tabstop>
-  <tabstop>customButton</tabstop>
-  <tabstop>debugClientPicker</tabstop>
-  <tabstop>sourceExtensionsEdit</tabstop>
-  <tabstop>refreshButton</tabstop>
-  <tabstop>pyRedirectCheckBox</tabstop>
-  <tabstop>pyNoEncodingCheckBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
-  <connection>
-   <sender>customButton</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>debugClientPicker</receiver>
-   <slot>setEnabled(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>328</x>
-     <y>116</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>328</x>
-     <y>135</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
--- a/eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py	Sun Jun 21 18:26:12 2020 +0200
@@ -91,7 +91,7 @@
         self.venvComboBox.clear()
         self.venvComboBox.addItems(
             [""] +
-            sorted(self.__virtualenvManager.getVirtualenvNamesForVariant(3))
+            sorted(self.__virtualenvManager.getVirtualenvNames())
         )
         
         # set initial value
--- a/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.py	Sun Jun 21 18:26:12 2020 +0200
@@ -32,64 +32,32 @@
         self.ericDocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.ericDocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
-        self.python2DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.python2DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;"
-            "Compressed Help Files (*.chm);;"
-            "All Files (*)"))
         self.pythonDocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.pythonDocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;"
             "Compressed Help Files (*.chm);;"
             "All Files (*)"))
-        self.qt4DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.qt4DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
         self.qt5DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.qt5DocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
-        self.pyqt4DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.pyqt4DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
         self.pyqt5DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.pyqt5DocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
-        self.pysideDocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.pysideDocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
         self.pyside2DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.pyside2DocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
         
-        pyside_py2, pyside_py3 = Utilities.checkPyside("1")
-        if pyside_py2 or pyside_py3:
-            self.pysideGroup.setEnabled(True)
-        else:
-            self.pysideGroup.setEnabled(False)
-        
-        pyside2_py2, pyside2_py3 = Utilities.checkPyside("2")
-        if pyside2_py2 or pyside2_py3:
-            self.pyside2Group.setEnabled(True)
-        else:
-            self.pyside2Group.setEnabled(False)
+        self.pyside2Group.setEnabled(Utilities.checkPyside())
         
         # set initial values
         self.ericDocDirPicker.setText(
             Preferences.getHelp("EricDocDir"), toNative=False)
-        self.python2DocDirPicker.setText(
-            Preferences.getHelp("Python2DocDir"), toNative=False)
         self.pythonDocDirPicker.setText(
             Preferences.getHelp("PythonDocDir"), toNative=False)
-        self.qt4DocDirPicker.setText(
-            Preferences.getHelp("Qt4DocDir"), toNative=False)
         self.qt5DocDirPicker.setText(
             Preferences.getHelp("Qt5DocDir"), toNative=False)
-        self.pyqt4DocDirPicker.setText(
-            Preferences.getHelp("PyQt4DocDir"), toNative=False)
         self.pyqt5DocDirPicker.setText(
             Preferences.getHelp("PyQt5DocDir"), toNative=False)
-        self.pysideDocDirPicker.setText(
-            Preferences.getHelp("PySideDocDir"), toNative=False)
         self.pyside2DocDirPicker.setText(
             Preferences.getHelp("PySide2DocDir"), toNative=False)
         
@@ -101,27 +69,15 @@
             "EricDocDir",
             self.ericDocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "Python2DocDir",
-            self.python2DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "PythonDocDir",
             self.pythonDocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "Qt4DocDir",
-            self.qt4DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "Qt5DocDir",
             self.qt5DocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "PyQt4DocDir",
-            self.pyqt4DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "PyQt5DocDir",
             self.pyqt5DocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "PySideDocDir",
-            self.pysideDocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "PySide2DocDir",
             self.pyside2DocDirPicker.text(toNative=False))
     
--- a/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.ui	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.ui	Sun Jun 21 18:26:12 2020 +0200
@@ -67,41 +67,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox_5">
-     <property name="title">
-      <string>Python 2 Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_2">
-      <item>
-       <widget class="E5PathPicker" name="python2DocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the Python 2 documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_3">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYTHON2DOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="groupBox_4">
      <property name="title">
       <string>Python 3 Documentation</string>
@@ -137,41 +102,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox_6">
-     <property name="title">
-      <string>Qt4 Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_4">
-      <item>
-       <widget class="E5PathPicker" name="qt4DocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the Qt4 documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_2_2_2">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the QT4DOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="groupBox_8">
      <property name="title">
       <string>Qt5 Documentation</string>
@@ -207,41 +137,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox_7">
-     <property name="title">
-      <string>PyQt4 Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_6">
-      <item>
-       <widget class="E5PathPicker" name="pyqt4DocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the PyQt4 documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_2_2_3">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYQT4DOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="pyqt5Group">
      <property name="title">
       <string>PyQt5 Documentation</string>
@@ -277,41 +172,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="pysideGroup">
-     <property name="title">
-      <string>PySide Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_8">
-      <item>
-       <widget class="E5PathPicker" name="pysideDocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the PySide documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_2_2">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYSIDEDOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="pyside2Group">
      <property name="title">
       <string>PySide2 Documentation</string>
@@ -371,13 +231,9 @@
  </customwidgets>
  <tabstops>
   <tabstop>ericDocDirPicker</tabstop>
-  <tabstop>python2DocDirPicker</tabstop>
   <tabstop>pythonDocDirPicker</tabstop>
-  <tabstop>qt4DocDirPicker</tabstop>
   <tabstop>qt5DocDirPicker</tabstop>
-  <tabstop>pyqt4DocDirPicker</tabstop>
   <tabstop>pyqt5DocDirPicker</tabstop>
-  <tabstop>pysideDocDirPicker</tabstop>
  </tabstops>
  <resources/>
  <connections/>
--- a/eric6/Preferences/ConfigurationPages/PythonPage.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/PythonPage.py	Sun Jun 21 18:26:12 2020 +0200
@@ -41,13 +41,9 @@
         self.ioEncodingComboBox.setCurrentIndex(index)
         
         # these are the same as in the debugger pages
-        self.py2ExtensionsEdit.setText(
-            Preferences.getDebugger("PythonExtensions"))
         self.py3ExtensionsEdit.setText(
             Preferences.getDebugger("Python3Extensions"))
         
-        self.py2EnvironmentEdit.setText(
-            Preferences.getDebugger("Python2VirtualEnv"))
         self.py3EnvironmentEdit.setText(
             Preferences.getDebugger("Python3VirtualEnv"))
     
@@ -66,9 +62,6 @@
         Preferences.setSystem("IOEncoding", enc)
         
         Preferences.setDebugger(
-            "PythonExtensions",
-            self.py2ExtensionsEdit.text())
-        Preferences.setDebugger(
             "Python3Extensions",
             self.py3ExtensionsEdit.text())
     
@@ -77,8 +70,6 @@
         """
         Private slot handling a click of the refresh button.
         """
-        self.py2EnvironmentEdit.setText(
-            Preferences.getDebugger("Python2VirtualEnv"))
         self.py3EnvironmentEdit.setText(
             Preferences.getDebugger("Python3VirtualEnv"))
     
--- a/eric6/Preferences/ConfigurationPages/PythonPage.ui	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/PythonPage.ui	Sun Jun 21 18:26:12 2020 +0200
@@ -89,7 +89,7 @@
       <item row="0" column="0" colspan="2">
        <widget class="QLabel" name="label_3">
         <property name="text">
-         <string>Enter the file extensions to be associated with the Python versions separated by a space. They must not overlap with each other.</string>
+         <string>Enter the file extensions to be associated with Python separated by a space.</string>
         </property>
         <property name="wordWrap">
          <bool>true</bool>
@@ -97,23 +97,13 @@
        </widget>
       </item>
       <item row="1" column="0">
-       <widget class="QLabel" name="label_4">
-        <property name="text">
-         <string>Python 2:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="py2ExtensionsEdit"/>
-      </item>
-      <item row="2" column="0">
        <widget class="QLabel" name="label_5">
         <property name="text">
          <string>Python 3:</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="1" column="1">
        <widget class="QLineEdit" name="py3ExtensionsEdit"/>
       </item>
      </layout>
@@ -142,27 +132,13 @@
         </property>
         <layout class="QGridLayout" name="gridLayout_3">
          <item row="0" column="0">
-          <widget class="QLabel" name="label_7">
-           <property name="text">
-            <string>Python 2:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="1">
-          <widget class="QLineEdit" name="py2EnvironmentEdit">
-           <property name="readOnly">
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0">
           <widget class="QLabel" name="label_9">
            <property name="text">
             <string>Python 3:</string>
            </property>
           </widget>
          </item>
-         <item row="1" column="1">
+         <item row="0" column="1">
           <widget class="QLineEdit" name="py3EnvironmentEdit">
            <property name="readOnly">
             <bool>true</bool>
@@ -233,9 +209,7 @@
  <tabstops>
   <tabstop>stringEncodingComboBox</tabstop>
   <tabstop>ioEncodingComboBox</tabstop>
-  <tabstop>py2ExtensionsEdit</tabstop>
   <tabstop>py3ExtensionsEdit</tabstop>
-  <tabstop>py2EnvironmentEdit</tabstop>
   <tabstop>py3EnvironmentEdit</tabstop>
   <tabstop>refreshButton</tabstop>
  </tabstops>
--- a/eric6/Preferences/ConfigurationPages/QtPage.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/QtPage.py	Sun Jun 21 18:26:12 2020 +0200
@@ -58,7 +58,7 @@
         self.pyside2uicImportsCheckBox.setChecked(
             Preferences.getQt("PySide2FromImports"))
         
-        self.pyside2Group.setEnabled(any(Utilities.checkPyside()))
+        self.pyside2Group.setEnabled(Utilities.checkPyside())
         
     def save(self):
         """
--- a/eric6/Preferences/ProgramsDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/ProgramsDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -141,88 +141,42 @@
             self.tr("Qt Assistant"), exe, version=version)
         
         # 2. do the PyQt programs
-        # 2.1 do the PyQt4 programs
-        # deprecated
-        # 2.1a. Translation Extractor PyQt4
-        self.__createProgramEntry(
-            self.tr("Translation Extractor (Python, PyQt4)"),
-            Utilities.generatePyQtToolPath("pylupdate4"),
-            '-version', 'pylupdate', -1)
-        # 2.1b. Forms Compiler PyQt4
-        self.__createProgramEntry(
-            self.tr("Forms Compiler (Python, PyQt4)"),
-            Utilities.generatePyQtToolPath("pyuic4", ["py3uic4"]),
-            '--version', 'Python User', 4)
-        # 2.1c. Resource Compiler PyQt4
-        self.__createProgramEntry(
-            self.tr("Resource Compiler (Python, PyQt4)"),
-            Utilities.generatePyQtToolPath("pyrcc4"),
-            '-version', 'Resource Compiler', -1)
-        
-        # 2.2 do the PyQt5 programs
-        # 2.2a. Translation Extractor PyQt5
+        # 2.1 do the PyQt5 programs
+        # 2.1a. Translation Extractor PyQt5
         self.__createProgramEntry(
             self.tr("Translation Extractor (Python, PyQt5)"),
             Utilities.generatePyQtToolPath("pylupdate5"),
             '-version', 'pylupdate', -1)
-        # 2.2b. Forms Compiler PyQt5
+        # 2.1b. Forms Compiler PyQt5
         self.__createProgramEntry(
             self.tr("Forms Compiler (Python, PyQt5)"),
             Utilities.generatePyQtToolPath("pyuic5", ["py3uic5"]),
             '--version', 'Python User', 4)
-        # 2.2c. Resource Compiler PyQt5
+        # 2.1c. Resource Compiler PyQt5
         self.__createProgramEntry(
             self.tr("Resource Compiler (Python, PyQt5)"),
             Utilities.generatePyQtToolPath("pyrcc5"),
             '-version', '', -1, versionRe='Resource Compiler|pyrcc5')
         
-        # 3.1 do the PySide programs
-        # 3.1a. Translation Extractor PySide
-        self.__createProgramEntry(
-            self.tr("Translation Extractor (Python, PySide)"),
-            Utilities.generatePySideToolPath("pyside-lupdate", "1"),
-            '-version', '', -1, versionRe='lupdate')
-        # 3.1b. Forms Compiler PySide
-        self.__createProgramEntry(
-            self.tr("Forms Compiler (Python, PySide)"),
-            Utilities.generatePySideToolPath("pyside-uic", "1"),
-            '--version', 'PySide User', 5, versionCleanup=(0, -1))
-        # 3.1c Resource Compiler PySide
-        self.__createProgramEntry(
-            self.tr("Resource Compiler (Python, PySide)"),
-            Utilities.generatePySideToolPath("pyside-rcc", "1"),
-            '-version', 'Resource Compiler', -1)
-        
-        # 3.2 do the PySide2 programs
-        # 3.2a. Translation Extractor PySide2
+        # 3. do the PySide programs
+        # 3.1 do the PySide2 programs
+        # 3.1a. Translation Extractor PySide2
         self.__createProgramEntry(
             self.tr("Translation Extractor (Python, PySide2)"),
-            Utilities.generatePySideToolPath("pyside2-lupdate", "2"),
+            Utilities.generatePySideToolPath("pyside2-lupdate"),
             '-version', '', -1, versionRe='lupdate')
-        # 3.2b. Forms Compiler PySide2
+        # 3.1b. Forms Compiler PySide2
         self.__createProgramEntry(
             self.tr("Forms Compiler (Python, PySide2)"),
-            Utilities.generatePySideToolPath("pyside2-uic", "2"),
+            Utilities.generatePySideToolPath("pyside2-uic"),
             '--version', '', -1, versionRe='uic')
-        # 3.2c Resource Compiler PySide2
+        # 3.1c Resource Compiler PySide2
         self.__createProgramEntry(
             self.tr("Resource Compiler (Python, PySide2)"),
-            Utilities.generatePySideToolPath("pyside2-rcc", "2"),
+            Utilities.generatePySideToolPath("pyside2-rcc"),
             '-version', '', -1, versionRe='rcc')
         
-        # 4. do the Ruby programs
-        # 4a. Forms Compiler for Qt4
-        self.__createProgramEntry(
-            self.tr("Forms Compiler (Ruby, Qt4)"),
-            Utilities.isWindowsPlatform() and "rbuic4.exe" or "rbuic4",
-            '-version', 'Qt', -1)
-        # 4b. Resource Compiler for Qt4
-        self.__createProgramEntry(
-            self.tr("Resource Compiler (Ruby, Qt4)"),
-            Utilities.isWindowsPlatform() and "rbrcc.exe" or "rbrcc",
-            '-version', 'Ruby Resource Compiler', -1)
-        
-        # 5. do the Conda program(s)
+        # 4. do the Conda program(s)
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
@@ -231,7 +185,7 @@
         self.__createProgramEntry(
             self.tr("conda Manager"), exe, '--version', 'conda', -1)
         
-        # 6. do the pip program(s)
+        # 5. do the pip program(s)
         virtualenvManager = e5App().getObject("VirtualEnvManager")
         for venvName in virtualenvManager.getVirtualenvNames():
             interpreter = virtualenvManager.getVirtualenvInterpreter(venvName)
@@ -239,8 +193,8 @@
                 self.tr("PyPI Package Management"), interpreter, '--version',
                 'pip', 1, exeModule=["-m", "pip"])
         
-        # 7. do the CORBA and Protobuf programs
-        # 7a. omniORB
+        # 6. do the CORBA and Protobuf programs
+        # 6a. omniORB
         exe = Preferences.getCorba("omniidl")
         if not exe:
             exe = "omniidl"
@@ -248,7 +202,7 @@
                 exe += ".exe"
         self.__createProgramEntry(
             self.tr("CORBA IDL Compiler"), exe, '-V', 'omniidl', -1)
-        # 7b. protobuf
+        # 6b. protobuf
         exe = Preferences.getProtobuf("protoc")
         if not exe:
             exe = "protoc"
@@ -256,7 +210,7 @@
                 exe += ".exe"
         self.__createProgramEntry(
             self.tr("Protobuf Compiler"), exe, '--version', 'libprotoc', -1)
-        # 7c. grpc
+        # 6c. grpc
         exe = Preferences.getProtobuf("grpcPython")
         if not exe:
             exe = sys.executable
@@ -264,7 +218,7 @@
             self.tr("gRPC Compiler"), exe, '--version', 'libprotoc', -1,
             exeModule=['-m', 'grpc_tools.protoc'])
         
-        # 8. do the spell checking entry
+        # 7. do the spell checking entry
         try:
             import enchant
             try:
@@ -281,7 +235,7 @@
         self.__createEntry(
             self.tr("Spell Checker - PyEnchant"), text, version)
         
-        # 9. do the pygments entry
+        # 8. do the pygments entry
         try:
             import pygments
             try:
@@ -298,7 +252,7 @@
         self.__createEntry(
             self.tr("Source Highlighter - Pygments"), text, version)
         
-        # 10. do the MicroPython related entries
+        # 9. do the MicroPython related entries
         exe = Preferences.getMicroPython("MpyCrossCompiler")
         if not exe:
             exe = "mpy-cross"
--- a/eric6/Preferences/__init__.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Preferences/__init__.py	Sun Jun 21 18:26:12 2020 +0200
@@ -82,12 +82,8 @@
         "SuppressClientExit": False,
         "BreakAlways": False,
         "ShowExceptionInShell": True,
-        "Python2VirtualEnv": "",
         "Python3VirtualEnv": "",
         "RubyInterpreter": "",
-        "DebugClientType": "standard",
-        # supported "standard", "custom"
-        "DebugClient": "",
         "DebugClientType3": "standard",
         # supported "standard", "custom"
         "DebugClient3": "",
@@ -109,8 +105,6 @@
         "BgColorNew": QColor("#28FFEEAA"),
         "BgColorChanged": QColor("#2870FF66"),
         "AllowedHosts": ["127.0.0.1", "::1%0"],
-        # space separated list of Python2 extensions
-        "PythonExtensions": ".py2 .pyw2 .ptl",
         # space separated list of Python3 extensions
         "Python3Extensions": ".py .pyw .py3 .pyw3"
     }
@@ -806,23 +800,6 @@
     
     # defaults for the project browser flags settings
     projectBrowserFlagsDefaults = {
-        # deprecated
-        "Qt4": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
-        # deprecated
-        "Qt4C": (
-            SourcesBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
         "PyQt5": (
             SourcesBrowserFlag |
             FormsBrowserFlag |
@@ -856,21 +833,6 @@
             InterfacesBrowserFlag |
             OthersBrowserFlag |
             ProtocolsBrowserFlag),
-        "PySide": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
-        "PySideC": (
-            SourcesBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
         "PySide2": (
             SourcesBrowserFlag |
             FormsBrowserFlag |
@@ -904,12 +866,8 @@
     helpDefaults = {
         "CustomViewer": "",
         "PythonDocDir": "",
-        "Python2DocDir": "",
-        "Qt4DocDir": "",
         "Qt5DocDir": "",
-        "PyQt4DocDir": "",
         "PyQt5DocDir": "",
-        "PySideDocDir": "",
         "PySide2DocDir": "",
         "EricDocDir": "",
     }
@@ -1761,10 +1719,8 @@
                 "Debugger/" + key, prefClass.debuggerDefaults[key]))
     elif key in ["PythonInterpreter", "Python3Interpreter"]:
         # This code is here to ensure backward compatibility.
-        if key == "PythonInterpreter":
-            newKey = "Python2VirtualEnv"
-        else:
-            newKey = "Python3VirtualEnv"
+        # Keep "PythonInterpreter" for backward compatibility.
+        newKey = "Python3VirtualEnv"
         venvName = prefClass.settings.value(
             "Debugger/" + newKey, prefClass.debuggerDefaults[newKey])
         if venvName:
@@ -1778,11 +1734,9 @@
         else:
             interpreter = ""
         if not interpreter:
-            pyVersion = 2 if key == "PythonInterpreter" else 3
-            if sys.version_info[0] == pyVersion:
-                return sys.executable
+            return sys.executable
         return interpreter
-    elif key in ["DebugClientType", "DebugClientType3"]:
+    elif key == "DebugClientType3":
         debugClientType = prefClass.settings.value(
             "Debugger/" + key, prefClass.debuggerDefaults[key])
         # Correct obsolete entry "threaded"
@@ -1790,6 +1744,12 @@
             return "standard"
         else:
             return debugClientType
+    elif key == "PythonExtensions":
+        # we don't support Python2 anymore
+        return ""
+    elif key == "Python2VirtualEnv":
+        # we don't support Python2 anymore
+        return ""
     else:
         return prefClass.settings.value(
             "Debugger/" + key, prefClass.debuggerDefaults[key])
@@ -1814,7 +1774,11 @@
     @param prefClass preferences class used as the storage area
     @return the requested debugger setting
     """
-    if key in ["PythonExtensions", "Python3Extensions"]:
+    if key == "PythonExtensions":
+        # we don't support Python2 anymore
+        return []
+    
+    if key == "Python3Extensions":
         exts = []
         for ext in getDebugger(key, prefClass).split():
             if ext.startswith("."):
@@ -1834,7 +1798,7 @@
     @param value the value to be set
     @param prefClass preferences class used as the storage area
     """
-    if key in ["PythonExtensions", "Python3Extensions"]:
+    if key == "Python3Extensions":
         setDebugger(key, value, prefClass)
 
 
@@ -2631,7 +2595,7 @@
     else:
         return prefClass.settings.value(
             "MultiProject/" + key, prefClass.multiProjectDefaults[key])
-    
+
 
 def setMultiProject(key, value, prefClass=Prefs):
     """
@@ -2642,24 +2606,7 @@
     @param prefClass preferences class used as the storage area
     """
     prefClass.settings.setValue("MultiProject/" + key, value)
-    
 
-def getQt4DocDir(prefClass=Prefs):
-    """
-    Module function to retrieve the Qt4DocDir setting.
-    
-    @param prefClass preferences class used as the storage area
-    @return the requested Qt4DocDir setting (string)
-    """
-    s = prefClass.settings.value(
-        "Help/Qt4DocDir", prefClass.helpDefaults["Qt4DocDir"])
-    if s == "":
-        s = os.getenv("QT4DOCDIR", "")
-    if s == "":
-        s = os.path.join(
-            QLibraryInfo.location(QLibraryInfo.DocumentationPath), "html")
-    return s
-    
 
 def getQt5DocDir(prefClass=Prefs):
     """
--- a/eric6/Project/CreateDialogCodeDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/CreateDialogCodeDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -288,22 +288,18 @@
         # I. always check for *
         mapped = mapped.replace("*", "")
         
-        if (
-            self.project.getProjectLanguage() != "Python2" or
-            self.project.getProjectType in ("PySide", "PySide2")
-        ):
-            # 1. check for const
-            mapped = mapped.replace("const ", "")
-            
-            # 2. replace QString and QStringList
-            mapped = (
-                mapped
-                .replace("QStringList", "list")
-                .replace("QString", "str")
-            )
-            
-            # 3. replace double by float
-            mapped = mapped.replace("double", "float")
+        # 1. check for const
+        mapped = mapped.replace("const ", "")
+        
+        # 2. replace QString and QStringList
+        mapped = (
+            mapped
+            .replace("QStringList", "list")
+            .replace("QString", "str")
+        )
+        
+        # 3. replace double by float
+        mapped = mapped.replace("double", "float")
         
         return mapped
     
@@ -377,7 +373,7 @@
         elif self.filenameEdit.text().endswith(".rb"):
             pass
         # second decide on project language
-        elif self.project.getProjectLanguage() in ["Python2", "Python3"]:
+        elif self.project.getProjectLanguage() == "Python3":
             self.__generatePythonCode()
         elif self.project.getProjectLanguage() == "Ruby":
             pass
@@ -389,6 +385,16 @@
         """
         Private slot to generate Python code as requested by the user.
         """
+        if self.project.getProjectLanguage() != "Python3":
+            E5MessageBox.critical(
+                self,
+                self.tr("Code Generation"),
+                self.tr(
+                    """<p>Code generation for project language"""
+                    """ "{0}" is not supported.</p>""")
+                .format(self.project.getProjectLanguage()))
+            return
+        
         # init some variables
         sourceImpl = []
         appendAtIndex = -1
@@ -398,41 +404,24 @@
         if self.__module is None:
             # new file
             try:
-                if self.project.getProjectLanguage() == "Python2":
-                    if self.project.getProjectType() == "PySide":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside.py2.tmpl")
-                    elif self.project.getProjectType() == "PySide2":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside2.py2.tmpl")
-                    elif self.project.getProjectType() == "PyQt5":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt5.py2.tmpl")
-                    else:
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt.py2.tmpl")
+                if self.project.getProjectType() == "PySide2":
+                    tmplName = os.path.join(
+                        getConfig('ericCodeTemplatesDir'),
+                        "impl_pyside2.py.tmpl")
+                elif self.project.getProjectType() in [
+                        "PyQt5", "E6Plugin"]:
+                    tmplName = os.path.join(
+                        getConfig('ericCodeTemplatesDir'),
+                        "impl_pyqt5.py.tmpl")
                 else:
-                    if self.project.getProjectType() == "PySide":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside.py.tmpl")
-                    elif self.project.getProjectType() == "PySide2":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside2.py.tmpl")
-                    elif self.project.getProjectType() in [
-                            "PyQt5", "E6Plugin"]:
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt5.py.tmpl")
-                    else:
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt.py.tmpl")
+                    E5MessageBox.critical(
+                        self,
+                        self.tr("Code Generation"),
+                        self.tr(
+                            """<p>No code template file available for"""
+                            """ project type "{0}".</p>""")
+                        .format(self.project.getProjectType()))
+                    return
                 tmplFile = open(tmplName, 'r', encoding="utf-8")
                 template = tmplFile.read()
                 tmplFile.close()
@@ -503,18 +492,10 @@
                     break
         
         # do the coding stuff
-        if self.project.getProjectLanguage() == "Python2":
-            if self.project.getProjectType() in ("PySide", "PySide2"):
-                pyqtSignatureFormat = '@Slot({0})'
-            elif self.project.getProjectType() == "PyQt5":
-                pyqtSignatureFormat = '@pyqtSlot({0})'
-            else:
-                pyqtSignatureFormat = '@pyqtSignature("{0}")'
+        if self.project.getProjectType() in ("PySide2",):
+            pyqtSignatureFormat = '@Slot({0})'
         else:
-            if self.project.getProjectType() in ("PySide", "PySide2"):
-                pyqtSignatureFormat = '@Slot({0})'
-            else:
-                pyqtSignatureFormat = '@pyqtSlot({0})'
+            pyqtSignatureFormat = '@pyqtSlot({0})'
         for row in range(self.slotsModel.rowCount()):
             topItem = self.slotsModel.item(row)
             for childRow in range(topItem.rowCount()):
--- a/eric6/Project/DebuggerPropertiesDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/DebuggerPropertiesDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -68,9 +68,7 @@
             venvIndex = max(0, self.venvComboBox.findText(
                 self.project.debugProperties["VIRTUALENV"]))
         else:
-            if self.project.pdata["PROGLANGUAGE"] == "Python2":
-                venvName = Preferences.getDebugger("Python2VirtualEnv")
-            elif self.project.pdata["PROGLANGUAGE"] == "Python3":
+            if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
             else:
                 venvName = ""
@@ -86,8 +84,7 @@
                 self.project.debugProperties["DEBUGCLIENT"],
                 toNative=False)
         else:
-            if self.project.pdata["PROGLANGUAGE"] in ["Python", "Python2",
-                                                      "Python3"]:
+            if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 debugClient = os.path.join(
                     getConfig('ericDir'),
                     "DebugClients", "Python", "DebugClient.py")
@@ -145,8 +142,7 @@
             self.debugClientPicker.text(toNative=False)
         )
         if not self.project.debugProperties["DEBUGCLIENT"]:
-            if self.project.pdata["PROGLANGUAGE"] in ["Python", "Python2",
-                                                      "Python3"]:
+            if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 debugClient = os.path.join(
                     getConfig('ericDir'),
                     "DebugClients", "Python", "DebugClient.py")
--- a/eric6/Project/Project.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/Project.py	Sun Jun 21 18:26:12 2020 +0200
@@ -164,7 +164,6 @@
         self.ui = parent
         
         self.__progLanguages = [
-            "Python2",
             "Python3",
             "MicroPython",
             "Ruby",
@@ -172,9 +171,6 @@
         ]
         
         self.__dbgFilters = {
-            "Python2": self.tr(
-                "Python2 Files (*.py2);;"
-                "Python2 GUI Files (*.pyw2);;"),
             "Python3": self.tr(
                 "Python3 Files (*.py *.py3);;"
                 "Python3 GUI Files (*.pyw *.pyw3);;"),
@@ -212,14 +208,7 @@
         @param language programming language (string)
         @return source extensions (list of string)
         """
-        if language == "Python2":
-            extensions = Preferences.getPython("PythonExtensions")
-            # *.py and *.pyw should always be associated with source files
-            for ext in [".py", ".pyw"]:
-                if ext not in extensions:
-                    extensions.append(ext)
-            return extensions
-        elif language == "Python3":
+        if language == "Python3":
             extensions = Preferences.getPython("Python3Extensions")
             # *.py and *.pyw should always be associated with source files
             for ext in [".py", ".pyw"]:
@@ -275,8 +264,6 @@
         self.__binaryTranslationsCallbacks = {}
         
         self.__projectTypes = {
-            "Qt4": self.tr("PyQt4 GUI (deprecated)"),
-            "Qt4C": self.tr("PyQt4 Console (deprecated)"),
             "PyQt5": self.tr("PyQt5 GUI"),
             "PyQt5C": self.tr("PyQt5 Console"),
             "E6Plugin": self.tr("Eric6 Plugin"),
@@ -285,36 +272,17 @@
         }
         
         self.__projectProgLanguages = {
-            "Python2": ["Qt4", "Qt4C", "PyQt5", "PyQt5C",
-                        "E6Plugin", "Console", "Other"],
-            "Python3": ["Qt4", "Qt4C", "PyQt5", "PyQt5C",
-                        "E6Plugin", "Console", "Other"],
+            "Python3": ["PyQt5", "PyQt5C", "E6Plugin", "Console", "Other"],
             "MicroPython": ["Console", "Other"],
-            "Ruby": ["Qt4", "Qt4C", "Console", "Other"],
+            "Ruby": ["Console", "Other"],
             "JavaScript": ["Other"],
         }
         
-        pyside_py2, pyside_py3 = Utilities.checkPyside("1")
-        if pyside_py2 or pyside_py3:
-            self.__projectTypes["PySide"] = self.tr("PySide GUI")
-            self.__projectTypes["PySideC"] = self.tr("PySide Console")
-            if pyside_py2:
-                self.__projectProgLanguages["Python2"].extend(
-                    ["PySide", "PySideC"])
-            if pyside_py3:
-                self.__projectProgLanguages["Python3"].extend(
-                    ["PySide", "PySideC"])
-        
-        pyside2_py2, pyside2_py3 = Utilities.checkPyside("2")
-        if pyside2_py2 or pyside2_py3:
+        if Utilities.checkPyside():
             self.__projectTypes["PySide2"] = self.tr("PySide2 GUI")
             self.__projectTypes["PySide2C"] = self.tr("PySide2 Console")
-            if pyside2_py2:
-                self.__projectProgLanguages["Python2"].extend(
-                    ["PySide2", "PySide2C"])
-            if pyside2_py3:
-                self.__projectProgLanguages["Python3"].extend(
-                    ["PySide2", "PySide2C"])
+            self.__projectProgLanguages["Python3"].extend(
+                ["PySide2", "PySide2C"])
         
     def getProjectTypes(self, progLanguage=""):
         """
@@ -369,14 +337,18 @@
         """
         if progLanguages:
             for progLanguage in progLanguages:
+                if progLanguage in ["Python", "Python2"]:
+                    # ignore that silently for Python2
+                    return
+                
                 if progLanguage not in self.__projectProgLanguages:
                     E5MessageBox.critical(
                         self.ui,
                         self.tr("Registering Project Type"),
                         self.tr(
                             """<p>The Programming Language <b>{0}</b> is not"""
-                            """ supported.</p>""")
-                        .format(progLanguage)
+                            """ supported (project type: {1}).</p>""")
+                        .format(progLanguage, type_)
                     )
                     return
                 
@@ -616,24 +588,20 @@
         self.pdata["FILETYPES"]["*.proto"] = "PROTOCOLS"
         
         # Forms
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "PyQt5",
-                                         "E6Plugin", "PySide",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
+                                         "PyQt5",
                                          "PySide2"]:
             self.pdata["FILETYPES"]["*.ui"] = "FORMS"
         
         # Resources
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "Qt4C",
-                                         "E6Plugin",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
                                          "PyQt5", "PyQt5C",
-                                         "PySide", "PySideC",
                                          "PySide2", "PySide2C"]:
             self.pdata["FILETYPES"]["*.qrc"] = "RESOURCES"
         
         # Translations
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "Qt4C",
-                                         "E6Plugin",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
                                          "PyQt5", "PyQt5C",
-                                         "PySide", "PySideC",
                                          "PySide2", "PySide2C"]:
             self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
             self.pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
@@ -654,10 +622,8 @@
         Public method to update the filetype associations with new default
         values.
         """
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "Qt4C",
-                                         "E6Plugin",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
                                          "PyQt5", "PyQt5C",
-                                         "PySide", "PySideC",
                                          "PySide2", "PySide2C"]:
             if "*.ts" not in self.pdata["FILETYPES"]:
                 self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
@@ -1414,8 +1380,7 @@
         if dlg.exec_() == QDialog.Accepted:
             lang = dlg.getSelectedLanguage()
             if self.pdata["PROJECTTYPE"] in [
-                "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-                "PySide", "PySideC", "PySide2", "PySide2C"
+                "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
             ]:
                 langFile = self.pdata["TRANSLATIONPATTERN"].replace(
                     "%language%", lang)
@@ -2385,7 +2350,7 @@
                 # create an empty __init__.py file to make it a Python package
                 # (only for Python and Python3)
                 if self.pdata["PROGLANGUAGE"] in [
-                    "Python", "Python2", "Python3", "MicroPython"
+                    "Python3", "MicroPython"
                 ]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     f = open(fn, "w", encoding="utf-8")
@@ -2499,7 +2464,7 @@
                 # create an empty __init__.py file to make it a Python package
                 # if none exists (only for Python and Python3)
                 if self.pdata["PROGLANGUAGE"] in [
-                    "Python", "Python2", "Python3", "MicroPython"
+                    "Python3", "MicroPython"
                 ]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     if not os.path.exists(fn):
@@ -2731,7 +2696,7 @@
                         self.projectLanguageAdded.emit(qm)
             if not self.pdata["MAINSCRIPT"] and bool(mainscriptname):
                 if self.pdata["PROGLANGUAGE"] in [
-                    "Python", "Python2", "Python3", "MicroPython"
+                    "Python3", "MicroPython"
                 ]:
                     self.pdata["MAINSCRIPT"] = '{0}.py'.format(mainscriptname)
                 elif self.pdata["PROGLANGUAGE"] == "Ruby":
@@ -3444,13 +3409,12 @@
         
     def isPythonProject(self):
         """
-        Public method to check, if this project is a Python2 or Python3
+        Public method to check, if this project is a Python3 or MicroPython
         project.
         
         @return flag indicating a Python project (boolean)
         """
-        return self.pdata["PROGLANGUAGE"] in ["Python", "Python2",
-                                              "Python3", "MicroPython"]
+        return self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]
         
     def isPy3Project(self):
         """
@@ -3459,15 +3423,7 @@
         @return flag indicating a Python3 project (boolean)
         """
         return self.pdata["PROGLANGUAGE"] == "Python3"
-        
-    def isPy2Project(self):
-        """
-        Public method to check, if this project is a Python2 project.
-        
-        @return flag indicating a Python2 project (boolean)
-        """
-        return self.pdata["PROGLANGUAGE"] in ["Python", "Python2"]
-        
+    
     def isMicroPythonProject(self):
         """
         Public method to check, if this project is a MicroPython project.
@@ -3529,7 +3485,7 @@
         if lang == "":
             lang = "Python3"
         elif lang == "Python":
-            lang = "Python2"
+            lang = "Python3"
         return self.__sourceExtensions(lang)[0]
         
     def getProjectPath(self):
@@ -5116,7 +5072,7 @@
                 os.path.isfile("{0}.profile".format(basename)) or
                 os.path.isfile("{0}.profile".format(tbasename)))
             self.codeCoverageAct.setEnabled(
-                (self.isPy3Project() or self.isPy2Project()) and
+                self.isPy3Project() and
                 (os.path.isfile("{0}.coverage".format(basename)) or
                  os.path.isfile("{0}.coverage".format(tbasename))))
         else:
--- a/eric6/Project/ProjectBrowser.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/ProjectBrowser.py	Sun Jun 21 18:26:12 2020 +0200
@@ -283,9 +283,7 @@
         if not self.project.isOpen():
             icon = UI.PixmapCache.getIcon("projectSources")
         else:
-            if self.project.getProjectLanguage() in [
-                "Python", "Python2", "Python3"
-            ]:
+            if self.project.getProjectLanguage() == "Python3":
                 if self.project.isMixedLanguageProject():
                     icon = UI.PixmapCache.getIcon("projectSourcesPyMixed")
                 else:
--- a/eric6/Project/ProjectFormsBrowser.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/ProjectFormsBrowser.py	Sun Jun 21 18:26:12 2020 +0200
@@ -74,7 +74,7 @@
             """ context menu.</p>"""
         ))
         
-        # templates for Qt4
+        # templates for Qt
         # these two lists have to stay in sync
         self.templates4 = [
             'dialog4.tmpl', 'widget4.tmpl', 'mainwindow4.tmpl',
@@ -125,9 +125,7 @@
         self.menusAboutToBeCreated.emit()
         
         self.menu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.menu.addAction(
                 self.tr('Compile form'), self.__compileForm)
             self.menu.addAction(
@@ -187,9 +185,7 @@
         act = self.menu.addAction(self.tr('Delete'), self.__deleteFile)
         self.menuActions.append(act)
         self.menu.addSeparator()
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.menu.addAction(self.tr('New form...'), self.__newForm)
         else:
             if self.hooks["newForm"] is not None:
@@ -213,7 +209,7 @@
         self.backMenu = QMenu(self)
         if (
             self.project.getProjectType() in [
-                "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
+                "PyQt5", "E6Plugin", "PySide2"
             ] or
             self.hooks["compileAllForms"] is not None
         ):
@@ -245,9 +241,7 @@
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.multiMenu.addAction(
                 self.tr('Compile forms'), self.__compileSelectedForms)
             self.multiMenu.addSeparator()
@@ -292,9 +286,7 @@
         self.multiMenu.addAction(self.tr('Configure...'), self._configure)
 
         self.dirMenu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.dirMenu.addAction(
                 self.tr('Compile all forms'), self.__compileAllForms)
             self.dirMenu.addSeparator()
@@ -317,9 +309,7 @@
             self.tr('Delete'), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.dirMenu.addAction(self.tr('New form...'), self.__newForm)
         else:
             if self.hooks["newForm"] is not None:
@@ -343,9 +333,7 @@
         self.dirMenu.addAction(self.tr('Configure...'), self._configure)
         
         self.dirMultiMenu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.dirMultiMenu.addAction(
                 self.tr('Compile all forms'), self.__compileAllForms)
             self.dirMultiMenu.addSeparator()
@@ -390,7 +378,7 @@
         if not self.project.isOpen():
             return
         
-        enable = self.project.getProjectType() in ("Qt4", "PyQt5", "E6Plugin")
+        enable = self.project.getProjectType() in ("PyQt5", "E6Plugin")
         self.__pyuicConfigAct.setEnabled(enable)
         self.__pyuicMultiConfigAct.setEnabled(enable)
         self.__pyuicDirConfigAct.setEnabled(enable)
@@ -578,7 +566,7 @@
             self.hooks["newForm"](path)
         else:
             if self.project.getProjectType() in [
-                "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
+                "PyQt5", "E6Plugin", "PySide2"
             ]:
                 self.__newUiForm(path)
         
@@ -690,30 +678,16 @@
         """
         self.__resetUiCompiler()
         
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
-            if self.project.getProjectType() in ["Qt4", ]:
-                self.__uicompiler = Utilities.generatePyQtToolPath(
-                    'pyuic4', ["py3uic4"])
-            elif self.project.getProjectType() in ["PyQt5"]:
+        if self.project.getProjectLanguage() == "Python3":
+            if self.project.getProjectType() in ["PyQt5"]:
                 self.__uicompiler = Utilities.generatePyQtToolPath(
                     'pyuic5', ["py3uic5"])
             elif self.project.getProjectType() in ["E6Plugin"]:
                 self.__uicompiler = Utilities.generatePyQtToolPath(
                     'pyuic5', ["py3uic5"])
-            elif self.project.getProjectType() == "PySide":
-                self.__uicompiler = Utilities.generatePySideToolPath(
-                    'pyside-uic', "1")
             elif self.project.getProjectType() == "PySide2":
                 self.__uicompiler = Utilities.generatePySideToolPath(
-                    'pyside2-uic', "2")
-        elif self.project.getProjectLanguage() == "Ruby":
-            if self.project.getProjectType() == "Qt4":
-                self.__uicompiler = 'rbuic4'
-                if Utilities.isWindowsPlatform():
-                    self.__uicompiler = Utilities.getWindowsExecutablePath(
-                        self.__uicompiler)
+                    'pyside2-uic')
     
     def getUiCompiler(self):
         """
@@ -730,7 +704,7 @@
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
         """
         if self.compileProc is None:
             return
@@ -743,7 +717,7 @@
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
         """
         if self.compileProc is None:
             return
@@ -842,18 +816,16 @@
         ofn, ext = os.path.splitext(fn)
         fn = os.path.join(self.project.ppath, fn)
         
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
+        if self.project.getProjectLanguage() == "Python3":
             dirname, filename = os.path.split(ofn)
             self.compiledFile = os.path.join(dirname, "Ui_" + filename + ".py")
             
-            if self.project.getProjectType() in ["PySide", "PySide2"]:
-                # PySide and PySide2
+            if self.project.getProjectType() == "PySide2":
+                # PySide2
                 if Preferences.getQt("PySide2FromImports"):
                     args.append("--from-imports")
             else:
-                # PyQt4 and PyQt5
+                # PyQt5
                 if Preferences.getQt("PyuicExecute"):
                     args.append("-x")
                 indentWidth = Preferences.getQt("PyuicIndent")
@@ -902,7 +874,7 @@
         
     def __generateDialogCode(self):
         """
-        Private method to generate dialog code for the form (Qt4 only).
+        Private method to generate dialog code for the form (Qt only).
         """
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
@@ -1017,7 +989,7 @@
             self.hooks["compileChangedForms"](self.project.pdata["FORMS"])
         else:
             if self.project.getProjectType() not in [
-                "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
+                "PyQt5", "E6Plugin", "PySide2"
             ]:
                 # ignore the request for non Qt GUI projects
                 return
@@ -1037,9 +1009,7 @@
                 QApplication.processEvents()
                 
                 ifn = os.path.join(self.project.ppath, fn)
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2", "Python3"
-                ]:
+                if self.project.getProjectLanguage() == "Python3":
                     dirname, filename = os.path.split(os.path.splitext(ifn)[0])
                     ofn = os.path.join(dirname, "Ui_" + filename + ".py")
                 elif self.project.getProjectLanguage() == "Ruby":
@@ -1093,7 +1063,7 @@
         
         params = self.project.pdata["UICPARAMS"]
         
-        if self.project.getProjectType() in ["Qt4", "PyQt5", "E6Plugin"]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin"]:
             dlg = UicCompilerOptionsDialog(params, self.getUiCompiler())
             if dlg.exec_() == QDialog.Accepted:
                 package, suffix, root = dlg.getData()
--- a/eric6/Project/ProjectResourcesBrowser.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/ProjectResourcesBrowser.py	Sun Jun 21 18:26:12 2020 +0200
@@ -79,8 +79,7 @@
         
         self.menu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.menu.addAction(
                 self.tr('Compile resource'),
@@ -122,8 +121,7 @@
         self.menuActions.append(act)
         self.menu.addSeparator()
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.menu.addAction(
                 self.tr('New resource...'), self.__newResource)
@@ -151,8 +149,7 @@
 
         self.backMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.backMenu.addAction(
                 self.tr('Compile all resources'),
@@ -194,8 +191,7 @@
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             act = self.multiMenu.addAction(
                 self.tr('Compile resources'),
@@ -231,8 +227,7 @@
 
         self.dirMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.dirMenu.addAction(
                 self.tr('Compile all resources'),
@@ -277,8 +272,7 @@
         
         self.dirMultiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.dirMultiMenu.addAction(
                 self.tr('Compile all resources'),
@@ -556,7 +550,7 @@
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc process.
         """
         if self.compileProc is None:
             return
@@ -570,7 +564,7 @@
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc/ process.
         """
         if self.compileProc is None:
             return
@@ -656,33 +650,14 @@
         args = []
         self.buf = ""
         
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
-            if self.project.getProjectType() in ["Qt4", "Qt4C"]:
-                self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc4')
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2"
-                ]:
-                    args.append("-py2")
-                else:
-                    args.append("-py3")
-            elif self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
+        if self.project.getProjectLanguage() == "Python3":
+            if self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
                 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5')
             elif self.project.getProjectType() in ["E6Plugin"]:
                 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5')
-            elif self.project.getProjectType() in ["PySide", "PySideC"]:
-                self.rccCompiler = Utilities.generatePySideToolPath(
-                    'pyside-rcc', "1")
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2"
-                ]:
-                    args.append("-py2")
-                else:
-                    args.append("-py3")
             elif self.project.getProjectType() in ["PySide2", "PySide2C"]:
                 self.rccCompiler = Utilities.generatePySideToolPath(
-                    'pyside2-rcc', "2")
+                    'pyside2-rcc')
             else:
                 return None
             defaultParameters = self.project.getDefaultRccCompilerParameters()
@@ -707,13 +682,6 @@
             if rccParameters["PathPrefix"] != defaultParameters["PathPrefix"]:
                 args.append("-root")
                 args.append(rccParameters["PathPrefix"])
-        elif self.project.getProjectLanguage() == "Ruby":
-            if self.project.getProjectType() == "Qt4":
-                self.rccCompiler = 'rbrcc'
-                if Utilities.isWindowsPlatform():
-                    self.rccCompiler += '.exe'
-            else:
-                return None
         else:
             return None
         
@@ -723,9 +691,7 @@
         fn = os.path.join(self.project.ppath, fn)
         
         dirname, filename = os.path.split(ofn)
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
+        if self.project.getProjectLanguage() == "Python3":
             self.compiledFile = os.path.join(
                 dirname, self.RCFilenameFormatPython.format(filename))
         elif self.project.getProjectLanguage() == "Ruby":
@@ -903,9 +869,7 @@
                 progress.setValue(i)
                 QApplication.processEvents()
                 ifn = os.path.join(self.project.ppath, fn)
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2", "Python3"
-                ]:
+                if self.project.getProjectLanguage() == "Python3":
                     dirname, filename = os.path.split(os.path.splitext(ifn)[0])
                     ofn = os.path.join(
                         dirname, self.RCFilenameFormatPython.format(filename))
--- a/eric6/Project/ProjectSourcesBrowser.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/ProjectSourcesBrowser.py	Sun Jun 21 18:26:12 2020 +0200
@@ -736,8 +736,7 @@
                 (coEnable or
                  os.path.isfile("{0}.coverage".format(basename)) or
                  os.path.isfile("{0}.coverage".format(tbasename))) and
-                (self.project.isPy3Project() or
-                 self.project.isPy2Project())
+                self.project.isPy3Project()
             )
         
         # now check the selected item
@@ -752,7 +751,7 @@
             coEnable = (
                 (coEnable or
                  os.path.isfile("{0}.coverage".format(basename))) and
-                (itm.isPython3File() or itm.isPython2File())
+                itm.isPython3File()
             )
         
         self.profileMenuAction.setEnabled(prEnable)
@@ -770,9 +769,7 @@
         
         for itm in itmList:
             if isinstance(itm, BrowserFileItem):
-                if itm.isPython2File():
-                    self.sourceFile[str].emit(itm.fileName())
-                elif itm.isPython3File():
+                if itm.isPython3File():
                     self.sourceFile[str].emit(itm.fileName())
                 elif itm.isRubyFile():
                     self.sourceFile[str, int, str].emit(
--- a/eric6/Project/ProjectTranslationsBrowser.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Project/ProjectTranslationsBrowser.py	Sun Jun 21 18:26:12 2020 +0200
@@ -102,8 +102,7 @@
         
         self.menu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             act = self.menu.addAction(
                 self.tr('Generate translation'), self.__generateSelected)
@@ -230,8 +229,7 @@
         
         self.backMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             act = self.backMenu.addAction(
                 self.tr('Generate all translations'),
@@ -292,8 +290,7 @@
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             act = self.multiMenu.addAction(
                 self.tr('Generate translations'),
@@ -377,8 +374,7 @@
 
         self.dirMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             act = self.dirMenu.addAction(
                 self.tr('Generate all translations'),
@@ -496,8 +492,7 @@
         Private slot called by the menu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             tsFiles = 0
             qmFiles = 0
@@ -541,8 +536,7 @@
         Private slot called by the multiMenu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             tsFiles = 0
             qmFiles = 0
@@ -584,8 +578,7 @@
         Private slot called by the dirMenu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             if self.pylupdateProcRunning:
                 for act in self.tsprocDirMenuActions:
@@ -605,8 +598,7 @@
         Private slot called by the backMenu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             if self.pylupdateProcRunning:
                 for act in self.tsprocBackMenuActions:
@@ -880,7 +872,7 @@
     def __readStderrLupdate(self, proc):
         """
         Private slot to handle the readyReadStandardError signal of the
-        pylupdate4/pylupdate5/pyside-lupdate/pyside2-lupdate process.
+        pylupdate5/pyside2-lupdate process.
         
         @param proc reference to the process
         @type QProcess
@@ -979,7 +971,7 @@
         
     def __generateTSFile(self, noobsolete=False, generateAll=True):
         """
-        Private method used to run pylupdate4/pylupdate5/pyside-lupdate to
+        Private method used to run pylupdate5/pyside2-lupdate to
         generate the .ts files.
         
         @param noobsolete flag indicating whether obsolete entries should be
@@ -1021,7 +1013,7 @@
         # generate a minimal temporary projectfile suitable for pylupdate
         self.__tmpProjects = []
         if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
+            "Python", "Python3"
         ]:
             ok = self.__writeTempProjectFile(langs, [".py"])
         else:
@@ -1029,18 +1021,13 @@
         if not ok:
             return
         
-        if self.project.getProjectType() in ["Qt4", "Qt4C"]:
-            self.pylupdate = Utilities.generatePyQtToolPath('pylupdate4')
-        elif self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
+        if self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
             self.pylupdate = Utilities.generatePyQtToolPath('pylupdate5')
         elif self.project.getProjectType() in ["E6Plugin"]:
             self.pylupdate = Utilities.generatePyQtToolPath('pylupdate5')
-        elif self.project.getProjectType() in ["PySide", "PySideC"]:
-            self.pylupdate = Utilities.generatePySideToolPath(
-                'pyside-lupdate', "1")
         elif self.project.getProjectType() in ["PySide2", "PySide2C"]:
             self.pylupdate = Utilities.generatePySideToolPath(
-                'pyside2-lupdate', "2")
+                'pyside2-lupdate')
         else:
             return
 
@@ -1197,8 +1184,7 @@
                 return
         
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             lrelease = os.path.join(
                 Utilities.getQtBinariesPath(),
--- a/eric6/PyUnit/UnittestDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/PyUnit/UnittestDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -30,7 +30,6 @@
 
 import UI.PixmapCache
 
-import Utilities
 import Preferences
 
 
@@ -288,17 +287,13 @@
         Private slot called before the test suite selection dialog is shown.
         """
         if self.__dbs:
-            py2Extensions = ' '.join(
-                ["*{0}".format(ext)
-                 for ext in self.__dbs.getExtensions('Python2')]
-            )
             py3Extensions = ' '.join(
                 ["*{0}".format(ext)
                  for ext in self.__dbs.getExtensions('Python3')]
             )
             fileFilter = self.tr(
-                "Python3 Files ({1});;Python2 Files ({0});;All Files (*)"
-            ).format(py2Extensions, py3Extensions)
+                "Python3 Files ({0});;All Files (*)"
+            ).format(py3Extensions)
         else:
             fileFilter = self.tr("Python Files (*.py);;All Files (*)")
         self.testsuitePicker.setFilters(fileFilter)
@@ -407,10 +402,7 @@
                     return
                 
                 workdir = ""
-                clientType = self.__venvManager.getVirtualenvVariant(venvName)
-                if not clientType:
-                    # assume Python 3
-                    clientType = "Python3"
+                clientType = "Python3"
                 sysPath = []
             self.__dbs.remoteUTDiscover(clientType, self.__forProject,
                                         venvName, sysPath, workdir,
@@ -756,34 +748,16 @@
                     
                     coverageFile = os.path.join(discoveryStart, "unittest")
                     workdir = ""
-                    clientType = self.__venvManager.getVirtualenvVariant(
-                        venvName)
-                    if not clientType:
-                        # assume Python 3
-                        clientType = "Python3"
+                    clientType = "Python3"
                 elif testFileName:
                     mainScript = os.path.abspath(testFileName)
-                    flags = Utilities.extractFlagsFromFile(mainScript)
                     workdir = os.path.dirname(mainScript)
-                    if (
-                        mainScript.endswith(tuple(
-                            Preferences.getPython("PythonExtensions"))) or
-                        ("FileType" in flags and
-                         flags["FileType"] in ["Python", "Python2"])
-                    ):
-                        clientType = "Python2"
-                    else:
-                        # if it is not Python2 it must be Python3!
-                        clientType = "Python3"
+                    clientType = "Python3"
                     coverageFile = os.path.splitext(mainScript)[0]
                 else:
                     coverageFile = os.path.abspath("unittest")
                     workdir = ""
-                    clientType = self.__venvManager.getVirtualenvVariant(
-                        venvName)
-                    if not clientType:
-                        # assume Python 3
-                        clientType = "Python3"
+                    clientType = "Python3"
                 sysPath = []
             if failedOnly and self.__failedTests:
                 failed = self.__failedTests[:]
--- a/eric6/QScintilla/Editor.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/QScintilla/Editor.py	Sun Jun 21 18:26:12 2020 +0200
@@ -655,8 +655,7 @@
             supportedLanguages = Lexers.getSupportedLanguages()
             if self.filetype in supportedLanguages:
                 bindName = supportedLanguages[self.filetype][1]
-            elif self.filetype in ["Python", "Python2", "Python3",
-                                   "MicroPython"]:
+            elif self.filetype in ["Python", "Python3", "MicroPython"]:
                 bindName = "dummy.py"
         
         if not bindName and line0.startswith("#!"):
@@ -664,21 +663,15 @@
             if "python3" in line0:
                 bindName = "dummy.py"
                 self.filetype = "Python3"
-            elif "python2" in line0:
-                bindName = "dummy.py"
-                self.filetype = "Python2"
             elif "python" in line0:
                 bindName = "dummy.py"
-                self.filetype = "Python2"
+                self.filetype = "Python3"
             elif "pypy3" in line0:
                 bindName = "dummy.py"
                 self.filetype = "Python3"
-            elif "pypy2" in line0:
-                bindName = "dummy.py"
-                self.filetype = "Python2"
             elif "pypy" in line0:
                 bindName = "dummy.py"
-                self.filetype = "Python2"
+                self.filetype = "Python3"
             elif ("/bash" in line0 or "/sh" in line0):
                 bindName = "dummy.sh"
             elif "ruby" in line0:
@@ -700,9 +693,6 @@
                 if mode in ["python3", "pypy3"]:
                     bindName = "dummy.py"
                     self.filetype = "Python3"
-                elif mode in ["python2", "pypy2", "python", "pypy"]:
-                    bindName = "dummy.py"
-                    self.filetype = "Python2"
                 elif mode == "ruby":
                     bindName = "dummy.rb"
                     self.filetype = "Ruby"
@@ -1741,7 +1731,7 @@
                 pyVer = Utilities.determinePythonVersion(
                     filename, self.text(0), self)
                 language = "Python{0}".format(pyVer)
-            if language in ['Python2', 'Python3', 'MicroPython', 'Ruby',
+            if language in ['Python3', 'MicroPython', 'Ruby',
                             'JavaScript', 'YAML', 'JSON']:
                 self.filetype = language
             else:
@@ -1843,17 +1833,13 @@
             lang = self.lexer_.name()
             if normalized:
                 # adjust some Pygments lexer names
-                if lang == "Python":
-                    lang = "Python2"
-                elif lang == "Python 3":
+                if lang == "Python 3":
                     lang = "Python3"
         else:
             lang = self.apiLanguage
             if forPygments:
                 # adjust some names to Pygments lexer names
-                if lang == "Python2":
-                    lang = "Python"
-                elif lang == "Python3":
+                if lang == "Python3":
                     lang = "Python 3"
         return lang
     
@@ -2032,10 +2018,10 @@
     
     def __getPyVersion(self):
         """
-        Private method to return the Python main version (2 or 3) or 0 if it's
+        Private method to return the Python main version or 0 if it's
         not a Python file at all.
         
-        @return Python version (2 or 3) or 0 if it's not a Python file (int)
+        @return Python version or 0 if it's not a Python file (int)
         """
         return Utilities.determinePythonVersion(
             self.fileName, self.text(0), self)
@@ -2044,17 +2030,19 @@
         """
         Public method to return a flag indicating a Python (2 or 3) file.
         
-        @return flag indicating a Python (2 or 3) file (boolean)
-        """
-        return self.__getPyVersion() in [2, 3]
+        @return flag indicating a Python3 file (boolean)
+        """
+        return self.__getPyVersion() == 3
     
     def isPy2File(self):
         """
         Public method to return a flag indicating a Python2 file.
         
-        @return flag indicating a Python2 file (boolean)
-        """
-        return self.__getPyVersion() == 2
+        @return flag reporting always False
+        @rtype bool
+        """
+        # kept to kep the API compatible for plugins
+        return False
 
     def isPy3File(self):
         """
@@ -5535,8 +5523,7 @@
                     (coEnable or
                      os.path.isfile("{0}.coverage".format(basename)) or
                      os.path.isfile("{0}.coverage".format(tbasename))) and
-                    (self.project.isPy3Project() or
-                     self.project.isPy2Project())
+                    self.project.isPy3Project()
                 )
         
         # now check ourselves
--- a/eric6/QScintilla/Lexers/LexerPython.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/QScintilla/Lexers/LexerPython.py	Sun Jun 21 18:26:12 2020 +0200
@@ -233,12 +233,7 @@
         @return string giving the keywords (string) or None
         """
         if kwSet == 1:
-            if self.language() in ["Python", "Python2"]:
-                keywords = ("and as assert break class continue def del elif "
-                            "else except exec finally for from global if "
-                            "import in is lambda not or pass print raise "
-                            "return try while with yield")
-            elif self.language() == "Python3":
+            if self.language() == "Python3":
                 keywords = ("False None True and as assert break class "
                             "continue def del elif else except finally for "
                             "from global if import in is lambda nonlocal not "
--- a/eric6/QScintilla/Lexers/__init__.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/QScintilla/Lexers/__init__.py	Sun Jun 21 18:26:12 2020 +0200
@@ -134,8 +134,6 @@
         "Protocol": [QCoreApplication.translate('Lexers',
                                                 "Protocol (protobuf)"),
                      'dummy.proto', "protobuf"],
-        "Python2": [QCoreApplication.translate('Lexers', "Python2"),
-                    'dummy.py', "lexerPython"],
         "Python3": [QCoreApplication.translate('Lexers', "Python3"),
                     'dummy.py', "lexerPython3"],
         "MicroPython": [QCoreApplication.translate('Lexers', "MicroPython"),
@@ -231,8 +229,7 @@
     """
     if not pyname:
         try:
-            if language in ["Python", "Python2", "Python3", "Cython",
-                            "MicroPython"]:
+            if language in ["Python", "Python3", "Cython", "MicroPython"]:
                 from .LexerPython import LexerPython
                 return LexerPython(language, parent)
             elif language == "C++":
@@ -562,15 +559,9 @@
     saveFileFiltersList = [
         QCoreApplication.translate(
             'Lexers',
-            "Python2 Files (*.py2)"),
-        QCoreApplication.translate(
-            'Lexers',
             "Python3 Files (*.py)"),
         QCoreApplication.translate(
             'Lexers',
-            "Python2 GUI Files (*.pyw2)"),
-        QCoreApplication.translate(
-            'Lexers',
             "Python3 GUI Files (*.pyw)"),
         QCoreApplication.translate(
             'Lexers',
--- a/eric6/QScintilla/MiniEditor.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/QScintilla/MiniEditor.py	Sun Jun 21 18:26:12 2020 +0200
@@ -3034,10 +3034,7 @@
         filename = os.path.basename(filename)
         language = Preferences.getEditorLexerAssoc(filename)
         if language == "Python":
-            if self.__isPy2File():
-                language = "Python2"
-            else:
-                language = "Python3"
+            language = "Python3"
         if language.startswith("Pygments|"):
             pyname = language.split("|", 1)[1]
             language = ""
@@ -3078,39 +3075,7 @@
         
         self.lexer_.setDefaultColor(self.lexer_.color(0))
         self.lexer_.setDefaultPaper(self.lexer_.paper(0))
-        
-    def __isPy2File(self):
-        """
-        Private method to return a flag indicating a Python 2 file.
-        
-        @return flag indicating a Python 2 file (boolean)
-        """
-        if self.filetype in ["Python", "Python2"]:
-            return True
-        
-        if self.filetype == "":
-            line0 = self.__textEdit.text(0)
-            if (
-                line0.startswith("#!") and
-                ("python2" in line0 or
-                 ("python" in line0 and "python3" not in line0))
-            ):
-                return True
-            
-            if self.__curFile is not None:
-                exts = []
-                for ext in Preferences.getDebugger("PythonExtensions").split():
-                    if ext.startswith("."):
-                        exts.append(ext)
-                    else:
-                        exts.append(".{0}".format(ext))
-                
-                ext = os.path.splitext(self.__curFile)[1]
-                if ext in exts:
-                    return True
-        
-        return False
-        
+    
     def __styleNeeded(self, position):
         """
         Private slot to handle the need for more styling.
@@ -3146,8 +3111,7 @@
             supportedLanguages = Lexers.getSupportedLanguages()
             if self.filetype in supportedLanguages:
                 bindName = supportedLanguages[self.filetype][1]
-            elif self.filetype in ["Python", "Python2", "Python3",
-                                   "MicroPython"]:
+            elif self.filetype in ["Python", "Python3", "MicroPython"]:
                 bindName = "dummy.py"
         
         if not bindName and line0.startswith("#!"):
@@ -3155,12 +3119,9 @@
             if "python3" in line0:
                 bindName = "dummy.py"
                 self.filetype = "Python3"
-            elif "python2" in line0:
-                bindName = "dummy.py"
-                self.filetype = "Python2"
             elif "python" in line0:
                 bindName = "dummy.py"
-                self.filetype = "Python2"
+                self.filetype = "Python3"
             elif ("/bash" in line0 or "/sh" in line0):
                 bindName = "dummy.sh"
             elif "ruby" in line0:
@@ -3182,9 +3143,6 @@
                 if mode in ["python3", "pypy3"]:
                     bindName = "dummy.py"
                     self.filetype = "Python3"
-                elif mode in ["python2", "pypy2", "python", "pypy"]:
-                    bindName = "dummy.py"
-                    self.filetype = "Python2"
                 elif mode == "ruby":
                     bindName = "dummy.rb"
                     self.filetype = "Ruby"
--- a/eric6/QScintilla/TypingCompleters/__init__.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/QScintilla/TypingCompleters/__init__.py	Sun Jun 21 18:26:12 2020 +0200
@@ -18,7 +18,7 @@
     @return reference to the instanciated lexer object (QsciLexer)
     """
     try:
-        if language in ["Python", "Python2", "Python3", "MicroPython"]:
+        if language in ["Python", "Python3", "MicroPython"]:
             from .CompleterPython import CompleterPython
             return CompleterPython(editor, parent)
         elif language == "Ruby":
--- a/eric6/UI/Browser.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/UI/Browser.py	Sun Jun 21 18:26:12 2020 +0200
@@ -412,9 +412,7 @@
             self._activating = True
             for itm in itmList:
                 if isinstance(itm, BrowserFileItem):
-                    if itm.isPython2File():
-                        self.sourceFile[str].emit(itm.fileName())
-                    elif itm.isPython3File():
+                    if itm.isPython3File():
                         self.sourceFile[str].emit(itm.fileName())
                     elif itm.isRubyFile():
                         self.sourceFile[str, int, str].emit(
--- a/eric6/UI/BrowserModel.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/UI/BrowserModel.py	Sun Jun 21 18:26:12 2020 +0200
@@ -630,7 +630,7 @@
         try:
             dictionary = Utilities.ClassBrowsers.readmodule(
                 moduleName, [parentItem.dirName()],
-                parentItem.isPython2File() or parentItem.isPython3File())
+                parentItem.isPython3File())
         except ImportError:
             return
         
@@ -1112,15 +1112,7 @@
         self._moduleName = ''
         
         pixName = ""
-        if self.isPython2File():
-            if self.fileext == '.py':
-                pixName = "filePython"
-            else:
-                pixName = "filePython2"
-            self._populated = False
-            self._lazyPopulation = True
-            self._moduleName = os.path.basename(finfo)
-        elif self.isPython3File():
+        if self.isPython3File():
             pixName = "filePython"
             self._populated = False
             self._lazyPopulation = True
@@ -1183,7 +1175,6 @@
         self._filename = os.path.abspath(finfo)
         self.itemData[0] = os.path.basename(finfo)
         if (
-            self.isPython2File() or
             self.isPython3File() or
             self.isRubyFile() or
             self.isIdlFile() or
@@ -1232,18 +1223,6 @@
         """
         return self._moduleName
     
-    def isPython2File(self):
-        """
-        Public method to check, if this file is a Python script.
-        
-        @return flag indicating a Python file (boolean)
-        """
-        return (
-            self.fileext in Preferences.getPython("PythonExtensions") or
-            (self.fileext == "" and
-             self.sourceLanguage in ["Python", "Python2"])
-        )
-    
     def isPython3File(self):
         """
         Public method to check, if this file is a Python3 script.
--- a/eric6/UI/UserInterface.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/UI/UserInterface.py	Sun Jun 21 18:26:12 2020 +0200
@@ -2198,7 +2198,7 @@
         self.utProjectAct.setEnabled(False)
         self.actions.append(self.utProjectAct)
         
-        # check for Qt4/Qt5 designer and linguist
+        # check for Qt5 designer and linguist
         if Utilities.isWindowsPlatform():
             designerExe = os.path.join(
                 Utilities.getQtBinariesPath(),
@@ -2732,21 +2732,6 @@
         """
         Private slot to initialize the action to show the Qt documentation.
         """
-        self.qt4DocAct = E5Action(
-            self.tr('Qt4 Documentation'),
-            self.tr('Qt&4 Documentation'),
-            0, 0, self, 'qt4_documentation')
-        self.qt4DocAct.setStatusTip(self.tr('Open Qt4 Documentation'))
-        self.qt4DocAct.setWhatsThis(self.tr(
-            """<b>Qt4 Documentation</b>"""
-            """<p>Display the Qt4 Documentation. Dependent upon your"""
-            """ settings, this will either show the help in Eric's internal"""
-            """ help viewer/web browser, or execute a web browser or Qt"""
-            """ Assistant. </p>"""
-        ))
-        self.qt4DocAct.triggered.connect(self.__showQt4Doc)
-        self.actions.append(self.qt4DocAct)
-      
         self.qt5DocAct = E5Action(
             self.tr('Qt5 Documentation'),
             self.tr('Qt&5 Documentation'),
@@ -2762,25 +2747,6 @@
         self.qt5DocAct.triggered.connect(self.__showQt5Doc)
         self.actions.append(self.qt5DocAct)
       
-        try:
-            import PyQt4        # __IGNORE_WARNING__
-            self.pyqt4DocAct = E5Action(
-                self.tr('PyQt4 Documentation'),
-                self.tr('PyQt&4 Documentation'),
-                0, 0, self, 'pyqt4_documentation')
-            self.pyqt4DocAct.setStatusTip(self.tr('Open PyQt4 Documentation'))
-            self.pyqt4DocAct.setWhatsThis(self.tr(
-                """<b>PyQt4 Documentation</b>"""
-                """<p>Display the PyQt4 Documentation. Dependent upon your"""
-                """ settings, this will either show the help in Eric's"""
-                """ internal help viewer/web browser, or execute a web"""
-                """ browser or Qt Assistant. </p>"""
-            ))
-            self.pyqt4DocAct.triggered.connect(self.__showPyQt4Doc)
-            self.actions.append(self.pyqt4DocAct)
-        except ImportError:
-            self.pyqt4DocAct = None
-        
         self.pyqt5DocAct = E5Action(
             self.tr('PyQt5 Documentation'),
             self.tr('PyQt&5 Documentation'),
@@ -2819,27 +2785,7 @@
         ))
         self.pythonDocAct.triggered.connect(self.__showPythonDoc)
         self.actions.append(self.pythonDocAct)
-        
-        self.python2DocAct = E5Action(
-            self.tr('Python 2 Documentation'),
-            self.tr('Python &2 Documentation'),
-            0, 0, self, 'python2_documentation')
-        self.python2DocAct.setStatusTip(self.tr(
-            'Open Python 2 Documentation'))
-        self.python2DocAct.setWhatsThis(self.tr(
-            """<b>Python 2 Documentation</b>"""
-            """<p>Display the Python 2 documentation. If no documentation"""
-            """ directory is configured, the location of the Python 2"""
-            """ documentation is assumed to be the doc directory underneath"""
-            """ the location of the configured Python 2 executable on"""
-            """ Windows and"""
-            """ <i>/usr/share/doc/packages/python/html/python-docs-html</i>"""
-            """ on Unix. Set PYTHON2DOCDIR in your environment to override"""
-            """ this. </p>"""
-        ))
-        self.python2DocAct.triggered.connect(self.__showPython2Doc)
-        self.actions.append(self.python2DocAct)
-        
+    
     def __initEricDocAction(self):
         """
         Private slot to initialize the action to show the eric6 documentation.
@@ -2864,29 +2810,7 @@
         Private slot to initialize the actions to show the PySide
         documentation.
         """
-        pyside_py2, pyside_py3 = Utilities.checkPyside("1")
-        if pyside_py2 or pyside_py3:
-            self.pysideDocAct = E5Action(
-                self.tr('PySide Documentation'),
-                self.tr('Py&Side Documentation'),
-                0, 0, self, 'pyside_documentation')
-            self.pysideDocAct.setStatusTip(self.tr(
-                'Open PySide Documentation'))
-            self.pysideDocAct.setWhatsThis(self.tr(
-                """<b>PySide Documentation</b>"""
-                """<p>Display the PySide Documentation. Dependent upon your"""
-                """ settings, this will either show the help in Eric's"""
-                """ internal help viewer/web browser, or execute a web"""
-                """ browser or Qt Assistant. </p>"""
-            ))
-            self.pysideDocAct.triggered.connect(
-                lambda: self.__showPySideDoc("1"))
-            self.actions.append(self.pysideDocAct)
-        else:
-            self.pysideDocAct = None
-        
-        pyside2_py2, pyside2_py3 = Utilities.checkPyside("2")
-        if pyside2_py2 or pyside2_py3:
+        if Utilities.checkPyside():
             self.pyside2DocAct = E5Action(
                 self.tr('PySide2 Documentation'),
                 self.tr('PySide&2 Documentation'),
@@ -3192,15 +3116,9 @@
             self.__menus["help"].addSeparator()
         self.__menus["help"].addAction(self.ericDocAct)
         self.__menus["help"].addAction(self.pythonDocAct)
-        self.__menus["help"].addAction(self.python2DocAct)
-        self.__menus["help"].addAction(self.qt4DocAct)
         self.__menus["help"].addAction(self.qt5DocAct)
-        if self.pyqt4DocAct is not None:
-            self.__menus["help"].addAction(self.pyqt4DocAct)
         if self.pyqt5DocAct is not None:
             self.__menus["help"].addAction(self.pyqt5DocAct)
-        if self.pysideDocAct is not None:
-            self.__menus["help"].addAction(self.pysideDocAct)
         if self.pyside2DocAct is not None:
             self.__menus["help"].addAction(self.pyside2DocAct)
         self.__menus["help"].addSeparator()
@@ -5552,75 +5470,6 @@
             else:
                 self.__customViewer(home)
 
-    def __showPython2Doc(self):
-        """
-        Private slot to show the Python 2 documentation.
-        """
-        pythonDocDir = Preferences.getHelp("Python2DocDir")
-        if not pythonDocDir:
-            if Utilities.isWindowsPlatform():
-                venvName = Preferences.getDebugger("Python2VirtualEnv")
-                interpreter = (
-                    e5App().getObject("VirtualEnvManager")
-                    .getVirtualenvInterpreter(venvName)
-                )
-                if interpreter:
-                    default = os.path.join(os.path.dirname(interpreter), "doc")
-                else:
-                    default = ""
-                pythonDocDir = Utilities.getEnvironmentEntry(
-                    "PYTHON2DOCDIR", default)
-            else:
-                pythonDocDir = Utilities.getEnvironmentEntry(
-                    "PYTHON2DOCDIR",
-                    '/usr/share/doc/packages/python/html')
-        if not pythonDocDir.startswith(("http://", "https://", "qthelp://")):
-            if pythonDocDir.startswith("file://"):
-                pythonDocDir = pythonDocDir[7:]
-            if not os.path.splitext(pythonDocDir)[1]:
-                home = Utilities.normjoinpath(pythonDocDir, 'index.html')
-            else:
-                home = pythonDocDir
-            
-            if not os.path.exists(home):
-                E5MessageBox.warning(
-                    self,
-                    self.tr("Documentation Missing"),
-                    self.tr("""<p>The documentation starting point"""
-                            """ "<b>{0}</b>" could not be found.</p>""")
-                    .format(home))
-                return
-            
-            if not home.endswith(".chm"):
-                if Utilities.isWindowsPlatform():
-                    home = "file:///" + Utilities.fromNativeSeparators(home)
-                else:
-                    home = "file://" + home
-        else:
-            home = pythonDocDir
-        
-        if home.endswith(".chm"):
-            self.__chmViewer(home)
-        else:
-            hvType = Preferences.getWebBrowser("HelpViewerType")
-            if hvType == 1:
-                self.launchHelpViewer(home)
-            elif hvType == 2:
-                if home.startswith("qthelp://"):
-                    self.__assistant(home)
-                else:
-                    self.__webBrowser(home)
-            elif hvType == 3:
-                self.__webBrowser(home)
-            else:
-                self.__customViewer(home)
-
-    def __showQt4Doc(self):
-        """
-        Private slot to show the Qt4 documentation.
-        """
-        self.__showQtDoc(4)
-    
     def __showQt5Doc(self):
         """
         Private slot to show the Qt5 documentation.
@@ -5633,9 +5482,7 @@
         
         @param version Qt version to show documentation for (integer)
         """
-        if version == 4:
-            qtDocDir = Preferences.getQt4DocDir()
-        elif version == 5:
+        if version == 5:
             qtDocDir = Preferences.getQt5DocDir()
         
         if qtDocDir.startswith("qthelp://"):
@@ -5680,68 +5527,6 @@
         else:
             self.__customViewer(home)
         
-    def __showPyQt4Doc(self):
-        """
-        Private slot to show the PyQt4 documentation.
-        """
-        pyqt4DocDir = Preferences.getHelp("PyQt4DocDir")
-        if not pyqt4DocDir:
-            pyqt4DocDir = Utilities.getEnvironmentEntry("PYQT4DOCDIR", None)
-        
-        if not pyqt4DocDir:
-            E5MessageBox.warning(
-                self,
-                self.tr("Documentation"),
-                self.tr("""<p>The PyQt4 documentation starting point"""
-                        """ has not been configured.</p>"""))
-            return
-        
-        if not pyqt4DocDir.startswith(("http://", "https://", "qthelp://")):
-            home = ""
-            if pyqt4DocDir:
-                if pyqt4DocDir.startswith("file://"):
-                    pyqt4DocDir = pyqt4DocDir[7:]
-                if not os.path.splitext(pyqt4DocDir)[1]:
-                    possibleHomes = [
-                        Utilities.normjoinpath(pyqt4DocDir, 'index.html'),
-                        Utilities.normjoinpath(pyqt4DocDir, 'classes.html'),
-                    ]
-                    for possibleHome in possibleHomes:
-                        if os.path.exists(possibleHome):
-                            home = possibleHome
-                            break
-                else:
-                    home = pyqt4DocDir
-            
-            if not home or not os.path.exists(home):
-                E5MessageBox.warning(
-                    self,
-                    self.tr("Documentation Missing"),
-                    self.tr("""<p>The documentation starting point"""
-                            """ "<b>{0}</b>" could not be found.</p>""")
-                    .format(home))
-                return
-            
-            if Utilities.isWindowsPlatform():
-                home = "file:///" + Utilities.fromNativeSeparators(home)
-            else:
-                home = "file://" + home
-        else:
-            home = pyqt4DocDir
-        
-        hvType = Preferences.getWebBrowser("HelpViewerType")
-        if hvType == 1:
-            self.launchHelpViewer(home)
-        elif hvType == 2:
-            if home.startswith("qthelp://"):
-                self.__assistant(home)
-            else:
-                self.__webBrowser(home)
-        elif hvType == 3:
-            self.__webBrowser(home)
-        else:
-            self.__customViewer(home)
-        
     def __showPyQt5Doc(self):
         """
         Private slot to show the PyQt5 documentation.
@@ -5842,24 +5627,18 @@
             self.__webBrowser(home)
         else:
             self.__customViewer(home)
-        
-    def __showPySideDoc(self, variant):
-        """
-        Private slot to show the PySide/PySide2 documentation.
-        
-        @param variant PySide variant (1 or 2)
+    
+    def __showPySideDoc(self, variant="2"):
+        """
+        Private slot to show the PySide2 documentation.
+        
+        @param variant PySide variant (2)
         @type str
         """
-        if variant == "1":
-            pysideDocDir = Preferences.getHelp("PySideDocDir")
-            if not pysideDocDir:
-                pysideDocDir = Utilities.getEnvironmentEntry(
-                    "PYSIDEDOCDIR", None)
-        else:
-            pysideDocDir = Preferences.getHelp("PySide2DocDir")
-            if not pysideDocDir:
-                pysideDocDir = Utilities.getEnvironmentEntry(
-                    "PYSIDE2DOCDIR", None)
+        pysideDocDir = Preferences.getHelp("PySide2DocDir")
+        if not pysideDocDir:
+            pysideDocDir = Utilities.getEnvironmentEntry(
+                "PYSIDE2DOCDIR", None)
         
         if not pysideDocDir:
             E5MessageBox.warning(
@@ -5867,7 +5646,7 @@
                 self.tr("Documentation"),
                 self.tr("""<p>The PySide{0} documentation starting point"""
                         """ has not been configured.</p>""").format(
-                    "" if variant == "1" else variant)
+                    variant)
             )
             return
         
--- a/eric6/Utilities/BackgroundClient.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Utilities/BackgroundClient.py	Sun Jun 21 18:26:12 2020 +0200
@@ -45,7 +45,7 @@
         self.batchServices = {}
         
         self.connection = socket.create_connection((host, port))
-        ver = b'Python2' if sys.version_info[0] == 2 else b'Python3'
+        ver = b'Python3'
         self.connection.sendall(ver)
         self.__maxProcs = maxProcs
 
--- a/eric6/Utilities/BackgroundService.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Utilities/BackgroundService.py	Sun Jun 21 18:26:12 2020 +0200
@@ -67,17 +67,15 @@
         ## Note: Need the port if started external in debugger:
         print('BackgroundService listening on: {0:d}'.format(port))
         # __IGNORE_WARNING__
-        for pyName in ['Python2', 'Python3']:
-            venvName = Preferences.getDebugger(
-                pyName + "VirtualEnv")
-            interpreter = e5App().getObject(
-                "VirtualEnvManager").getVirtualenvInterpreter(venvName)
-            if not interpreter and int(pyName[-1]) == sys.version_info[0]:
-                interpreter = sys.executable.replace("w.exe", ".exe")
-            if interpreter:
-                process = self.__startExternalClient(interpreter, port)
-                if process:
-                    self.processes[pyName] = process, interpreter
+        venvName = Preferences.getDebugger("Python3VirtualEnv")
+        interpreter = e5App().getObject(
+            "VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        if not interpreter:
+            interpreter = sys.executable.replace("w.exe", ".exe")
+        if interpreter:
+            process = self.__startExternalClient(interpreter, port)
+            if process:
+                self.processes['Python3'] = process, interpreter
 
     def __startExternalClient(self, interpreter, port):
         """
@@ -247,19 +245,17 @@
         """
         Public slot to restart the built in languages.
         """
-        for pyName in ['Python2', 'Python3']:
-            venvName = Preferences.getDebugger(
-                pyName + "VirtualEnv")
-            interpreter = e5App().getObject(
-                "VirtualEnvManager").getVirtualenvInterpreter(venvName)
-            if not interpreter and int(pyName[-1]) == sys.version_info[0]:
-                interpreter = sys.executable.replace("w.exe", ".exe")
-            
-            # Tweak the processes list to reflect the changed interpreter
-            proc, inter = self.processes.pop(pyName, [None, None])
-            self.processes[pyName] = proc, interpreter
-            
-            self.restartService(pyName)
+        venvName = Preferences.getDebugger("Python3VirtualEnv")
+        interpreter = e5App().getObject(
+            "VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        if not interpreter:
+            interpreter = sys.executable.replace("w.exe", ".exe")
+        
+        # Tweak the processes list to reflect the changed interpreter
+        proc, inter = self.processes.pop('Python3', [None, None])
+        self.processes['Python3'] = proc, interpreter
+        
+        self.restartService('Python3')
 
     def restartService(self, language, forceKill=False):
         """
--- a/eric6/Utilities/ModuleParser.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Utilities/ModuleParser.py	Sun Jun 21 18:26:12 2020 +0200
@@ -24,7 +24,6 @@
 
 import Utilities
 from functools import reduce
-import Preferences
 
 __all__ = ["Module", "Class", "Function", "Attribute", "RbModule",
            "readModule", "getTypeFromTypeName"]
@@ -39,7 +38,6 @@
 SUPPORTED_TYPES = [PY_SOURCE, PTL_SOURCE, RB_SOURCE]
 TYPE_MAPPING = {
     "Python": PY_SOURCE,
-    "Python2": PY_SOURCE,
     "Python3": PY_SOURCE,
     "MicroPython": PY_SOURCE,
     "Ruby": RB_SOURCE,
@@ -1274,11 +1272,7 @@
         @return type of the modules's source (string)
         """
         if self.type in [PY_SOURCE, PTL_SOURCE]:
-            py3ExtList = Preferences.getDebugger("Python3Extensions").split()
-            if self.file.endswith(tuple(py3ExtList)):
-                moduleType = "Python3"
-            else:
-                moduleType = "Python2"
+            moduleType = "Python3"
         elif self.type == RB_SOURCE:
             moduleType = "Ruby"
         else:
--- a/eric6/Utilities/PySideImporter.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Utilities/PySideImporter.py	Sun Jun 21 18:26:12 2020 +0200
@@ -4,7 +4,7 @@
 #
 
 """
-Module to check for the presence of PySide/PySide2 by importing it.
+Module to check for the presence of PySide2 by importing it.
 """
 
 import sys
@@ -15,11 +15,8 @@
         pySideVariant = sys.argv[1].replace("-", "")
     
     if pySideVariant == "1":
-        try:
-            import PySide       # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
-            ret = 0
-        except ImportError:
-            ret = 1
+        # no PySide support anymore
+        ret = 1
     
     elif pySideVariant == "2":
         try:
--- a/eric6/Utilities/__init__.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/Utilities/__init__.py	Sun Jun 21 18:26:12 2020 +0200
@@ -1601,11 +1601,9 @@
     @param source of the file (str)
     @keyparam editor reference to the editor, if the file is opened
         already (Editor object)
-    @return Python version if file is Python2 or Python3 (int)
+    @return Python version if file is Python3 (int)
     """
     pyAssignment = {
-        "Python": 2,
-        "Python2": 2,
         "Python3": 3,
         "MicroPython": 3,
     }
@@ -1635,7 +1633,7 @@
             language = project.getEditorLexerAssoc(basename)
             if not language:
                 language = Preferences.getEditorLexerAssoc(basename)
-            if language in ['Python2', 'Python3']:
+            if language == 'Python3':
                 pyVer = pyAssignment[language]
         
         if pyVer:
@@ -1820,36 +1818,38 @@
     return exe
 
 ###############################################################################
-# PySide/PySide2 utility functions below
+# PySide2 utility functions below
 ###############################################################################
 
 
 def generatePySideToolPath(toolname, variant="2"):
     """
-    Module function to generate the executable path for a PySide/PySide2 tool.
+    Module function to generate the executable path for a PySide2 tool.
     
     @param toolname base name of the tool
     @type str
-    @param variant indicator for the PySide variant
+    @param variant indicator for the PySide variant (not used)
     @type str
-    @return the PySide/PySide2 tool path with extension
+    @return the PySide2 tool path with extension
     @rtype str
     """
+    if variant == 1:
+        # no PySide support anymore
+        return ""
+    
     if isWindowsPlatform():
         pysideInterpreters = checkPyside(variant)
         interpreterIndex = sys.version_info[0] - 2
         hasPyside = pysideInterpreters[interpreterIndex]
-        # if it isn't the internal interpreter, it has to be the external one
         if not hasPyside:
-            interpreterIndex = not interpreterIndex
-        if interpreterIndex:
+            return ""
+        
+        if interpreterIndex == 1:
             venvName = Preferences.getDebugger("Python3VirtualEnv")
-        else:
-            venvName = Preferences.getDebugger("Python2VirtualEnv")
         interpreter = e5App().getObject(
             "VirtualEnvManager").getVirtualenvInterpreter(venvName)
         prefix = os.path.dirname(interpreter)
-        if toolname in ["pyside-uic", "pyside2-uic"]:
+        if toolname in ["pyside2-uic"]:
             return os.path.join(prefix, "Scripts", toolname + '.exe')
         else:
             path = os.path.join(prefix, "Scripts", toolname + '.exe')
@@ -1859,63 +1859,59 @@
             # report it the old style
             return os.path.join(
                 prefix, "Lib", "site-packages",
-                "PySide{0}".format("" if variant == "1" else variant),
+                "PySide{0}".format(variant),
                 toolname + ".exe")
     else:
-        if variant == "1":
+        # step 1: check, if the user has configured a tools path
+        path = Preferences.getQt("PySide2ToolsDir")
+        if path:
+            return os.path.join(path, toolname)
+        
+        # step 2: determine from used Python interpreter
+        dirName = os.path.dirname(sys.executable)
+        if os.path.exists(os.path.join(dirName, toolname)):
+            return os.path.join(dirName, toolname)
+        
+        # step 3: if it is not 'pyside2-uic' look in the package directory
+        if toolname == "pyside2-uic":
             return toolname
         else:
-            # step 1: check, if the user has configured a tools path
-            path = Preferences.getQt("PySide2ToolsDir")
-            if path:
-                return os.path.join(path, toolname)
-            
-            # step 2: determine from used Python interpreter
-            dirName = os.path.dirname(sys.executable)
-            if os.path.exists(os.path.join(dirName, toolname)):
-                return os.path.join(dirName, toolname)
-            
-            # step 3: if it is not 'pyside2-uic' look in the package directory
-            if toolname == "pyside2-uic":
-                return toolname
-            else:
-                import distutils.sysconfig
-                return os.path.join(distutils.sysconfig.get_python_lib(True),
-                                    "PySide2", toolname)
+            import distutils.sysconfig
+            return os.path.join(distutils.sysconfig.get_python_lib(True),
+                                "PySide2", toolname)
 
 
 def checkPyside(variant="2"):
     """
-    Module function to check the presence of PySide/PySide2.
+    Module function to check the presence of PySide2.
     
-    @param variant indicator for the PySide variant
+    @param variant indicator for the PySide variant (not used)
     @type str
-    @return list of two flags indicating the presence of PySide/PySide2 for
-        Python2 and PySide/PySide2 for Python3
-    @rtype tuple of (bool, bool)
+    @return flags indicating the presence of PySide2
+    @rtype bool
     """
-    pysideInformation = []
-    for venvNameKey in ["Python2VirtualEnv", "Python3VirtualEnv"]:
-        venvName = Preferences.getDebugger(venvNameKey)
-        interpreter = e5App().getObject(
-            "VirtualEnvManager").getVirtualenvInterpreter(venvName)
-        if interpreter == "" or not isinpath(interpreter):
-            hasPyside = False
-        else:
-            hasPyside = False
-            checker = os.path.join(getConfig('ericDir'),
-                                   "Utilities", "PySideImporter.py")
-            args = [checker, "-" + variant]
-            proc = QProcess()
-            proc.setProcessChannelMode(QProcess.MergedChannels)
-            proc.start(interpreter, args)
-            finished = proc.waitForFinished(30000)
-            if finished:
-                if proc.exitCode() == 0:
-                    hasPyside = True
-        pysideInformation.append(hasPyside)
+    if variant == 1:
+        # no longer supported PySide
+        return [False, False]
     
-    return pysideInformation
+    venvName = Preferences.getDebugger("Python3VirtualEnv")
+    interpreter = e5App().getObject(
+        "VirtualEnvManager").getVirtualenvInterpreter(venvName)
+    if interpreter == "" or not isinpath(interpreter):
+        return False
+    else:
+        checker = os.path.join(
+            getConfig('ericDir'), "Utilities", "PySideImporter.py")
+        args = [checker, "-" + variant]
+        proc = QProcess()
+        proc.setProcessChannelMode(QProcess.MergedChannels)
+        proc.start(interpreter, args)
+        finished = proc.waitForFinished(30000)
+        if finished:
+            if proc.exitCode() == 0:
+                return True
+    
+    return False
 
 ###############################################################################
 # Other utility functions below
--- a/eric6/VirtualEnv/VirtualenvAddEditDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/VirtualEnv/VirtualenvAddEditDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -26,8 +26,8 @@
     Class implementing a dialog to enter the data of a virtual environment.
     """
     def __init__(self, manager, venvName="", venvDirectory="",
-                 venvInterpreter="", venvVariant=3, isGlobal=False,
-                 isConda=False, isRemote=False, execPath="", parent=None):
+                 venvInterpreter="", isGlobal=False, isConda=False,
+                 isRemote=False, execPath="", parent=None):
         """
         Constructor
         
@@ -39,8 +39,6 @@
         @type str
         @param venvInterpreter Python interpreter of the virtual environment
         @type str
-        @param venvVariant Python variant of the virtual environment
-        @type int
         @param isGlobal flag indicating a global environment
         @type bool
         @param isConda flag indicating an Anaconda virtual environment
@@ -82,7 +80,6 @@
                                            toNative=not isRemote)
         self.pythonExecPicker.setText(venvInterpreter,
                                       toNative=not isRemote)
-        self.variantComboBox.setCurrentIndex(3 - venvVariant)
         self.globalCheckBox.setChecked(isGlobal)
         self.anacondaCheckBox.setChecked(isConda)
         self.remoteCheckBox.setChecked(isRemote)
@@ -211,19 +208,17 @@
         Public method to retrieve the entered data.
         
         @return tuple containing the logical name, the directory, the
-            interpreter of the virtual environment, the Python variant,
-            a flag indicating a global environment, a flag indicating an
-            Anaconda environment, aflag indicating a remotely accessed
-            environment and a string to be prepended to the PATH environment
-            variable
-        @rtype tuple of (str, str, str, int, bool, bool, bool, str)
+            interpreter of the virtual environment, a flag indicating a
+            global environment, a flag indicating an Anaconda environment,
+            a flag indicating a remotely accessed environment and a string
+            to be prepended to the PATH environment variable
+        @rtype tuple of (str, str, str, bool, bool, bool, str)
         """
         nativePaths = not self.remoteCheckBox.isChecked()
         return (
             self.nameEdit.text(),
             self.targetDirectoryPicker.text(toNative=nativePaths),
             self.pythonExecPicker.text(toNative=nativePaths),
-            3 - self.variantComboBox.currentIndex(),
             self.globalCheckBox.isChecked(),
             self.anacondaCheckBox.isChecked(),
             self.remoteCheckBox.isChecked(),
--- a/eric6/VirtualEnv/VirtualenvAddEditDialog.ui	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/VirtualEnv/VirtualenvAddEditDialog.ui	Sun Jun 21 18:26:12 2020 +0200
@@ -7,98 +7,24 @@
     <x>0</x>
     <y>0</y>
     <width>700</width>
-    <height>220</height>
+    <height>188</height>
    </rect>
   </property>
   <property name="sizeGripEnabled">
    <bool>true</bool>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Logical Name:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="E5ClearableLineEdit" name="nameEdit">
-     <property name="toolTip">
-      <string>Enter a unique name for the virtual environment</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QLabel" name="label_2">
+   <item row="4" column="0">
+    <widget class="QLabel" name="label_5">
      <property name="text">
-      <string>Directory:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="E5PathPicker" name="targetDirectoryPicker" native="true">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="focusPolicy">
-      <enum>Qt::WheelFocus</enum>
-     </property>
-     <property name="toolTip">
-      <string>Enter the directory of the virtual environment</string>
+      <string>PATH Prefix:</string>
      </property>
     </widget>
    </item>
-   <item row="2" column="0">
-    <widget class="QLabel" name="label_3">
-     <property name="text">
-      <string>Python Interpreter:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <widget class="E5PathPicker" name="pythonExecPicker" native="true">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="focusPolicy">
-      <enum>Qt::WheelFocus</enum>
-     </property>
-     <property name="toolTip">
-      <string>Enter the Python interpreter of the virtual environment</string>
-     </property>
-    </widget>
+   <item row="4" column="1">
+    <widget class="E5ClearableLineEdit" name="execPathEdit"/>
    </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="label_4">
-     <property name="text">
-      <string>Python Variant:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1">
-    <widget class="QComboBox" name="variantComboBox">
-     <property name="toolTip">
-      <string>Select the Python variant</string>
-     </property>
-     <item>
-      <property name="text">
-       <string notr="true">Python 3</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string notr="true">Python 2</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="2">
+   <item row="3" column="0" colspan="2">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QCheckBox" name="globalCheckBox">
@@ -149,17 +75,7 @@
      </item>
     </layout>
    </item>
-   <item row="5" column="0">
-    <widget class="QLabel" name="label_5">
-     <property name="text">
-      <string>PATH Prefix:</string>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="1">
-    <widget class="E5ClearableLineEdit" name="execPathEdit"/>
-   </item>
-   <item row="6" column="0" colspan="2">
+   <item row="5" column="0" colspan="2">
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
@@ -169,6 +85,66 @@
      </property>
     </widget>
    </item>
+   <item row="2" column="1">
+    <widget class="E5PathPicker" name="pythonExecPicker" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="focusPolicy">
+      <enum>Qt::WheelFocus</enum>
+     </property>
+     <property name="toolTip">
+      <string>Enter the Python interpreter of the virtual environment</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="E5PathPicker" name="targetDirectoryPicker" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="focusPolicy">
+      <enum>Qt::WheelFocus</enum>
+     </property>
+     <property name="toolTip">
+      <string>Enter the directory of the virtual environment</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="E5ClearableLineEdit" name="nameEdit">
+     <property name="toolTip">
+      <string>Enter a unique name for the virtual environment</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <widget class="QLabel" name="label_3">
+     <property name="text">
+      <string>Python Interpreter:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="0">
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Logical Name:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>Directory:</string>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <customwidgets>
@@ -188,7 +164,6 @@
   <tabstop>nameEdit</tabstop>
   <tabstop>targetDirectoryPicker</tabstop>
   <tabstop>pythonExecPicker</tabstop>
-  <tabstop>variantComboBox</tabstop>
   <tabstop>globalCheckBox</tabstop>
   <tabstop>anacondaCheckBox</tabstop>
   <tabstop>remoteCheckBox</tabstop>
--- a/eric6/VirtualEnv/VirtualenvConfigurationDialog.ui	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/VirtualEnv/VirtualenvConfigurationDialog.ui	Sun Jun 21 18:26:12 2020 +0200
@@ -289,16 +289,6 @@
               </item>
               <item>
                <property name="text">
-                <string notr="true">2.6</string>
-               </property>
-              </item>
-              <item>
-               <property name="text">
-                <string notr="true">2.7</string>
-               </property>
-              </item>
-              <item>
-               <property name="text">
                 <string notr="true">3.4</string>
                </property>
               </item>
@@ -322,6 +312,11 @@
                 <string notr="true">3.8</string>
                </property>
               </item>
+              <item>
+               <property name="text">
+                <string notr="true">3.9</string>
+               </property>
+              </item>
              </widget>
             </item>
             <item>
--- a/eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -73,11 +73,7 @@
         """
         Public method to get the entered data.
         
-        @return tuple containing the path of the selected Python interpreter
-            and the Python variant
-        @rtype tuple of (str, int)
+        @return path of the selected Python interpreter
+        @rtype str
         """
-        return (
-            self.pythonExecPicker.text(),
-            3 - self.variantComboBox.currentIndex(),
-        )
+        return self.pythonExecPicker.text(),
--- a/eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.ui	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.ui	Sun Jun 21 18:26:12 2020 +0200
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>550</width>
-    <height>150</height>
+    <height>118</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -59,23 +59,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QComboBox" name="variantComboBox">
-     <property name="toolTip">
-      <string>Select the Python variant</string>
-     </property>
-     <item>
-      <property name="text">
-       <string notr="true">Python 3</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string notr="true">Python 2</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-   <item>
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
@@ -97,7 +80,6 @@
  </customwidgets>
  <tabstops>
   <tabstop>pythonExecPicker</tabstop>
-  <tabstop>variantComboBox</tabstop>
   <tabstop>nameEdit</tabstop>
  </tabstops>
  <resources/>
--- a/eric6/VirtualEnv/VirtualenvManager.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/VirtualEnv/VirtualenvManager.py	Sun Jun 21 18:26:12 2020 +0200
@@ -68,15 +68,21 @@
         #   path:           the directory of the virtual environment
         #                   (empty for a global environment)
         #   interpreter:    the path of the Python interpreter
-        #   variant:        Python variant (2 or 3)
+        #   variant:        Python variant (always 3)
         #   is_global:      a flag indicating a global environment
         #   is_conda:       a flag indicating an Anaconda environment
         #   is_remote:      a flag indicating a remotely accessed environment
         #   exec_path:      a string to be prefixed to the PATH environment
         #                   setting
         #
+        envsToDelete = []
         for venvName in environments:
             environment = environments[venvName]
+            if environment["variant"] == 2:
+                # Python2 environment are not supported anymore, delete them
+                envsToDelete.append(venvName)
+                continue
+            
             if (
                 ("is_remote" in environment and environment["is_remote"]) or
                 os.access(environment["interpreter"], os.X_OK)
@@ -91,6 +97,10 @@
                     environment["exec_path"] = ""
                 self.__virtualEnvironments[venvName] = environment
         
+        # now remove unsupported environments
+        for venvName in envsToDelete:
+            del environments[venvName]
+        
         # check, if the interpreter used to run eric is in the environments
         defaultPy = sys.executable.replace("w.exe", ".exe")
         found = False
@@ -104,7 +114,7 @@
             self.__virtualEnvironments[VirtualenvManager.DefaultKey] = {
                 "path": "",
                 "interpreter": defaultPy,
-                "variant": sys.version_info[0],
+                "variant": 3,
                 "is_global": True,
                 "is_conda": False,
                 "is_remote": False,
@@ -186,8 +196,8 @@
                 dia.exec_()
     
     def addVirtualEnv(self, venvName, venvDirectory, venvInterpreter="",
-                      venvVariant=3, isGlobal=False, isConda=False,
-                      isRemote=False, execPath=""):
+                      isGlobal=False, isConda=False, isRemote=False,
+                      execPath=""):
         """
         Public method to add a virtual environment.
         
@@ -197,8 +207,6 @@
         @type str
         @param venvInterpreter interpreter of the virtual environment
         @type str
-        @param venvVariant Python variant of the virtual environment
-        @type int
         @param isGlobal flag indicating a global environment
         @type bool
         @param isConda flag indicating an Anaconda virtual environment
@@ -233,13 +241,13 @@
             )
             dlg = VirtualenvInterpreterSelectionDialog(venvName, venvDirectory)
             if dlg.exec_() == QDialog.Accepted:
-                venvInterpreter, venvVariant = dlg.getData()
+                venvInterpreter = dlg.getData()
         
         if venvInterpreter:
             self.__virtualEnvironments[venvName] = {
                 "path": venvDirectory,
                 "interpreter": venvInterpreter,
-                "variant": venvVariant,
+                "variant": 3,                   # always 3
                 "is_global": isGlobal,
                 "is_conda": isConda,
                 "is_remote": isRemote,
@@ -253,8 +261,7 @@
                 self.__virtualenvManagerDialog.refresh()
     
     def setVirtualEnv(self, venvName, venvDirectory, venvInterpreter,
-                      venvVariant, isGlobal, isConda, isRemote,
-                      execPath):
+                      isGlobal, isConda, isRemote, execPath):
         """
         Public method to change a virtual environment.
         
@@ -264,8 +271,6 @@
         @type str
         @param venvInterpreter interpreter of the virtual environment
         @type str
-        @param venvVariant Python variant of the virtual environment
-        @type int
         @param isGlobal flag indicating a global environment
         @type bool
         @param isConda flag indicating an Anaconda virtual environment
@@ -289,7 +294,7 @@
         self.__virtualEnvironments[venvName] = {
             "path": venvDirectory,
             "interpreter": venvInterpreter,
-            "variant": venvVariant,
+            "variant": 3,                   # always 3
             "is_global": isGlobal,
             "is_conda": isConda,
             "is_remote": isRemote,
@@ -303,7 +308,7 @@
             self.__virtualenvManagerDialog.refresh()
     
     def renameVirtualEnv(self, oldVenvName, venvName, venvDirectory,
-                         venvInterpreter, venvVariant, isGlobal, isConda,
+                         venvInterpreter, isGlobal, isConda,
                          isRemote, execPath):
         """
         Public method to substitute a virtual environment entry with a new
@@ -317,8 +322,6 @@
         @type str
         @param venvInterpreter interpreter of the virtual environment
         @type str
-        @param venvVariant Python variant of the virtual environment
-        @type int
         @param isGlobal flag indicating a global environment
         @type bool
         @param isConda flag indicating an Anaconda virtual environment
@@ -341,8 +344,7 @@
         
         del self.__virtualEnvironments[oldVenvName]
         self.addVirtualEnv(venvName, venvDirectory, venvInterpreter,
-                           venvVariant, isGlobal, isConda, isRemote,
-                           execPath)
+                           isGlobal, isConda, isRemote, execPath)
     
     def deleteVirtualEnvs(self, venvNames):
         """
@@ -539,38 +541,6 @@
         
         return environments
     
-    def getVirtualenvNamesForVariant(self, variant):
-        """
-        Public method to get a list of virtual environments for a given
-        Python variant.
-        
-        @param variant Python variant (2 or 3)
-        @type int
-        @return list of defined virtual environments
-        @rtype list of str
-        """
-        environments = []
-        for venvName in self.__virtualEnvironments:
-            if self.__virtualEnvironments[venvName]["variant"] == variant:
-                environments.append(venvName)
-        
-        return environments
-    
-    def getVirtualenvVariant(self, venvName):
-        """
-        Public method to get the variant of a virtual environment.
-        
-        @param venvName logical name for the virtual environment
-        @type str
-        @return Python variant of the environment
-        @rtype str
-        """
-        if venvName in self.__virtualEnvironments:
-            return "Python{0}".format(
-                self.__virtualEnvironments[venvName]["variant"])
-        else:
-            return ""
-    
     def isGlobalEnvironment(self, venvName):
         """
         Public method to test, if a given environment is a global one.
--- a/eric6/VirtualEnv/VirtualenvManagerDialog.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/VirtualEnv/VirtualenvManagerDialog.py	Sun Jun 21 18:26:12 2020 +0200
@@ -98,12 +98,12 @@
         from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
         dlg = VirtualenvAddEditDialog(self.__manager)
         if dlg.exec_() == QDialog.Accepted:
-            (venvName, venvDirectory, venvInterpreter, venvVariant,
-             isGlobal, isConda, isRemote, execPath) = dlg.getData()
+            (venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
+             isRemote, execPath) = dlg.getData()
             
             self.__manager.addVirtualEnv(
-                venvName, venvDirectory, venvInterpreter, venvVariant,
-                isGlobal, isConda, isRemote, execPath)
+                venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
+                isRemote, execPath)
     
     @pyqtSlot()
     def on_newButton_clicked(self):
@@ -131,16 +131,16 @@
             selectedItem.data(0, VirtualenvManagerDialog.ExecPathRole),
         )
         if dlg.exec_() == QDialog.Accepted:
-            (venvName, venvDirectory, venvInterpreter, venvVariant,
-             isGlobal, isConda, isRemote, execPath) = dlg.getData()
+            (venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
+             isRemote, execPath) = dlg.getData()
             if venvName != oldVenvName:
                 self.__manager.renameVirtualEnv(
                     oldVenvName, venvName, venvDirectory, venvInterpreter,
-                    venvVariant, isGlobal, isConda, isRemote, execPath)
+                    isGlobal, isConda, isRemote, execPath)
             else:
                 self.__manager.setVirtualEnv(
-                    venvName, venvDirectory, venvInterpreter, venvVariant,
-                    isGlobal, isConda, isRemote, execPath)
+                    venvName, venvDirectory, venvInterpreter, isGlobal,
+                    isConda, isRemote, execPath)
     
     @pyqtSlot()
     def on_removeButton_clicked(self):
--- a/eric6/WebBrowser/QtHelp/HelpDocsInstaller.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/WebBrowser/QtHelp/HelpDocsInstaller.py	Sun Jun 21 18:26:12 2020 +0200
@@ -70,7 +70,6 @@
         engine = QHelpEngineCore(self.__collection)
         changes = False
         
-        qt4Docs = ["designer", "linguist", "qt"]
         qt5Docs = [
             "activeqt", "qdoc", "qmake", "qt3d", "qt3drenderer",
             "qtandroidextras", "qtassistant", "qtbluetooth", "qtcanvas3d",
@@ -91,7 +90,7 @@
             "qtwebengine", "qtwebenginewidgets", "qtwebkit",
             "qtwebkitexamples", "qtwebsockets", "qtwebview", "qtwidgets",
             "qtwinextras", "qtx11extras", "qtxml", "qtxmlpatterns"]
-        for qtDocs, version in [(qt4Docs, 4), (qt5Docs, 5)]:
+        for qtDocs, version in [(qt5Docs, 5)]:
             for doc in qtDocs:
                 changes |= self.__installQtDoc(doc, version, engine)
                 self.__mutex.lock()
--- a/eric6/eric6.py	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/eric6.py	Sun Jun 21 18:26:12 2020 +0200
@@ -11,8 +11,6 @@
 of the IDE and starts the Qt event loop.
 """
 
-# TODO: remove support for Qt4 and pyside (1)
-
 import sys
 import os
 
--- a/eric6/i18n/eric6_cs.ts	Sat Jun 20 17:36:20 2020 +0200
+++ b/eric6/i18n/eric6_cs.ts	Sun Jun 21 18:26:12 2020 +0200
@@ -1549,37 +1549,37 @@
 <context>
     <name>BackgroundService</name>
     <message>
-        <location filename="../Utilities/BackgroundService.py" line="131"/>
+        <location filename="../Utilities/BackgroundService.py" line="129"/>
         <source>{0} not configured.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Utilities/BackgroundService.py" line="185"/>
+        <location filename="../Utilities/BackgroundService.py" line="183"/>
         <source>Restart background client?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Utilities/BackgroundService.py" line="211"/>
+        <location filename="../Utilities/BackgroundService.py" line="209"/>
         <source>An error in Erics background client stopped the service.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Utilities/BackgroundService.py" line="424"/>
+        <location filename="../Utilities/BackgroundService.py" line="420"/>
         <source>Eric&apos;s background client disconnected because of an unknown reason.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Utilities/BackgroundService.py" line="430"/>
+        <location filename="../Utilities/BackgroundService.py" line="426"/>
         <source>Background client disconnected.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Utilities/BackgroundService.py" line="185"/>
+        <location filename="../Utilities/BackgroundService.py" line="183"/>
         <source>&lt;p&gt;The background client for &lt;b&gt;{0}&lt;/b&gt; has stopped due to an exception. It&apos;s used by various plug-ins like the different checkers.&lt;/p&gt;&lt;p&gt;Select&lt;ul&gt;&lt;li&gt;&lt;b&gt;&apos;Yes&apos;&lt;/b&gt; to restart the client, but abort the last job&lt;/li&gt;&lt;li&gt;&lt;b&gt;&apos;Retry&apos;&lt;/b&gt; to restart the client and the last job&lt;/li&gt;&lt;li&gt;&lt;b&gt;&apos;No&apos;&lt;/b&gt; to leave the client off.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Note: The client can be restarted by opening and accepting the preferences dialog or reloading/changing the project.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Utilities/BackgroundService.py" line="430"/>
+        <location filename="../Utilities/BackgroundService.py" line="426"/>
         <source>The background client for &lt;b&gt;{0}&lt;/b&gt; disconnected because of an unknown reason.&lt;br&gt;Should it be restarted?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2327,7 +2327,7 @@
         <translation>Hledat v tomto adresáři</translation>
     </message>
     <message>
-        <location filename="../UI/Browser.py" line="572"/>
+        <location filename="../UI/Browser.py" line="570"/>
         <source>New toplevel directory</source>
         <translation>Nový toplevel adresář</translation>
     </message>
@@ -2372,22 +2372,22 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Browser.py" line="503"/>
+        <location filename="../UI/Browser.py" line="501"/>
         <source>Show Mime-Type</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Browser.py" line="476"/>
+        <location filename="../UI/Browser.py" line="474"/>
         <source>The mime type of the file could not be determined.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Browser.py" line="494"/>
+        <location filename="../UI/Browser.py" line="492"/>
         <source>The file has the mime type &lt;b&gt;{0}&lt;/b&gt;.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Browser.py" line="503"/>
+        <location filename="../UI/Browser.py" line="501"/>
         <source>The file has the mime type &lt;b&gt;{0}&lt;/b&gt;.&lt;br/&gt; Shall it be added to the list of text mime types?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3591,7 +3591,7 @@
         <translation type="unfinished">Chyby: {0}</translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginCodeStyleChecker.py" line="248"/>
+        <location filename="../Plugins/PluginCodeStyleChecker.py" line="224"/>
         <source>Fix: {0}</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4049,32 +4049,27 @@
 <context>
     <name>CodeStyleCheckerPlugin</name>
     <message>
-        <location filename="../Plugins/PluginCodeStyleChecker.py" line="360"/>
+        <location filename="../Plugins/PluginCodeStyleChecker.py" line="336"/>
         <source>Check Code Style</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginCodeStyleChecker.py" line="360"/>
+        <location filename="../Plugins/PluginCodeStyleChecker.py" line="336"/>
         <source>&amp;Code Style...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginCodeStyleChecker.py" line="266"/>
+        <location filename="../Plugins/PluginCodeStyleChecker.py" line="242"/>
         <source>Check code style.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginCodeStyleChecker.py" line="364"/>
+        <location filename="../Plugins/PluginCodeStyleChecker.py" line="340"/>
         <source>&lt;b&gt;Check Code Style...&lt;/b&gt;&lt;p&gt;This checks Python files for compliance to the code style conventions given in various PEPs.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Plugins/PluginCodeStyleChecker.py" line="112"/>
-        <source>Python 2 batch check</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Plugins/PluginCodeStyleChecker.py" line="128"/>
+        <location filename="../Plugins/PluginCodeStyleChecker.py" line="107"/>
         <source>Python 3 batch check</source>
         <translation type="unfinished"></translation>
     </message>
@@ -5675,7 +5670,7 @@
         <translation>Plugin Manažer</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="386"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="383"/>
         <source>Printer</source>
         <translation>Tiskárna</translation>
     </message>
@@ -5715,163 +5710,163 @@
         <translation>Debugger</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="233"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="230"/>
         <source>Editor</source>
         <translation>Editor</translation>
     </message>
     <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="233"/>
+        <source>APIs</source>
+        <translation>APIs</translation>
+    </message>
+    <message>
         <location filename="../Preferences/ConfigurationDialog.py" line="236"/>
-        <source>APIs</source>
-        <translation>APIs</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="239"/>
         <source>Autocompletion</source>
         <translation>Autodoplňování</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="247"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="244"/>
         <source>Calltips</source>
         <translation>Rychlé tipy</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="256"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="253"/>
         <source>General</source>
         <translation>Hlavní</translation>
     </message>
     <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="273"/>
+        <source>Typing</source>
+        <translation>Psaní</translation>
+    </message>
+    <message>
         <location filename="../Preferences/ConfigurationDialog.py" line="276"/>
-        <source>Typing</source>
-        <translation>Psaní</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="279"/>
         <source>Exporters</source>
         <translation>Exportery</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="283"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="280"/>
         <source>Highlighters</source>
         <translation>Zvýrazňovače</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="287"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="284"/>
         <source>Filetype Associations</source>
         <translation>Asociace typů souborů</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="291"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="288"/>
         <source>Styles</source>
         <translation>Styly</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="307"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="304"/>
         <source>Help</source>
         <translation>Nápověda</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="393"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="390"/>
         <source>Help Documentation</source>
         <translation>Dokumenty nápovědy</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="314"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="311"/>
         <source>Help Viewers</source>
         <translation>Prohlížeče nápovědy</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="325"/>
-        <source>Project</source>
-        <translation>Projekt</translation>
-    </message>
-    <message>
         <location filename="../Preferences/ConfigurationDialog.py" line="322"/>
+        <source>Project</source>
+        <translation>Projekt</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="319"/>
         <source>Project Viewer</source>
         <translation>Prohlížeč projektu</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="328"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="325"/>
         <source>Multiproject</source>
         <translation>Multiprojekt</translation>
     </message>
     <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="377"/>
+        <source>Interface</source>
+        <translation>Interface</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="336"/>
+        <source>Viewmanager</source>
+        <translation>Viewmanager</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="660"/>
+        <source>Configuration Page Error</source>
+        <translation>Chyba na straně konfigurace</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="256"/>
+        <source>Filehandling</source>
+        <translation>Manažer souborů</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="260"/>
+        <source>Searching</source>
+        <translation>Vyhledávání</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="395"/>
+        <source>Appearance</source>
+        <translation>Vzhled</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="247"/>
+        <source>QScintilla</source>
+        <translation>QScintilla</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="267"/>
+        <source>Style</source>
+        <translation>Styl</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="295"/>
+        <source>Properties</source>
+        <translation>Nastavení</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="578"/>
+        <source>Preferences</source>
+        <translation>Předvolby</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationDialog.py" line="583"/>
+        <source>Please select an entry of the list 
+to display the configuration page.</source>
+        <translation>Pro zobrazení strany s konfigurací vyberte položku ze seznamu.</translation>
+    </message>
+    <message>
         <location filename="../Preferences/ConfigurationDialog.py" line="380"/>
-        <source>Interface</source>
-        <translation>Interface</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="339"/>
-        <source>Viewmanager</source>
-        <translation>Viewmanager</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="663"/>
-        <source>Configuration Page Error</source>
-        <translation>Chyba na straně konfigurace</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="259"/>
-        <source>Filehandling</source>
-        <translation>Manažer souborů</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="263"/>
-        <source>Searching</source>
-        <translation>Vyhledávání</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="398"/>
-        <source>Appearance</source>
-        <translation>Vzhled</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="250"/>
-        <source>QScintilla</source>
-        <translation>QScintilla</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="270"/>
-        <source>Style</source>
-        <translation>Styl</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="298"/>
-        <source>Properties</source>
-        <translation>Nastavení</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="581"/>
-        <source>Preferences</source>
-        <translation>Předvolby</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="586"/>
-        <source>Please select an entry of the list 
-to display the configuration page.</source>
-        <translation>Pro zobrazení strany s konfigurací vyberte položku ze seznamu.</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="383"/>
         <source>Network</source>
         <translation>Síť</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="413"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="410"/>
         <source>Spell checking</source>
         <translation>Kontrola pravopisu</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="229"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="226"/>
         <source>Python3</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="663"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="660"/>
         <source>&lt;p&gt;The configuration page &lt;b&gt;{0}&lt;/b&gt; could not be loaded.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Konfigurační stranu &lt;b&gt;{0}&lt;/b&gt; nelze načíst.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="295"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="292"/>
         <source>Keywords</source>
         <translation>Klíčová slova</translation>
     </message>
@@ -5881,17 +5876,17 @@
         <translation>Spolupráce</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="427"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="424"/>
         <source>Tray Starter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="409"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="406"/>
         <source>VirusTotal Interface</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="389"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="386"/>
         <source>Security</source>
         <translation type="unfinished">Bezpečnost</translation>
     </message>
@@ -5906,12 +5901,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="273"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="270"/>
         <source>Code Checkers</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="401"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="398"/>
         <source>eric6 Web Browser</source>
         <translation type="unfinished">eric5 web prohlížeč {6 ?}</translation>
     </message>
@@ -5926,27 +5921,27 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="517"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="514"/>
         <source>Enter search text...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="302"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="299"/>
         <source>Mouse Click Handlers</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="405"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="402"/>
         <source>Flash Cookie Manager</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="440"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="437"/>
         <source>Hex Editor</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="343"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="340"/>
         <source>Web Browser</source>
         <translation type="unfinished"></translation>
     </message>
@@ -5956,7 +5951,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="253"/>
+        <location filename="../Preferences/ConfigurationDialog.py" line="250"/>
         <source>Documentation Viewer</source>
         <translation type="unfinished"></translation>
     </message>
@@ -5966,11 +5961,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationDialog.py" line="226"/>
-        <source>Python2</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../Preferences/ConfigurationDialog.py" line="138"/>
         <source>Conda</source>
         <translation type="unfinished"></translation>
@@ -6635,7 +6625,7 @@
         <translation>&amp;Filtr pro:</translation>
     </message>
     <message>
-        <location filename="../Project/CreateDialogCodeDialog.py" line="580"/>
+        <location filename="../Project/CreateDialogCodeDialog.py" line="561"/>
         <source>Code Generation</source>
         <translation>Generování kódu</translation>
     </message>
@@ -6660,17 +6650,17 @@
         <translation>&lt;p&gt;Byla nalezena chyba načtená z &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;{1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Project/CreateDialogCodeDialog.py" line="440"/>
+        <location filename="../Project/CreateDialogCodeDialog.py" line="429"/>
         <source>&lt;p&gt;Could not open the code template file &quot;{0}&quot;.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Template soubor &lt;b&gt;{0}&lt;/b&gt; nelze otevřít.&lt;/p&gt;&lt;p&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Project/CreateDialogCodeDialog.py" line="478"/>
+        <location filename="../Project/CreateDialogCodeDialog.py" line="467"/>
         <source>&lt;p&gt;Could not open the source file &quot;{0}&quot;.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Nelze ovevřít source soubor &quot;{0}&quot;.&lt;/p&gt;&lt;p&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Project/CreateDialogCodeDialog.py" line="580"/>
+        <location filename="../Project/CreateDialogCodeDialog.py" line="561"/>
         <source>&lt;p&gt;Could not write the source file &quot;{0}&quot;.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Nelze zapsat do source souboru &quot;{0}&quot;.&lt;/p&gt;&lt;p&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
@@ -6679,6 +6669,16 @@
         <source>&lt;p&gt;The project specific Python interpreter &lt;b&gt;{0}&lt;/b&gt; could not be started or did not finish within 30 seconds.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../Project/CreateDialogCodeDialog.py" line="389"/>
+        <source>&lt;p&gt;Code generation for project language &quot;{0}&quot; is not supported.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Project/CreateDialogCodeDialog.py" line="417"/>
+        <source>&lt;p&gt;No code template file available for project type &quot;{0}&quot;.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>Crypto</name>
@@ -6706,24 +6706,24 @@
 <context>
     <name>DebugServer</name>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="184"/>
+        <location filename="../Debugger/DebugServer.py" line="183"/>
         <source>created</source>
         <comment>must be same as in EditWatchpointDialog</comment>
         <translation>vytvořeno</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="186"/>
+        <location filename="../Debugger/DebugServer.py" line="185"/>
         <source>changed</source>
         <comment>must be same as in EditWatchpointDialog</comment>
         <translation>změněno</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="783"/>
+        <location filename="../Debugger/DebugServer.py" line="774"/>
         <source>Connection from illegal host</source>
         <translation>Spojení z ilegálního hosta</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="1578"/>
+        <location filename="../Debugger/DebugServer.py" line="1569"/>
         <source>
 Not connected
 </source>
@@ -6732,39 +6732,39 @@
 </translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="783"/>
+        <location filename="../Debugger/DebugServer.py" line="774"/>
         <source>&lt;p&gt;A connection was attempted by the illegal host &lt;b&gt;{0}&lt;/b&gt;. Accept this connection?&lt;/p&gt;</source>
         <translation>&lt;p&gt;Pokus o spojení z ilegálního hosta &lt;b&gt;{0}&lt;/b&gt;. Přijmout toto spojení?&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="1791"/>
+        <location filename="../Debugger/DebugServer.py" line="1782"/>
         <source>Passive debug connection received
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="1805"/>
+        <location filename="../Debugger/DebugServer.py" line="1796"/>
         <source>Passive debug connection closed
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="330"/>
+        <location filename="../Debugger/DebugServer.py" line="321"/>
         <source>Register Debugger Interface</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="330"/>
+        <location filename="../Debugger/DebugServer.py" line="321"/>
         <source>&lt;p&gt;The debugger interface &lt;b&gt;{0}&lt;/b&gt; has already been registered. Ignoring this request.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="1394"/>
+        <location filename="../Debugger/DebugServer.py" line="1385"/>
         <source>Start Debugger</source>
         <translation type="unfinished">Spustit debuger</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugServer.py" line="1394"/>
+        <location filename="../Debugger/DebugServer.py" line="1385"/>
         <source>&lt;p&gt;The debugger type &lt;b&gt;{0}&lt;/b&gt; is not supported or not configured.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
@@ -6772,7 +6772,7 @@
 <context>
     <name>DebugUI</name>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1838"/>
+        <location filename="../Debugger/DebugUI.py" line="1836"/>
         <source>Run Script</source>
         <translation>Spustit skript</translation>
     </message>
@@ -6792,7 +6792,7 @@
         <translation>&lt;b&gt;Spustit skript&lt;/b&gt;&lt;p&gt;Nastavení parametrů příkazové řádky a spuštění skriptu bez debugeru. Pokud jsou v souboru neuložené změny, měly by se nejdříve uložit.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1853"/>
+        <location filename="../Debugger/DebugUI.py" line="1851"/>
         <source>Run Project</source>
         <translation>Spustit projekt</translation>
     </message>
@@ -6892,7 +6892,7 @@
         <translation>&lt;b&gt;Profilovat projekt&lt;/b&gt;&lt;p&gt;Nastavení parametrů příkazové řádky a spuštění projektu s profilováním kódu. Pokud jsou v projektu neuložené změny, měly by se nejdříve uložit.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1977"/>
+        <location filename="../Debugger/DebugUI.py" line="1975"/>
         <source>Debug Script</source>
         <translation>Debugovat skript</translation>
     </message>
@@ -6912,7 +6912,7 @@
         <translation>&lt;b&gt;Debugovat skript&lt;/b&gt;&lt;p&gt;Nastavení parametrů příkazové řádky a aktuální řádky jako první python příkaz v aktuálním editačním okně. Pokud jsou ve skriptu neuložené změny, měly by se nejdříve uložit.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1993"/>
+        <location filename="../Debugger/DebugUI.py" line="1991"/>
         <source>Debug Project</source>
         <translation>Debugovat projekt</translation>
     </message>
@@ -7189,52 +7189,52 @@
         <translation>Debug</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1102"/>
+        <location filename="../Debugger/DebugUI.py" line="1100"/>
         <source>The program being debugged contains an unspecified syntax error.</source>
         <translation>Program, který je právě debugován, obsahuje nespecifikovanou syntaktickou chybu.</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1139"/>
+        <location filename="../Debugger/DebugUI.py" line="1137"/>
         <source>An unhandled exception occured. See the shell window for details.</source>
         <translation>Objevila se neošetřená výjimka. Detaily naleznete v shell okně.</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1268"/>
+        <location filename="../Debugger/DebugUI.py" line="1266"/>
         <source>The program being debugged has terminated unexpectedly.</source>
         <translation>Debugovaný program byl neočekávaně ukončen.</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1339"/>
+        <location filename="../Debugger/DebugUI.py" line="1337"/>
         <source>Breakpoint Condition Error</source>
         <translation>Chyba v podmíněném breakpointu</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1581"/>
+        <location filename="../Debugger/DebugUI.py" line="1579"/>
         <source>Coverage of Project</source>
         <translation>Pokrytí projektu</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1568"/>
+        <location filename="../Debugger/DebugUI.py" line="1566"/>
         <source>Coverage of Script</source>
         <translation>Pokrytí skriptu</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1853"/>
+        <location filename="../Debugger/DebugUI.py" line="1851"/>
         <source>There is no main script defined for the current project. Aborting</source>
         <translation>V aktuálním projektu není definován hlavní skript. Zrušeno</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1716"/>
+        <location filename="../Debugger/DebugUI.py" line="1714"/>
         <source>Profile of Project</source>
         <translation>Profilovat projekt</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1703"/>
+        <location filename="../Debugger/DebugUI.py" line="1701"/>
         <source>Profile of Script</source>
         <translation>Profilovat skript</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1993"/>
+        <location filename="../Debugger/DebugUI.py" line="1991"/>
         <source>There is no main script defined for the current project. No debugging possible.</source>
         <translation>V aktuálním projektu není definován hlavní skript. Debugování není možné.</translation>
     </message>
@@ -7244,12 +7244,12 @@
         <translation>Zastavit běžící skript.</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1375"/>
+        <location filename="../Debugger/DebugUI.py" line="1373"/>
         <source>Watch Expression Error</source>
         <translation>Chyba sledovacího bodu</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1415"/>
+        <location filename="../Debugger/DebugUI.py" line="1413"/>
         <source>Watch expression already exists</source>
         <translation>Sledovací bod již existuje</translation>
     </message>
@@ -7286,42 +7286,42 @@
         <translation></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1121"/>
+        <location filename="../Debugger/DebugUI.py" line="1119"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; contains the syntax error &lt;b&gt;{1}&lt;/b&gt; at line &lt;b&gt;{2}&lt;/b&gt;, character &lt;b&gt;{3}&lt;/b&gt;.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; na řádce &lt;b&gt;{1}&lt;/b&gt;, písmeno &lt;b&gt;{2}&lt;/b&gt;, obsahuje syntaktickou chybu &lt;b&gt;{3}&lt;/b&gt;.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1189"/>
+        <location filename="../Debugger/DebugUI.py" line="1187"/>
         <source>&lt;p&gt;The debugged program raised the exception &lt;b&gt;{0}&lt;/b&gt;&lt;br&gt;&quot;&lt;b&gt;{1}&lt;/b&gt;&quot;&lt;br&gt;File: &lt;b&gt;{2}&lt;/b&gt;, Line: &lt;b&gt;{3}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Break here?&lt;/p&gt;</source>
         <translation>&lt;p&gt;Debugovaný program vyvolal výjimku  &lt;b&gt;{0}&lt;/b&gt;&lt;br&gt;&quot;&lt;b&gt;{1}&lt;/b&gt;&quot;&lt;br&gt;Soubor: &lt;b&gt;{2}&lt;/b&gt;, řádek: &lt;b&gt;{3}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Zastavit zde?&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1204"/>
+        <location filename="../Debugger/DebugUI.py" line="1202"/>
         <source>&lt;p&gt;The debugged program raised the exception &lt;b&gt;{0}&lt;/b&gt;&lt;br&gt;&quot;&lt;b&gt;{1}&lt;/b&gt;&quot;&lt;/p&gt;</source>
         <translation>&lt;p&gt;Debugovaný program vyvolal výjimku  &lt;b&gt;{0}&lt;/b&gt;&lt;br&gt;&quot;&lt;b&gt;{1}&lt;/b&gt;&quot;&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1339"/>
+        <location filename="../Debugger/DebugUI.py" line="1337"/>
         <source>&lt;p&gt;The condition of the breakpoint &lt;b&gt;{0}, {1}&lt;/b&gt; contains a syntax error.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Podmínka breakpointu &lt;b&gt;{0}, {1}&lt;/b&gt; obsahuje syntaktickou chybu.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1375"/>
+        <location filename="../Debugger/DebugUI.py" line="1373"/>
         <source>&lt;p&gt;The watch expression &lt;b&gt;{0}&lt;/b&gt; contains a syntax error.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Sledovací bod &lt;b&gt;{0}&lt;/b&gt; obsahuje syntaktickou chybu.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1405"/>
+        <location filename="../Debugger/DebugUI.py" line="1403"/>
         <source>&lt;p&gt;A watch expression &apos;&lt;b&gt;{0}&lt;/b&gt;&apos; already exists.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Sledovací bod &apos;&lt;b&gt;{0}&lt;/b&gt;&apos; již existuje.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1410"/>
+        <location filename="../Debugger/DebugUI.py" line="1408"/>
         <source>&lt;p&gt;A watch expression &apos;&lt;b&gt;{0}&lt;/b&gt;&apos; for the variable &lt;b&gt;{1}&lt;/b&gt; already exists.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Sledovací bod &apos;&lt;b&gt;{0}&lt;/b&gt;&apos; pro proměnnou &lt;b&gt;{1}&lt;/b&gt; již existuje.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1071"/>
+        <location filename="../Debugger/DebugUI.py" line="1069"/>
         <source>Program terminated</source>
         <translation type="unfinished"></translation>
     </message>
@@ -7341,51 +7341,51 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1254"/>
+        <location filename="../Debugger/DebugUI.py" line="1252"/>
         <source>&lt;p&gt;The program generate the signal &quot;{0}&quot;.&lt;br/&gt;File: &lt;b&gt;{1}&lt;/b&gt;, Line: &lt;b&gt;{2}&lt;/b&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1038"/>
+        <location filename="../Debugger/DebugUI.py" line="1036"/>
         <source>&lt;p&gt;Message: {0}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1043"/>
+        <location filename="../Debugger/DebugUI.py" line="1041"/>
         <source>&lt;p&gt;The program has terminated with an exit status of {0}.&lt;/p&gt;{1}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1048"/>
+        <location filename="../Debugger/DebugUI.py" line="1046"/>
         <source>&lt;p&gt;&lt;b&gt;{0}&lt;/b&gt; has terminated with an exit status of {1}.&lt;/p&gt;{2}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1056"/>
+        <location filename="../Debugger/DebugUI.py" line="1054"/>
         <source>Message: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1062"/>
+        <location filename="../Debugger/DebugUI.py" line="1060"/>
         <source>The program has terminated with an exit status of {0}.
 {1}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1066"/>
+        <location filename="../Debugger/DebugUI.py" line="1064"/>
         <source>&quot;{0}&quot; has terminated with an exit status of {1}.
 {2}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1076"/>
+        <location filename="../Debugger/DebugUI.py" line="1074"/>
         <source>The program has terminated with an exit status of {0}.
 {1}
 </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1080"/>
+        <location filename="../Debugger/DebugUI.py" line="1078"/>
         <source>&quot;{0}&quot; has terminated with an exit status of {1}.
 {2}
 </source>
@@ -7412,7 +7412,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebugUI.py" line="1314"/>
+        <location filename="../Debugger/DebugUI.py" line="1312"/>
         <source>No locals available.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -7911,48 +7911,48 @@
 <context>
     <name>DebuggerInterfacePython</name>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="479"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="459"/>
         <source>Start Debugger</source>
         <translation type="unfinished">Spustit debuger</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="1032"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="1012"/>
         <source>Parent Process</source>
         <translation type="unfinished">Rodičovský proces</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="1033"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="1013"/>
         <source>Child process</source>
         <translation type="unfinished">Dětský proces</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="1034"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="1014"/>
         <source>Client forking</source>
         <translation type="unfinished">Větvení klienta</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="1034"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="1014"/>
         <source>Select the fork branch to follow.</source>
         <translation type="unfinished">Pokračovat ve fork větvi.</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="479"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="459"/>
         <source>&lt;p&gt;The debugger backend could not be started.&lt;/p&gt;</source>
         <translation type="unfinished">&lt;p&gt;Debugovací backend nelze spustit.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="1080"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="1060"/>
         <source>Debug Protocol Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="1080"/>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="1060"/>
         <source>&lt;p&gt;The response received from the debugger backend could not be decoded. Please report this issue with the received data to the eric bugs email address.&lt;/p&gt;&lt;p&gt;Error: {0}&lt;/p&gt;&lt;p&gt;Data:&lt;br/&gt;{1}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Debugger/DebuggerInterfacePython.py" line="374"/>
-        <source>&lt;p&gt;No suitable {0} environment configured.&lt;/p&gt;</source>
+        <location filename="../Debugger/DebuggerInterfacePython.py" line="354"/>
+        <source>&lt;p&gt;No suitable Python3 environment configured.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -8097,7 +8097,7 @@
         <translation>Nenastavovat kódování debug klienta</translation>
     </message>
     <message>
-        <location filename="../Project/DebuggerPropertiesDialog.py" line="133"/>
+        <location filename="../Project/DebuggerPropertiesDialog.py" line="130"/>
         <source>All Files (*)</source>
         <translation>Všechny soubory (*)</translation>
     </message>
@@ -8149,102 +8149,77 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="17"/>
         <source>&lt;b&gt;Configure Python2 Debugger&lt;/b&gt;</source>
-        <translation type="unfinished">&lt;b&gt;Konfigurace Python debugeru&lt;/b&gt;</translation>
+        <translation type="obsolete">&lt;b&gt;Konfigurace Python debugeru&lt;/b&gt;</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="37"/>
         <source>Python2 Virtual Environment</source>
-        <translation type="unfinished">Python interpret pro Debug klienta</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="43"/>
-        <source>Select the virtual environment to be used</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="50"/>
-        <source>Press to open the virtual environment manager dialog</source>
-        <translation type="unfinished"></translation>
+        <translation type="obsolete">Python interpret pro Debug klienta</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="63"/>
         <source>Debug Client Type</source>
-        <translation type="unfinished">Typ Debug klienta</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="75"/>
-        <source>Enter the path of the Debug Client to be used.  Leave empty to use the default.</source>
-        <translation type="unfinished"></translation>
+        <translation type="obsolete">Typ Debug klienta</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="82"/>
         <source>Select the standard debug client</source>
-        <translation type="unfinished">Výběr multi threadového debug klienta</translation>
+        <translation type="obsolete">Výběr multi threadového debug klienta</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="85"/>
         <source>Standard</source>
-        <translation type="unfinished">Standard</translation>
+        <translation type="obsolete">Standard</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="92"/>
         <source>Select the custom selected debug client</source>
-        <translation type="unfinished">Zapnout vybraného obvyklého debug klienta</translation>
+        <translation type="obsolete">Zapnout vybraného obvyklého debug klienta</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="95"/>
         <source>Custom</source>
-        <translation type="unfinished">Obvyklý</translation>
+        <translation type="obsolete">Obvyklý</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="105"/>
         <source>Source association</source>
-        <translation type="unfinished">Asociace zdroje</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="111"/>
-        <source>Please configure the associated file extensions on the &apos;Python&apos; page.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="143"/>
-        <source>Press to update the display of the source associations</source>
-        <translation type="unfinished"></translation>
+        <translation type="obsolete">Asociace zdroje</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="146"/>
         <source>Refresh</source>
-        <translation type="unfinished">Obnovit</translation>
+        <translation type="obsolete">Obnovit</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="171"/>
         <source>Select, to redirect stdin, stdout and stderr of the program being debugged to the eric6 IDE</source>
-        <translation type="unfinished">Vyberte pro přesměrování stdin, stdout, a stderr programu, který je debugován v eric5 IDE {6 ?}</translation>
+        <translation type="obsolete">Vyberte pro přesměrování stdin, stdout, a stderr programu, který je debugován v eric5 IDE {6 ?}</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="174"/>
         <source>Redirect stdin/stdout/stderr</source>
-        <translation type="unfinished">Přesměrování stdin/stdout/stderr</translation>
+        <translation type="obsolete">Přesměrování stdin/stdout/stderr</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="181"/>
         <source>Select to not set the debug client encoding</source>
-        <translation type="unfinished">Nenastavovat kódování debug klienta</translation>
+        <translation type="obsolete">Nenastavovat kódování debug klienta</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.ui" line="184"/>
         <source>Don&apos;t set the encoding of the debug client</source>
-        <translation type="unfinished">Nenastavovat kódování debug klienta</translation>
+        <translation type="obsolete">Nenastavovat kódování debug klienta</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.py" line="44"/>
         <source>Press to select the Debug Client via a file selection dialog</source>
-        <translation type="unfinished">Stisknout pro výběr klienta debugeru přes dialog výběru souborů</translation>
+        <translation type="obsolete">Stisknout pro výběr klienta debugeru přes dialog výběru souborů</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/DebuggerPython2Page.py" line="46"/>
         <source>Python Files (*.py *.py2)</source>
-        <translation type="unfinished">Python soubory (*.py *.py3) {2)?}</translation>
+        <translation type="obsolete">Python soubory (*.py *.py3) {2)?}</translation>
     </message>
 </context>
 <context>
@@ -11218,562 +11193,562 @@
 <context>
     <name>Editor</name>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3107"/>
+        <location filename="../QScintilla/Editor.py" line="3095"/>
         <source>Open File</source>
         <translation>Otevřít soubor</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="769"/>
+        <source>Undo</source>
+        <translation>Vrátit</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="772"/>
+        <source>Redo</source>
+        <translation>Znovu použít</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="775"/>
+        <source>Revert to last saved state</source>
+        <translation>Vrátit k poslednímu uloženému stavu</translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="779"/>
-        <source>Undo</source>
-        <translation>Vrátit</translation>
+        <source>Cut</source>
+        <translation>Vyjmout</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="782"/>
-        <source>Redo</source>
-        <translation>Znovu použít</translation>
+        <source>Copy</source>
+        <translation>Kopírovat</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="785"/>
-        <source>Revert to last saved state</source>
-        <translation>Vrátit k poslednímu uloženému stavu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="789"/>
-        <source>Cut</source>
-        <translation>Vyjmout</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="792"/>
-        <source>Copy</source>
-        <translation>Kopírovat</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="795"/>
         <source>Paste</source>
         <translation>Vložit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="803"/>
+        <location filename="../QScintilla/Editor.py" line="793"/>
         <source>Indent</source>
         <translation>Odsadit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="806"/>
+        <location filename="../QScintilla/Editor.py" line="796"/>
         <source>Unindent</source>
         <translation>Zrušit odsazení</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="809"/>
+        <location filename="../QScintilla/Editor.py" line="799"/>
         <source>Comment</source>
         <translation>Vytvořit komentář</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="802"/>
+        <source>Uncomment</source>
+        <translation>Zrušit komentář</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="805"/>
+        <source>Stream Comment</source>
+        <translation>Proudový komentář</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="808"/>
+        <source>Box Comment</source>
+        <translation>Obdélníkový komentář</translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="812"/>
-        <source>Uncomment</source>
-        <translation>Zrušit komentář</translation>
+        <source>Select to brace</source>
+        <translation>Vybrat až po závorku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="814"/>
+        <source>Select all</source>
+        <translation>Vybrat vše</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="815"/>
-        <source>Stream Comment</source>
-        <translation>Proudový komentář</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="818"/>
-        <source>Box Comment</source>
-        <translation>Obdélníkový komentář</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="822"/>
-        <source>Select to brace</source>
-        <translation>Vybrat až po závorku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="824"/>
-        <source>Select all</source>
-        <translation>Vybrat vše</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="825"/>
         <source>Deselect all</source>
         <translation>Zrušit celý výběr</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="843"/>
+        <location filename="../QScintilla/Editor.py" line="833"/>
         <source>Shorten empty lines</source>
         <translation>Zkrátit prázdné řádky</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="850"/>
+        <location filename="../QScintilla/Editor.py" line="840"/>
         <source>Use Monospaced Font</source>
         <translation>Použít neporoporcionální font</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="855"/>
+        <location filename="../QScintilla/Editor.py" line="845"/>
         <source>Autosave enabled</source>
         <translation>Zapnout autosave</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="898"/>
+        <location filename="../QScintilla/Editor.py" line="888"/>
         <source>Close</source>
         <translation>Zavřít</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="904"/>
+        <location filename="../QScintilla/Editor.py" line="894"/>
         <source>Save</source>
         <translation>Uložit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="907"/>
+        <location filename="../QScintilla/Editor.py" line="897"/>
         <source>Save As...</source>
         <translation>Uložit jako...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="923"/>
+        <location filename="../QScintilla/Editor.py" line="913"/>
         <source>Print</source>
         <translation>Tisk</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="952"/>
+        <location filename="../QScintilla/Editor.py" line="942"/>
         <source>Complete from Document</source>
         <translation type="unfinished">z dokumentu</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="954"/>
+        <location filename="../QScintilla/Editor.py" line="944"/>
         <source>Complete from APIs</source>
         <translation type="unfinished">z API</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="956"/>
+        <location filename="../QScintilla/Editor.py" line="946"/>
         <source>Complete from Document and APIs</source>
         <translation type="unfinished">z dokumentu a API</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="970"/>
+        <location filename="../QScintilla/Editor.py" line="960"/>
         <source>Check</source>
         <translation>Zkontrolovat</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="990"/>
+        <location filename="../QScintilla/Editor.py" line="980"/>
         <source>Show</source>
         <translation>Zobrazit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="992"/>
+        <location filename="../QScintilla/Editor.py" line="982"/>
         <source>Code metrics...</source>
         <translation>Metrika kódu...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="993"/>
+        <location filename="../QScintilla/Editor.py" line="983"/>
         <source>Code coverage...</source>
         <translation>Pokrytí kódu...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="995"/>
+        <location filename="../QScintilla/Editor.py" line="985"/>
         <source>Show code coverage annotations</source>
         <translation>Zobrazit poznámky pokrytí kódu</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="998"/>
+        <location filename="../QScintilla/Editor.py" line="988"/>
         <source>Hide code coverage annotations</source>
         <translation>Skrýt poznámky pokrytí kódu</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1001"/>
+        <location filename="../QScintilla/Editor.py" line="991"/>
         <source>Profile data...</source>
         <translation>Profilovat data...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1014"/>
+        <location filename="../QScintilla/Editor.py" line="1004"/>
         <source>Diagrams</source>
         <translation>Diagramy</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1016"/>
+        <location filename="../QScintilla/Editor.py" line="1006"/>
         <source>Class Diagram...</source>
         <translation>Diagram třídy...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1018"/>
+        <location filename="../QScintilla/Editor.py" line="1008"/>
         <source>Package Diagram...</source>
         <translation>Diagram balíčku...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1020"/>
+        <location filename="../QScintilla/Editor.py" line="1010"/>
         <source>Imports Diagram...</source>
         <translation>Diagram importů...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1022"/>
+        <location filename="../QScintilla/Editor.py" line="1012"/>
         <source>Application Diagram...</source>
         <translation>Diagram aplikace...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1040"/>
+        <location filename="../QScintilla/Editor.py" line="1030"/>
         <source>Languages</source>
         <translation>Jazyky</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1173"/>
+        <location filename="../QScintilla/Editor.py" line="1163"/>
         <source>No Language</source>
         <translation>Žádný jazyk</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1220"/>
+        <location filename="../QScintilla/Editor.py" line="1210"/>
         <source>Toggle bookmark</source>
         <translation>Přepnout záložku</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1222"/>
+        <location filename="../QScintilla/Editor.py" line="1212"/>
         <source>Next bookmark</source>
         <translation>Následující záložka</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1224"/>
+        <location filename="../QScintilla/Editor.py" line="1214"/>
         <source>Previous bookmark</source>
         <translation>Předchozí záložka</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1226"/>
+        <location filename="../QScintilla/Editor.py" line="1216"/>
         <source>Clear all bookmarks</source>
         <translation>Zrušit všechny záložky</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1300"/>
+        <location filename="../QScintilla/Editor.py" line="1290"/>
         <source>Goto syntax error</source>
         <translation>Jít na chybu syntaxe</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1304"/>
+        <location filename="../QScintilla/Editor.py" line="1294"/>
         <source>Show syntax error message</source>
         <translation>Zobrazit hlášení syntaktické chyby</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1309"/>
+        <location filename="../QScintilla/Editor.py" line="1299"/>
         <source>Clear syntax error</source>
         <translation>Zrušit chybu syntaxe</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="1225"/>
+        <source>Toggle breakpoint</source>
+        <translation>Přepnout breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1227"/>
+        <source>Toggle temporary breakpoint</source>
+        <translation>Přepnout dočasný breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1230"/>
+        <source>Edit breakpoint...</source>
+        <translation>Editovat breakpoint...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5603"/>
+        <source>Enable breakpoint</source>
+        <translation>Aktivovat breakpoint</translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="1235"/>
-        <source>Toggle breakpoint</source>
-        <translation>Přepnout breakpoint</translation>
+        <source>Next breakpoint</source>
+        <translation>Následující breakpoint</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="1237"/>
-        <source>Toggle temporary breakpoint</source>
-        <translation>Přepnout dočasný breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1240"/>
-        <source>Edit breakpoint...</source>
-        <translation>Editovat breakpoint...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5616"/>
-        <source>Enable breakpoint</source>
-        <translation>Aktivovat breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1245"/>
-        <source>Next breakpoint</source>
-        <translation>Následující breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1247"/>
         <source>Previous breakpoint</source>
         <translation>Předchozí breakpoint</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1252"/>
+        <location filename="../QScintilla/Editor.py" line="1242"/>
         <source>Clear all breakpoints</source>
         <translation>Zrušit všechny breakpointy</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1331"/>
+        <location filename="../QScintilla/Editor.py" line="1321"/>
         <source>Next uncovered line</source>
         <translation>Následující odkrytá řádka</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1335"/>
+        <location filename="../QScintilla/Editor.py" line="1325"/>
         <source>Previous uncovered line</source>
         <translation>Předchozí odkrytá řádka</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1340"/>
+        <location filename="../QScintilla/Editor.py" line="1330"/>
         <source>Next task</source>
         <translation>Následující úloha</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1344"/>
+        <location filename="../QScintilla/Editor.py" line="1334"/>
         <source>Previous task</source>
         <translation>Předchozí úloha</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1956"/>
+        <location filename="../QScintilla/Editor.py" line="1942"/>
         <source>Modification of Read Only file</source>
         <translation>Modifikace souboru otevřeného jen pro čtení</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1956"/>
+        <location filename="../QScintilla/Editor.py" line="1942"/>
         <source>You are attempting to change a read only file. Please save to a different file first.</source>
         <translation>Pokoušíte se změnit soubor, který je otevřen jen pro čtení. Prosím, uložte jej nejdříve do jiného souboru.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="2664"/>
+        <location filename="../QScintilla/Editor.py" line="2652"/>
         <source>Printing...</source>
         <translation>Tisk...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="2681"/>
+        <location filename="../QScintilla/Editor.py" line="2669"/>
         <source>Printing completed</source>
         <translation>Tisk je hotov</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="2683"/>
+        <location filename="../QScintilla/Editor.py" line="2671"/>
         <source>Error while printing</source>
         <translation>Chyba během tisku</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="2686"/>
+        <location filename="../QScintilla/Editor.py" line="2674"/>
         <source>Printing aborted</source>
         <translation>Tisk byl zrušen</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3296"/>
+        <location filename="../QScintilla/Editor.py" line="3284"/>
         <source>Save File</source>
         <translation>Uložit soubor</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3047"/>
+        <location filename="../QScintilla/Editor.py" line="3035"/>
         <source>File Modified</source>
         <translation>Soubor je modifikován</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="4777"/>
+        <location filename="../QScintilla/Editor.py" line="4765"/>
         <source>Autocompletion</source>
         <translation>Autodoplňování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="4777"/>
+        <location filename="../QScintilla/Editor.py" line="4765"/>
         <source>Autocompletion is not available because there is no autocompletion source set.</source>
         <translation>Autodoplňování není dostupné protože zdrojová část autodoplňování nebyla nalezena.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="5619"/>
+        <location filename="../QScintilla/Editor.py" line="5606"/>
         <source>Disable breakpoint</source>
         <translation>Deaktivovat breakpoint</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="5994"/>
+        <location filename="../QScintilla/Editor.py" line="5981"/>
         <source>Code Coverage</source>
         <translation>Pokrytí kódu</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="5994"/>
+        <location filename="../QScintilla/Editor.py" line="5981"/>
         <source>Please select a coverage file</source>
         <translation>Prosím, vyberte soubor s pokrytím kódu</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6057"/>
+        <location filename="../QScintilla/Editor.py" line="6044"/>
         <source>Show Code Coverage Annotations</source>
         <translation>Zobrazit poznámky pokrytí kódu</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6050"/>
+        <location filename="../QScintilla/Editor.py" line="6037"/>
         <source>All lines have been covered.</source>
         <translation>Všechny řádky byly pokryty.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6057"/>
+        <location filename="../QScintilla/Editor.py" line="6044"/>
         <source>There is no coverage file available.</source>
         <translation>Soubor s pokrytím není dostupný.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6174"/>
+        <location filename="../QScintilla/Editor.py" line="6161"/>
         <source>Profile Data</source>
         <translation>Profilovat data</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6174"/>
+        <location filename="../QScintilla/Editor.py" line="6161"/>
         <source>Please select a profile file</source>
         <translation>Prosím, vyberte soubor s profilem</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6336"/>
+        <location filename="../QScintilla/Editor.py" line="6323"/>
         <source>Syntax Error</source>
         <translation>Chyba syntaxe</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6336"/>
+        <location filename="../QScintilla/Editor.py" line="6323"/>
         <source>No syntax error message available.</source>
         <translation>Hlášení syntaktické chyby není dostupné.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6725"/>
+        <location filename="../QScintilla/Editor.py" line="6712"/>
         <source>Macro Name</source>
         <translation>Název makra</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6725"/>
+        <location filename="../QScintilla/Editor.py" line="6712"/>
         <source>Select a macro name:</source>
         <translation>Vyberte název makra:</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6753"/>
+        <location filename="../QScintilla/Editor.py" line="6740"/>
         <source>Load macro file</source>
         <translation>Načíst soubor makra</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6796"/>
+        <location filename="../QScintilla/Editor.py" line="6783"/>
         <source>Macro files (*.macro)</source>
         <translation>Macro soubory (*.macro)</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6776"/>
+        <location filename="../QScintilla/Editor.py" line="6763"/>
         <source>Error loading macro</source>
         <translation>Chyba při načítání makra</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6796"/>
+        <location filename="../QScintilla/Editor.py" line="6783"/>
         <source>Save macro file</source>
         <translation>Uložit soubor s makrem</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6813"/>
+        <location filename="../QScintilla/Editor.py" line="6800"/>
         <source>Save macro</source>
         <translation>Uložit makro</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="6816"/>
+        <source>Error saving macro</source>
+        <translation>Chyba při ukládání makra</translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="6829"/>
-        <source>Error saving macro</source>
-        <translation>Chyba při ukládání makra</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6842"/>
         <source>Start Macro Recording</source>
         <translation>Spustit záznam makra</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6842"/>
+        <location filename="../QScintilla/Editor.py" line="6829"/>
         <source>Macro recording is already active. Start new?</source>
         <translation>Nahrávání makra již probíhá. Spustit nové?</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6868"/>
+        <location filename="../QScintilla/Editor.py" line="6855"/>
         <source>Macro Recording</source>
         <translation>Záznam makra</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6868"/>
+        <location filename="../QScintilla/Editor.py" line="6855"/>
         <source>Enter name of the macro:</source>
         <translation>Vložte název makra:</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7008"/>
+        <location filename="../QScintilla/Editor.py" line="6995"/>
         <source>File changed</source>
         <translation>Soubor změněn</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7319"/>
+        <location filename="../QScintilla/Editor.py" line="7306"/>
         <source>Drop Error</source>
         <translation>Zahodit chybu</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="7327"/>
+        <source>Resources</source>
+        <translation>Zdroje</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7329"/>
+        <source>Add file...</source>
+        <translation>Přidat soubor...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7331"/>
+        <source>Add files...</source>
+        <translation>Přidat soubory...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7333"/>
+        <source>Add aliased file...</source>
+        <translation>Přidat zástupce souboru...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7336"/>
+        <source>Add localized resource...</source>
+        <translation>Přidat lokalizované resource...</translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="7340"/>
-        <source>Resources</source>
-        <translation>Zdroje</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7342"/>
-        <source>Add file...</source>
-        <translation>Přidat soubor...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7344"/>
-        <source>Add files...</source>
-        <translation>Přidat soubory...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7346"/>
-        <source>Add aliased file...</source>
-        <translation>Přidat zástupce souboru...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7349"/>
-        <source>Add localized resource...</source>
-        <translation>Přidat lokalizované resource...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7353"/>
         <source>Add resource frame</source>
         <translation>Přidat resource frame</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7372"/>
+        <location filename="../QScintilla/Editor.py" line="7359"/>
         <source>Add file resource</source>
         <translation>Přidat soubor resource</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7388"/>
+        <location filename="../QScintilla/Editor.py" line="7375"/>
         <source>Add file resources</source>
         <translation>Přidat soubory resource</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7415"/>
+        <location filename="../QScintilla/Editor.py" line="7402"/>
         <source>Add aliased file resource</source>
         <translation>Přidat zástupce souboru resource</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7481"/>
+        <location filename="../QScintilla/Editor.py" line="7468"/>
         <source>Package Diagram</source>
         <translation>Diagram balíčku</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7481"/>
+        <location filename="../QScintilla/Editor.py" line="7468"/>
         <source>Include class attributes?</source>
         <translation>Včetně atributů třídy?</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7517"/>
+        <location filename="../QScintilla/Editor.py" line="7504"/>
         <source>Application Diagram</source>
         <translation>Diagram aplikace</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7517"/>
+        <location filename="../QScintilla/Editor.py" line="7504"/>
         <source>Include module names?</source>
         <translation>Včetně jmen modulů?</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1198"/>
+        <location filename="../QScintilla/Editor.py" line="1188"/>
         <source>Export as</source>
         <translation>Exportovat jako</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1394"/>
+        <location filename="../QScintilla/Editor.py" line="1384"/>
         <source>Export source</source>
         <translation>Export zdroj</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1394"/>
+        <location filename="../QScintilla/Editor.py" line="1384"/>
         <source>No export format given. Aborting...</source>
         <translation>Nebyl zadán forám exportu. Zrušeno....</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7503"/>
+        <location filename="../QScintilla/Editor.py" line="7490"/>
         <source>Imports Diagram</source>
         <translation>Importovat diagram</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7503"/>
+        <location filename="../QScintilla/Editor.py" line="7490"/>
         <source>Include imports from external modules?</source>
         <translation>Zahrnout importy z externích modulů?</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="874"/>
+        <location filename="../QScintilla/Editor.py" line="864"/>
         <source>Calltip</source>
         <translation>Rychlé tipy</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="920"/>
+        <location filename="../QScintilla/Editor.py" line="910"/>
         <source>Print Preview</source>
         <translation>Náhled tisku</translation>
     </message>
@@ -11783,77 +11758,77 @@
         <translation>&lt;b&gt;Okno editoru zdrojového kódu&lt;/b&gt;&lt;p&gt;V tomto okně se zobrazuje a edituje soubor se zdrojovým kódem. Můžete otevřít oken podle libosti. Jméno souboru se zobrazuje v titlebaru okna.&lt;/p&gt;&lt;p&gt;Kliknutím do prostoru mezi čísly řádku a značkami skládání nastavíte breakpoint. Přes kontextové menu je pak lze editovat.&lt;/p&gt;&lt;p&gt;Záložka se vkládá kliknutím na stejné místo se stisknutou klávesou Shift.&lt;/p&gt;&lt;p&gt;Tyto akce mohou být navráceny zpět i opětovným kliknutím nebo přes kontextové menu.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="859"/>
+        <location filename="../QScintilla/Editor.py" line="849"/>
         <source>Typing aids enabled</source>
         <translation>Pomůcky při psaní zapnuty</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1130"/>
+        <location filename="../QScintilla/Editor.py" line="1120"/>
         <source>End-of-Line Type</source>
         <translation>Typ Konec-řádku</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1134"/>
+        <location filename="../QScintilla/Editor.py" line="1124"/>
         <source>Unix</source>
         <translation>Unix</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1141"/>
+        <location filename="../QScintilla/Editor.py" line="1131"/>
         <source>Windows</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1148"/>
+        <location filename="../QScintilla/Editor.py" line="1138"/>
         <source>Macintosh</source>
         <translation>Macintosh</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1089"/>
+        <location filename="../QScintilla/Editor.py" line="1079"/>
         <source>Encodings</source>
         <translation>Kódování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1069"/>
+        <location filename="../QScintilla/Editor.py" line="1059"/>
         <source>Guessed</source>
         <translation>Odhadem</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1409"/>
+        <location filename="../QScintilla/Editor.py" line="1399"/>
         <source>Alternatives</source>
         <translation>Alternativy</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1425"/>
+        <location filename="../QScintilla/Editor.py" line="1415"/>
         <source>Pygments Lexer</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1425"/>
+        <location filename="../QScintilla/Editor.py" line="1415"/>
         <source>Select the Pygments lexer to apply.</source>
         <translation>Použít Pygments lexer.</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7846"/>
+        <location filename="../QScintilla/Editor.py" line="7833"/>
         <source>Check spelling...</source>
         <translation>Zatrhnout kontrolu...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="833"/>
+        <location filename="../QScintilla/Editor.py" line="823"/>
         <source>Check spelling of selection...</source>
         <translation>Zatrhnout výběr kontroly...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7849"/>
+        <location filename="../QScintilla/Editor.py" line="7836"/>
         <source>Add to dictionary</source>
         <translation>Přidat do slovníku</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7851"/>
+        <location filename="../QScintilla/Editor.py" line="7838"/>
         <source>Ignore All</source>
         <translation>Ignorovat vše</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="837"/>
+        <location filename="../QScintilla/Editor.py" line="827"/>
         <source>Remove from dictionary</source>
         <translation>Odebrat ze slovníku</translation>
     </message>
@@ -11863,282 +11838,282 @@
         <translation>&lt;p&gt;Velikost souboru &lt;b&gt;{0}&lt;/b&gt; je &lt;b&gt;{1} KB&lt;/b&gt;. Opravdu jej chcete načíst?&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1386"/>
+        <location filename="../QScintilla/Editor.py" line="1376"/>
         <source>&lt;p&gt;No exporter available for the export format &lt;b&gt;{0}&lt;/b&gt;. Aborting...&lt;/p&gt;</source>
         <translation>&lt;p&gt;Pro formát exportu &lt;b&gt;{0}&lt;/b&gt; není exportér dostupný. Zrušeno.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1405"/>
+        <location filename="../QScintilla/Editor.py" line="1395"/>
         <source>Alternatives ({0})</source>
         <translation>Alternativy ({0})</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3047"/>
+        <location filename="../QScintilla/Editor.py" line="3035"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; has unsaved changes.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; obsahuje neuložené změny.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3107"/>
+        <location filename="../QScintilla/Editor.py" line="3095"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; could not be opened.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; nemůže být přejmenován.&lt;br /&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3233"/>
+        <location filename="../QScintilla/Editor.py" line="3221"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; could not be saved.&lt;br/&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; nemůže být přejmenován.&lt;br /&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6767"/>
+        <location filename="../QScintilla/Editor.py" line="6754"/>
         <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; could not be read.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor s makrem &lt;b&gt;{0}&lt;/b&gt; nelze načíst.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6776"/>
+        <location filename="../QScintilla/Editor.py" line="6763"/>
         <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; is corrupt.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor s makrem &lt;b&gt;{0}&lt;/b&gt; je poškozen.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6829"/>
+        <location filename="../QScintilla/Editor.py" line="6816"/>
         <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; could not be written.&lt;/p&gt;</source>
         <translation>&lt;p&gt;So souboru s makrem &lt;b&gt;{0}&lt;/b&gt; nelze zapisovat.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7178"/>
+        <location filename="../QScintilla/Editor.py" line="7165"/>
         <source>{0} (ro)</source>
         <translation>{0} (ro)</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7319"/>
+        <location filename="../QScintilla/Editor.py" line="7306"/>
         <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/Editor.py" line="7415"/>
+        <location filename="../QScintilla/Editor.py" line="7402"/>
         <source>Alias for file &lt;b&gt;{0}&lt;/b&gt;:</source>
         <translation>Zástupce pro soubor &lt;b&gt;{0}&lt;/b&gt;:</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1314"/>
+        <location filename="../QScintilla/Editor.py" line="1304"/>
         <source>Next warning</source>
         <translation>Následující varování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1318"/>
+        <location filename="../QScintilla/Editor.py" line="1308"/>
         <source>Previous warning</source>
         <translation>Předchozí varování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1322"/>
+        <location filename="../QScintilla/Editor.py" line="1312"/>
         <source>Show warning message</source>
         <translation>Zobrazit varování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1326"/>
+        <location filename="../QScintilla/Editor.py" line="1316"/>
         <source>Clear warnings</source>
         <translation>Vyčistit varování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3296"/>
+        <location filename="../QScintilla/Editor.py" line="3284"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
         <translation type="unfinished">&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; již existuje.&lt;/p&gt;&lt;p&gt;Má se přepsat?&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6813"/>
+        <location filename="../QScintilla/Editor.py" line="6800"/>
         <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6613"/>
+        <location filename="../QScintilla/Editor.py" line="6600"/>
         <source>Warning: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6620"/>
+        <location filename="../QScintilla/Editor.py" line="6607"/>
         <source>Error: {0}</source>
         <translation type="unfinished">Chyby: {0}</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7004"/>
+        <location filename="../QScintilla/Editor.py" line="6991"/>
         <source>&lt;br&gt;&lt;b&gt;Warning:&lt;/b&gt; You will lose your changes upon reopening it.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="916"/>
+        <location filename="../QScintilla/Editor.py" line="906"/>
         <source>Open &apos;rejection&apos; file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1026"/>
+        <location filename="../QScintilla/Editor.py" line="1016"/>
         <source>Load Diagram...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1349"/>
+        <location filename="../QScintilla/Editor.py" line="1339"/>
         <source>Next change</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1353"/>
+        <location filename="../QScintilla/Editor.py" line="1343"/>
         <source>Previous change</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="8267"/>
+        <location filename="../QScintilla/Editor.py" line="8254"/>
         <source>Sort Lines</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="8267"/>
+        <location filename="../QScintilla/Editor.py" line="8254"/>
         <source>The selection contains illegal data for a numerical sort.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6548"/>
+        <location filename="../QScintilla/Editor.py" line="6535"/>
         <source>Warning</source>
         <translation type="unfinished">Varování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6548"/>
+        <location filename="../QScintilla/Editor.py" line="6535"/>
         <source>No warning messages available.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6610"/>
+        <location filename="../QScintilla/Editor.py" line="6597"/>
         <source>Style: {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="890"/>
+        <location filename="../QScintilla/Editor.py" line="880"/>
         <source>New Document View</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="893"/>
+        <location filename="../QScintilla/Editor.py" line="883"/>
         <source>New Document View (with new split)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="980"/>
+        <location filename="../QScintilla/Editor.py" line="970"/>
         <source>Tools</source>
         <translation type="unfinished">Nástroje</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1111"/>
+        <location filename="../QScintilla/Editor.py" line="1101"/>
         <source>Re-Open With Encoding</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6998"/>
+        <location filename="../QScintilla/Editor.py" line="6985"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; has been changed while it was opened in eric6. Reread it?&lt;/p&gt;</source>
         <translation type="unfinished">&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; byl změněn po té co již byl načten do eric5. Znovu načíst?&lt;/p&gt; {0}?} {6.?}</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="856"/>
+        <source>Automatic Completion enabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="936"/>
+        <source>Complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="4895"/>
+        <source>Auto-Completion Provider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="4895"/>
+        <source>The completion list provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5174"/>
+        <source>Call-Tips Provider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5174"/>
+        <source>The call-tips provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8343"/>
+        <source>Register Mouse Click Handler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8343"/>
+        <source>A mouse click handler for &quot;{0}&quot; was already registered by &quot;{1}&quot;. Aborting request by &quot;{2}&quot;...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="900"/>
+        <source>Save Copy...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="939"/>
+        <source>Clear Completions Cache</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="866"/>
-        <source>Automatic Completion enabled</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="946"/>
-        <source>Complete</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="4907"/>
-        <source>Auto-Completion Provider</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="4907"/>
-        <source>The completion list provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5186"/>
-        <source>Call-Tips Provider</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5186"/>
-        <source>The call-tips provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8356"/>
-        <source>Register Mouse Click Handler</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8356"/>
-        <source>A mouse click handler for &quot;{0}&quot; was already registered by &quot;{1}&quot;. Aborting request by &quot;{2}&quot;...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="910"/>
-        <source>Save Copy...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="949"/>
-        <source>Clear Completions Cache</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="876"/>
         <source>Code Info</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1357"/>
+        <location filename="../QScintilla/Editor.py" line="1347"/>
         <source>Clear changes</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="799"/>
+        <location filename="../QScintilla/Editor.py" line="789"/>
         <source>Execute Selection In Console</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="8477"/>
+        <location filename="../QScintilla/Editor.py" line="8464"/>
         <source>EditorConfig Properties</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="8477"/>
+        <location filename="../QScintilla/Editor.py" line="8464"/>
         <source>&lt;p&gt;The EditorConfig properties for file &lt;b&gt;{0}&lt;/b&gt; could not be loaded.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="1251"/>
+        <source>Toggle all folds</source>
+        <translation type="unfinished">Složit/rozložit všechna skládání</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1256"/>
+        <source>Toggle all folds (including children)</source>
+        <translation type="unfinished">Složit/rozložit všechna skládání (i s podsložkami)</translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="1261"/>
-        <source>Toggle all folds</source>
-        <translation type="unfinished">Složit/rozložit všechna skládání</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1266"/>
-        <source>Toggle all folds (including children)</source>
-        <translation type="unfinished">Složit/rozložit všechna skládání (i s podsložkami)</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1271"/>
         <source>Toggle current fold</source>
         <translation type="unfinished">Složit/rozložit aktuální složený blok</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1277"/>
+        <location filename="../QScintilla/Editor.py" line="1267"/>
         <source>Expand (including children)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1282"/>
+        <location filename="../QScintilla/Editor.py" line="1272"/>
         <source>Collapse (including children)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1288"/>
+        <location filename="../QScintilla/Editor.py" line="1278"/>
         <source>Clear all folds</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1169"/>
+        <location filename="../QScintilla/Editor.py" line="1159"/>
         <source>Spell Check Languages</source>
         <translation type="unfinished"></translation>
     </message>
@@ -27267,7 +27242,7 @@
 <context>
     <name>HelpDocsInstaller</name>
     <message>
-        <location filename="../WebBrowser/QtHelp/HelpDocsInstaller.py" line="242"/>
+        <location filename="../WebBrowser/QtHelp/HelpDocsInstaller.py" line="241"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; could not be registered. &lt;br/&gt;Reason: {1}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
@@ -27282,115 +27257,100 @@
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="142"/>
         <source>Qt4 Documentation</source>
-        <translation>Qt4 dokumentace</translation>
+        <translation type="obsolete">Qt4 dokumentace</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="157"/>
         <source>Enter the Qt4 documentation directory</source>
-        <translation>Zadejte adresář Qt4 dokumentace</translation>
+        <translation type="obsolete">Zadejte adresář Qt4 dokumentace</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="164"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the QT4DOCDIR environment variable, if set.</source>
-        <translation>&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí QT4DOCDIR, je-li nastavena.</translation>
+        <translation type="obsolete">&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí QT4DOCDIR, je-li nastavena.</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="212"/>
         <source>PyQt4 Documentation</source>
-        <translation>PyQt4 dokumentace</translation>
+        <translation type="obsolete">PyQt4 dokumentace</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="227"/>
         <source>Enter the PyQt4 documentation directory</source>
-        <translation>Zadejte adresář PyQt4 dokumentace</translation>
+        <translation type="obsolete">Zadejte adresář PyQt4 dokumentace</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="234"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYQT4DOCDIR environment variable, if set.</source>
-        <translation>&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí PYQT4DOCDIR, je-li nastavena.</translation>
+        <translation type="obsolete">&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí PYQT4DOCDIR, je-li nastavena.</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="282"/>
         <source>PySide Documentation</source>
-        <translation>PySide dokumentace</translation>
+        <translation type="obsolete">PySide dokumentace</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="297"/>
         <source>Enter the PySide documentation directory</source>
-        <translation>Zadejte adresář pro PySide dokumentaci</translation>
+        <translation type="obsolete">Zadejte adresář pro PySide dokumentaci</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="304"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYSIDEDOCDIR environment variable, if set.</source>
-        <translation>&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí PYSIDEDOCDIR, je-li nastavena.</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.py" line="61"/>
+        <translation type="obsolete">&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí PYSIDEDOCDIR, je-li nastavena.</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.py" line="47"/>
         <source>HTML Files (*.html *.htm);;All Files (*)</source>
         <translation>HTML soubory (*.html *.htm);;Všechny soubory (*)</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.py" line="41"/>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.py" line="36"/>
         <source>HTML Files (*.html *.htm);;Compressed Help Files (*.chm);;All Files (*)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="72"/>
-        <source>Python 2 Documentation</source>
+        <source>Python 3 Documentation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="87"/>
-        <source>Enter the Python 2 documentation directory</source>
+        <source>Enter the Python 3 documentation directory</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="94"/>
-        <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYTHON2DOCDIR environment variable, if set.</source>
+        <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYTHON3DOCDIR environment variable, if set.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="107"/>
-        <source>Python 3 Documentation</source>
-        <translation type="unfinished"></translation>
+        <source>Qt5 Documentation</source>
+        <translation type="unfinished">Qt4 dokumentace {5 ?}</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="122"/>
-        <source>Enter the Python 3 documentation directory</source>
-        <translation type="unfinished"></translation>
+        <source>Enter the Qt5 documentation directory</source>
+        <translation type="unfinished">Zadejte adresář Qt4 dokumentace {5 ?}</translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="129"/>
-        <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYTHON3DOCDIR environment variable, if set.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="177"/>
-        <source>Qt5 Documentation</source>
-        <translation type="unfinished">Qt4 dokumentace {5 ?}</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="192"/>
-        <source>Enter the Qt5 documentation directory</source>
-        <translation type="unfinished">Zadejte adresář Qt4 dokumentace {5 ?}</translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="199"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the QT5DOCDIR environment variable, if set.</source>
         <translation type="unfinished">&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí QT4DOCDIR, je-li nastavena. {5D?}</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="247"/>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="142"/>
         <source>PyQt5 Documentation</source>
         <translation type="unfinished">PyQt4 dokumentace {5 ?}</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="262"/>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="157"/>
         <source>Enter the PyQt5 documentation directory</source>
         <translation type="unfinished">Zadejte adresář PyQt4 dokumentace {5 ?}</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="269"/>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="164"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYQT5DOCDIR environment variable, if set.</source>
         <translation type="unfinished">&lt;b&gt;Poznámka&lt;/b&gt;: Ponechte prázdné má-li se použít proměnná prostředí PYQT4DOCDIR, je-li nastavena. {5D?}</translation>
     </message>
@@ -27410,17 +27370,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="317"/>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="177"/>
         <source>PySide2 Documentation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="332"/>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="192"/>
         <source>Enter the PySide2 documentation directory</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="339"/>
+        <location filename="../Preferences/ConfigurationPages/HelpDocumentationPage.ui" line="199"/>
         <source>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYSIDE2DOCDIR environment variable, if set.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -45051,297 +45011,297 @@
         <translation>Nastavení</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Lexers/__init__.py" line="145"/>
+        <location filename="../QScintilla/Lexers/__init__.py" line="143"/>
         <source>Ruby</source>
         <translation>Ruby</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Lexers/__init__.py" line="147"/>
+        <location filename="../QScintilla/Lexers/__init__.py" line="145"/>
         <source>SQL</source>
         <translation></translation>
     </message>
     <message>
+        <location filename="../QScintilla/Lexers/__init__.py" line="149"/>
+        <source>TeX</source>
+        <translation></translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Lexers/__init__.py" line="151"/>
-        <source>TeX</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Lexers/__init__.py" line="153"/>
         <source>VHDL</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../QScintilla/Lexers/__init__.py" line="584"/>
+        <location filename="../QScintilla/Lexers/__init__.py" line="575"/>
         <source>Quixote Template Files (*.ptl)</source>
         <translation>Quixote Template soubory (*.ptl)</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Lexers/__init__.py" line="587"/>
+        <location filename="../QScintilla/Lexers/__init__.py" line="578"/>
         <source>Ruby Files (*.rb)</source>
         <translation>Ruby soubory (*.rb)</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Lexers/__init__.py" line="590"/>
+        <location filename="../QScintilla/Lexers/__init__.py" line="581"/>
         <source>IDL Files (*.idl)</source>
         <translation>IDL soubory (*.idl)</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Lexers/__init__.py" line="408"/>
+        <source>C Files (*.h *.c)</source>
+        <translation>C soubory (*.h *.c)</translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Lexers/__init__.py" line="411"/>
-        <source>C Files (*.h *.c)</source>
-        <translation>C soubory (*.h *.c)</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Lexers/__init__.py" line="414"/>
         <source>C++ Files (*.h *.hpp *.hh *.cxx *.cpp *.cc)</source>