[spyder] 06/10: Imported Upstream version 3.0.0~b4+dfsg1

Frédéric-Emmanuel Picca picca at moszumanska.debian.org
Sun Aug 21 17:30:27 UTC 2016


This is an automated email from the git hooks/post-receive script.

picca pushed a commit to branch experimental
in repository spyder.

commit 7a8d7fc12d6fd302f8757582e535ce73efbbd75c
Author: Picca Frédéric-Emmanuel <picca at debian.org>
Date:   Sun Aug 21 11:47:01 2016 +0200

    Imported Upstream version 3.0.0~b4+dfsg1
---
 LICENSE                                            |    2 +-
 MANIFEST.in                                        |    2 +-
 PKG-INFO                                           |   18 +-
 README.md                                          |   48 +-
 app_example/example.pyw                            |   37 +-
 bootstrap.py                                       |   27 +-
 doc/console.rst                                    |    2 +-
 doc/{inspector.rst => help.rst}                    |   16 +-
 doc/images/{inspector_plain.png => help_plain.png} |  Bin
 doc/images/{inspector_rich.png => help_rich.png}   |  Bin
 .../{inspector_source.png => help_source.png}      |  Bin
 doc/index.rst                                      |    3 +-
 doc/installation.rst                               |  136 +-
 doc/ipythonconsole.rst                             |    2 +-
 doc/lightmode.rst                                  |   22 -
 doc/onlinehelp.rst                                 |    2 +-
 doc/options.rst                                    |    1 -
 doc/overview.rst                                   |   16 +-
 img_src/{spyder_light.ico => spyder_reset.ico}     |  Bin
 scripts/spyder                                     |    4 +-
 scripts/spyder3                                    |    4 +-
 scripts/spyder_win_post_install.py                 |    7 -
 setup.py                                           |   68 +-
 spyderlib/__init__.py                              |   20 +-
 .../{widgets/variableexplorer => app}/__init__.py  |   24 +-
 spyderlib/{ => app}/cli_options.py                 |    6 +-
 spyderlib/{ => app}/mac_stylesheet.qss             |    4 +-
 spyderlib/{restart_app.py => app/restart.py}       |   19 +-
 spyderlib/{ => app}/spyder.py                      | 1727 +++---
 spyderlib/{start_app.py => app/start.py}           |    8 +-
 spyderlib/{ => app}/tour.py                        |   31 +-
 spyderlib/config/base.py                           |    3 +-
 spyderlib/config/fonts.py                          |   52 +
 spyderlib/config/gui.py                            |   75 +-
 spyderlib/config/ipython.py                        |   37 +-
 spyderlib/config/main.py                           |  354 +-
 spyderlib/config/user.py                           |    7 +-
 spyderlib/config/utils.py                          |  163 +
 spyderlib/dependencies.py                          |   39 +-
 spyderlib/fonts/spyder-charmap.json                |    3 +-
 spyderlib/fonts/spyder.ttf                         |  Bin 8704 -> 8792 bytes
 spyderlib/images/{inspector.png => help.png}       |  Bin
 spyderlib/images/splash.png                        |  Bin 166120 -> 0 bytes
 spyderlib/images/splash.svg                        | 3788 +++++++++++++
 spyderlib/images/spyder_light.svg                  |  366 --
 spyderlib/interpreter.py                           |    8 +-
 spyderlib/locale/es/LC_MESSAGES/spyderlib.po       |    6 +-
 spyderlib/locale/fr/LC_MESSAGES/spyderlib.po       |   10 +-
 spyderlib/locale/pt_BR/LC_MESSAGES/spyderlib.po    |    6 +-
 spyderlib/locale/ru/LC_MESSAGES/spyderlib.mo       |  Bin 0 -> 139794 bytes
 spyderlib/locale/ru/LC_MESSAGES/spyderlib.po       | 5637 ++++++++++++++++++++
 spyderlib/locale/spyderlib.pot                     | 5324 +++++++++---------
 spyderlib/otherplugins.py                          |  176 +-
 spyderlib/plugins/__init__.py                      |  103 +-
 spyderlib/plugins/configdialog.py                  |  774 ++-
 spyderlib/plugins/console.py                       |   58 +-
 spyderlib/plugins/editor.py                        |  673 ++-
 spyderlib/plugins/explorer.py                      |   42 +-
 spyderlib/plugins/externalconsole.py               |  201 +-
 spyderlib/plugins/findinfiles.py                   |   30 +-
 spyderlib/plugins/{inspector.py => help.py}        |  223 +-
 spyderlib/plugins/history.py                       |   80 +-
 spyderlib/plugins/ipythonconsole.py                |  104 +-
 spyderlib/plugins/layoutdialog.py                  |   15 +-
 spyderlib/plugins/onlinehelp.py                    |   14 +-
 spyderlib/plugins/outlineexplorer.py               |    7 +-
 spyderlib/plugins/projectexplorer.py               |   11 +-
 spyderlib/plugins/runconfig.py                     |   23 +-
 spyderlib/plugins/shortcuts.py                     |   49 +-
 spyderlib/plugins/variableexplorer.py              |   11 +-
 spyderlib/plugins/workingdirectory.py              |   53 +-
 spyderlib/py3compat.py                             |    6 +-
 spyderlib/qt/QtCore.py                             |   31 -
 spyderlib/qt/QtGui.py                              |   24 -
 spyderlib/qt/QtNetwork.py                          |   14 -
 spyderlib/qt/QtSvg.py                              |   14 -
 spyderlib/qt/QtWebKit.py                           |   16 -
 spyderlib/qt/__init__.py                           |   75 -
 spyderlib/qt/compat.py                             |  210 -
 spyderlib/requirements.py                          |   19 +-
 spyderlib/rope_patch.py                            |    6 +-
 spyderlib/utils/codeanalysis.py                    |    7 +-
 spyderlib/utils/encoding.py                        |   24 +-
 spyderlib/utils/environ.py                         |    7 +-
 spyderlib/utils/fixtures.py                        |   43 +
 spyderlib/utils/help/__init__.py                   |   16 +
 spyderlib/utils/{inspector => help}/conf.py        |    8 +-
 .../{inspector => help}/js/collapse_sections.js    |    0
 .../utils/{inspector => help}/js/copy_button.js    |    0
 .../{inspector => help}/js/fix_image_paths.js      |    0
 .../utils/{inspector => help}/js/math_config.js    |    0
 .../utils/{inspector => help}/js/move_outline.js   |    0
 spyderlib/utils/{inspector => help}/js/utils.js    |    0
 spyderlib/utils/{inspector => help}/sphinxify.py   |   12 +-
 .../{inspector => help}/static/css/default.css     |    0
 .../{inspector => help}/static/css/pygments.css    |    0
 .../static/images/collapse_expand.png              |  Bin
 .../static/images/debug-continue.png               |  Bin
 .../static/images/debug-step-in.png                |  Bin
 .../static/images/debug-step-out.png               |  Bin
 .../static/images/debug-step-over.png              |  Bin
 .../static/images/spyder-hello-docstring.png       |  Bin
 .../images/spyder-nice-docstring-rendering.png     |  Bin
 .../static/images/spyder-sympy-example.png         |  Bin
 .../{inspector => help}/templates/layout.html      |    4 +-
 .../utils/{inspector => help}/templates/usage.html |    4 +-
 .../{inspector => help}/templates/warning.html     |    0
 spyderlib/utils/{inspector => help}/tutorial.rst   |   28 +-
 spyderlib/utils/icon_manager.py                    |   76 +-
 spyderlib/utils/inspector/__init__.py              |   16 -
 spyderlib/utils/introspection/__init__.py          |    3 -
 spyderlib/utils/introspection/fallback_plugin.py   |  142 +-
 spyderlib/utils/introspection/jedi_plugin.py       |   60 +-
 spyderlib/utils/introspection/manager.py           |  354 ++
 spyderlib/utils/introspection/module_completion.py |    3 +
 spyderlib/utils/introspection/plugin_client.py     |  227 +
 spyderlib/utils/introspection/plugin_manager.py    |  584 --
 spyderlib/utils/introspection/plugin_server.py     |  129 +
 spyderlib/utils/introspection/rope_plugin.py       |   69 +-
 spyderlib/utils/introspection/utils.py             |  248 +
 spyderlib/utils/iofuncs.py                         |    2 +-
 spyderlib/utils/misc.py                            |   48 +-
 spyderlib/utils/programs.py                        |  233 +-
 spyderlib/utils/qthelpers.py                       |   57 +-
 spyderlib/utils/sourcecode.py                      |    9 +-
 spyderlib/utils/stringmatching.py                  |    6 +-
 spyderlib/utils/syntaxhighlighters.py              |  107 +-
 spyderlib/utils/vcs.py                             |   27 +-
 spyderlib/widgets/arraybuilder.py                  |  120 +-
 spyderlib/widgets/browser.py                       |  123 +-
 spyderlib/widgets/calltip.py                       |   55 +-
 spyderlib/widgets/colors.py                        |    7 +-
 spyderlib/widgets/comboboxes.py                    |   11 +-
 spyderlib/widgets/dependencies.py                  |   18 +-
 spyderlib/widgets/editor.py                        |  296 +-
 spyderlib/widgets/editortools.py                   |   18 +-
 spyderlib/widgets/explorer.py                      |   58 +-
 spyderlib/widgets/externalshell/baseshell.py       |   54 +-
 spyderlib/widgets/externalshell/introspection.py   |   13 +-
 spyderlib/widgets/externalshell/monitor.py         |    6 +-
 spyderlib/widgets/externalshell/pythonshell.py     |   38 +-
 spyderlib/widgets/externalshell/sitecustomize.py   |  190 +-
 .../widgets/externalshell/start_ipython_kernel.py  |   16 +-
 spyderlib/widgets/externalshell/systemshell.py     |   28 +-
 spyderlib/widgets/fileswitcher.py                  |   11 +-
 spyderlib/widgets/findinfiles.py                   |   35 +-
 spyderlib/widgets/findreplace.py                   |   73 +-
 spyderlib/widgets/formlayout.py                    |   35 +-
 spyderlib/widgets/helperwidgets.py                 |   13 +-
 spyderlib/widgets/internalshell.py                 |   48 +-
 spyderlib/widgets/ipython.py                       |  135 +-
 spyderlib/widgets/mixins.py                        |   67 +-
 spyderlib/widgets/onecolumntree.py                 |   10 +-
 spyderlib/widgets/pathmanager.py                   |   21 +-
 spyderlib/widgets/projectexplorer.py               |   28 +-
 spyderlib/widgets/pydocgui.py                      |   15 +-
 spyderlib/widgets/shell.py                         |   53 +-
 spyderlib/widgets/sourcecode/base.py               |   49 +-
 spyderlib/widgets/sourcecode/codeeditor.py         |  342 +-
 spyderlib/widgets/sourcecode/kill_ring.py          |   36 +-
 spyderlib/widgets/status.py                        |   17 +-
 spyderlib/widgets/tabs.py                          |   39 +-
 .../widgets/tests}/__init__.py                     |    0
 spyderlib/widgets/tests/test_array_builder.py      |  174 +
 spyderlib/widgets/variableexplorer/__init__.py     |    2 +-
 spyderlib/widgets/variableexplorer/arrayeditor.py  |  112 +-
 .../widgets/variableexplorer/collectionseditor.py  |   82 +-
 .../widgets/variableexplorer/dataframeeditor.py    |   59 +-
 spyderlib/widgets/variableexplorer/importwizard.py |   28 +-
 .../widgets/variableexplorer/namespacebrowser.py   |   45 +-
 spyderlib/widgets/variableexplorer/objecteditor.py |    4 +-
 spyderlib/widgets/variableexplorer/texteditor.py   |   14 +-
 spyderlib/widgets/variableexplorer/utils.py        |   38 +-
 spyderlib/workers/updates.py                       |    6 +-
 spyplugins/__init__.py                             |   12 -
 spyplugins/io/__init__.py                          |   12 -
 spyplugins/io/dcm/__init__.py                      |    9 -
 spyplugins/io/dcm/dcm.py                           |   26 -
 spyplugins/io/hdf5/__init__.py                     |    9 -
 spyplugins/io/hdf5/hdf5.py                         |   78 -
 spyplugins/ui/__init__.py                          |   12 -
 spyplugins/ui/breakpoints/__init__.py              |    6 -
 spyplugins/ui/breakpoints/breakpoints.py           |  121 -
 .../locale/es/LC_MESSAGES/breakpoints.mo           |  Bin 772 -> 0 bytes
 .../locale/fr/LC_MESSAGES/breakpoints.mo           |  Bin 835 -> 0 bytes
 .../locale/pt_BR/LC_MESSAGES/breakpoints.mo        |  Bin 863 -> 0 bytes
 .../ui/breakpoints/widgets/breakpointsgui.py       |  256 -
 spyplugins/ui/profiler/__init__.py                 |    6 -
 spyplugins/ui/profiler/images/profiler.png         |  Bin 1454 -> 0 bytes
 .../ui/profiler/locale/es/LC_MESSAGES/profiler.mo  |  Bin 794 -> 0 bytes
 .../ui/profiler/locale/fr/LC_MESSAGES/profiler.mo  |  Bin 2736 -> 0 bytes
 .../profiler/locale/pt_BR/LC_MESSAGES/profiler.mo  |  Bin 2317 -> 0 bytes
 spyplugins/ui/profiler/profiler.py                 |  147 -
 spyplugins/ui/profiler/widgets/__init__.py         |    0
 spyplugins/ui/profiler/widgets/profilergui.py      |  689 ---
 spyplugins/ui/pylint/__init__.py                   |    6 -
 spyplugins/ui/pylint/images/pylint.png             |  Bin 1196 -> 0 bytes
 .../ui/pylint/locale/es/LC_MESSAGES/pylint.mo      |  Bin 1137 -> 0 bytes
 .../ui/pylint/locale/fr/LC_MESSAGES/pylint.mo      |  Bin 2427 -> 0 bytes
 .../ui/pylint/locale/pt_BR/LC_MESSAGES/pylint.mo   |  Bin 2607 -> 0 bytes
 spyplugins/ui/pylint/pylint.py                     |  179 -
 spyplugins/ui/pylint/widgets/__init__.py           |    0
 spyplugins/ui/pylint/widgets/pylintgui.py          |  508 --
 203 files changed, 18536 insertions(+), 9931 deletions(-)

diff --git a/LICENSE b/LICENSE
index 5a4140c..650c4ff 100644
--- a/LICENSE
+++ b/LICENSE
@@ -78,7 +78,7 @@ spyderlib/images/browser.png
 spyderlib/images/ext_tools.png
 spyderlib/images/font.png
 spyderlib/images/genprefs.png
-spyderlib/images/inspector.png
+spyderlib/images/help.png
 spyderlib/images/italic.png
 spyderlib/images/pythonpath_mgr.png
 spyderlib/images/upper_lower.png
diff --git a/MANIFEST.in b/MANIFEST.in
index cf6ba11..e60f0a0 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1,5 @@
 recursive-include spyderlib *.pot *.po *.svg *.png *.css *.qss
-recursive-include spyderlibplugins *.pot *.po *.svg *.png
+recursive-include spyplugins *.pot *.po *.svg *.png
 recursive-include doc *.py *.rst *.png *.ico *.
 recursive-include app_example *.py *.pyw *.bat *.qm *.svg *.png
 include spyderlib/fonts/spyder.ttf
diff --git a/PKG-INFO b/PKG-INFO
index 9a7604a..081458f 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,28 +1,26 @@
 Metadata-Version: 1.1
 Name: spyder
-Version: 3.0.0b2
+Version: 3.0.0b4
 Summary: Scientific PYthon Development EnviRonment
 Home-page: https://github.com/spyder-ide/spyder
-Author: Pierre Raybaut
+Author: The Spyder Development Team
 Author-email: UNKNOWN
 License: MIT
-Download-URL: https://github.com/spyder-ide/spyder/files/spyder-3.0.0b2.zip
+Download-URL: https://github.com/spyder-ide/spyder/files/spyder-3.0.0b4.zip
 Description: Spyder is an interactive Python development environment providing
         MATLAB-like features in a simple and light-weighted software.
-        It also provides ready-to-use pure-Python widgets to your PyQt4 or
-        PySide application: source code editor with syntax highlighting and
+        It also provides ready-to-use pure-Python widgets to your PyQt5 or
+        PyQt4 application: source code editor with syntax highlighting and
         code introspection/analysis features, NumPy array editor, dictionary
         editor, Python console, etc.
-Keywords: PyQt4 PySide editor shell console widgets IDE
+Keywords: PyQt5 PyQt4 editor shell console widgets IDE
 Platform: any
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Operating System :: MacOS
 Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: OS Independent
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Unix
+Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3Development Status :: 5 - Production/Stable
+Classifier: Development Status :: 5 - Production/Stable
 Classifier: Topic :: Scientific/Engineering
 Classifier: Topic :: Software Development :: Widget Sets
diff --git a/README.md b/README.md
index 8dbb71f..8e67be8 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@ Copyright © 2009- The Spyder Development Team.
 [![pypi downloads](https://img.shields.io/pypi/dm/spyder.svg)](https://pypi.python.org/pypi/spyder)
 [![Travis status](https://travis-ci.org/spyder-ide/spyder.svg?branch=master)](https://travis-ci.org/spyder-ide/spyder)
 [![AppVeyor status](https://ci.appveyor.com/api/projects/status/awb92if4tl555fuy/branch/master?svg=true)](https://ci.appveyor.com/project/ccordoba12/spyder/branch/master)
+[![Coverage Status](https://coveralls.io/repos/github/spyder-ide/spyder/badge.svg?branch=master)](https://coveralls.io/github/spyder-ide/spyder?branch=master)
 
 ## Overview
 
@@ -45,9 +46,9 @@ Spyder is a Python development environment with a lot of features:
 
 * **History log**
 
-Spyder may also be used as a PyQt4/PySide extension library (module 
+Spyder may also be used as a PyQt5/PyQt4 extension library (module 
 `spyderlib`). For example, the Python interactive shell widget used in
-Spyder may be embedded in your own PyQt4/PySide application.
+Spyder may be embedded in your own PyQt5/PyQt4 application.
 
 
 ## Documentation
@@ -105,16 +106,16 @@ For more details on supported platforms, please refer to our
 [installation instructions](http://pythonhosted.org/spyder/installation.html).
 
 **Important note**: This does not install the graphical Python libraries (i.e.
-PyQt4, PyQt5 or PySide) that Spyder depend on. Those have to be installed
-separately after installing Python.
+PyQt5 or PyQt4) that Spyder depend on. Those have to be installed separately
+after installing Python.
 
 
 ## Running from source
 
 The fastest way to run Spyder is to get the source code using git, install
-PyQt4, PyQt5 or PySide, and run these commands:
+PyQt5 or PyQt4, and run these commands:
 
-1. `pip install qtawesome` or `conda install -c spyder-ide qtawesome`
+1. Install our *runtime dependencies* (see below).
 2. `cd /your/spyder/git-clone`
 3. `python bootstrap.py`
 
@@ -137,27 +138,30 @@ a Python version greater than 2.7 (Python 3.2 is not supported anymore).
 ### Runtime dependencies
 
 * **Python** 2.7 or 3.3+
-* **PyQt4** 4.6+, **PyQt5** 5.2+ or **PySide** 1.2.0+: PyQt4 is recommended.
-* **IPython** 3.0 or **qtconsole**: Enhanced Python interpreter.
-* **Rope** and/or **Jedi** 0.8.1: Editor code completion, calltips
+* **PyQt5** 5.2+ or **PyQt4** 4.6+: PyQt5 is recommended.
+* **qtconsole** 4.2.0+: Enhanced Python interpreter.
+* **Rope** and **Jedi**: Editor code completion, calltips
   and go-to-definition.
-* **Pyflakes**: Real-time code analysis)
-* **Sphinx**: Object Inspector's rich text mode.
-* **Pygments**: Syntax highlighting for all file types it supports.
+* **Pyflakes**: Real-time code analysis.
+* **Sphinx**: Rich text mode for the Help pane.
+* **Pygments** 2.0+: Syntax highlighting for all file types it supports.
 * **Pylint**: Static code analysis.
 * **Pep8**: Style analysis.
 * **Psutil**: CPU and memory usage on the status bar.
 * **Nbconvert**: Manipulation of notebooks in the Editor.
-
-**Note**: To get IPython in Ubuntu you need to install `ipython-qtconsole`,
-on Fedora `ipython-gui` and on Gentoo `ipython` with the `qt4` USE flag.
-
-### Optional modules
-
-* **Matplotlib**: 2D/3D plotting.
-* **Pandas**: DataFrame and Series support.
-* **Numpy**: N-dimensional arrays.
-* **SymPy**: Symbolic mathematics.
+* **Qtawesome**: To have an icon theme based on FontAwesome.
+* **Pickleshare**: Show import completions on the Python consoles.
+* **PyZMQ**: Run introspection services asynchronously.
+* **QtPy** 1.1.0+: Abstracion layer for Python Qt bindings so that Spyder can run on PyQt4
+  and PyQt5.
+
+### Optional dependencies
+
+* **Matplotlib**: 2D/3D plotting in the Python and IPython consoles.
+* **Pandas**: View and edit DataFrames and Series in the Variable Explorer.
+* **Numpy**: View and edit two or three dimensional arrays in the Variable Explorer.
+* **SymPy**: Symbolic mathematics in the IPython console.
+* **SciPy**: Import Matlab workspace files in the Variable Explorer.
 
 
 ## More information
diff --git a/app_example/example.pyw b/app_example/example.pyw
index cbadf5f..38d3802 100644
--- a/app_example/example.pyw
+++ b/app_example/example.pyw
@@ -1,8 +1,11 @@
 
-from spyderlib.qt.QtGui import (QApplication, QMainWindow, QWidget, QLabel,
-                                QLineEdit, QHBoxLayout, QDockWidget, QFont)
-from spyderlib.qt.QtCore import Qt
+# Third party imports
+from qtpy.QtCore import Qt
+from qtpy.QtGui import QFont
+from qtpy.QtWidgets import (QApplication, QDockWidget, QHBoxLayout, QLabel,
+                            QLineEdit, QMainWindow, QWidget)
 
+# Local imports
 from spyderlib.widgets.internalshell import InternalShell
 
 
@@ -15,11 +18,11 @@ class MyWidget(QWidget):
         layout.addWidget(label)
         layout.addWidget(self.edit)
         self.setLayout(layout)
-        
+
     def get_text(self):
         """Return sample edit text"""
         return self.edit.text()
-        
+
     def set_text(self, text):
         """Set sample edit text"""
         self.edit.setText(text)
@@ -28,22 +31,22 @@ class MyWidget(QWidget):
 class MyWindow(QMainWindow):
     def __init__(self):
         QMainWindow.__init__(self)
-        
+
         # Set this very simple widget as central widget
         widget = MyWidget()
         self.setCentralWidget(widget)
-        
+
         # Create the console widget
         font = QFont("Courier new")
         font.setPointSize(10)
         ns = {'win': self, 'widget': widget}
         msg = "Try for example: widget.set_text('foobar') or win.close()"
-        # Note: by default, the internal shell is multithreaded which is safer 
+        # Note: by default, the internal shell is multithreaded which is safer
         # but not compatible with graphical user interface creation.
-        # For example, if you need to plot data with Matplotlib, you will need 
+        # For example, if you need to plot data with Matplotlib, you will need
         # to pass the option: multithreaded=False
         self.console = cons = InternalShell(self, namespace=ns, message=msg)
-        
+
         # Setup the console widget
         cons.set_font(font)
         cons.set_codecompletion_auto(True)
@@ -52,21 +55,23 @@ class MyWindow(QMainWindow):
         cons.setup_completion(size=(300, 180), font=font)
         console_dock = QDockWidget("Console", self)
         console_dock.setWidget(cons)
-        
+
         # Add the console widget to window as a dockwidget
         self.addDockWidget(Qt.BottomDockWidgetArea, console_dock)
-        
+
         self.resize(800, 600)
-        
+
     def closeEvent(self, event):
         self.console.exit_interpreter()
         event.accept()
-        
+
+
 def main():
     app = QApplication([])
     win = MyWindow()
     win.show()
     app.exec_()
-        
+
+
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
diff --git a/bootstrap.py b/bootstrap.py
index 9cb64a8..7ce8188 100755
--- a/bootstrap.py
+++ b/bootstrap.py
@@ -33,7 +33,7 @@ Type `python bootstrap.py -- --help` to read about Spyder
 options.""")
 parser.add_option('--gui', default=None,
                   help="GUI toolkit: pyqt5 (for PyQt5), pyqt (for PyQt4) or "
-                       "pyside (for PySide)")
+                       "pyside (for PySide, deprecated)")
 parser.add_option('--hide-console', action='store_true',
                   default=False, help="Hide parent console window (Windows only)")
 parser.add_option('--test', dest="test", action='store_true', default=False,
@@ -109,15 +109,16 @@ print("01. Patched sys.path with %s" % DEVPATH)
 if options.gui is None:
     try:
         import PyQt5  # analysis:ignore
-        print("02. PyQt5 is detected, selecting (experimental)")
+        print("02. PyQt5 is detected, selecting")
         os.environ['QT_API'] = 'pyqt5'
     except ImportError:
         try:
-            import PySide  # analysis:ignore
-            print("02. PySide is detected, selecting")
-            os.environ['QT_API'] = 'pyside'
+            import PyQt4  # analysis:ignore
+            print("02. PyQt4 is detected, selecting")
+            os.environ['QT_API'] = 'pyqt'
         except ImportError:
-            print("02. No PyQt5 or PySide detected, using PyQt4 if available")
+            print("02. No PyQt5 or PyQt4 detected, using PySide if available "
+                  "(deprecated)")
 else:
     print ("02. Skipping GUI toolkit detection")
     os.environ['QT_API'] = options.gui
@@ -143,14 +144,22 @@ print("    [Python %s %dbits, Qt %s, %s %s on %s]" % \
        versions['qt_api'], versions['qt_api_ver'], versions['system']))
 
 
+# Check that we have the right qtpy version
+from spyderlib.utils import programs
+if not programs.is_module_installed('qtpy', '>=1.1.0'):
+    print("")
+    sys.exit("ERROR: Your qtpy version is outdated. Please install qtpy "
+             "1.1.0 or higher to be able to work with Spyder!")
+
+
 # --- Executing Spyder
 
 if not options.hide_console and os.name == 'nt':
     print("0x. Enforcing parent console (Windows only)")
     sys.argv.append("--show-console")  # Windows only: show parent console
 
-print("04. Executing spyder.main()")
-from spyderlib import start_app
+print("04. Running Spyder")
+from spyderlib.app import start
 
 time_lapse = time.time()-time_start
 print("Bootstrap completed in " +
@@ -158,4 +167,4 @@ print("Bootstrap completed in " +
     # gmtime() converts float into tuple, but loses milliseconds
     ("%.4f" % time_lapse).split('.')[1])
 
-start_app.main()
+start.main()
diff --git a/doc/console.rst b/doc/console.rst
index 50a2cd7..97411a1 100644
--- a/doc/console.rst
+++ b/doc/console.rst
@@ -30,7 +30,7 @@ Python-based command windows support the following features:
 
 Related plugins:
 
-* :doc:`inspector`
+* :doc:`help`
 * :doc:`historylog`
 * :doc:`editor`
 * :doc:`explorer`
diff --git a/doc/inspector.rst b/doc/help.rst
similarity index 67%
rename from doc/inspector.rst
rename to doc/help.rst
index e664e9e..d33c8b7 100644
--- a/doc/inspector.rst
+++ b/doc/help.rst
@@ -1,11 +1,11 @@
-Object inspector
-================
+Help
+====
 
-The object inspector plugin works together with the :doc:`console` and the 
+The help plugin works together with the :doc:`console` and the 
 :doc:`editor`: it shows automatically documentation available when the 
 user is instantiating a class or calling a function (pressing the left 
-parenthesis key after a valid function or class name triggers the object 
-inspector).
+parenthesis key after a valid function or class name triggers a call
+in the help pane).
 
 Note that this automatic link may be disabled by pressing the "Lock" button 
 (at the top right corner of the window).
@@ -16,17 +16,17 @@ in the combo box.
 
 Plain text mode:
 
-.. image:: images/inspector_plain.png
+.. image:: images/help_plain.png
 
 Rich text mode:
 
-.. image:: images/inspector_rich.png
+.. image:: images/help_rich.png
 
 Sometimes, when docstrings are not available or not sufficient to document the 
 object, the documentation viewer can show the source code (if available, i.e. 
 if the object is pure Python):
 
-.. image:: images/inspector_source.png
+.. image:: images/help_source.png
 
 Related plugins:
 
diff --git a/doc/images/inspector_plain.png b/doc/images/help_plain.png
similarity index 100%
rename from doc/images/inspector_plain.png
rename to doc/images/help_plain.png
diff --git a/doc/images/inspector_rich.png b/doc/images/help_rich.png
similarity index 100%
rename from doc/images/inspector_rich.png
rename to doc/images/help_rich.png
diff --git a/doc/images/inspector_source.png b/doc/images/help_source.png
similarity index 100%
rename from doc/images/inspector_source.png
rename to doc/images/help_source.png
diff --git a/doc/index.rst b/doc/index.rst
index fb9fed3..0928e7c 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -30,12 +30,11 @@ Contents:
     overview
     installation
     options
-    lightmode
     console
     ipythonconsole
     debugging
     variableexplorer
-    inspector
+    help
     onlinehelp
     historylog
     explorer
diff --git a/doc/installation.rst b/doc/installation.rst
index 92c3df5..dec8ebe 100644
--- a/doc/installation.rst
+++ b/doc/installation.rst
@@ -27,19 +27,13 @@ If you want to install Spyder directly, you need to follow these steps:
 
 #. Install the essential requirements:
 
-   * `The Python language <http://www.python.org/>`_
-   * `PyQt4 <http://www.riverbankcomputing.co.uk/software/pyqt/download>`_
+   * `The Python programming language <http://www.python.org/>`_
+   * `PyQt5 <http://www.riverbankcomputing.co.uk/software/pyqt/download5>`_ (recommended)
+     or `PyQt4 <http://www.riverbankcomputing.co.uk/software/pyqt/download>`_
 
-#. Install optional modules:
+#. Install Spyder and its dependencies by running this command::
 
-   Please refer to the `Recommended modules`_ section to see what other packages
-   you might need.
-  
-#. Installing Spyder itself:
-
-   You need to download and install the .exe file that corresponds to your Python
-   version and architecture from
-   `this page <https://github.com/spyder-ide/spyder/releases>`_.
+       pip install spyder
 
 
 Updating Spyder
@@ -49,9 +43,14 @@ You can update Spyder by:
 
 * Updating Anaconda, WinPython, Python(x,y).
 
-* Installing a new .exe file from the page mentioned above (this will automatically
-  uninstall any previous version *only if* this version was installed with the same
-  kind of installer - i.e. not with an .msi installer).
+* Or using this command (in case you *don't* use any of those scientific
+  distributions)::
+
+        pip install --update spyder
+
+  .. note::
+
+     This command will also update all Spyder dependencies
 
 |
 
@@ -99,21 +98,20 @@ __ http://www.macports.org/ports.php?by=name&substr=spyder
 Installing on Linux
 -------------------
 
-Please refer to the `Recommended modules`_ section to see what other packages you
+Please refer to the `Requirements`_ section to see what other packages you
 might need.
 
 #. **Ubuntu**:
-  
+
    * Using the official package manager: ``sudo apt-get install spyder``.
-  
+
      .. note::
-     
+
         This package could be slightly outdated. If you find that is the case,
         please use the Debian package mentioned below.
-  
+
    * Using the `pip <https://pypi.python.org/pypi/pip/>`_ package manager:
-  
-     * Requirements: ``sudo apt-get install python-qt4 python-sphinx``
+
      * Installing: ``sudo pip install spyder``
      * Updating: ``sudo pip install -U spyder``
 
@@ -151,69 +149,81 @@ Installing or running directly from source
 Requirements
 ~~~~~~~~~~~~
 
-The minimal requirements to run Spyder are
-
-* `Python <http://www.python.org/>`_ 2.6+
-  
-* `PyQt4 <http://www.riverbankcomputing.co.uk/software/pyqt/download>`_ >= v4.6 or
-  `PySide <http://pyside.org/>`_ >=1.2.0 (PyQt4 is recommended).
-
+The requirements to run Spyder are:
 
-Recommended modules
-~~~~~~~~~~~~~~~~~~~
+* `Python <http://www.python.org/>`_ 2.7 or >=3.3
 
-We recommend you to install these modules to get the most out of Spyder:
+* `PyQt5 <https://www.riverbankcomputing.com/software/pyqt/download5>`_ >=5.2 or
+  `PyQt4 <https://www.riverbankcomputing.com/software/pyqt/download>`_ >=4.6.0
+  (PyQt5 is recommended).
 
-* `IPython <http://ipython.org/install.html#downloads>`_ 3.0 or less, or
-  `qtconsole <http://jupyter.org/qtconsole/stable/>`_ 4.0 or higher -- for an
+* `Qtconsole <http://jupyter.org/qtconsole/stable/>`_ >=4.2.0 -- for an
   enhanced Python interpreter.
-  
- .. note::
-  
-    - On *Ubuntu* you need to install ``ipython-qtconsole``.
-    - On *Fedora*, ``ipython-gui``
-    - And on *Gentoo* ``ipython`` with the ``qt4`` USE flag
-  
-* `sphinx <http://sphinx.pocoo.org>`_ >= v0.6  -- for the Object Inspector's rich
-  text mode and to get our documentation.
 
-* `rope <http://rope.sourceforge.net/>`_ 0.9.x (x>=0) -- for code completion,
+* `Rope <http://rope.sourceforge.net/>`_ >=0.9.4 and
+  `Jedi <http://jedi.jedidjah.ch/en/latest/>` 0.8.1 -- for code completion,
   go-to-definition and calltips on the Editor.
 
-* `pyflakes <http://pypi.python.org/pypi/pyflakes>`_  0.x (x>=5) -- for real-time
+* `Pyflakes <http://pypi.python.org/pypi/pyflakes>`_  -- for real-time
   code analysis.
 
-* `pylint <http://www.logilab.org/project/pylint>`_  -- for static code analysis.
+* `Sphinx <http://sphinx.pocoo.org>`_ -- for the Help pane rich text mode
+  and to get our documentation.
 
-* `pep8 <https://pypi.python.org/pypi/pep8>`_ -- for style analysis.
+* `Pygments <http://pygments.org/>`_ >=2.0 -- for syntax highlighting and code
+  completion in the Editor of all file types it supports.
 
-* `numpy <http://numpy.scipy.org/>`_ -- for N-dimensional arrays.
+* `Pylint <http://www.logilab.org/project/pylint>`_  -- for static code analysis.
 
-* `scipy <http://www.scipy.org/>`_ -- for signal and image processing.
+* `Pep8 <https://pypi.python.org/pypi/pep8>`_ -- for style analysis.
 
-* `matplotlib <http://matplotlib.sourceforge.net/>`_ -- for 2D and 3D plotting.
-
-* `psutil <http://code.google.com/p/psutil/>`_  -- for memory/CPU usage in the status
+* `Psutil <http://code.google.com/p/psutil/>`_  -- for memory/CPU usage in the status
   bar.
 
+* `Nbconvert <http://nbconvert.readthedocs.org/>`_ -- to manipulate Jupyter notebooks
+  on the Editor.
+
+* `Qtawesome <https://github.com/spyder-ide/qtawesome>`_ -- for an icon theme based on
+  FontAwesome.
+
+* Pickleshare -- To show import completions on the Editor and Consoles.
+
+* `PyZMQ <https://github.com/zeromq/pyzmq>`_ -- To run introspection services on the
+  Editor asynchronously.
+
+* `QtPy <https://github.com/spyder-ide/qtpy>`_ >=1.1.0 -- To run Spyder with PyQt4 or
+  PyQt5 seamlessly.
+
+
+Optional modules
+~~~~~~~~~~~~~~~~
+
+* `Matplotlib <http://matplotlib.sourceforge.net/>`_ >=1.0 -- for 2D and 3D plotting
+  in the consoles.
+
+* `Pandas <http://pandas.pydata.org/>`_ >=0.13.1 -- for view and editing DataFrames
+  and Series in the Variable Explorer.
+
+* `Numpy <http://numpy.scipy.org/>`_ -- for view and editing two or three
+  dimensional arrays in the Variable Explorer.
+
+* `Sympy <http://www.sympy.org/es/>`_ >=0.7.3 -- for working with symbolic mathematics
+  in the IPython console.
+
+* `Scipy <http://www.scipy.org/>`_ -- for importing Matlab workspace files in
+  the Variable Explorer.
+
 
 Installation procedure
 ~~~~~~~~~~~~~~~~~~~~~~
 
-#. Download and unzip the source package (spyder-*version*.zip):
-#. Change your current directory to the unzipped directory
-#. Run:
+1. If you use Anaconda, you need to run this command to install Spyder:
 
-   * ``sudo python setup.py install``, on Linux or MacOS X, or
-   * ``python setup.py install``, on Windows.
+   ``conda install spyder``
 
-  .. warning::
+2. If you don't use Anaconda, you need to run:
 
-     This procedure does *not* uninstall previous versions of Spyder, it simply 
-     copies files on top of an existing installation. When using this command,
-     it is thus highly recommended to uninstall manually any previous version of
-     Spyder by removing the associated directories (``spyderlib`` and
-     ``spyderplugins`` in your site-packages directory).
+   ``pip install --update spyder``
 
 
 Run without installing
@@ -236,6 +246,8 @@ Installing the development version
 
 If you want to try the next Spyder version, you have to:
 
+#. Install Spyder `requirements`_
+
 #. Install `Git <http://git-scm.com/downloads>`_, a powerful
    source control management tool.
 
diff --git a/doc/ipythonconsole.rst b/doc/ipythonconsole.rst
index 4c31a0f..77015b8 100644
--- a/doc/ipythonconsole.rst
+++ b/doc/ipythonconsole.rst
@@ -42,7 +42,7 @@ set:
 
 Related plugins:
 
-* :doc:`inspector`
+* :doc:`help`
 * :doc:`editor`
 * :doc:`explorer`
 
diff --git a/doc/lightmode.rst b/doc/lightmode.rst
deleted file mode 100644
index 75ffd5e..0000000
--- a/doc/lightmode.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-Light mode
-==========
-
-Spyder may be started in *light mode* with the following command:
-
-    ``python spyder.py --light``
-
-or
-
-    ``python spyder.py -l``
-
-
-The light mode is a very simple and light environment with the :doc:`console` 
-and the :doc:`variableexplorer`.
-
-.. image:: images/lightmode.png
-
-Related plugins:
-
-* :doc:`console`
-* :doc:`variableexplorer`
-
diff --git a/doc/onlinehelp.rst b/doc/onlinehelp.rst
index 5c902e1..97e281a 100644
--- a/doc/onlinehelp.rst
+++ b/doc/onlinehelp.rst
@@ -9,4 +9,4 @@ generated Python documentation on installed module, including your own modules
 
 Related plugins:
 
-* :doc:`inspector`
+* :doc:`help`
diff --git a/doc/options.rst b/doc/options.rst
index 9de51b6..9e92232 100644
--- a/doc/options.rst
+++ b/doc/options.rst
@@ -6,7 +6,6 @@ Spyder's command line options are the following:
 
 Options:
   -h, --help            show this help message and exit
-  -l, --light           Light version (all add-ons are disabled)
   --new-instance        Run a new instance of Spyder, even if the single
                         instance mode has been turned on (default)
   --session=STARTUP_SESSION
diff --git a/doc/overview.rst b/doc/overview.rst
index b81c708..0c9b540 100644
--- a/doc/overview.rst
+++ b/doc/overview.rst
@@ -16,7 +16,7 @@ Key features:
 * *preferences* dialog box:
   
   * keyboard shortcuts
-  * syntax coloring schemes (source editor, history log, object inspector)
+  * syntax coloring schemes (source editor, history log, help)
   * console: background color (black/white), automatic code completion, etc.
   * and a lot more...
     
@@ -39,7 +39,7 @@ Key features:
     * *calltips*
     * *go-to-definition*: go to object (any symbol: function, class, attribute, etc.) definition by pressing Ctrl+Left mouse click on word or Ctrl+G (default shortcut)
       
-  * *occurence highlighting*
+  * *occurrence highlighting*
   * typing helpers (optional):
     
     * automatically insert closing parentheses, braces and brackets
@@ -53,7 +53,7 @@ Key features:
 * :doc:`console`:
   
   * *all consoles are executed in a separate process*
-  * *code completion*/calltips and automatic link to object inspector (see below)
+  * *code completion*/calltips and automatic link to help (see below)
   * open Python interpreters or basic terminal command windows
   * run Python scripts (see source editor features)
   * *variable explorer*:
@@ -64,17 +64,17 @@ Key features:
     * data visualization
       
 * :doc:`historylog`
-* :doc:`inspector`:
+* :doc:`help`:
   
   * provide documentation or source code on any Python object (class, function, module, ...)
   * documentation may be displayed as an html page thanks to the rich text mode (powered by `sphinx`)
     
 * :doc:`onlinehelp`: automatically generated html documentation on installed Python modules
-* :doc:`findinfiles`: find string occurences in a directory, a mercurial repository or directly in PYTHONPATH (support for regular expressions and  included/excluded string lists)
+* :doc:`findinfiles`: find string occurrences in a directory, a mercurial repository or directly in PYTHONPATH (support for regular expressions and  included/excluded string lists)
 * :doc:`explorer`
 * :doc:`projectexplorer` (support Pydev project import)
 
 
-Spyder may also be used as a PyQt4 or PySide extension library 
-(module 'spyderlib'). For example, the Python interactive shell widget 
-used in Spyder may be embedded in your own PyQt4 or PySide application.
+Spyder may also be used as a PyQt5 or PyQt4 extension library 
+(module 'spyderlib'). For example, the Python interactive shell widget
+used in Spyder may be embedded in your own PyQt5 or PyQt4 application.
diff --git a/img_src/spyder_light.ico b/img_src/spyder_reset.ico
similarity index 100%
rename from img_src/spyder_light.ico
rename to img_src/spyder_reset.ico
diff --git a/scripts/spyder b/scripts/spyder
index a5990f6..d1034bd 100755
--- a/scripts/spyder
+++ b/scripts/spyder
@@ -1,3 +1,3 @@
 #!/usr/bin/env python
-from spyderlib import start_app
-start_app.main()
\ No newline at end of file
+from spyderlib.app import start
+start.main()
diff --git a/scripts/spyder3 b/scripts/spyder3
index a7f92bd..06da50e 100755
--- a/scripts/spyder3
+++ b/scripts/spyder3
@@ -1,3 +1,3 @@
 #! /usr/bin/python3
-from spyderlib import start_app
-start_app.main()
\ No newline at end of file
+from spyderlib.app import start
+start.main()
diff --git a/scripts/spyder_win_post_install.py b/scripts/spyder_win_post_install.py
index 527936b..128a9d8 100644
--- a/scripts/spyder_win_post_install.py
+++ b/scripts/spyder_win_post_install.py
@@ -147,13 +147,6 @@ def install():
                     osp.join(ico_dir, 'spyder.ico'))
     file_created(fname)
 
-    desc += '. Light configuration: console and variable explorer only.'
-    fname = osp.join(start_menu, 'Spyder (light).lnk')
-    create_shortcut(python, desc, fname,
-                    '"%s" --light' % script, workdir,
-                    osp.join(ico_dir, 'spyder_light.ico'))
-    file_created(fname)
-
     fname = osp.join(start_menu, 'Spyder-Reset all settings.lnk')
     create_shortcut(python, 'Reset Spyder settings to defaults',
                     fname, '"%s" --reset' % script, workdir)
diff --git a/setup.py b/setup.py
index 1112060..765848a 100644
--- a/setup.py
+++ b/setup.py
@@ -17,7 +17,6 @@ import os
 import os.path as osp
 import subprocess
 import sys
-import re
 import shutil
 
 from distutils.core import setup
@@ -86,7 +85,7 @@ def get_data_files():
                           ('share/pixmaps', ['img_src/spyder.png'])]
     elif os.name == 'nt':
         data_files = [('scripts', ['img_src/spyder.ico',
-                                   'img_src/spyder_light.ico'])]
+                                   'img_src/spyder_reset.ico'])]
     else:
         data_files = []
     return data_files
@@ -195,18 +194,6 @@ except ImportError:
 
 
 #==============================================================================
-# Windows installer names
-#==============================================================================
-JOINEDARGS = ''.join(sys.argv)
-WINDOWS_INSTALLER = 'bdist_wininst' in JOINEDARGS or 'bdist_msi' in JOINEDARGS
-TARGET_MATCH = re.search(r'--target-version=([0-9]*)\.([0-9]*)', JOINEDARGS)
-if TARGET_MATCH:
-    TARGET_VERSION = TARGET_MATCH.groups()
-else:
-    TARGET_VERSION = (str(sys.version_info[0]), str(sys.version_info[1]))
-
-
-#==============================================================================
 # Main scripts
 #==============================================================================
 # NOTE: the '[...]_win_post_install.py' script is installed even on non-Windows
@@ -229,58 +216,40 @@ if os.name == 'nt':
 
 
 #==============================================================================
-# Adding a message for the Windows installers
-#==============================================================================
-WININST_MSG = ""
-if WINDOWS_INSTALLER:
-    WININST_MSG = \
-"""Please uninstall any previous version of Spyder before continue.
-
-"""
-
-
-#==============================================================================
 # Setup arguments
 #==============================================================================
 setup_args = dict(name=NAME,
       version=__version__,
       description='Scientific PYthon Development EnviRonment',
-      long_description=WININST_MSG + \
+      long_description=
 """Spyder is an interactive Python development environment providing
 MATLAB-like features in a simple and light-weighted software.
-It also provides ready-to-use pure-Python widgets to your PyQt4 or
-PySide application: source code editor with syntax highlighting and
+It also provides ready-to-use pure-Python widgets to your PyQt5 or
+PyQt4 application: source code editor with syntax highlighting and
 code introspection/analysis features, NumPy array editor, dictionary
 editor, Python console, etc.""",
       download_url='%s/files/%s-%s.zip' % (__project_url__, NAME, __version__),
-      author="Pierre Raybaut",
+      author="The Spyder Development Team",
       url=__project_url__,
       license='MIT',
-      keywords='PyQt4 PySide editor shell console widgets IDE',
+      keywords='PyQt5 PyQt4 editor shell console widgets IDE',
       platforms=['any'],
       packages=get_packages(),
       package_data={LIBNAME: get_package_data(LIBNAME, EXTLIST),
-                    'spyplugins': get_package_data('spyplugins', EXTLIST),
+                    'spyder_breakpoints': get_package_data('spyder_breakpoints', EXTLIST),
+                    'spyder_profiler': get_package_data('spyder_profiler', EXTLIST),
+                    'spyder_pylint': get_package_data('spyder_pylint', EXTLIST),
+                    'spyder_io_dcm': get_package_data('spyder_io_dcm', EXTLIST),
+                    'spyder_io_hdf5': get_package_data('spyder_io_hdf5', EXTLIST),
                     },
       scripts=[osp.join('scripts', fname) for fname in SCRIPTS],
       data_files=get_data_files(),
-      options={"bdist_wininst":
-               {"install_script": "%s_win_post_install.py" % NAME,
-                "title": "%s %s" % (NAME.capitalize(), __version__),
-                "bitmap": osp.join('img_src', 'spyder-bdist_wininst.bmp'),
-                "target_version": '%s.%s' % TARGET_VERSION,
-                "user_access_control": "auto"},
-               "bdist_msi":
-               {"install_script": "%s_win_post_install.py" % NAME}},
       classifiers=['License :: OSI Approved :: MIT License',
                    'Operating System :: MacOS',
                    'Operating System :: Microsoft :: Windows',
-                   'Operating System :: OS Independent',
-                   'Operating System :: POSIX',
-                   'Operating System :: Unix',
+                   'Operating System :: POSIX :: Linux',
                    'Programming Language :: Python :: 2.7',
                    'Programming Language :: Python :: 3',
-                   'Programming Language :: Python :: 3.3'
                    'Development Status :: 5 - Production/Stable',
                    'Topic :: Scientific/Engineering',
                    'Topic :: Software Development :: Widget Sets'],
@@ -295,16 +264,19 @@ if any(arg == 'bdist_wheel' for arg in sys.argv):
 
 install_requires = [
     'rope_py3k' if PY3 else 'rope>=0.9.4',
-    'jedi==0.8.1',
+    'jedi',
     'pyflakes',
-    'pygments',
-    'qtconsole',
+    'pygments>=2.0',
+    'qtconsole>=4.2.0',
     'nbconvert',
     'sphinx',
     'pep8',
     'pylint',
     'psutil',
-    'qtawesome'
+    'qtawesome',
+    'qtpy>=1.1.0',
+    'pickleshare',
+    'pyzmq'
 ]
 
 if 'setuptools' in sys.modules:
@@ -312,7 +284,7 @@ if 'setuptools' in sys.modules:
 
     setup_args['entry_points'] = {
         'gui_scripts': [
-            'spyder = spyderlib.start_app:main'
+            'spyder = spyderlib.app.start:main'
         ]
     }
 
diff --git a/spyderlib/__init__.py b/spyderlib/__init__.py
index fc07709..b1775b2 100644
--- a/spyderlib/__init__.py
+++ b/spyderlib/__init__.py
@@ -3,8 +3,7 @@
 Spyder License Agreement (MIT License)
 --------------------------------------
 
-Copyright (c) 2009-2013 Pierre Raybaut
-Copyright (c) 2013-2015 The Spyder Development Team
+Copyright (c) 2009- The Spyder Development Team
 
 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
@@ -28,7 +27,9 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 """
 
-__version__ = '3.0.0b2'
+version_info = (3, 0, "0b4")
+
+__version__ = '.'.join(map(str, version_info))
 __license__ = __doc__
 __project_url__ = 'https://github.com/spyder-ide/spyder'
 __forum_url__   = 'http://groups.google.com/group/spyderlib'
@@ -62,8 +63,9 @@ def get_versions(reporev=True):
     """Get version information for components used by Spyder"""
     import sys
     import platform
-    import spyderlib.qt
-    import spyderlib.qt.QtCore
+
+    import qtpy
+    import qtpy.QtCore
 
     revision = None
     if reporev:
@@ -74,14 +76,14 @@ def get_versions(reporev=True):
         system = platform.system()
     else:
         system = 'Darwin'
-    
+
     return {
         'spyder': __version__,
         'python': platform.python_version(),  # "2.7.3"
         'bitness': 64 if sys.maxsize > 2**32 else 32,
-        'qt': spyderlib.qt.QtCore.__version__,
-        'qt_api': spyderlib.qt.API_NAME,      # PySide or PyQt4
-        'qt_api_ver': spyderlib.qt.__version__,
+        'qt': qtpy.QtCore.__version__,
+        'qt_api': qtpy.API_NAME,      # PyQt5 or PyQt4
+        'qt_api_ver': qtpy.PYQT_VERSION,
         'system': system,   # Linux, Windows, ...
         'revision': revision,  # '9fdf926eccce'
     }
diff --git a/spyderlib/widgets/variableexplorer/__init__.py b/spyderlib/app/__init__.py
similarity index 62%
copy from spyderlib/widgets/variableexplorer/__init__.py
copy to spyderlib/app/__init__.py
index 77e6402..15d8b6e 100644
--- a/spyderlib/widgets/variableexplorer/__init__.py
+++ b/spyderlib/app/__init__.py
@@ -1,12 +1,12 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009- The Spyder Development team
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""
-spyderlib.widgets.variableexplorer
-========================
-
-Variable Explorer related widgets
-"""
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009- The Spyder Development team
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""
+spyderlib.app
+=============
+
+Modules related to starting and restarting the Spyder application
+"""
diff --git a/spyderlib/cli_options.py b/spyderlib/app/cli_options.py
similarity index 91%
rename from spyderlib/cli_options.py
rename to spyderlib/app/cli_options.py
index 31910da..b0597f6 100644
--- a/spyderlib/cli_options.py
+++ b/spyderlib/app/cli_options.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright © 2012 The Spyder development team
+# Copyright © 2009- The Spyder development team
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
@@ -12,8 +12,6 @@ def get_options():
     return commands, message
     """
     parser = optparse.OptionParser(usage="spyder [options] files")
-    parser.add_option('-l', '--light', action='store_true', default=False,
-                      help="Light version (all add-ons are disabled)")
     parser.add_option('--new-instance', action='store_true', default=False,
                       help="Run a new instance of Spyder, even if the single "
                            "instance mode has been turned on (default)")
@@ -39,5 +37,7 @@ def get_options():
     parser.add_option('--profile', action='store_true', default=False,
                       help="Profile mode (internal test, "
                            "not related with Python profiling)")
+    parser.add_option('--window-title', type=str, default=None,
+                      help="String to show in the main window title")
     options, args = parser.parse_args()
     return options, args
diff --git a/spyderlib/mac_stylesheet.qss b/spyderlib/app/mac_stylesheet.qss
similarity index 96%
rename from spyderlib/mac_stylesheet.qss
rename to spyderlib/app/mac_stylesheet.qss
index 316da7b..89b21c5 100644
--- a/spyderlib/mac_stylesheet.qss
+++ b/spyderlib/app/mac_stylesheet.qss
@@ -107,12 +107,12 @@ QTabBar::scroller#plugin-tab {
 QTabBar#plugin-tab QToolButton::left-arrow {
     background: lightgrey;
     border-right: 1px solid darkgrey;
-    image: url(spyderlib/images/chevron-left.png);
+    image: url($IMAGE_PATH/chevron-left.png);
 }
 
 QTabBar#plugin-tab QToolButton::right-arrow {
     background: lightgrey;
-    image: url(spyderlib/images/chevron-right.png);
+    image: url($IMAGE_PATH/chevron-right.png);
 }
 
 
diff --git a/spyderlib/restart_app.py b/spyderlib/app/restart.py
similarity index 92%
rename from spyderlib/restart_app.py
rename to spyderlib/app/restart.py
index ad38e9d..1ace405 100644
--- a/spyderlib/restart_app.py
+++ b/spyderlib/app/restart.py
@@ -12,6 +12,7 @@ A helper script that allows to restart (and also reset) Spyder from within the
 running application.
 """
 
+# Standard library imports
 import ast
 import os
 import os.path as osp
@@ -19,15 +20,18 @@ import subprocess
 import sys
 import time
 
+# Third party imports
+from qtpy.QtCore import Qt, QTimer
+from qtpy.QtGui import QColor, QPixmap
+from qtpy.QtWidgets import QApplication, QMessageBox, QSplashScreen, QWidget
 
+# Local imports
 from spyderlib.config.base import _, get_image_path
 from spyderlib.py3compat import to_text_string
-from spyderlib.qt.QtCore import Qt, QTimer
-from spyderlib.qt.QtGui import (QColor, QMessageBox, QPixmap, QSplashScreen,
-                                QWidget, QApplication)
 from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.qthelpers import qapplication
 
+
 PY2 = sys.version[0] == '2'
 IS_WINDOWS = os.name == 'nt'
 SLEEP_TIME = 0.2  # Seconds for throttling control
@@ -85,8 +89,8 @@ class Restarter(QWidget):
 
         # Widgets
         self.timer_ellipsis = QTimer(self)
-        self.splash = QSplashScreen(QPixmap(get_image_path('splash.png'),
-                                    'png'))
+        self.splash = QSplashScreen(QPixmap(get_image_path('splash.svg'),
+                                    'svg'))
 
         # Widget setup
         self.setVisible(False)
@@ -168,7 +172,8 @@ def main():
     reset = os.environ.pop('SPYDER_RESET', None)
 
     # Get the spyder base folder based on this file
-    spyder_folder = osp.split(osp.dirname(osp.abspath(__file__)))[0]
+    this_folder = osp.split(osp.dirname(osp.abspath(__file__)))[0]
+    spyder_folder = osp.split(this_folder)[0]
 
     if not any([spyder_args, pid, is_bootstrap, reset]):
         error = "This script can only be called from within a Spyder instance"
@@ -206,7 +211,7 @@ def main():
         spyder = osp.join(spyder_folder, 'bootstrap.py')
     else:
         spyderlib = osp.join(spyder_folder, 'spyderlib')
-        spyder = osp.join(spyderlib, 'start_app.py')
+        spyder = osp.join(spyderlib, 'app', 'start.py')
 
     command = '"{0}" "{1}" {2}'.format(python, spyder, args)
 
diff --git a/spyderlib/spyder.py b/spyderlib/app/spyder.py
similarity index 65%
rename from spyderlib/spyder.py
rename to spyderlib/app/spyder.py
index 0c8f882..0822fd5 100644
--- a/spyderlib/spyder.py
+++ b/spyderlib/app/spyder.py
@@ -16,19 +16,18 @@ Licensed under the terms of the MIT License
 (see spyderlib/__init__.py for details)
 """
 
-from __future__ import print_function
-
-
-#==============================================================================
+# =============================================================================
 # Stdlib imports
-#==============================================================================
+# =============================================================================
+from __future__ import print_function
 import atexit
 import errno
 import os
 import os.path as osp
 import re
-import socket
 import shutil
+import signal
+import socket
 import subprocess
 import sys
 import threading
@@ -72,35 +71,24 @@ except ImportError:
 
 
 #==============================================================================
-# Don't show IPython ShimWarning's to our users
-# TODO: Move to Jupyter imports in 3.1
-#==============================================================================
-try:
-    import warnings
-    from IPython.utils.shimmodule import ShimWarning
-    warnings.simplefilter('ignore', ShimWarning)
-except:
-    pass
-
-
-#==============================================================================
 # Qt imports
 #==============================================================================
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QApplication, QMainWindow, QSplashScreen,
-                                QPixmap, QMessageBox, QMenu, QColor, QShortcut,
-                                QKeySequence, QDockWidget, QAction,
-                                QDesktopServices, QStyleFactory)
-from spyderlib.qt.QtCore import (Signal, QPoint, Qt, QSize, QByteArray, QUrl,
-                                 Slot, QTimer, QCoreApplication, QThread)
-from spyderlib.qt.compat import (from_qvariant, getopenfilename,
-                                 getsavefilename)
+from qtpy import API, PYQT5
+from qtpy.compat import from_qvariant, getopenfilename, getsavefilename
+from qtpy.QtCore import (QByteArray, QCoreApplication, QPoint, QSize, Qt,
+                         QThread, QTimer, QUrl, Signal, Slot)
+from qtpy.QtGui import QColor, QDesktopServices, QKeySequence, QPixmap
+from qtpy.QtWidgets import (QAction, QApplication, QDockWidget, QMainWindow,
+                            QMenu, QMessageBox, QShortcut, QSplashScreen,
+                            QStyleFactory)
 # Avoid a "Cannot mix incompatible Qt library" error on Windows platforms
 # when PySide is selected by the QT_API environment variable and when PyQt4
 # is also installed (or any other Qt-based application prepending a directory
 # containing incompatible Qt DLLs versions in PATH):
-from spyderlib.qt import QtSvg  # analysis:ignore
+from qtpy import QtSvg  # analysis:ignore
 
+# Avoid a bug in Qt: https://bugreports.qt.io/browse/QTBUG-46720
+from qtpy import QtWebEngineWidgets
 
 
 #==============================================================================
@@ -115,7 +103,7 @@ MAIN_APP = qapplication()
 # Create splash screen out of MainWindow to reduce perceived startup time. 
 #==============================================================================
 from spyderlib.config.base import _, get_image_path, DEV
-SPLASH = QSplashScreen(QPixmap(get_image_path('splash.png'), 'png'))
+SPLASH = QSplashScreen(QPixmap(get_image_path('splash.svg'), 'svg'))
 SPLASH_FONT = SPLASH.font()
 SPLASH_FONT.setPixelSize(10)
 SPLASH.setFont(SPLASH_FONT)
@@ -128,26 +116,25 @@ QApplication.processEvents()
 #==============================================================================
 # Local utility imports
 #==============================================================================
-import spyderlib.utils.icon_manager as ima
 from spyderlib import __version__, __project_url__, __forum_url__, get_versions
 from spyderlib.config.base import (get_conf_path, get_module_data_path,
                                    get_module_source_path, STDERR, DEBUG,
                                    debug_print, TEST, SUBFOLDER, MAC_APP_NAME,
                                    running_in_mac_app, get_module_path)
-from spyderlib.config.main import (CONF, EDIT_EXT, IMPORT_EXT, OPEN_FILES_PORT,
-                                   is_gtk_desktop)
-from spyderlib.cli_options import get_options
+from spyderlib.config.main import CONF, OPEN_FILES_PORT
+from spyderlib.config.utils import IMPORT_EXT, is_gtk_desktop
+from spyderlib.app.cli_options import get_options
 from spyderlib import dependencies
-from spyderlib.config.ipython import IPYTHON_QT_INSTALLED
+from spyderlib.config.ipython import QTCONSOLE_INSTALLED
 from spyderlib.config.user import NoDefault
+from spyderlib.py3compat import (getcwd, is_text_string, to_text_string,
+                                 PY3, qbytearray_to_str, u, configparser as cp)
 from spyderlib.utils import encoding, programs
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.introspection import module_completion
 from spyderlib.utils.iofuncs import load_session, save_session, reset_session
 from spyderlib.utils.programs import is_module_installed
-from spyderlib.utils.introspection import module_completion
 from spyderlib.utils.misc import select_port
-from spyderlib.py3compat import (PY3, to_text_string, is_text_string, getcwd,
-                                 u, qbytearray_to_str, configparser as cp)
-
 
 #==============================================================================
 # Local gui imports
@@ -164,11 +151,10 @@ from spyderlib.utils.qthelpers import (create_action, add_actions, get_icon,
                                        add_shortcut_to_tooltip,
                                        create_module_bookmark_actions,
                                        create_program_action, DialogManager,
-                                       keybinding, create_python_script_action,
-                                       file_uri)
-from spyderlib.config.gui import get_shortcut, remove_deprecated_shortcuts
+                                       create_python_script_action, file_uri)
+from spyderlib.config.gui import get_shortcut
 from spyderlib.otherplugins import get_spyderplugins_mods
-from spyderlib import tour # FIXME: Better place for this?
+from spyderlib.app import tour
 
 
 #==============================================================================
@@ -281,15 +267,31 @@ class MainWindow(QMainWindow):
         self.init_workdir = options.working_directory
         self.profile = options.profile
         self.multithreaded = options.multithreaded
-        self.light = options.light
         self.new_instance = options.new_instance
 
         self.debug_print("Start of MainWindow constructor")
 
+        def signal_handler(signum, frame=None):
+            """Handler for signals."""
+            sys.stdout.write('Handling signal: %s\n' % signum)
+            sys.stdout.flush()
+            QApplication.quit()
+
+        if os.name == "nt":
+            try:
+                import win32api
+                win32api.SetConsoleCtrlHandler(signal_handler, True)
+            except ImportError:
+                pass
+        else:
+            signal.signal(signal.SIGTERM, signal_handler)
+
         # Use a custom Qt stylesheet
         if sys.platform == 'darwin':
             spy_path = get_module_source_path('spyderlib')
-            mac_style = open(osp.join(spy_path, 'mac_stylesheet.qss')).read()
+            img_path = osp.join(spy_path, 'images')
+            mac_style = open(osp.join(spy_path, 'app', 'mac_stylesheet.qss')).read()
+            mac_style = mac_style.replace('$IMAGE_PATH', img_path)
             self.setStyleSheet(mac_style)
 
         # Shortcut management data
@@ -324,7 +326,7 @@ class MainWindow(QMainWindow):
         self.workingdirectory = None
         self.editor = None
         self.explorer = None
-        self.inspector = None
+        self.help = None
         self.onlinehelp = None
         self.projectexplorer = None
         self.outlineexplorer = None
@@ -366,10 +368,6 @@ class MainWindow(QMainWindow):
         self.lock_dockwidgets_action = None
         self.show_toolbars_action = None
         self.close_dockwidget_action = None
-        self.find_action = None
-        self.find_next_action = None
-        self.find_previous_action = None
-        self.replace_action = None
         self.undo_action = None
         self.redo_action = None
         self.copy_action = None
@@ -401,6 +399,7 @@ class MainWindow(QMainWindow):
         self.external_tools_menu_actions = []
         self.view_menu = None
         self.plugins_menu = None
+        self.plugins_menu_actions = []
         self.toolbars_menu = None
         self.help_menu = None
         self.help_menu_actions = []
@@ -440,10 +439,12 @@ class MainWindow(QMainWindow):
                                                sys.version_info[1])
         if DEBUG:
             title += " [DEBUG MODE %d]" % DEBUG
+        if options.window_title is not None:
+            title += ' -- ' + options.window_title
+
         self.setWindowTitle(title)
         resample = os.name != 'nt'
-        icon = ima.icon('spyder_light', resample=resample) if self.light\
-          else ima.icon('spyder', resample=resample)
+        icon = ima.icon('spyder', resample=resample)
         # Resampling SVG icon only on non-Windows platforms (see Issue 1314):
         self.setWindowIcon(icon)
         if set_windows_appusermodelid != None:
@@ -461,12 +462,11 @@ class MainWindow(QMainWindow):
 
         # Showing splash screen
         self.splash = SPLASH
-        if not self.light:
-            if CONF.get('main', 'current_version', '') != __version__:
-                CONF.set('main', 'current_version', __version__)
-                # Execute here the actions to be performed only once after
-                # each update (there is nothing there for now, but it could
-                # be useful some day...)
+        if CONF.get('main', 'current_version', '') != __version__:
+            CONF.set('main', 'current_version', __version__)
+            # Execute here the actions to be performed only once after
+            # each update (there is nothing there for now, but it could
+            # be useful some day...)
 
         # List of satellite widgets (registered in add_dockwidget):
         self.widgetlist = []
@@ -525,675 +525,639 @@ class MainWindow(QMainWindow):
     def setup(self):
         """Setup main window"""
         self.debug_print("*** Start of MainWindow setup ***")
-        if not self.light:
-            self.debug_print("  ..core actions")
-            self.close_dockwidget_action = create_action(self,
-                                        icon=ima.icon('DialogCloseButton'),
-                                        text=_("Close current pane"),
-                                        triggered=self.close_current_dockwidget,
+        self.debug_print("  ..core actions")
+        self.close_dockwidget_action = create_action(self,
+                                    icon=ima.icon('DialogCloseButton'),
+                                    text=_("Close current pane"),
+                                    triggered=self.close_current_dockwidget,
+                                    context=Qt.ApplicationShortcut)
+        self.register_shortcut(self.close_dockwidget_action, "_",
+                               "Close pane")
+        self.lock_dockwidgets_action = create_action(self, _("Lock panes"),
+                                        toggled=self.toggle_lock_dockwidgets,
                                         context=Qt.ApplicationShortcut)
-            self.register_shortcut(self.close_dockwidget_action, "_",
-                                   "Close pane")
-            self.lock_dockwidgets_action = create_action(self, _("Lock panes"),
-                                            toggled=self.toggle_lock_dockwidgets,
-                                            context=Qt.ApplicationShortcut)
-            self.register_shortcut(self.lock_dockwidgets_action, "_",
-                                       "lock unlock panes")
-            # custom layouts shortcuts
-            self.toggle_next_layout_action = create_action(self,
-                                        _("Use next layout"),
-                                        triggered=self.toggle_next_layout,
+        self.register_shortcut(self.lock_dockwidgets_action, "_",
+                               "Lock unlock panes")
+        # custom layouts shortcuts
+        self.toggle_next_layout_action = create_action(self,
+                                    _("Use next layout"),
+                                    triggered=self.toggle_next_layout,
+                                    context=Qt.ApplicationShortcut)
+        self.toggle_previous_layout_action = create_action(self,
+                                    _("Use previous layout"),
+                                    triggered=self.toggle_previous_layout,
+                                    context=Qt.ApplicationShortcut)
+        self.register_shortcut(self.toggle_next_layout_action, "_",
+                               "Use next layout")
+        self.register_shortcut(self.toggle_previous_layout_action, "_",
+                               "Use previous layout")
+
+        def create_edit_action(text, tr_text, icon):
+            textseq = text.split(' ')
+            method_name = textseq[0].lower()+"".join(textseq[1:])
+            action = create_action(self, tr_text,
+                                   icon=icon,
+                                   triggered=self.global_callback,
+                                   data=method_name,
+                                   context=Qt.WidgetShortcut)
+            self.register_shortcut(action, "Editor", text)
+            return action
+
+        self.undo_action = create_edit_action('Undo', _('Undo'),
+                                              ima.icon('undo'))
+        self.redo_action = create_edit_action('Redo', _('Redo'),
+                                              ima.icon('redo'))
+        self.copy_action = create_edit_action('Copy', _('Copy'),
+                                              ima.icon('editcopy'))
+        self.cut_action = create_edit_action('Cut', _('Cut'),
+                                             ima.icon('editcut'))
+        self.paste_action = create_edit_action('Paste', _('Paste'),
+                                               ima.icon('editpaste'))
+        self.selectall_action = create_edit_action("Select All",
+                                                   _("Select All"),
+                                                   ima.icon('selectall'))
+
+        self.edit_menu_actions = [self.undo_action, self.redo_action,
+                                  None, self.cut_action, self.copy_action,
+                                  self.paste_action, self.selectall_action]
+
+        namespace = None
+        self.debug_print("  ..toolbars")
+        # File menu/toolbar
+        self.file_menu = self.menuBar().addMenu(_("&File"))
+        self.file_menu.aboutToShow.connect(self.update_file_menu)
+        self.file_toolbar = self.create_toolbar(_("File toolbar"),
+                                                "file_toolbar")
+
+        # Edit menu/toolbar
+        self.edit_menu = self.menuBar().addMenu(_("&Edit"))
+        self.edit_toolbar = self.create_toolbar(_("Edit toolbar"),
+                                                "edit_toolbar")
+
+        # Search menu/toolbar
+        self.search_menu = self.menuBar().addMenu(_("&Search"))
+        self.search_toolbar = self.create_toolbar(_("Search toolbar"),
+                                                    "search_toolbar")
+
+        # Source menu/toolbar
+        self.source_menu = self.menuBar().addMenu(_("Sour&ce"))
+        self.source_toolbar = self.create_toolbar(_("Source toolbar"),
+                                                    "source_toolbar")
+
+        # Run menu/toolbar
+        self.run_menu = self.menuBar().addMenu(_("&Run"))
+        self.run_toolbar = self.create_toolbar(_("Run toolbar"),
+                                                "run_toolbar")
+
+        # Debug menu/toolbar
+        self.debug_menu = self.menuBar().addMenu(_("&Debug"))
+        self.debug_toolbar = self.create_toolbar(_("Debug toolbar"),
+                                                    "debug_toolbar")
+
+        # Consoles menu/toolbar
+        self.consoles_menu = self.menuBar().addMenu(_("C&onsoles"))
+
+        # Tools menu
+        self.tools_menu = self.menuBar().addMenu(_("&Tools"))
+
+        # View menu
+        self.view_menu = self.menuBar().addMenu(_("&View"))
+
+        # Help menu
+        self.help_menu = self.menuBar().addMenu(_("&Help"))
+
+        # Status bar
+        status = self.statusBar()
+        status.setObjectName("StatusBar")
+        status.showMessage(_("Welcome to Spyder!"), 5000)
+
+
+        self.debug_print("  ..tools")
+        # Tools + External Tools
+        prefs_action = create_action(self, _("Pre&ferences"),
+                                        icon=ima.icon('configure'),
+                                        triggered=self.edit_preferences,
                                         context=Qt.ApplicationShortcut)
-            self.toggle_previous_layout_action = create_action(self,
-                                        _("Use previous layout"),
-                                        triggered=self.toggle_previous_layout,
+        self.register_shortcut(prefs_action, "_", "Preferences",
+                               add_sc_to_tip=True)
+        spyder_path_action = create_action(self,
+                                _("PYTHONPATH manager"),
+                                None, icon=ima.icon('pythonpath'),
+                                triggered=self.path_manager_callback,
+                                tip=_("Python Path Manager"),
+                                menurole=QAction.ApplicationSpecificRole)
+        update_modules_action = create_action(self,
+                                    _("Update module names list"),
+                                    triggered=lambda:
+                                                module_completion.reset(),
+                                    tip=_("Refresh list of module names "
+                                            "available in PYTHONPATH"))
+        reset_spyder_action = create_action(
+            self, _("Reset Spyder to factory defaults"),
+            triggered=self.reset_spyder)
+        self.tools_menu_actions = [prefs_action, spyder_path_action]
+        if WinUserEnvDialog is not None:
+            winenv_action = create_action(self,
+                    _("Current user environment variables..."),
+                    icon='win_env.png',
+                    tip=_("Show and edit current user environment "
+                            "variables in Windows registry "
+                            "(i.e. for all sessions)"),
+                    triggered=self.win_env)
+            self.tools_menu_actions.append(winenv_action)
+        self.tools_menu_actions += [reset_spyder_action, None,
+                                    update_modules_action]
+
+        # External Tools submenu
+        self.external_tools_menu = QMenu(_("External Tools"))
+        self.external_tools_menu_actions = []
+        # Python(x,y) launcher
+        self.xy_action = create_action(self,
+                                _("Python(x,y) launcher"),
+                                icon=get_icon('pythonxy.png'),
+                                triggered=lambda:
+                                programs.run_python_script('xy', 'xyhome'))
+        if os.name == 'nt' and is_module_installed('xy'):
+            self.external_tools_menu_actions.append(self.xy_action)
+        # WinPython control panel
+        self.wp_action = create_action(self, _("WinPython control panel"),
+                    icon=get_icon('winpython.svg'),
+                    triggered=lambda:
+                    programs.run_python_script('winpython', 'controlpanel'))
+        if os.name == 'nt' and is_module_installed('winpython'):
+            self.external_tools_menu_actions.append(self.wp_action)
+        # Qt-related tools
+        additact = []
+        for name in ("designer-qt4", "designer"):
+            qtdact = create_program_action(self, _("Qt Designer"),
+                                            name, 'qtdesigner.png')
+            if qtdact:
+                break
+        for name in ("linguist-qt4", "linguist"):
+            qtlact = create_program_action(self, _("Qt Linguist"),
+                                            "linguist", 'qtlinguist.png')
+            if qtlact:
+                break
+        args = ['-no-opengl'] if os.name == 'nt' else []
+        qteact = create_python_script_action(self,
+                                _("Qt examples"), 'qt.png', "PyQt4",
+                                osp.join("examples", "demos",
+                                        "qtdemo", "qtdemo"), args)
+        for act in (qtdact, qtlact, qteact):
+            if act:
+                additact.append(act)
+        if additact and (is_module_installed('winpython') or \
+            is_module_installed('xy')):
+            self.external_tools_menu_actions += [None] + additact
+
+        # Guidata and Sift
+        self.debug_print("  ..sift?")
+        gdgq_act = []
+        # Guidata and Guiqwt don't support PyQt5 yet and they fail
+        # with an AssertionError when imported using those bindings
+        # (see issue 2274)
+        try:
+            from guidata import configtools
+            from guidata import config       # analysis:ignore
+            guidata_icon = configtools.get_icon('guidata.svg')
+            guidata_act = create_python_script_action(self,
+                                    _("guidata examples"), guidata_icon,
+                                    "guidata",
+                                    osp.join("tests", "__init__"))
+            gdgq_act += [guidata_act]
+        except (ImportError, AssertionError):
+            pass
+        try:
+            from guidata import configtools
+            from guiqwt import config  # analysis:ignore
+            guiqwt_icon = configtools.get_icon('guiqwt.svg')
+            guiqwt_act = create_python_script_action(self,
+                            _("guiqwt examples"), guiqwt_icon, "guiqwt",
+                            osp.join("tests", "__init__"))
+            if guiqwt_act:
+                gdgq_act += [guiqwt_act]
+            sift_icon = configtools.get_icon('sift.svg')
+            sift_act = create_python_script_action(self, _("Sift"),
+                        sift_icon, "guiqwt", osp.join("tests", "sift"))
+            if sift_act:
+                gdgq_act += [sift_act]
+        except (ImportError, AssertionError):
+            pass
+        if gdgq_act:
+            self.external_tools_menu_actions += [None] + gdgq_act
+
+        # ViTables
+        vitables_act = create_program_action(self, _("ViTables"),
+                                                "vitables", 'vitables.png')
+        if vitables_act:
+            self.external_tools_menu_actions += [None, vitables_act]
+
+        # Maximize current plugin
+        self.maximize_action = create_action(self, '',
+                                        triggered=self.maximize_dockwidget,
                                         context=Qt.ApplicationShortcut)
-            self.register_shortcut(self.toggle_next_layout_action, "_",
-                                   "Use next layout")
-            self.register_shortcut(self.toggle_previous_layout_action, "_",
-                                   "Use previous layout")
-
-
-            _text = _("&Find text")
-            self.find_action = create_action(self, _text, icon=ima.icon('find'),
-                                             tip=_text, triggered=self.find,
-                                             context=Qt.WidgetShortcut)
-            self.register_shortcut(self.find_action, "Editor", "Find text")
-            self.find_next_action = create_action(self, _("Find &next"),
-                  icon=ima.icon('findnext'), 
-                  triggered=self.find_next,
-                  context=Qt.WidgetShortcut)
-            self.register_shortcut(self.find_next_action, "Editor",
-                                   "Find next")
-            self.find_previous_action = create_action(self,
-                        _("Find &previous"),
-                        icon=ima.icon('findprevious'),
-                                      triggered=self.find_previous,
-                        context=Qt.WidgetShortcut)
-            self.register_shortcut(self.find_previous_action, "Editor",
-                                   "Find previous")
-            _text = _("&Replace text")
-            self.replace_action = create_action(self, _text, 
-                                            icon=ima.icon('replace'),
-                                            tip=_text, triggered=self.replace,
-                                            context=Qt.WidgetShortcut)
-            self.register_shortcut(self.replace_action, "Editor",
-                                   "Replace text")
-
-            def create_edit_action(text, tr_text, icon):
-                textseq = text.split(' ')
-                method_name = textseq[0].lower()+"".join(textseq[1:])
-                action = create_action(self, tr_text,
-                                    shortcut=keybinding(text.replace(' ', '')),
-                                    icon=icon,
-                                    triggered=self.global_callback,
-                                    data=method_name,
-                                    context=Qt.WidgetShortcut)
-                self.register_shortcut(action, "Editor", text)
-                return action
-
-            self.undo_action = create_edit_action('Undo', _('Undo'),
-                                                  ima.icon('undo'))
-            self.redo_action = create_edit_action('Redo', _('Redo'), 
-                                                  ima.icon('redo'))
-            self.copy_action = create_edit_action('Copy', _('Copy'),
-                                                  ima.icon('editcopy'))
-            self.cut_action = create_edit_action('Cut', _('Cut'),
-                                                 ima.icon('editcut'))
-            self.paste_action = create_edit_action('Paste', _('Paste'),
-                                                   ima.icon('editpaste'))
-            self.selectall_action = create_edit_action("Select All",
-                                                       _("Select All"),
-                                                       ima.icon('selectall'))
-
-            self.edit_menu_actions = [self.undo_action, self.redo_action,
-                                      None, self.cut_action, self.copy_action,
-                                      self.paste_action, self.selectall_action]
-            self.search_menu_actions = [self.find_action,
-                                        self.find_next_action,
-                                        self.find_previous_action,
-                                        self.replace_action]
-            self.search_toolbar_actions = [self.find_action,
-                                           self.find_next_action,
-                                           self.replace_action]
+        self.register_shortcut(self.maximize_action, "_", "Maximize pane")
+        self.__update_maximize_action()
 
-        namespace = None
-        if not self.light:
-            self.debug_print("  ..toolbars")
-            # File menu/toolbar
-            self.file_menu = self.menuBar().addMenu(_("&File"))
-            self.file_menu.aboutToShow.connect(self.update_file_menu)
-            self.file_toolbar = self.create_toolbar(_("File toolbar"),
-                                                    "file_toolbar")
-
-            # Edit menu/toolbar
-            self.edit_menu = self.menuBar().addMenu(_("&Edit"))
-            self.edit_toolbar = self.create_toolbar(_("Edit toolbar"),
-                                                    "edit_toolbar")
-
-            # Search menu/toolbar
-            self.search_menu = self.menuBar().addMenu(_("&Search"))
-            self.search_toolbar = self.create_toolbar(_("Search toolbar"),
-                                                      "search_toolbar")
-
-            # Source menu/toolbar
-            self.source_menu = self.menuBar().addMenu(_("Sour&ce"))
-            self.source_toolbar = self.create_toolbar(_("Source toolbar"),
-                                                      "source_toolbar")
-
-            # Run menu/toolbar
-            self.run_menu = self.menuBar().addMenu(_("&Run"))
-            self.run_toolbar = self.create_toolbar(_("Run toolbar"),
-                                                   "run_toolbar")
-
-            # Debug menu/toolbar
-            self.debug_menu = self.menuBar().addMenu(_("&Debug"))
-            self.debug_toolbar = self.create_toolbar(_("Debug toolbar"),
-                                                     "debug_toolbar")
-
-            # Consoles menu/toolbar
-            self.consoles_menu = self.menuBar().addMenu(_("C&onsoles"))
-
-            # Tools menu
-            self.tools_menu = self.menuBar().addMenu(_("&Tools"))
-
-            # View menu
-            self.view_menu = self.menuBar().addMenu(_("&View"))
-
-            # Help menu
-            self.help_menu = self.menuBar().addMenu(_("&Help"))
-
-            # Status bar
-            status = self.statusBar()
-            status.setObjectName("StatusBar")
-            status.showMessage(_("Welcome to Spyder!"), 5000)
-
-
-            self.debug_print("  ..tools")
-            # Tools + External Tools
-            prefs_action = create_action(self, _("Pre&ferences"),
-                                         icon=ima.icon('configure'),
-                                         triggered=self.edit_preferences)
-            self.register_shortcut(prefs_action, "_", "Preferences")
-            add_shortcut_to_tooltip(prefs_action, context="_",
-                                    name="Preferences")
-            spyder_path_action = create_action(self,
-                                    _("PYTHONPATH manager"),
-                                    None, icon=ima.icon('pythonpath'),
-                                    triggered=self.path_manager_callback,
-                                    tip=_("Python Path Manager"),
-                                    menurole=QAction.ApplicationSpecificRole)
-            update_modules_action = create_action(self,
-                                        _("Update module names list"),
-                                        triggered=lambda:
-                                                  module_completion.reset(),
-                                        tip=_("Refresh list of module names "
-                                              "available in PYTHONPATH"))
-            reset_spyder_action = create_action(
-                self, _("Reset Spyder to factory defaults"),
-                triggered=self.reset_spyder)
-            self.tools_menu_actions = [prefs_action, spyder_path_action]
-            if WinUserEnvDialog is not None:
-                winenv_action = create_action(self,
-                        _("Current user environment variables..."),
-                        icon='win_env.png',
-                        tip=_("Show and edit current user environment "
-                              "variables in Windows registry "
-                              "(i.e. for all sessions)"),
-                        triggered=self.win_env)
-                self.tools_menu_actions.append(winenv_action)
-            self.tools_menu_actions += [reset_spyder_action, None,
-                                        update_modules_action]
-
-            # External Tools submenu
-            self.external_tools_menu = QMenu(_("External Tools"))
-            self.external_tools_menu_actions = []
-            # Python(x,y) launcher
-            self.xy_action = create_action(self,
-                                   _("Python(x,y) launcher"),
-                                   icon=get_icon('pythonxy.png'),
-                                   triggered=lambda:
-                                   programs.run_python_script('xy', 'xyhome'))
-            if os.name == 'nt' and is_module_installed('xy'):
-                self.external_tools_menu_actions.append(self.xy_action)
-            # WinPython control panel
-            self.wp_action = create_action(self, _("WinPython control panel"),
-                       icon=get_icon('winpython.svg'),
-                       triggered=lambda:
-                       programs.run_python_script('winpython', 'controlpanel'))
-            if os.name == 'nt' and is_module_installed('winpython'):
-                self.external_tools_menu_actions.append(self.wp_action)
-            # Qt-related tools
-            additact = []
-            for name in ("designer-qt4", "designer"):
-                qtdact = create_program_action(self, _("Qt Designer"),
-                                               name, 'qtdesigner.png')
-                if qtdact:
-                    break
-            for name in ("linguist-qt4", "linguist"):
-                qtlact = create_program_action(self, _("Qt Linguist"),
-                                               "linguist", 'qtlinguist.png')
-                if qtlact:
-                    break
-            args = ['-no-opengl'] if os.name == 'nt' else []
-            qteact = create_python_script_action(self,
-                                   _("Qt examples"), 'qt.png', "PyQt4",
-                                   osp.join("examples", "demos",
-                                            "qtdemo", "qtdemo"), args)
-            for act in (qtdact, qtlact, qteact):
-                if act:
-                    additact.append(act)
-            if additact and (is_module_installed('winpython') or \
-              is_module_installed('xy')):
-                self.external_tools_menu_actions += [None] + additact
-
-            # Guidata and Sift
-            self.debug_print("  ..sift?")
-            gdgq_act = []
-            # Guidata and Guiqwt don't support PyQt5 yet and they fail
-            # with an AssertionError when imported using those bindings
-            # (see issue 2274)
-            try:
-                from guidata import configtools
-                from guidata import config       # analysis:ignore
-                guidata_icon = configtools.get_icon('guidata.svg')
-                guidata_act = create_python_script_action(self,
-                                       _("guidata examples"), guidata_icon,
-                                       "guidata",
-                                       osp.join("tests", "__init__"))
-                gdgq_act += [guidata_act]
-            except (ImportError, AssertionError):
-                pass
-            try:
-                from guidata import configtools
-                from guiqwt import config  # analysis:ignore
-                guiqwt_icon = configtools.get_icon('guiqwt.svg')
-                guiqwt_act = create_python_script_action(self,
-                               _("guiqwt examples"), guiqwt_icon, "guiqwt",
-                               osp.join("tests", "__init__"))
-                if guiqwt_act:
-                    gdgq_act += [guiqwt_act]
-                sift_icon = configtools.get_icon('sift.svg')
-                sift_act = create_python_script_action(self, _("Sift"),
-                           sift_icon, "guiqwt", osp.join("tests", "sift"))
-                if sift_act:
-                    gdgq_act += [sift_act]
-            except (ImportError, AssertionError):
-                pass
-            if gdgq_act:
-                self.external_tools_menu_actions += [None] + gdgq_act
-
-            # ViTables
-            vitables_act = create_program_action(self, _("ViTables"),
-                                                 "vitables", 'vitables.png')
-            if vitables_act:
-                self.external_tools_menu_actions += [None, vitables_act]
-
-            # Maximize current plugin
-            self.maximize_action = create_action(self, '',
-                                            triggered=self.maximize_dockwidget)
-            self.register_shortcut(self.maximize_action, "_",
-                                   "Maximize pane")
-            self.__update_maximize_action()
-
-            # Fullscreen mode
-            self.fullscreen_action = create_action(self,
-                                            _("Fullscreen mode"),
-                                            triggered=self.toggle_fullscreen)
-            self.register_shortcut(self.fullscreen_action, "_",
-                                   "Fullscreen mode")
-            add_shortcut_to_tooltip(self.fullscreen_action, context="_",
-                                    name="Fullscreen mode")
-
-            # Main toolbar
-            self.main_toolbar_actions = [self.maximize_action,
-                                         self.fullscreen_action, None,
-                                         prefs_action, spyder_path_action]
-
-            self.main_toolbar = self.create_toolbar(_("Main toolbar"),
-                                                    "main_toolbar")
-
-            # Internal console plugin
-            self.debug_print("  ..plugin: internal console")
-            from spyderlib.plugins.console import Console
-            self.console = Console(self, namespace, exitfunc=self.closing,
-                              profile=self.profile,
-                              multithreaded=self.multithreaded,
-                              message=_("Spyder Internal Console\n\n"
-                                        "This console is used to report application\n"
-                                        "internal errors and to inspect Spyder\n"
-                                        "internals with the following commands:\n"
-                                        "  spy.app, spy.window, dir(spy)\n\n"
-                                        "Please don't use it to run your code\n\n"))
-            self.console.register_plugin()
-
-            # Working directory plugin
-            self.debug_print("  ..plugin: working directory")
-            from spyderlib.plugins.workingdirectory import WorkingDirectory
-            self.workingdirectory = WorkingDirectory(self, self.init_workdir, main=self)
-            self.workingdirectory.register_plugin()
-            self.toolbarslist.append(self.workingdirectory)
-
-            # Object inspector plugin
-            if CONF.get('inspector', 'enable'):
-                self.set_splash(_("Loading object inspector..."))
-                from spyderlib.plugins.inspector import ObjectInspector
-                self.inspector = ObjectInspector(self)
-                self.inspector.register_plugin()
-
-            # Outline explorer widget
-            if CONF.get('outline_explorer', 'enable'):
-                self.set_splash(_("Loading outline explorer..."))
-                from spyderlib.plugins.outlineexplorer import OutlineExplorer
-                fullpath_sorting = CONF.get('editor', 'fullpath_sorting', True)
-                self.outlineexplorer = OutlineExplorer(self,
-                                            fullpath_sorting=fullpath_sorting)
-                self.outlineexplorer.register_plugin()
-
-            # Editor plugin
-            self.set_splash(_("Loading editor..."))
-            from spyderlib.plugins.editor import Editor
-            self.editor = Editor(self)
-            self.editor.register_plugin()
-
-            # Populating file menu entries
-            quit_action = create_action(self, _("&Quit"),
-                                        icon=ima.icon('exit'), 
-                                        tip=_("Quit"),
-                                        triggered=self.console.quit)
-            self.register_shortcut(quit_action, "_", "Quit")
-            restart_action = create_action(self, _("&Restart"),
-                                           icon=ima.icon('restart'),
-                                           tip=_("Restart"),
-                                           triggered=self.restart)
-            self.register_shortcut(restart_action, "_", "Restart")
-
-            self.file_menu_actions += [self.load_temp_session_action,
-                                       self.load_session_action,
-                                       self.save_session_action,
-                                       None, restart_action, quit_action]
-            self.set_splash("")
-
-            self.debug_print("  ..widgets")
-            # Find in files
-            if CONF.get('find_in_files', 'enable'):
-                from spyderlib.plugins.findinfiles import FindInFiles
-                self.findinfiles = FindInFiles(self)
-                self.findinfiles.register_plugin()
-
-            # Explorer
-            if CONF.get('explorer', 'enable'):
-                self.set_splash(_("Loading file explorer..."))
-                from spyderlib.plugins.explorer import Explorer
-                self.explorer = Explorer(self)
-                self.explorer.register_plugin()
-
-            # History log widget
-            if CONF.get('historylog', 'enable'):
-                self.set_splash(_("Loading history plugin..."))
-                from spyderlib.plugins.history import HistoryLog
-                self.historylog = HistoryLog(self)
-                self.historylog.register_plugin()
-
-            # Online help widget
-            try:    # Qt >= v4.4
-                from spyderlib.plugins.onlinehelp import OnlineHelp
-            except ImportError:    # Qt < v4.4
-                OnlineHelp = None  # analysis:ignore
-            if CONF.get('onlinehelp', 'enable') and OnlineHelp is not None:
-                self.set_splash(_("Loading online help..."))
-                self.onlinehelp = OnlineHelp(self)
-                self.onlinehelp.register_plugin()
-
-            # Project explorer widget
-            if CONF.get('project_explorer', 'enable'):
-                self.set_splash(_("Loading project explorer..."))
-                from spyderlib.plugins.projectexplorer import ProjectExplorer
-                self.projectexplorer = ProjectExplorer(self)
-                self.projectexplorer.register_plugin()
+        # Fullscreen mode
+        self.fullscreen_action = create_action(self,
+                                        _("Fullscreen mode"),
+                                        triggered=self.toggle_fullscreen,
+                                        context=Qt.ApplicationShortcut)
+        self.register_shortcut(self.fullscreen_action, "_",
+                               "Fullscreen mode", add_sc_to_tip=True)
+
+        # Main toolbar
+        self.main_toolbar_actions = [self.maximize_action,
+                                     self.fullscreen_action,
+                                     None,
+                                     prefs_action, spyder_path_action]
+
+        self.main_toolbar = self.create_toolbar(_("Main toolbar"),
+                                                "main_toolbar")
+
+        # Internal console plugin
+        self.debug_print("  ..plugin: internal console")
+        from spyderlib.plugins.console import Console
+        self.console = Console(self, namespace, exitfunc=self.closing,
+                            profile=self.profile,
+                            multithreaded=self.multithreaded,
+                            message=_("Spyder Internal Console\n\n"
+                                    "This console is used to report application\n"
+                                    "internal errors and to inspect Spyder\n"
+                                    "internals with the following commands:\n"
+                                    "  spy.app, spy.window, dir(spy)\n\n"
+                                    "Please don't use it to run your code\n\n"))
+        self.console.register_plugin()
+
+        # Working directory plugin
+        self.debug_print("  ..plugin: working directory")
+        from spyderlib.plugins.workingdirectory import WorkingDirectory
+        self.workingdirectory = WorkingDirectory(self, self.init_workdir, main=self)
+        self.workingdirectory.register_plugin()
+        self.toolbarslist.append(self.workingdirectory)
+
+        # Help plugin
+        if CONF.get('help', 'enable'):
+            self.set_splash(_("Loading help..."))
+            from spyderlib.plugins.help import Help
+            self.help = Help(self)
+            self.help.register_plugin()
+
+        # Outline explorer widget
+        if CONF.get('outline_explorer', 'enable'):
+            self.set_splash(_("Loading outline explorer..."))
+            from spyderlib.plugins.outlineexplorer import OutlineExplorer
+            fullpath_sorting = CONF.get('editor', 'fullpath_sorting', True)
+            self.outlineexplorer = OutlineExplorer(self,
+                                        fullpath_sorting=fullpath_sorting)
+            self.outlineexplorer.register_plugin()
+
+        # Editor plugin
+        self.set_splash(_("Loading editor..."))
+        from spyderlib.plugins.editor import Editor
+        self.editor = Editor(self)
+        self.editor.register_plugin()
+
+        # Populating file menu entries
+        quit_action = create_action(self, _("&Quit"),
+                                    icon=ima.icon('exit'),
+                                    tip=_("Quit"),
+                                    triggered=self.console.quit,
+                                    context=Qt.ApplicationShortcut)
+        self.register_shortcut(quit_action, "_", "Quit")
+        restart_action = create_action(self, _("&Restart"),
+                                       icon=ima.icon('restart'),
+                                       tip=_("Restart"),
+                                       triggered=self.restart,
+                                       context=Qt.ApplicationShortcut)
+        self.register_shortcut(restart_action, "_", "Restart")
+
+        self.file_menu_actions += [self.load_temp_session_action,
+                                    self.load_session_action,
+                                    self.save_session_action,
+                                    None, restart_action, quit_action]
+        self.set_splash("")
+
+        self.debug_print("  ..widgets")
+        # Find in files
+        if CONF.get('find_in_files', 'enable'):
+            from spyderlib.plugins.findinfiles import FindInFiles
+            self.findinfiles = FindInFiles(self)
+            self.findinfiles.register_plugin()
+
+        # Explorer
+        if CONF.get('explorer', 'enable'):
+            self.set_splash(_("Loading file explorer..."))
+            from spyderlib.plugins.explorer import Explorer
+            self.explorer = Explorer(self)
+            self.explorer.register_plugin()
+
+        # History log widget
+        if CONF.get('historylog', 'enable'):
+            self.set_splash(_("Loading history plugin..."))
+            from spyderlib.plugins.history import HistoryLog
+            self.historylog = HistoryLog(self)
+            self.historylog.register_plugin()
+
+        # Online help widget
+        try:    # Qt >= v4.4
+            from spyderlib.plugins.onlinehelp import OnlineHelp
+        except ImportError:    # Qt < v4.4
+            OnlineHelp = None  # analysis:ignore
+        if CONF.get('onlinehelp', 'enable') and OnlineHelp is not None:
+            self.set_splash(_("Loading online help..."))
+            self.onlinehelp = OnlineHelp(self)
+            self.onlinehelp.register_plugin()
+
+        # Project explorer widget
+        if CONF.get('project_explorer', 'enable'):
+            self.set_splash(_("Loading project explorer..."))
+            from spyderlib.plugins.projectexplorer import ProjectExplorer
+            self.projectexplorer = ProjectExplorer(self)
+            self.projectexplorer.register_plugin()
 
         # External console
-        if self.light:
-            # This is necessary to support the --working-directory option:
-            if self.init_workdir is not None:
-                os.chdir(self.init_workdir)
-        else:
-            self.set_splash(_("Loading external console..."))
+        self.set_splash(_("Loading external console..."))
         from spyderlib.plugins.externalconsole import ExternalConsole
-        self.extconsole = ExternalConsole(self, light_mode=self.light)
+        self.extconsole = ExternalConsole(self, light_mode=False)
         self.extconsole.register_plugin()
 
         # Namespace browser
-        if not self.light:
-            # In light mode, namespace browser is opened inside external console
-            # Here, it is opened as an independent plugin, in its own dockwidget
-            self.set_splash(_("Loading namespace browser..."))
-            from spyderlib.plugins.variableexplorer import VariableExplorer
-            self.variableexplorer = VariableExplorer(self)
-            self.variableexplorer.register_plugin()
+        self.set_splash(_("Loading namespace browser..."))
+        from spyderlib.plugins.variableexplorer import VariableExplorer
+        self.variableexplorer = VariableExplorer(self)
+        self.variableexplorer.register_plugin()
 
         # IPython console
-        if IPYTHON_QT_INSTALLED and not self.light:
+        if QTCONSOLE_INSTALLED:
             self.set_splash(_("Loading IPython console..."))
             from spyderlib.plugins.ipythonconsole import IPythonConsole
             self.ipyconsole = IPythonConsole(self)
             self.ipyconsole.register_plugin()
 
-        if not self.light:
-            nsb = self.variableexplorer.add_shellwidget(self.console.shell)
-            self.console.shell.refresh.connect(nsb.refresh_table)
-            nsb.auto_refresh_button.setEnabled(False)
-
-            self.set_splash(_("Setting up main window..."))
-
-            # Help menu
-            dep_action = create_action(self, _("Dependencies..."),
-                                       triggered=self.show_dependencies,
-                                       icon=ima.icon('advanced'))
-            report_action = create_action(self,
-                                          _("Report issue..."),
-                                          icon=ima.icon('bug'),
-                                          triggered=self.report_issue)
-            support_action = create_action(self,
-                                           _("Spyder support..."),
-                                           triggered=self.google_group)
-            self.check_updates_action = create_action(self,
-                                                  _("Check for updates..."),
-                                                  triggered=self.check_updates)
-
-            # Spyder documentation
-            doc_path = get_module_data_path('spyderlib', relpath="doc",
-                                            attr_name='DOCPATH')
-            # * Trying to find the chm doc
-            spyder_doc = osp.join(doc_path, "Spyderdoc.chm")
-            if not osp.isfile(spyder_doc):
-                spyder_doc = osp.join(doc_path, os.pardir, "Spyderdoc.chm")
-            # * Trying to find the html doc
-            if not osp.isfile(spyder_doc):
-                spyder_doc = osp.join(doc_path, "index.html")
-            # * Trying to find the development-version html doc
-            if not osp.isfile(spyder_doc):
-                spyder_doc = osp.join(get_module_source_path('spyderlib'),
-                                      os.pardir, 'build', 'lib', 'spyderlib',
-                                      'doc', "index.html")
-            # * If we totally fail, point to our web build
-            if not osp.isfile(spyder_doc):
-                spyder_doc = 'http://pythonhosted.org/spyder'
-            else:
-                spyder_doc = file_uri(spyder_doc)
-            doc_action = create_action( self, _("Spyder documentation"), shortcut="F1", 
-                                       icon=ima.icon('DialogHelpButton'),
-                                       triggered=lambda : programs.start_file(spyder_doc))
+        nsb = self.variableexplorer.add_shellwidget(self.console.shell)
+        self.console.shell.refresh.connect(nsb.refresh_table)
+        nsb.auto_refresh_button.setEnabled(False)
+
+        self.set_splash(_("Setting up main window..."))
+
+        # Help menu
+        dep_action = create_action(self, _("Dependencies..."),
+                                    triggered=self.show_dependencies,
+                                    icon=ima.icon('advanced'))
+        report_action = create_action(self,
+                                        _("Report issue..."),
+                                        icon=ima.icon('bug'),
+                                        triggered=self.report_issue)
+        support_action = create_action(self,
+                                        _("Spyder support..."),
+                                        triggered=self.google_group)
+        self.check_updates_action = create_action(self,
+                                                _("Check for updates..."),
+                                                triggered=self.check_updates)
+
+        # Spyder documentation
+        doc_path = get_module_data_path('spyderlib', relpath="doc",
+                                        attr_name='DOCPATH')
+        # * Trying to find the chm doc
+        spyder_doc = osp.join(doc_path, "Spyderdoc.chm")
+        if not osp.isfile(spyder_doc):
+            spyder_doc = osp.join(doc_path, os.pardir, "Spyderdoc.chm")
+        # * Trying to find the html doc
+        if not osp.isfile(spyder_doc):
+            spyder_doc = osp.join(doc_path, "index.html")
+        # * Trying to find the development-version html doc
+        if not osp.isfile(spyder_doc):
+            spyder_doc = osp.join(get_module_source_path('spyderlib'),
+                                    os.pardir, 'build', 'lib', 'spyderlib',
+                                    'doc', "index.html")
+        # * If we totally fail, point to our web build
+        if not osp.isfile(spyder_doc):
+            spyder_doc = 'http://pythonhosted.org/spyder'
+        else:
+            spyder_doc = file_uri(spyder_doc)
+        doc_action = create_action( self, _("Spyder documentation"), shortcut="F1", 
+                                    icon=ima.icon('DialogHelpButton'),
+                                    triggered=lambda : programs.start_file(spyder_doc))
 
+        if self.help is not None:
             tut_action = create_action(self, _("Spyder tutorial"),
-                                       triggered=self.inspector.show_tutorial)
+                                       triggered=self.help.show_tutorial)
+        else:
+            tut_action = None
 
         #----- Tours
-            self.tour = tour.AnimatedTour(self)
-            self.tours_menu = QMenu(_("Interactive tours"))
-            self.tour_menu_actions = []
-            # TODO: Only show intro tour for now. When we are close to finish
-            # 3.0, we will finish and show the other tour
-            self.tours_available = tour.get_tours(0)
-
-            for i, tour_available in enumerate(self.tours_available):
-                self.tours_available[i]['last'] = 0
-                tour_name = tour_available['name']
-
-                def trigger(i=i, self=self):  # closure needed!
-                    return lambda: self.show_tour(i)
-
-                temp_action = create_action(self, tour_name, tip="",
-                                            triggered=trigger())
-                self.tour_menu_actions += [temp_action]
-
-            self.tours_menu.addActions(self.tour_menu_actions)
-
-            if not DEV:
-                self.tours_menu = None
-
-            self.help_menu_actions = [doc_action, tut_action, self.tours_menu,
-                                      None,
-                                      report_action, dep_action,
-                                      self.check_updates_action, support_action,
-                                      None]
-            # Python documentation
-            if get_python_doc_path() is not None:
-                pydoc_act = create_action(self, _("Python documentation"),
-                                  triggered=lambda:
-                                  programs.start_file(get_python_doc_path()))
-                self.help_menu_actions.append(pydoc_act)
-            # IPython documentation
-            if self.ipyconsole is not None:
-                ipython_menu = QMenu(_("IPython documentation"), self)
-                intro_action = create_action(self, _("Intro to IPython"),
-                                          triggered=self.ipyconsole.show_intro)
-                quickref_action = create_action(self, _("Quick reference"),
-                                       triggered=self.ipyconsole.show_quickref)
-                guiref_action = create_action(self, _("Console help"),
-                                         triggered=self.ipyconsole.show_guiref)
-                add_actions(ipython_menu, (intro_action, guiref_action,
-                                           quickref_action))
-                self.help_menu_actions.append(ipython_menu)
-            # Windows-only: documentation located in sys.prefix/Doc
-            ipm_actions = []
-            def add_ipm_action(text, path):
-                """Add installed Python module doc action to help submenu"""
-                path = file_uri(path)
-                action = create_action(self, text,
-                       icon='%s.png' % osp.splitext(path)[1][1:],
-                       triggered=lambda path=path: programs.start_file(path))
-                ipm_actions.append(action)
-            sysdocpth = osp.join(sys.prefix, 'Doc')
-            if osp.isdir(sysdocpth): # exists on Windows, except frozen dist.
-                for docfn in os.listdir(sysdocpth):
-                    pt = r'([a-zA-Z\_]*)(doc)?(-dev)?(-ref)?(-user)?.(chm|pdf)'
-                    match = re.match(pt, docfn)
-                    if match is not None:
-                        pname = match.groups()[0]
-                        if pname not in ('Python', ):
-                            add_ipm_action(pname, osp.join(sysdocpth, docfn))
-            # Documentation provided by Python(x,y), if available
-            try:
-                from xy.config import DOC_PATH as xy_doc_path
-                xydoc = osp.join(xy_doc_path, "Libraries")
-                def add_xydoc(text, pathlist):
-                    for path in pathlist:
-                        if osp.exists(path):
-                            add_ipm_action(text, path)
-                            break
-                add_xydoc(_("Python(x,y) documentation folder"),
-                          [xy_doc_path])
-                add_xydoc(_("IPython documentation"),
-                          [osp.join(xydoc, "IPython", "ipythondoc.chm")])
-                add_xydoc(_("guidata documentation"),
-                          [osp.join(xydoc, "guidata", "guidatadoc.chm"),
-                           r"D:\Python\guidata\build\doc_chm\guidatadoc.chm"])
-                add_xydoc(_("guiqwt documentation"),
-                          [osp.join(xydoc, "guiqwt", "guiqwtdoc.chm"),
-                           r"D:\Python\guiqwt\build\doc_chm\guiqwtdoc.chm"])
-                add_xydoc(_("Matplotlib documentation"),
-                          [osp.join(xydoc, "matplotlib", "Matplotlibdoc.chm"),
-                           osp.join(xydoc, "matplotlib", "Matplotlib.pdf")])
-                add_xydoc(_("NumPy documentation"),
-                          [osp.join(xydoc, "NumPy", "numpy.chm")])
-                add_xydoc(_("NumPy reference guide"),
-                          [osp.join(xydoc, "NumPy", "numpy-ref.pdf")])
-                add_xydoc(_("NumPy user guide"),
-                          [osp.join(xydoc, "NumPy", "numpy-user.pdf")])
-                add_xydoc(_("SciPy documentation"),
-                          [osp.join(xydoc, "SciPy", "scipy.chm"),
-                           osp.join(xydoc, "SciPy", "scipy-ref.pdf")])
-            except (ImportError, KeyError, RuntimeError):
-                pass
-            # Installed Python modules submenu (Windows only)
-            if ipm_actions:
-                pymods_menu = QMenu(_("Installed Python modules"), self)
-                add_actions(pymods_menu, ipm_actions)
-                self.help_menu_actions.append(pymods_menu)
-            # Online documentation
-            web_resources = QMenu(_("Online documentation"))
-            webres_actions = create_module_bookmark_actions(self,
-                                                            self.BOOKMARKS)
-            webres_actions.insert(2, None)
-            webres_actions.insert(5, None)
-            add_actions(web_resources, webres_actions)
-            self.help_menu_actions.append(web_resources)
-            # Qt assistant link
-            if sys.platform.startswith('linux') and not PYQT5:
-                qta_exe = "assistant-qt4"
+        self.tour = tour.AnimatedTour(self)
+        self.tours_menu = QMenu(_("Interactive tours"))
+        self.tour_menu_actions = []
+        # TODO: Only show intro tour for now. When we are close to finish
+        # 3.0, we will finish and show the other tour
+        self.tours_available = tour.get_tours(0)
+
+        for i, tour_available in enumerate(self.tours_available):
+            self.tours_available[i]['last'] = 0
+            tour_name = tour_available['name']
+
+            def trigger(i=i, self=self):  # closure needed!
+                return lambda: self.show_tour(i)
+
+            temp_action = create_action(self, tour_name, tip="",
+                                        triggered=trigger())
+            self.tour_menu_actions += [temp_action]
+
+        self.tours_menu.addActions(self.tour_menu_actions)
+
+        if not DEV:
+            self.tours_menu = None
+
+        self.help_menu_actions = [doc_action, tut_action, self.tours_menu,
+                                  None, report_action, dep_action,
+                                  self.check_updates_action, support_action,
+                                  None]
+        # Python documentation
+        if get_python_doc_path() is not None:
+            pydoc_act = create_action(self, _("Python documentation"),
+                                triggered=lambda:
+                                programs.start_file(get_python_doc_path()))
+            self.help_menu_actions.append(pydoc_act)
+        # IPython documentation
+        if self.ipyconsole is not None and self.help is not None:
+            ipython_menu = QMenu(_("IPython documentation"), self)
+            intro_action = create_action(self, _("Intro to IPython"),
+                                        triggered=self.ipyconsole.show_intro)
+            quickref_action = create_action(self, _("Quick reference"),
+                                    triggered=self.ipyconsole.show_quickref)
+            guiref_action = create_action(self, _("Console help"),
+                                        triggered=self.ipyconsole.show_guiref)
+            add_actions(ipython_menu, (intro_action, guiref_action,
+                                        quickref_action))
+            self.help_menu_actions.append(ipython_menu)
+        # Windows-only: documentation located in sys.prefix/Doc
+        ipm_actions = []
+        def add_ipm_action(text, path):
+            """Add installed Python module doc action to help submenu"""
+            # QAction.triggered works differently for PySide and PyQt
+            path = file_uri(path)
+            if not API == 'pyside':
+                slot=lambda _checked, path=path: programs.start_file(path)
             else:
-                qta_exe = "assistant"
-            qta_act = create_program_action(self, _("Qt documentation"),
-                                            qta_exe)
-            if qta_act:
-                self.help_menu_actions += [qta_act, None]
-            # About Spyder
-            about_action = create_action(self,
-                                    _("About %s...") % "Spyder",
-                                    icon=ima.icon('MessageBoxInformation'),
-                                    triggered=self.about)
-            self.help_menu_actions += [None, about_action]
-
-            # Status bar widgets
-            from spyderlib.widgets.status import MemoryStatus, CPUStatus
-            self.mem_status = MemoryStatus(self, status)
-            self.cpu_status = CPUStatus(self, status)
-            self.apply_statusbar_settings()
-
-            # Third-party plugins
-            for mod in get_spyderplugins_mods():
-                try:
-                    plugin = mod.PLUGIN_CLASS(self)
-                    self.thirdparty_plugins.append(plugin)
-                    plugin.register_plugin()
-                except Exception as error:
-                    print("%s: %s" % (mod, str(error)), file=STDERR)
-                    traceback.print_exc(file=STDERR)
-
-
-    #----- View
-            # View menu
-            self.plugins_menu = QMenu(_("Panes"), self)
-            self.toolbars_menu = QMenu(_("Toolbars"), self)
-            self.quick_layout_menu = QMenu(_("Window layouts"), self)
-            self.quick_layout_set_menu()
+                slot=lambda path=path: programs.start_file(path)
+            action = create_action(self, text,
+                    icon='%s.png' % osp.splitext(path)[1][1:],
+                    triggered=slot)
+            ipm_actions.append(action)
+        sysdocpth = osp.join(sys.prefix, 'Doc')
+        if osp.isdir(sysdocpth): # exists on Windows, except frozen dist.
+            for docfn in os.listdir(sysdocpth):
+                pt = r'([a-zA-Z\_]*)(doc)?(-dev)?(-ref)?(-user)?.(chm|pdf)'
+                match = re.match(pt, docfn)
+                if match is not None:
+                    pname = match.groups()[0]
+                    if pname not in ('Python', ):
+                        add_ipm_action(pname, osp.join(sysdocpth, docfn))
+        # Documentation provided by Python(x,y), if available
+        try:
+            from xy.config import DOC_PATH as xy_doc_path
+            xydoc = osp.join(xy_doc_path, "Libraries")
+            def add_xydoc(text, pathlist):
+                for path in pathlist:
+                    if osp.exists(path):
+                        add_ipm_action(text, path)
+                        break
+            add_xydoc(_("Python(x,y) documentation folder"),
+                        [xy_doc_path])
+            add_xydoc(_("IPython documentation"),
+                        [osp.join(xydoc, "IPython", "ipythondoc.chm")])
+            add_xydoc(_("guidata documentation"),
+                        [osp.join(xydoc, "guidata", "guidatadoc.chm"),
+                        r"D:\Python\guidata\build\doc_chm\guidatadoc.chm"])
+            add_xydoc(_("guiqwt documentation"),
+                        [osp.join(xydoc, "guiqwt", "guiqwtdoc.chm"),
+                        r"D:\Python\guiqwt\build\doc_chm\guiqwtdoc.chm"])
+            add_xydoc(_("Matplotlib documentation"),
+                        [osp.join(xydoc, "matplotlib", "Matplotlibdoc.chm"),
+                        osp.join(xydoc, "matplotlib", "Matplotlib.pdf")])
+            add_xydoc(_("NumPy documentation"),
+                        [osp.join(xydoc, "NumPy", "numpy.chm")])
+            add_xydoc(_("NumPy reference guide"),
+                        [osp.join(xydoc, "NumPy", "numpy-ref.pdf")])
+            add_xydoc(_("NumPy user guide"),
+                        [osp.join(xydoc, "NumPy", "numpy-user.pdf")])
+            add_xydoc(_("SciPy documentation"),
+                        [osp.join(xydoc, "SciPy", "scipy.chm"),
+                        osp.join(xydoc, "SciPy", "scipy-ref.pdf")])
+        except (ImportError, KeyError, RuntimeError):
+            pass
+        # Installed Python modules submenu (Windows only)
+        if ipm_actions:
+            pymods_menu = QMenu(_("Installed Python modules"), self)
+            add_actions(pymods_menu, ipm_actions)
+            self.help_menu_actions.append(pymods_menu)
+        # Online documentation
+        web_resources = QMenu(_("Online documentation"))
+        webres_actions = create_module_bookmark_actions(self,
+                                                        self.BOOKMARKS)
+        webres_actions.insert(2, None)
+        webres_actions.insert(5, None)
+        add_actions(web_resources, webres_actions)
+        self.help_menu_actions.append(web_resources)
+        # Qt assistant link
+        if sys.platform.startswith('linux') and not PYQT5:
+            qta_exe = "assistant-qt4"
+        else:
+            qta_exe = "assistant"
+        qta_act = create_program_action(self, _("Qt documentation"),
+                                        qta_exe)
+        if qta_act:
+            self.help_menu_actions += [qta_act, None]
+        # About Spyder
+        about_action = create_action(self,
+                                _("About %s...") % "Spyder",
+                                icon=ima.icon('MessageBoxInformation'),
+                                triggered=self.about)
+        self.help_menu_actions += [None, about_action]
+
+        # Status bar widgets
+        from spyderlib.widgets.status import MemoryStatus, CPUStatus
+        self.mem_status = MemoryStatus(self, status)
+        self.cpu_status = CPUStatus(self, status)
+        self.apply_statusbar_settings()
 
-            self.view_menu.addMenu(self.plugins_menu)  # Panes
-            add_actions(self.view_menu, (self.lock_dockwidgets_action,
-                                         self.close_dockwidget_action,
-                                         self.maximize_action,
-                                         None))
-            self.show_toolbars_action = create_action(self,
-                                    _("Show toolbars"),
-                                    triggered=self.show_toolbars)
-            self.register_shortcut(self.show_toolbars_action, "_",
-                                   "Show toolbars")
-            self.view_menu.addMenu(self.toolbars_menu)
-            self.view_menu.addAction(self.show_toolbars_action)
-            add_actions(self.view_menu, (None,
-                                         self.quick_layout_menu,
-                                         self.toggle_previous_layout_action,
-                                         self.toggle_next_layout_action,
-                                         None,
-                                         self.fullscreen_action))
-            if set_attached_console_visible is not None:
-                cmd_act = create_action(self,
-                                    _("Attached console window (debugging)"),
-                                    toggled=set_attached_console_visible)
-                cmd_act.setChecked(is_attached_console_visible())
-                add_actions(self.view_menu, (None, cmd_act))
-
-            # Adding external tools action to "Tools" menu
-            if self.external_tools_menu_actions:
-                external_tools_act = create_action(self, _("External Tools"))
-                external_tools_act.setMenu(self.external_tools_menu)
-                self.tools_menu_actions += [None, external_tools_act]
-
-            # Filling out menu/toolbar entries:
-            add_actions(self.file_menu, self.file_menu_actions)
-            add_actions(self.edit_menu, self.edit_menu_actions)
-            add_actions(self.search_menu, self.search_menu_actions)
-            add_actions(self.source_menu, self.source_menu_actions)
-            add_actions(self.run_menu, self.run_menu_actions)
-            add_actions(self.debug_menu, self.debug_menu_actions)
-            add_actions(self.consoles_menu, self.consoles_menu_actions)
-            add_actions(self.tools_menu, self.tools_menu_actions)
-            add_actions(self.external_tools_menu,
-                        self.external_tools_menu_actions)
-            add_actions(self.help_menu, self.help_menu_actions)
-
-            add_actions(self.main_toolbar, self.main_toolbar_actions)
-            add_actions(self.file_toolbar, self.file_toolbar_actions)
-            add_actions(self.edit_toolbar, self.edit_toolbar_actions)
-            add_actions(self.search_toolbar, self.search_toolbar_actions)
-            add_actions(self.source_toolbar, self.source_toolbar_actions)
-            add_actions(self.debug_toolbar, self.debug_toolbar_actions)
-            add_actions(self.run_toolbar, self.run_toolbar_actions)
+        # Third-party plugins
+        for mod in get_spyderplugins_mods():
+            try:
+                plugin = mod.PLUGIN_CLASS(self)
+                self.thirdparty_plugins.append(plugin)
+                plugin.register_plugin()
+            except Exception as error:
+                print("%s: %s" % (mod, str(error)), file=STDERR)
+                traceback.print_exc(file=STDERR)
+
+
+        #----- View
+        # View menu
+        self.plugins_menu = QMenu(_("Panes"), self)
+
+        self.toolbars_menu = QMenu(_("Toolbars"), self)
+        self.quick_layout_menu = QMenu(_("Window layouts"), self)
+        self.quick_layout_set_menu()
+
+        self.view_menu.addMenu(self.plugins_menu)  # Panes
+        add_actions(self.view_menu, (self.lock_dockwidgets_action,
+                                        self.close_dockwidget_action,
+                                        self.maximize_action,
+                                        None))
+        self.show_toolbars_action = create_action(self,
+                                _("Show toolbars"),
+                                triggered=self.show_toolbars,
+                                context=Qt.ApplicationShortcut)
+        self.register_shortcut(self.show_toolbars_action, "_",
+                               "Show toolbars")
+        self.view_menu.addMenu(self.toolbars_menu)
+        self.view_menu.addAction(self.show_toolbars_action)
+        add_actions(self.view_menu, (None,
+                                     self.quick_layout_menu,
+                                     self.toggle_previous_layout_action,
+                                     self.toggle_next_layout_action,
+                                     None,
+                                     self.fullscreen_action))
+        if set_attached_console_visible is not None:
+            cmd_act = create_action(self,
+                                _("Attached console window (debugging)"),
+                                toggled=set_attached_console_visible)
+            cmd_act.setChecked(is_attached_console_visible())
+            add_actions(self.view_menu, (None, cmd_act))
+
+        # Adding external tools action to "Tools" menu
+        if self.external_tools_menu_actions:
+            external_tools_act = create_action(self, _("External Tools"))
+            external_tools_act.setMenu(self.external_tools_menu)
+            self.tools_menu_actions += [None, external_tools_act]
+
+        # Filling out menu/toolbar entries:
+        add_actions(self.file_menu, self.file_menu_actions)
+        add_actions(self.edit_menu, self.edit_menu_actions)
+        add_actions(self.search_menu, self.search_menu_actions)
+        add_actions(self.source_menu, self.source_menu_actions)
+        add_actions(self.run_menu, self.run_menu_actions)
+        add_actions(self.debug_menu, self.debug_menu_actions)
+        add_actions(self.consoles_menu, self.consoles_menu_actions)
+        add_actions(self.tools_menu, self.tools_menu_actions)
+        add_actions(self.external_tools_menu,
+                    self.external_tools_menu_actions)
+        add_actions(self.help_menu, self.help_menu_actions)
+
+        add_actions(self.main_toolbar, self.main_toolbar_actions)
+        add_actions(self.file_toolbar, self.file_toolbar_actions)
+        add_actions(self.edit_toolbar, self.edit_toolbar_actions)
+        add_actions(self.search_toolbar, self.search_toolbar_actions)
+        add_actions(self.source_toolbar, self.source_toolbar_actions)
+        add_actions(self.debug_toolbar, self.debug_toolbar_actions)
+        add_actions(self.run_toolbar, self.run_toolbar_actions)
 
         # Apply all defined shortcuts (plugins + 3rd-party plugins)
         self.apply_shortcuts()
-        #self.remove_deprecated_shortcuts()
 
         # Emitting the signal notifying plugins that main window menu and
         # toolbar actions are all defined:
@@ -1203,6 +1167,18 @@ class MainWindow(QMainWindow):
         self.debug_print("Setting up window...")
         self.setup_layout(default=False)
 
+        # Show and hide shortcuts in menus for Mac.
+        # This is a workaround because we can't disable shortcuts
+        # by setting context=Qt.WidgetShortcut there
+        if sys.platform == 'darwin':
+            for name in ['file', 'search', 'source', 'run', 'debug',
+                         'plugins']:
+                menu_object = getattr(self, name + '_menu')
+                menu_object.aboutToShow.connect(
+                    lambda name=name: self.show_shortcuts(name))
+                menu_object.aboutToHide.connect(
+                    lambda name=name: self.hide_shortcuts(name))
+
         self.splash.hide()
 
         # Enabling tear off for all menus except help menu
@@ -1264,62 +1240,80 @@ class MainWindow(QMainWindow):
             self.sig_open_external_file.connect(self.open_external_file)
 
         # Create Plugins and toolbars submenus
-        if not self.light:
-            self.create_plugins_menu()
-            self.create_toolbars_menu()
+        self.create_plugins_menu()
+        self.create_toolbars_menu()
 
-        # Open a Python console for light mode
-        if self.light:
-            self.extconsole.open_interpreter()
         self.extconsole.setMinimumHeight(0)
 
-        if not self.light:
-            # Update toolbar visibility status
-            self.toolbars_visible = CONF.get('main', 'toolbars_visible')
-            self.load_last_visible_toolbars()
-
-            # Update lock status of dockidgets (panes)
-            self.lock_dockwidgets_action.setChecked(self.dockwidgets_locked)
-            self.apply_panes_settings()
-
-            # Hide Internal Console so that people don't use it instead of
-            # the External or IPython ones
-            if self.console.dockwidget.isVisible() and DEV is None:
-                self.console.toggle_view_action.setChecked(False)
-                self.console.dockwidget.hide()
-
-            # Show the Object Inspector and Consoles by default
-            plugins_to_show = [self.inspector]
-            if self.ipyconsole is not None:
-                if self.ipyconsole.isvisible:
-                    plugins_to_show += [self.extconsole, self.ipyconsole]
-                else:
-                    plugins_to_show += [self.ipyconsole, self.extconsole]
+        # Update toolbar visibility status
+        self.toolbars_visible = CONF.get('main', 'toolbars_visible')
+        self.load_last_visible_toolbars()
+
+        # Update lock status of dockidgets (panes)
+        self.lock_dockwidgets_action.setChecked(self.dockwidgets_locked)
+        self.apply_panes_settings()
+
+        # Hide Internal Console so that people don't use it instead of
+        # the External or IPython ones
+        if self.console.dockwidget.isVisible() and DEV is None:
+            self.console.toggle_view_action.setChecked(False)
+            self.console.dockwidget.hide()
+
+        # Show Help and Consoles by default
+        plugins_to_show = []
+        if self.help is not None:
+            plugins_to_show.append(self.help)
+        if self.ipyconsole is not None:
+            if self.ipyconsole.isvisible:
+                plugins_to_show += [self.extconsole, self.ipyconsole]
             else:
-                plugins_to_show += [self.extconsole]
-            for plugin in plugins_to_show:
-                if plugin.dockwidget.isVisible():
-                    plugin.dockwidget.raise_()
-
-            # Show history file if no console is visible
-            ipy_visible = self.ipyconsole is not None and self.ipyconsole.isvisible
-            if not self.extconsole.isvisible and not ipy_visible:
-                self.historylog.add_history(get_conf_path('history.py'))
-
-            # Give focus to the Editor
-            if self.editor.dockwidget.isVisible():
-                try:
-                    self.editor.get_focus_widget().setFocus()
-                except AttributeError:
-                    pass
+                plugins_to_show += [self.ipyconsole, self.extconsole]
+        else:
+            plugins_to_show += [self.extconsole]
+        for plugin in plugins_to_show:
+            if plugin.dockwidget.isVisible():
+                plugin.dockwidget.raise_()
+
+        # Show history file if no console is visible
+        ipy_visible = self.ipyconsole is not None and self.ipyconsole.isvisible
+        if not self.extconsole.isvisible and not ipy_visible:
+            self.historylog.add_history(get_conf_path('history.py'))
+
+        # Give focus to the Editor
+        if self.editor.dockwidget.isVisible():
+            try:
+                self.editor.get_focus_widget().setFocus()
+            except AttributeError:
+                pass
 
         # Check for spyder updates
         if DEV is None and CONF.get('main', 'check_updates_on_startup'):
-            self.give_updates_feedback = False 
+            self.give_updates_feedback = False
             self.check_updates()
 
+        self.report_missing_dependencies()
+
         self.is_setting_up = False
 
+    def report_missing_dependencies(self):
+        """Show a QMessageBox with a list of missing hard dependencies"""
+        missing_deps = dependencies.missing_dependencies()
+        if missing_deps:
+            QMessageBox.critical(self, _('Error'),
+                _("<b>You have missing dependencies!</b>"
+                  "<br><br><tt>%s</tt><br><br>"
+                  "<b>Please install them to avoid this message.</b>"
+                  "<br><br>"
+                  "<i>Note</i>: Spyder could work without some of these "
+                  "dependencies, however to have a smooth experience when "
+                  "using Spyder we <i>strongly</i> recommend you to install "
+                  "all the listed missing dependencies.<br><br>"
+                  "Failing to install these dependencies might result in bugs. "
+                  "Please be sure that any found bugs are not the direct "
+                  "result of missing dependencies, prior to reporting a new "
+                  "issue."
+                  ) % missing_deps, QMessageBox.Ok)
+
     def load_window_settings(self, prefix, default=False, section='main'):
         """Load window layout settings from userconfig-based configuration
         with *prefix*, under *section*
@@ -1365,22 +1359,24 @@ class MainWindow(QMainWindow):
         self.setWindowState(Qt.WindowNoState)
         self.resize(self.window_size)
         self.move(self.window_position)
-        if not self.light:
-            # Window layout
-            if hexstate:
-                self.restoreState( QByteArray().fromHex(
-                        str(hexstate).encode('utf-8')) )
-                # [Workaround for Issue 880]
-                # QDockWidget objects are not painted if restored as floating
-                # windows, so we must dock them before showing the mainwindow.
-                for widget in self.children():
-                    if isinstance(widget, QDockWidget) and widget.isFloating():
-                        self.floating_dockwidgets.append(widget)
-                        widget.setFloating(False)
-            # Is fullscreen?
-            if is_fullscreen:
-                self.setWindowState(Qt.WindowFullScreen)
-            self.__update_fullscreen_action()
+
+        # Window layout
+        if hexstate:
+            self.restoreState( QByteArray().fromHex(
+                    str(hexstate).encode('utf-8')) )
+            # [Workaround for Issue 880]
+            # QDockWidget objects are not painted if restored as floating
+            # windows, so we must dock them before showing the mainwindow.
+            for widget in self.children():
+                if isinstance(widget, QDockWidget) and widget.isFloating():
+                    self.floating_dockwidgets.append(widget)
+                    widget.setFloating(False)
+
+        # Is fullscreen?
+        if is_fullscreen:
+            self.setWindowState(Qt.WindowFullScreen)
+        self.__update_fullscreen_action()
+
         # Is maximized?
         if is_fullscreen:
             self.maximized_flag = is_maximized
@@ -1401,26 +1397,25 @@ class MainWindow(QMainWindow):
         CONF.set(section, prefix+'is_fullscreen', self.isFullScreen())
         pos = self.window_position
         CONF.set(section, prefix+'position', (pos.x(), pos.y()))
-        if not self.light:
-            self.maximize_dockwidget(restore=True)# Restore non-maximized layout
-            qba = self.saveState()
-            CONF.set(section, prefix+'state', qbytearray_to_str(qba))
-            CONF.set(section, prefix+'statusbar',
-                     not self.statusBar().isHidden())
+        self.maximize_dockwidget(restore=True)# Restore non-maximized layout
+        qba = self.saveState()
+        CONF.set(section, prefix+'state', qbytearray_to_str(qba))
+        CONF.set(section, prefix+'statusbar',
+                    not self.statusBar().isHidden())
 
     def tabify_plugins(self, first, second):
         """Tabify plugin dockwigdets"""
         self.tabifyDockWidget(first.dockwidget, second.dockwidget)
 
-    # --- Layouts 
+    # --- Layouts
     def setup_layout(self, default=False):
         """Setup window layout"""
-        prefix = ('lightwindow' if self.light else 'window') + '/'
+        prefix = 'window' + '/'
         settings = self.load_window_settings(prefix, default)
         hexstate = settings[0]
-        
+
         self.first_spyder_run = False
-        if hexstate is None and not self.light:
+        if hexstate is None:
             # First Spyder execution:
             self.setWindowState(Qt.WindowMaximized)
             self.first_spyder_run = True
@@ -1458,7 +1453,11 @@ class MainWindow(QMainWindow):
         self.set_window_settings(*settings)
 
         for plugin in self.widgetlist:
-            plugin.initialize_plugin_in_mainwindow_layout()
+            try:
+                plugin.initialize_plugin_in_mainwindow_layout()
+            except Exception as error:
+                print("%s: %s" % (plugin, str(error)), file=STDERR)
+                traceback.print_exc(file=STDERR)
        
     def setup_default_layouts(self, index, settings):
         """Setup default layouts when run for the first time"""
@@ -1479,7 +1478,7 @@ class MainWindow(QMainWindow):
         explorer_variable = self.variableexplorer
         history = self.historylog
         finder = self.findinfiles
-        inspector = self.inspector
+        help_plugin = self.help
         helper = self.onlinehelp
         plugins = self.thirdparty_plugins
 
@@ -1496,10 +1495,10 @@ class MainWindow(QMainWindow):
                     [[explorer_project]],
                     # column 1
                     [[editor]],
-                    # column 2                                        
+                    # column 2
                     [[outline]],
                     # column 3
-                    [[inspector, explorer_variable, helper, explorer_file,
+                    [[help_plugin, explorer_variable, helper, explorer_file,
                       finder] + plugins,
                      [console_int, console_ext, console_ipy, history]]
                     ],
@@ -1520,7 +1519,7 @@ class MainWindow(QMainWindow):
                      [console_ipy, console_ext, console_int]],
                     # column 1
                     [[explorer_variable, history, outline, finder] + plugins,
-                     [explorer_file, explorer_project, inspector, helper]]
+                     [explorer_file, explorer_project, help_plugin, helper]]
                     ],
                     'width fraction': [0.55,            # column 0 width
                                        0.45],           # column 1 width
@@ -1539,7 +1538,7 @@ class MainWindow(QMainWindow):
                      [console_ipy, console_ext, console_int]],
                     # column 2
                     [[explorer_variable, finder] + plugins,
-                     [history, inspector, helper]]
+                     [history, help_plugin, helper]]
                     ],
                     'width fraction': [0.20,            # column 0 width
                                        0.40,            # column 1 width
@@ -1555,7 +1554,7 @@ class MainWindow(QMainWindow):
                     # column 0
                     [[editor],
                      [console_ipy, console_ext, console_int, explorer_file,
-                      explorer_project, inspector, explorer_variable,
+                      explorer_project, help_plugin, explorer_variable,
                       history, outline, finder, helper] + plugins]
                     ],
                     'width fraction': [1.0],            # column 0 width
@@ -1569,7 +1568,7 @@ class MainWindow(QMainWindow):
                     [[editor]],
                     # column 1
                     [[console_ipy, console_ext, console_int, explorer_file,
-                      explorer_project, inspector, explorer_variable,
+                      explorer_project, help_plugin, explorer_variable,
                       history, outline, finder, helper] + plugins]
                     ],
                     'width fraction': [0.55,      # column 0 width
@@ -1697,10 +1696,12 @@ class MainWindow(QMainWindow):
 
         self.setUpdatesEnabled(True)
 
+    @Slot()
     def toggle_previous_layout(self):
         """ """
         self.toggle_layout('previous')
 
+    @Slot()
     def toggle_next_layout(self):
         """ """
         self.toggle_layout('next')
@@ -1935,6 +1936,7 @@ class MainWindow(QMainWindow):
             self.get_visible_toolbars()
         self._update_show_toolbars_action()
 
+    @Slot()
     def show_toolbars(self):
         """Show/Hides toolbars."""
         value = not self.toolbars_visible
@@ -1954,9 +1956,6 @@ class MainWindow(QMainWindow):
     # --- Other
     def plugin_focus_changed(self):
         """Focus has changed from one plugin to another"""
-        if self.light:
-            #  There is currently no point doing the following in light mode
-            return
         self.update_edit_menu()
         self.update_search_menu()
 
@@ -1965,9 +1964,9 @@ class MainWindow(QMainWindow):
         if shell is not None:
             # A Python shell widget has focus
             self.last_console_plugin_focus_was_python = True
-            if self.inspector is not None:
-                #  The object inspector may be disabled in .spyder.ini
-                self.inspector.set_shell(shell)
+            if self.help is not None:
+                #  Help may be disabled in .spyder.ini
+                self.help.set_shell(shell)
             from spyderlib.widgets.externalshell import pythonshell
             if isinstance(shell, pythonshell.ExtPythonShellWidget):
                 shell = shell.parent()
@@ -1981,8 +1980,8 @@ class MainWindow(QMainWindow):
                     idx = self.extconsole.get_shell_index_from_id(kwid)
                     if idx is not None:
                         kw = self.extconsole.shellwidgets[idx]
-                        if self.inspector is not None:
-                            self.inspector.set_shell(kw)
+                        if self.help is not None:
+                            self.help.set_shell(kw)
                         self.variableexplorer.set_shellwidget_from_id(kwid)
                         # Setting the kernel widget as current widget for the
                         # external console's tabwidget: this is necessary for
@@ -1995,6 +1994,20 @@ class MainWindow(QMainWindow):
                         self.extconsole.tabwidget.setCurrentWidget(kw)
                         focus_client.get_control().setFocus()
 
+    def show_shortcuts(self, menu):
+        """Show action shortcuts in menu"""
+        for element in getattr(self, menu + '_menu_actions'):
+            if element and isinstance(element, QAction):
+                if element._shown_shortcut is not None:
+                    element.setShortcut(element._shown_shortcut)
+
+    def hide_shortcuts(self, menu):
+        """Hide action shortcuts in menu"""
+        for element in getattr(self, menu + '_menu_actions'):
+            if element and isinstance(element, QAction):
+                if element._shown_shortcut is not None:
+                    element.setShortcut(QKeySequence())
+
     def update_file_menu(self):
         """Update file menu"""
         self.load_temp_session_action.setEnabled(osp.isfile(TEMP_SESSION_PATH))
@@ -2041,10 +2054,6 @@ class MainWindow(QMainWindow):
         """Update search menu"""
         if self.menuBar().hasFocus():
             return
-        # Disabling all actions to begin with
-        for child in [self.find_action, self.find_next_action,
-                      self.find_previous_action, self.replace_action]:
-            child.setEnabled(False)
 
         widget, textedit_properties = get_focus_widget_properties()
         for action in self.editor.search_menu_actions:
@@ -2053,15 +2062,12 @@ class MainWindow(QMainWindow):
             return
         #!!! Below this line, widget is expected to be a QPlainTextEdit instance
         _x, _y, readwrite_editor = textedit_properties
-        for action in [self.find_action, self.find_next_action,
-                       self.find_previous_action]:
-            action.setEnabled(True)
-        self.replace_action.setEnabled(readwrite_editor)
-        self.replace_action.setEnabled(readwrite_editor)
+        # Disable the replace action for read-only files
+        self.search_menu_actions[3].setEnabled(readwrite_editor)
 
     def create_plugins_menu(self):
         order = ['editor', 'console', 'ipython_console', 'variable_explorer',
-                 'inspector', None, 'explorer', 'outline_explorer',
+                 'help', None, 'explorer', 'outline_explorer',
                  'project_explorer', 'find_in_files', None, 'historylog',
                  'profiler', 'breakpoints', 'pylint', None,
                  'onlinehelp', 'internal_console']
@@ -2081,6 +2087,7 @@ class MainWindow(QMainWindow):
         for action in order:
             if type(action) is str:
                 actions.remove(action)
+        self.plugins_menu_actions = actions
         add_actions(self.plugins_menu, actions)
 
     def create_toolbars_menu(self):
@@ -2101,13 +2108,10 @@ class MainWindow(QMainWindow):
         add_actions(self.toolbars_menu, order)
 
     def createPopupMenu(self):
-        if self.light:
-            menu = self.createPopupMenu()
-        else:
-            menu = QMenu('', self)
-            actions = self.help_menu_actions[:3] + \
-                      [None, self.help_menu_actions[-1]]
-            add_actions(menu, actions)
+        menu = QMenu('', self)
+        actions = self.help_menu_actions[:3] + \
+                    [None, self.help_menu_actions[-1]]
+        add_actions(menu, actions)
         return menu
 
     def set_splash(self, message):
@@ -2147,13 +2151,12 @@ class MainWindow(QMainWindow):
 
         # To be used by the tour to be able to move
         self.sig_moved.emit(event)
-    
+
     def hideEvent(self, event):
         """Reimplement Qt method"""
-        if not self.light:
-            for plugin in self.widgetlist:
-                if plugin.isAncestorOf(self.last_focused_widget):
-                    plugin.visibility_changed(True)
+        for plugin in self.widgetlist:
+            if plugin.isAncestorOf(self.last_focused_widget):
+                plugin.visibility_changed(True)
         QMainWindow.hideEvent(self, event)
 
     def change_last_focused_widget(self, old, now):
@@ -2174,7 +2177,7 @@ class MainWindow(QMainWindow):
                                          QMessageBox.Yes, QMessageBox.No)
             if reply == QMessageBox.No:
                 return False
-        prefix = ('lightwindow' if self.light else 'window') + '/'
+        prefix = 'window' + '/'
         self.save_current_window_settings(prefix)
         if CONF.get('main', 'single_instance'):
             self.open_files_server.close()
@@ -2391,7 +2394,7 @@ class MainWindow(QMainWindow):
 
         url = QUrl("https://github.com/spyder-ide/spyder/issues/new")
         if PYQT5:
-            from spyderlib.qt.QtCore import QUrlQuery
+            from qtpy.QtCore import QUrlQuery
             query = QUrlQuery()
             query.addQueryItem("body", quote(issue_template))
             url.setQuery(query)
@@ -2405,58 +2408,6 @@ class MainWindow(QMainWindow):
         url = QUrl("http://groups.google.com/group/spyderlib")
         QDesktopServices.openUrl(url)
 
-    #---- Global callbacks (called from plugins)
-    def get_current_editor_plugin(self):
-        """Return editor plugin which has focus:
-        console, extconsole, editor, inspector or historylog"""
-        if self.light:
-            return self.extconsole
-        widget = QApplication.focusWidget()
-        from spyderlib.widgets.editor import TextEditBaseWidget
-        from spyderlib.widgets.shell import ShellBaseWidget
-        if not isinstance(widget, (TextEditBaseWidget, ShellBaseWidget)):
-            return
-        for plugin in self.widgetlist:
-            if plugin.isAncestorOf(widget):
-                return plugin
-        else:
-            # External Editor window
-            plugin = widget
-            from spyderlib.widgets.editor import EditorWidget
-            while not isinstance(plugin, EditorWidget):
-                plugin = plugin.parent()
-            return plugin
-
-    @Slot()
-    def find(self):
-        """Global find callback"""
-        plugin = self.get_current_editor_plugin()
-        if plugin is not None:
-            plugin.find_widget.show()
-            plugin.find_widget.search_text.setFocus()
-            return plugin
-
-    @Slot()
-    def find_next(self):
-        """Global find next callback"""
-        plugin = self.get_current_editor_plugin()
-        if plugin is not None:
-            plugin.find_widget.find_next()
-
-    @Slot()
-    def find_previous(self):
-        """Global find previous callback"""
-        plugin = self.get_current_editor_plugin()
-        if plugin is not None:
-            plugin.find_widget.find_previous()
-
-    @Slot()
-    def replace(self):
-        """Global replace callback"""
-        plugin = self.find()
-        if plugin is not None:
-            plugin.find_widget.show_replace()
-
     @Slot()
     def global_callback(self):
         """Global callback"""
@@ -2519,9 +2470,7 @@ class MainWindow(QMainWindow):
         """
         fname = to_text_string(fname)
         ext = osp.splitext(fname)[1]
-        if ext in EDIT_EXT:
-            self.editor.load(fname)
-        elif self.variableexplorer is not None and ext in IMPORT_EXT:
+        if self.variableexplorer is not None and ext in IMPORT_EXT:
             self.variableexplorer.import_data(fname)
         elif encoding.is_text_file(fname):
             self.editor.load(fname)
@@ -2646,7 +2595,7 @@ class MainWindow(QMainWindow):
             dlg.add_page(widget)
         for plugin in [self.workingdirectory, self.editor,
                        self.projectexplorer, self.extconsole, self.ipyconsole,
-                       self.historylog, self.inspector, self.variableexplorer,
+                       self.historylog, self.help, self.variableexplorer,
                        self.onlinehelp, self.explorer, self.findinfiles
                        ]+self.thirdparty_plugins:
             if plugin is not None:
@@ -2673,29 +2622,29 @@ class MainWindow(QMainWindow):
 
     #---- Shortcuts
     def register_shortcut(self, qaction_or_qshortcut, context, name,
-                          default=NoDefault):
+                          add_sc_to_tip=False):
         """
         Register QAction or QShortcut to Spyder main application,
         with shortcut (context, name, default)
         """
-        self.shortcut_data.append( (qaction_or_qshortcut,
-                                    context, name, default) )
-
-    def remove_deprecated_shortcuts(self):
-        """Remove deprecated shortcuts"""
-        data = [(context, name) for (qobject, context, name,
-                default) in self.shortcut_data]
-        remove_deprecated_shortcuts(data)
+        self.shortcut_data.append( (qaction_or_qshortcut, context,
+                                    name, add_sc_to_tip) )
 
     def apply_shortcuts(self):
         """Apply shortcuts settings to all widgets/plugins"""
         toberemoved = []
         for index, (qobject, context, name,
-                    default) in enumerate(self.shortcut_data):
-            keyseq = QKeySequence( get_shortcut(context, name, default) )
+                    add_sc_to_tip) in enumerate(self.shortcut_data):
+            keyseq = QKeySequence( get_shortcut(context, name) )
             try:
                 if isinstance(qobject, QAction):
-                    qobject.setShortcut(keyseq)
+                    if sys.platform == 'darwin' and \
+                      qobject._shown_shortcut == 'missing':
+                        qobject._shown_shortcut = keyseq
+                    else:
+                        qobject.setShortcut(keyseq)
+                    if add_sc_to_tip:
+                        add_shortcut_to_tooltip(qobject, context, name)
                 elif isinstance(qobject, QShortcut):
                     qobject.setKey(keyseq)
             except RuntimeError:
@@ -2753,12 +2702,12 @@ class MainWindow(QMainWindow):
                     return
                 raise
             fname = req.recv(1024)
-            if not self.light:
-                fname = fname.decode('utf-8')
-                self.sig_open_external_file.emit(fname)
+            fname = fname.decode('utf-8')
+            self.sig_open_external_file.emit(fname)
             req.sendall(b' ')
 
     # ---- Quit and restart, and reset spyder defaults
+    @Slot()
     def reset_spyder(self):
         """
         Quit and reset Spyder and then Restart application.
@@ -2770,6 +2719,7 @@ class MainWindow(QMainWindow):
         if answer == QMessageBox.Yes:
             self.restart(reset=True)
 
+    @Slot()
     def restart(self, reset=False):
         """
         Quit and Restart Spyder application.
@@ -2778,10 +2728,10 @@ class MainWindow(QMainWindow):
         """
         # Get start path to use in restart script
         spyder_start_directory = get_module_path('spyderlib')
-        restart_script = osp.join(spyder_start_directory, 'restart_app.py')
+        restart_script = osp.join(spyder_start_directory, 'app', 'restart.py')
 
         # Get any initial argument passed when spyder was started
-        # Note: Variables defined in bootstrap.py and spyderlib\start_app.py
+        # Note: Variables defined in bootstrap.py and spyderlib/app/start.py
         env = os.environ.copy()
         bootstrap_args = env.pop('SPYDER_BOOTSTRAP_ARGS', None)
         spyder_args = env.pop('SPYDER_ARGS')
@@ -2906,6 +2856,7 @@ class MainWindow(QMainWindow):
         # Provide feeback when clicking menu if check on startup is on
         self.give_updates_feedback = True
 
+    @Slot()
     def check_updates(self):
         """
         Check for spyder updates on github releases using a QThread.
@@ -2946,7 +2897,7 @@ def initialize():
         def exec_():
             """Do nothing because the Qt mainloop is already running"""
             pass
-    from spyderlib.qt import QtGui
+    from qtpy import QtGui
     QtGui.QApplication = FakeQApplication
 
     #----Monkey patching rope
@@ -2962,6 +2913,12 @@ def initialize():
         pass
     sys.exit = fake_sys_exit
 
+    #----Monkey patching sys.excepthook to avoid crashes in PyQt 5.5+
+    if PYQT5:
+        def spy_excepthook(type_, value, tback):
+            sys.__excepthook__(type_, value, tback) 
+        sys.excepthook = spy_excepthook
+
     # Removing arguments from sys.argv as in standard Python interpreter
     sys.argv = ['']
 
diff --git a/spyderlib/start_app.py b/spyderlib/app/start.py
similarity index 93%
rename from spyderlib/start_app.py
rename to spyderlib/app/start.py
index 43bfc5f..95b02c5 100644
--- a/spyderlib/start_app.py
+++ b/spyderlib/app/start.py
@@ -10,7 +10,7 @@ import sys
 import time
 
 # Local imports
-from spyderlib.cli_options import get_options
+from spyderlib.app.cli_options import get_options
 from spyderlib.config.base import get_conf_path, running_in_mac_app, DEV, TEST
 from spyderlib.config.main import CONF
 from spyderlib.utils.external import lockfile
@@ -107,7 +107,7 @@ def main():
             # Then start Spyder as usual and *don't* continue
             # executing this script because it doesn't make
             # sense
-            from spyderlib import spyder
+            from spyderlib.app import spyder
             spyder.main()
             return
 
@@ -115,7 +115,7 @@ def main():
             # Start a new instance
             if TEST is None:
                 atexit.register(lock.unlock)
-            from spyderlib import spyder
+            from spyderlib.app import spyder
             spyder.main()
         else:
             # Pass args to Spyder or print an informative
@@ -126,7 +126,7 @@ def main():
                 print("Spyder is already running. If you want to open a new \n"
                       "instance, please pass to it the --new-instance option")
     else:
-        from spyderlib import spyder
+        from spyderlib.app import spyder
         spyder.main()
 
 
diff --git a/spyderlib/tour.py b/spyderlib/app/tour.py
similarity index 95%
rename from spyderlib/tour.py
rename to spyderlib/app/tour.py
index 65cbf52..c322d4b 100644
--- a/spyderlib/tour.py
+++ b/spyderlib/app/tour.py
@@ -11,22 +11,23 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 from __future__ import division
-
 import sys
 
-from spyderlib.qt.QtGui import (QColor, QLayout, QMenu, QApplication,
-                                QPainter, QIcon, QBrush, QToolButton,
-                                QPixmap, QLabel, QWidget, QVBoxLayout,
-                                QHBoxLayout, QDialog, QMainWindow, QAction,
-                                QPushButton, QPainterPath, QSpacerItem, QPen,
-                                QGraphicsOpacityEffect, QRegion, QComboBox)
-from spyderlib.qt.QtCore import (Qt, Signal, QPoint, QRectF,
-                                 QPropertyAnimation, QEasingCurve)
-
-# Local import
+# Third party imports
+from qtpy.QtCore import (QEasingCurve, QPoint, QPropertyAnimation, QRectF, Qt,
+                         Signal)
+from qtpy.QtGui import (QBrush, QColor, QIcon, QPainter, QPainterPath, QPen,
+                        QPixmap, QRegion)
+from qtpy.QtWidgets import (QAction, QApplication, QComboBox, QDialog,
+                            QGraphicsOpacityEffect, QHBoxLayout, QLabel,
+                            QLayout, QMainWindow, QMenu, QPushButton,
+                            QSpacerItem, QToolButton, QVBoxLayout, QWidget)
+
+# Local imports
 from spyderlib.config.base import _, get_image_path
-from spyderlib.utils.qthelpers import (create_action, add_actions)
+from spyderlib.utils.qthelpers import add_actions, create_action
 
 # FIXME: Known issues
 # How to handle if an specific dockwidget does not exists/load, like ipython
@@ -41,7 +42,7 @@ class SpyderWidgets(object):
     editor_line_number_area = 'editor.get_current_editor().linenumberarea'
     editor_scroll_flag_area = 'editor.get_current_editor().scrollflagarea'
     file_explorer = 'explorer'
-    object_inspector = 'inspector'
+    help_plugin = 'help'
     variable_explorer = 'variableexplorer'
     history_log = "historylog"
 
@@ -189,7 +190,7 @@ def get_tour(index):
               'run': ["a = 2", "s='Hello, world!'"],
               },
 
-             {'title': _("The Object Inspector"),
+             {'title': _("Help"),
               'content': _("This pane displays documentation of the "
                            "functions, classes, methods or modules you are "
                            "currently using in the Editor or the Consoles.<br><br>"
@@ -197,7 +198,7 @@ def get_tour(index):
                            "front of an object. If that object has some "
                            "documentation associated with it, it will be "
                            "displayed here."),
-              'widgets': [sw.object_inspector],
+              'widgets': [sw.help_plugin],
               'interact': True},
 
              {'title': _("The File Explorer"),
diff --git a/spyderlib/config/base.py b/spyderlib/config/base.py
index ddeef2e..ed4f2a9 100644
--- a/spyderlib/config/base.py
+++ b/spyderlib/config/base.py
@@ -217,7 +217,8 @@ DEFAULT_LANGUAGE = 'en'
 LANGUAGE_CODES = {'en': u'English',
                   'fr': u'Français',
                   'es': u'Español',
-                  'pt_BR': u'Português'
+                  'pt_BR': u'Português',
+                  'ru': u'Русский'
                   }
 
 
diff --git a/spyderlib/config/fonts.py b/spyderlib/config/fonts.py
new file mode 100644
index 0000000..294dd8d
--- /dev/null
+++ b/spyderlib/config/fonts.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009- The Spyder Development Team
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""
+Spyder font variables
+"""
+
+import os
+import sys
+
+from spyderlib.config.utils import is_ubuntu
+
+
+#==============================================================================
+# Main fonts
+#==============================================================================
+# Rich text fonts
+SANS_SERIF = ['Sans Serif', 'DejaVu Sans', 'Bitstream Vera Sans',
+              'Bitstream Charter', 'Lucida Grande', 'MS Shell Dlg 2',
+              'Calibri', 'Verdana', 'Geneva', 'Lucid', 'Arial',
+              'Helvetica', 'Avant Garde', 'Times', 'sans-serif']
+
+# Plan text fonts
+MONOSPACE = ['Monospace', 'DejaVu Sans Mono', 'Consolas',
+             'Bitstream Vera Sans Mono', 'Andale Mono', 'Liberation Mono',
+             'Courier New', 'Courier', 'monospace', 'Fixed', 'Terminal']
+
+
+#==============================================================================
+# Adjust font size per OS
+#==============================================================================
+if sys.platform == 'darwin':
+    MONOSPACE = ['Menlo'] + MONOSPACE
+    BIG = MEDIUM = SMALL = 12
+elif os.name == 'nt':
+    BIG = 12
+    MEDIUM = 10
+    SMALL = 9
+elif is_ubuntu():
+    SANS_SERIF = ['Ubuntu'] + SANS_SERIF
+    MONOSPACE = ['Ubuntu Mono'] + MONOSPACE
+    BIG = 13
+    MEDIUM = SMALL = 11
+else:
+    BIG = 12
+    MEDIUM = SMALL = 9
+
+DEFAULT_SMALL_DELTA = SMALL - MEDIUM
+DEFAULT_LARGE_DELTA = SMALL - BIG
diff --git a/spyderlib/config/gui.py b/spyderlib/config/gui.py
index 3ef5234..a8be03d 100644
--- a/spyderlib/config/gui.py
+++ b/spyderlib/config/gui.py
@@ -14,17 +14,30 @@ Important note regarding shortcuts:
         Ctrl + Alt + Q, W, F, G, Y, X, C, V, B, N
 """
 
+# Standard library imports
 from collections import namedtuple
+import sys
 
-from spyderlib.qt.QtGui import QFont, QFontDatabase, QShortcut, QKeySequence
-from spyderlib.qt.QtCore import Qt
+# Third party imports
+from qtpy.QtCore import Qt
+from qtpy.QtGui import QFont, QFontDatabase, QKeySequence
+from qtpy.QtWidgets import QShortcut
 
+# Local imports
 from spyderlib.config.main import CONF
 from spyderlib.config.user import NoDefault
 from spyderlib.py3compat import to_text_string
 from spyderlib.utils import syntaxhighlighters as sh
 
 
+# Run cell shortcuts
+if sys.platform == 'darwin':
+    RUN_CELL_SHORTCUT = Qt.META + Qt.Key_Return
+else:
+    RUN_CELL_SHORTCUT = Qt.CTRL + Qt.Key_Return
+RUN_CELL_AND_ADVANCE_SHORTCUT = Qt.SHIFT + Qt.Key_Return
+
+
 # To save metadata about widget shortcuts (needed to build our
 # preferences page)
 Shortcut = namedtuple('Shortcut', 'data')
@@ -49,35 +62,36 @@ def get_family(families):
 
 
 FONT_CACHE = {}
-def get_font(section, option=None):
+
+def get_font(section='main', option='font', font_size_delta=0):
     """Get console font properties depending on OS and user options"""
     font = FONT_CACHE.get((section, option))
+
     if font is None:
-        if option is None:
-            option = 'font'
-        else:
-            option += '/font'
         families = CONF.get(section, option+"/family", None)
+
         if families is None:
             return QFont()
+
         family = get_family(families)
         weight = QFont.Normal
         italic = CONF.get(section, option+'/italic', False)
+
         if CONF.get(section, option+'/bold', False):
             weight = QFont.Bold
-        size = CONF.get(section, option+'/size', 9)
+
+        size = CONF.get(section, option+'/size', 9) + font_size_delta
         font = QFont(family, size, weight)
         font.setItalic(italic)
         FONT_CACHE[(section, option)] = font
+
+    size = CONF.get(section, option+'/size', 9) + font_size_delta
+    font.setPointSize(size)
     return font
 
 
-def set_font(font, section, option=None):
+def set_font(font, section='main', option='font'):
     """Set font"""
-    if option is None:
-        option = 'font'
-    else:
-        option += '/font'
     CONF.set(section, option+'/family', to_text_string(font.family()))
     CONF.set(section, option+'/size', float(font.pointSize()))
     CONF.set(section, option+'/italic', int(font.italic()))
@@ -85,9 +99,9 @@ def set_font(font, section, option=None):
     FONT_CACHE[(section, option)] = font
 
 
-def get_shortcut(context, name, default=NoDefault):
+def get_shortcut(context, name):
     """Get keyboard shortcut (key sequence string)"""
-    return CONF.get('shortcuts', '%s/%s' % (context, name), default=default)
+    return CONF.get('shortcuts', '%s/%s' % (context, name))
 
 
 def set_shortcut(context, name, keystr):
@@ -95,18 +109,23 @@ def set_shortcut(context, name, keystr):
     CONF.set('shortcuts', '%s/%s' % (context, name), keystr)
 
 
-def new_shortcut(keystr, parent, action):
-    """Define a new shortcut according to a keysequence string"""
+def fixed_shortcut(keystr, parent, action):
+    """Define a fixed shortcut according to a keysequence string"""
     sc = QShortcut(QKeySequence(keystr), parent, action)
     sc.setContext(Qt.WidgetWithChildrenShortcut)
     return sc
 
 
-def create_shortcut(action, context, name, parent):
-    """Creates a Shortcut namedtuple for a widget"""
+def config_shortcut(action, context, name, parent):
+    """
+    Create a Shortcut namedtuple for a widget
+    
+    The data contained in this tuple will be registered in
+    our shortcuts preferences page
+    """
     keystr = get_shortcut(context, name)
-    qsc = new_shortcut(keystr, parent, action)
-    sc = Shortcut(data=(qsc, name, keystr))
+    qsc = fixed_shortcut(keystr, parent, action)
+    sc = Shortcut(data=(qsc, context, name))
     return sc
 
 
@@ -117,17 +136,6 @@ def iter_shortcuts():
         yield context, name, get_shortcut(context, name)
 
 
-def remove_deprecated_shortcuts(data):
-    """Remove deprecated shortcuts (shortcuts in CONF but not registered)"""
-    section = 'shortcuts'
-    options = [('%s/%s' % (context, name)).lower() for (context, name) in data]
-    for option, _ in CONF.items(section, raw=CONF.raw):
-        if option not in options:
-            CONF.remove_option(section, option)
-            if len(CONF.items(section, raw=CONF.raw)) == 0:
-                CONF.remove_section(section)
-
-
 def reset_shortcuts():
     """Reset keyboard shortcuts to default values"""
     CONF.reset_to_defaults(section='shortcuts')
@@ -162,6 +170,3 @@ def set_default_color_scheme(name, replace=True):
 
 for _name in sh.COLOR_SCHEME_NAMES:
     set_default_color_scheme(_name, replace=False)
-CUSTOM_COLOR_SCHEME_NAME = "Custom"
-set_color_scheme(CUSTOM_COLOR_SCHEME_NAME, sh.get_color_scheme("Spyder"),
-                 replace=False)
diff --git a/spyderlib/config/ipython.py b/spyderlib/config/ipython.py
index 1331fe9..3fe5c98 100644
--- a/spyderlib/config/ipython.py
+++ b/spyderlib/config/ipython.py
@@ -14,43 +14,30 @@ from spyderlib.config.base import _
 
 
 # Constants
-IPYTHON_REQVER = '>=3.0'
-ZMQ_REQVER = '>=13.0.0'
-QTCONSOLE_REQVER = '>=4.0'
+QTCONSOLE_REQVER = ">=4.2.0"
+ZMQ_REQVER = ">=13.0.0"
+NBCONVERT_REQVER = ">=4.0"
 
 
 # Dependencies
-dependencies.add("IPython", _("IPython Console integration"),
-                 required_version=IPYTHON_REQVER)
-dependencies.add("zmq", _("IPython Console integration"),
-                 required_version=ZMQ_REQVER)
-
-
-# Jupyter 4.0 requirements
-ipy4_installed = programs.is_module_installed('IPython', '>=4.0')
-if ipy4_installed:
-    dependencies.add("qtconsole", _("IPython Console integration"),
-                     required_version=QTCONSOLE_REQVER)
+dependencies.add("qtconsole", _("Jupyter Qtconsole integration"),
+                 required_version=QTCONSOLE_REQVER)
+dependencies.add("nbconvert", _("Manipulate Jupyter notebooks on the Editor"),
+                 required_version=NBCONVERT_REQVER)
 
 
 # Auxiliary functions
 def is_qtconsole_installed():
-    ipyqt_installed = programs.is_module_installed('IPython.qt',
-                                                   version=IPYTHON_REQVER)
     pyzmq_installed = programs.is_module_installed('zmq', version=ZMQ_REQVER)
     pygments_installed = programs.is_module_installed('pygments')
+    qtconsole_installed = programs.is_module_installed('qtconsole',
+                                                       version=QTCONSOLE_REQVER)
 
-    if ipyqt_installed and pyzmq_installed and pygments_installed:
-        if ipy4_installed:
-            if programs.is_module_installed('qtconsole'):
-                return True
-            else:
-                return False
-        else:
-            return True
+    if pyzmq_installed and pygments_installed and qtconsole_installed:
+        return True
     else:
         return False
 
 
 # Main check for IPython presence
-IPYTHON_QT_INSTALLED = is_qtconsole_installed()
+QTCONSOLE_INSTALLED = is_qtconsole_installed()
diff --git a/spyderlib/config/main.py b/spyderlib/config/main.py
index f558a0b..b3b5393 100644
--- a/spyderlib/config/main.py
+++ b/spyderlib/config/main.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright © 2009-2011 Pierre Raybaut
+# Copyright © 2009- The Spyder Development Team
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
@@ -16,172 +16,52 @@ import sys
 import os.path as osp
 
 # Local import
-from spyderlib.config.user import UserConfig
 from spyderlib.config.base import (CHECK_ALL, EXCLUDED_NAMES, SUBFOLDER,
-                                   get_home_dir, _)
-from spyderlib.utils import iofuncs, codeanalysis
+                                   get_home_dir)
+from spyderlib.config.fonts import BIG, MEDIUM, MONOSPACE, SANS_SERIF
+from spyderlib.config.user import UserConfig
+from spyderlib.config.utils import IMPORT_EXT
+from spyderlib.utils import codeanalysis
 
 
 #==============================================================================
-# Extensions supported by Spyder's Editor
+# Main constants
 #==============================================================================
-EDIT_FILETYPES = (
-    (_("Python files"), ('.py', '.pyw', '.ipy')),
-    (_("Cython/Pyrex files"), ('.pyx', '.pxd', '.pxi')),
-    (_("C files"), ('.c', '.h')),
-    (_("C++ files"), ('.cc', '.cpp', '.cxx', '.h', '.hh', '.hpp', '.hxx')),
-    (_("OpenCL files"), ('.cl', )),
-    (_("Fortran files"), ('.f', '.for', '.f77', '.f90', '.f95', '.f2k')),
-    (_("IDL files"), ('.pro', )),
-    (_("MATLAB files"), ('.m', )),
-    (_("Julia files"), ('.jl',)),
-    (_("Yaml files"), ('.yaml','.yml',)),
-    (_("Patch and diff files"), ('.patch', '.diff', '.rej')),
-    (_("Batch files"), ('.bat', '.cmd')),
-    (_("Text files"), ('.txt',)),
-    (_("reStructured Text files"), ('.txt', '.rst')),
-    (_("gettext files"), ('.po', '.pot')),
-    (_("NSIS files"), ('.nsi', '.nsh')),
-    (_("Web page files"), ('.scss', '.css', '.htm', '.html',)),
-    (_("XML files"), ('.xml',)),
-    (_("Javascript files"), ('.js',)),
-    (_("Json files"), ('.json',)),
-    (_("IPython notebooks"), ('.ipynb',)),
-    (_("Enaml files"), ('.enaml',)),
-    (_("Configuration files"), ('.properties', '.session', '.ini', '.inf',
-                                '.reg', '.cfg', '.desktop')),
-                 )
-
-def _create_filter(title, ftypes):
-    return "%s (*%s)" % (title, " *".join(ftypes))
-
-ALL_FILTER = "%s (*)" % _("All files")
-
-def _get_filters(filetypes):
-    filters = []
-    for title, ftypes in filetypes:
-        filters.append(_create_filter(title, ftypes))
-    filters.append(ALL_FILTER)
-    return ";;".join(filters)
-
-def _get_extensions(filetypes):
-    ftype_list = []
-    for _title, ftypes in filetypes:
-        ftype_list += list(ftypes)
-    return ftype_list
-
-def get_filter(filetypes, ext):
-    """Return filter associated to file extension"""
-    if not ext:
-        return ALL_FILTER
-    for title, ftypes in filetypes:
-        if ext in ftypes:
-            return _create_filter(title, ftypes)
-    else:
-        return ''
-
-EDIT_FILTERS = _get_filters(EDIT_FILETYPES)
-EDIT_EXT = _get_extensions(EDIT_FILETYPES)+['']
-
-# Extensions supported by Spyder's Variable explorer
-IMPORT_EXT = list(iofuncs.iofunctions.load_extensions.values())
+# Find in files exclude patterns
+EXCLUDE_PATTERNS = [r'\.pyc$|\.pyo$|\.orig$|\.hg|\.svn|\bbuild\b',
+                    r'\.pyc$|\.pyo$|\.orig$|\.hg|\.svn']
 
 # Extensions that should be visible in Spyder's file/project explorers
-SHOW_EXT = ['.png', '.ico', '.svg']
-
-# Extensions supported by Spyder (Editor or Variable explorer)
-VALID_EXT = EDIT_EXT+IMPORT_EXT
+SHOW_EXT = ['.py', '.ipynb', '.txt', '.dat', '.pdf', '.png', '.svg']
 
 
-# Find in files include/exclude patterns
-INCLUDE_PATTERNS = [r'|'.join(['\\'+_ext+r'$' for _ext in EDIT_EXT if _ext])+\
-                    r'|README|INSTALL',
-                    r'\.pyw?$|\.ipy$|\.txt$|\.rst$',
-                    '.']
-EXCLUDE_PATTERNS = [r'\.pyc$|\.pyo$|\.orig$|\.hg|\.svn|\bbuild\b',
-                    r'\.pyc$|\.pyo$|\.orig$|\.hg|\.svn']
+# Extensions supported by Spyder (Editor or Variable explorer)
+USEFUL_EXT = IMPORT_EXT + SHOW_EXT
 
 
 # Name filters for file/project explorers (excluding files without extension)
-NAME_FILTERS = ['*' + _ext for _ext in VALID_EXT + SHOW_EXT if _ext]+\
-               ['README', 'INSTALL', 'LICENSE', 'CHANGELOG']
+NAME_FILTERS = ['README', 'INSTALL', 'LICENSE', 'CHANGELOG'] + \
+               ['*' + _ext for _ext in USEFUL_EXT if _ext]
 
 
 # Port used to detect if there is a running instance and to communicate with
 # it to open external files
 OPEN_FILES_PORT = 21128
 
+
 # OS Specific
 WIN = os.name == 'nt'
 MAC = sys.platform == 'darwin'
 CTRL = "Meta" if MAC else "Ctrl"
 
 
-#==============================================================================
-# Fonts
-#==============================================================================
-def is_ubuntu():
-    "Detect if we are running in an Ubuntu-based distribution"
-    if sys.platform.startswith('linux') and osp.isfile('/etc/lsb-release'):
-        release_info = open('/etc/lsb-release').read()
-        if 'Ubuntu' in release_info:
-            return True
-        else:
-            return False
-    else:
-        return False
-
-
-def is_gtk_desktop():
-    "Detect if we are running in a Gtk-based desktop"
-    if sys.platform.startswith('linux'):
-        xdg_desktop = os.environ.get('XDG_CURRENT_DESKTOP', '')
-        if xdg_desktop:
-            gtk_desktops = ['Unity', 'GNOME', 'XFCE']
-            if any([xdg_desktop.startswith(d) for d in gtk_desktops]):
-                return True
-            else:
-                return False
-        else:
-            return False
-    else:
-        return False
-
-
-SANS_SERIF = ['Sans Serif', 'DejaVu Sans', 'Bitstream Vera Sans',
-              'Bitstream Charter', 'Lucida Grande', 'MS Shell Dlg 2',
-              'Calibri', 'Verdana', 'Geneva', 'Lucid', 'Arial',
-              'Helvetica', 'Avant Garde', 'Times', 'sans-serif']
-
-MONOSPACE = ['Monospace', 'DejaVu Sans Mono', 'Consolas',
-             'Bitstream Vera Sans Mono', 'Andale Mono', 'Liberation Mono',
-             'Courier New', 'Courier', 'monospace', 'Fixed', 'Terminal']
-
-
-if sys.platform == 'darwin':
-    MONOSPACE = ['Menlo'] + MONOSPACE
-    BIG = MEDIUM = SMALL = 12
-elif os.name == 'nt':
-    BIG = 12
-    MEDIUM = 10
-    SMALL = 9
-elif is_ubuntu():
-    SANS_SERIF = ['Ubuntu'] + SANS_SERIF
-    MONOSPACE = ['Ubuntu Mono'] + MONOSPACE
-    BIG = 13
-    MEDIUM = SMALL = 11
-else:
-    BIG = 12
-    MEDIUM = SMALL = 9
-
-
-#==============================================================================
-# Defaults
-#==============================================================================
+# =============================================================================
+#  Defaults
+# =============================================================================
 DEFAULTS = [
             ('main',
              {
-              'icon_theme': 'spyder 2',
+              'icon_theme': 'spyder 3',
               'single_instance': True,
               'open_files_port': OPEN_FILES_PORT,
               'tear_off_menus': False,
@@ -195,17 +75,6 @@ DEFAULTS = [
               'window/is_maximized': True,
               'window/is_fullscreen': False,
               'window/prefs_dialog_size': (745, 411),
-              'lightwindow/size': (650, 400),
-              'lightwindow/position': (30, 30),
-              'lightwindow/is_maximized': False,
-              'lightwindow/is_fullscreen': False,
-
-              # The following setting is currently not used but necessary from 
-              # a programmatical point of view (see spyder.py):
-              # (may become useful in the future if we add a button to change 
-              # settings within the "light mode")
-              'lightwindow/prefs_dialog_size': (745, 411),
-
               'show_status_bar': True,
               'memory_usage/enable': True,
               'memory_usage/timeout': 2000,
@@ -216,6 +85,17 @@ DEFAULTS = [
               'show_internal_console_if_traceback': True,
               'check_updates_on_startup': True,
               'toolbars_visible': True,
+              # Global Spyder fonts
+              'font/family': MONOSPACE,
+              'font/size': MEDIUM,
+              'font/italic': False,
+              'font/bold': False,
+              'rich_font/family': SANS_SERIF,
+              'rich_font/size': BIG,
+              'rich_font/italic': False,
+              'rich_font/bold': False,
+              'cursor/width': 2,
+              'completion/size': (300, 180),
               }),
             ('quick_layouts',
              {
@@ -224,25 +104,11 @@ DEFAULTS = [
               'order': ['Matlab layout', 'Rstudio layout', 'Vertical split', 'Horizontal split'],
               'active': ['Matlab layout', 'Rstudio layout', 'Vertical split', 'Horizontal split'],
               }),
-            ('editor_appearance',
-             {
-              'cursor/width': 2,
-              'completion/size': (300, 180),
-              }),
-            ('shell_appearance',
-             {
-              'cursor/width': 2,
-              'completion/size': (300, 180),
-              }),
             ('internal_console',
              {
               'max_line_count': 300,
               'working_dir_history': 30,
               'working_dir_adjusttocontents': False,
-              'font/family': MONOSPACE,
-              'font/size': MEDIUM,
-              'font/italic': False,
-              'font/bold': False,
               'wrap': True,
               'calltips': True,
               'codecompletion/auto': False,
@@ -255,14 +121,9 @@ DEFAULTS = [
             ('console',
              {
               'max_line_count': 500,
-              'font/family': MONOSPACE,
-              'font/size': MEDIUM,
-              'font/italic': False,
-              'font/bold': False,
               'wrap': True,
               'single_tab': True,
               'calltips': True,
-              'object_inspector': True,
               'codecompletion/auto': True,
               'codecompletion/enter_key': True,
               'codecompletion/case_sensitive': True,
@@ -285,16 +146,11 @@ DEFAULTS = [
               }),
             ('ipython_console',
              {
-              'font/family': MONOSPACE,
-              'font/size': MEDIUM,
-              'font/italic': False,
-              'font/bold': False,
               'show_banner': True,
               'completion_type': 0,
               'use_pager': False,
               'show_calltips': True,
               'ask_before_closing': True,
-              'object_inspector': True,
               'buffer_size': 500,
               'pylab': True,
               'pylab/autoload': False,
@@ -334,10 +190,6 @@ DEFAULTS = [
               'printer_header/font/size': MEDIUM,
               'printer_header/font/italic': False,
               'printer_header/font/bold': False,
-              'font/family': MONOSPACE,
-              'font/size': MEDIUM,
-              'font/italic': False,
-              'font/bold': False,
               'wrap': False,
               'wrapflag': True,
               'code_analysis/pyflakes': True,
@@ -359,7 +211,6 @@ DEFAULTS = [
               'auto_unindent': True,
               'indent_chars': '*    *',
               'tab_stop_width': 40,
-              'object_inspector': True,
               'codecompletion/auto': True,
               'codecompletion/enter_key': True,
               'codecompletion/case_sensitive': True,
@@ -368,8 +219,8 @@ DEFAULTS = [
               'intelligent_backspace': True,
               'highlight_current_line': True,
               'highlight_current_cell': True,
-              'occurence_highlighting': True,
-              'occurence_highlighting/timeout': 1500,
+              'occurrence_highlighting': True,
+              'occurrence_highlighting/timeout': 1500,
               'always_remove_trailing_spaces': False,
               'fullpath_sorting': True,
               'show_tab_bar': True,
@@ -382,25 +233,13 @@ DEFAULTS = [
              {
               'enable': True,
               'max_entries': 100,
-              'font/family': MONOSPACE,
-              'font/size': MEDIUM,
-              'font/italic': False,
-              'font/bold': False,
               'wrap': True,
               'go_to_eof': True,
               }),
-            ('inspector',
+            ('help',
              {
               'enable': True,
               'max_history_entries': 20,
-              'font/family': MONOSPACE,
-              'font/size': SMALL,
-              'font/italic': False,
-              'font/bold': False,
-              'rich_text/font/family': SANS_SERIF,
-              'rich_text/font/size': BIG,
-              'rich_text/font/italic': False,
-              'rich_text/font/bold': False,
               'wrap': True,
               'connect/editor': False,
               'connect/python_console': False,
@@ -428,27 +267,6 @@ DEFAULTS = [
               'show_all': False,
               'show_hscrollbar': True
               }),
-            ('arrayeditor',
-             {
-              'font/family': MONOSPACE,
-              'font/size': SMALL,
-              'font/italic': False,
-              'font/bold': False,
-              }),
-            ('texteditor',
-             {
-              'font/family': MONOSPACE,
-              'font/size': MEDIUM,
-              'font/italic': False,
-              'font/bold': False,
-              }),
-            ('dicteditor',
-             {
-              'font/family': MONOSPACE,
-              'font/size': SMALL,
-              'font/italic': False,
-              'font/bold': False,
-              }),
             ('explorer',
              {
               'enable': True,
@@ -462,7 +280,7 @@ DEFAULTS = [
              {
               'enable': True,
               'supported_encodings': ["utf-8", "iso-8859-1", "cp1252"],
-              'include': INCLUDE_PATTERNS,
+              'include': '',
               'include_regexp': True,
               'exclude': EXCLUDE_PATTERNS,
               'exclude_regexp': True,
@@ -487,28 +305,32 @@ DEFAULTS = [
             ('shortcuts',
              {
               # ---- Global ----
-              # -- In spyder.py
+              # -- In app/spyder.py
               '_/close pane': "Shift+Ctrl+F4",
               '_/lock unlock panes': "Shift+Ctrl+F5",
+              '_/use next layout': "Shift+Alt+PgDown",
+              '_/use previous layout': "Shift+Alt+PgUp",
               '_/preferences': "Ctrl+Alt+Shift+P",
               '_/maximize pane': "Ctrl+Alt+Shift+M",
               '_/fullscreen mode': "F11",
-              '_/use next layout': "Shift+Alt+PgDown",
-              '_/use previous layout': "Shift+Alt+PgUp",
               '_/save current layout': "Shift+Alt+S",
-              '_/toggle default layout': "Shift+Alt+Home",
               '_/layout preferences': "Shift+Alt+P",
               '_/show toolbars': "Alt+Shift+T",
               '_/restart': "Shift+Alt+R",
               '_/quit': "Ctrl+Q",
               # -- In plugins/editor
+              '_/file switcher': 'Ctrl+P',
+              '_/debug': "Ctrl+F5",
               '_/debug step over': "Ctrl+F10",
               '_/debug continue': "Ctrl+F12",
               '_/debug step into': "Ctrl+F11",
               '_/debug step return': "Ctrl+Shift+F11",
               '_/debug exit': "Ctrl+Shift+F12",
+              '_/run': "F5",
+              '_/configure': "Ctrl+F6",
+              '_/re-run last script': "F6",
               # -- In plugins/init
-              '_/switch to inspector': "Ctrl+Shift+H",
+              '_/switch to help': "Ctrl+Shift+H",
               '_/switch to outline_explorer': "Ctrl+Shift+O",
               '_/switch to editor': "Ctrl+Shift+E",
               '_/switch to historylog': "Ctrl+Shift+L",
@@ -519,8 +341,13 @@ DEFAULTS = [
               '_/switch to variable_explorer': "Ctrl+Shift+V",
               '_/switch to find_in_files': "Ctrl+Shift+F",
               '_/switch to explorer': "Ctrl+Shift+X",
+              # -- In widgets/findreplace.py
+              '_/find text': "Ctrl+F",
+              '_/find next': "F3",
+              '_/find previous': "Shift+F3",
+              '_/replace text': "Ctrl+R",
               # ---- Editor ----
-              # -- In codeeditor
+              # -- In widgets/sourcecode/codeeditor.py
               'editor/code completion': CTRL+'+Space',
               'editor/duplicate line': "Ctrl+Alt+Up" if WIN else \
                                        "Shift+Alt+Up",
@@ -549,65 +376,56 @@ DEFAULTS = [
               'editor/kill next word': 'Meta+D',
               'editor/start of document': 'Ctrl+Up',
               'editor/end of document': 'Ctrl+Down',
-              # -- In widgets/editor
-              'editor/inspect current object': 'Ctrl+I',
-              'editor/go to line': 'Ctrl+L',
-              'editor/go to previous file': 'Ctrl+Tab',
-              'editor/go to next file': 'Ctrl+Shift+Tab',
-              '_/file switcher': 'Ctrl+P',
-              # -- In spyder.py
-              'editor/find text': "Ctrl+F",
-              'editor/find next': "F3",
-              'editor/find previous': "Shift+F3",
-              'editor/replace text': "Ctrl+H",
-              'editor/undo': 'Ctrl+U',
-              'editor/redo': 'Ctrl+Y',
+              'editor/undo': 'Ctrl+Z',
+              'editor/redo': 'Ctrl+Shift+Z',
               'editor/cut': 'Ctrl+X',
               'editor/copy': 'Ctrl+C',
               'editor/paste': 'Ctrl+V',
               'editor/delete': 'Delete',
               'editor/select all': "Ctrl+A",
-              # -- In plugins/editor
-              'editor/show/hide outline': "Ctrl+Alt+O",
-              'editor/show/hide project explorer': "Ctrl+Alt+P",
+              # -- In widgets/editor.py
+              'editor/inspect current object': 'Ctrl+I',
+              'editor/breakpoint': 'F12',
+              'editor/conditional breakpoint': 'Shift+F12',
+              'editor/run selection': "F9",
+              'editor/go to line': 'Ctrl+L',
+              'editor/go to previous file': 'Ctrl+Tab',
+              'editor/go to next file': 'Ctrl+Shift+Tab',
               'editor/new file': "Ctrl+N",
               'editor/open file': "Ctrl+O",
               'editor/save file': "Ctrl+S",
               'editor/save all': "Ctrl+Alt+S",
               'editor/save as': 'Ctrl+Shift+S',
               'editor/close all': "Ctrl+Shift+W",
-              'editor/breakpoint': 'F12',
-              'editor/conditional breakpoint': 'Shift+F12',
-              'editor/debug with winpdb': "F7",
-              'editor/debug': "Ctrl+F5",
-              'editor/run': "F5",
-              'editor/configure': "F6",
-              'editor/re-run last script': "Ctrl+F6",
-              'editor/run selection': "F9",
               'editor/last edit location': "Ctrl+Alt+Shift+Left",
               'editor/previous cursor position': "Ctrl+Alt+Left",
               'editor/next cursor position': "Ctrl+Alt+Right",
-              # -- In p_breakpoints
+              # -- In plugins/editor.py
+              'editor/show/hide outline': "Ctrl+Alt+O",
+              'editor/show/hide project explorer': "Ctrl+Alt+P",
+              # -- In Breakpoints
               '_/switch to breakpoints': "Ctrl+Shift+B",
-              # ---- Console (in widgets/shell) ----
+              # ---- Consoles (in widgets/shell) ----
               'console/inspect current object': "Ctrl+I",
               'console/clear shell': "Ctrl+L",
               'console/clear line': "Shift+Escape",
-              # ---- Pylint (in p_pylint) ----
+              # ---- In Pylint ----
               'pylint/run analysis': "F8",
-              # ---- Profiler (in p_profiler) ----
+              # ---- In Profiler ----
               'profiler/run profiler': "F10"
               }),
             ('color_schemes',
              {
-              'names': ['Emacs', 'IDLE', 'Monokai', 'Pydev', 'Scintilla',
-                        'Spyder', 'Spyder/Dark', 'Zenburn'],
+              'names': ['emacs', 'idle', 'monokai', 'pydev', 'scintilla',
+                        'spyder', 'spyder/dark', 'zenburn'],
+              'selected': 'spyder',
               # ---- Emacs ----
+              'emacs/name':        "Emacs",
               #      Name            Color     Bold  Italic
               'emacs/background':  "#000000",
               'emacs/currentline': "#2b2b43",
               'emacs/currentcell': "#1c1c2d",
-              'emacs/occurence':   "#abab67",
+              'emacs/occurrence':   "#abab67",
               'emacs/ctrlclick':   "#0000ff",
               'emacs/sideareas':   "#555555",
               'emacs/matched_p':   "#009800",
@@ -621,11 +439,12 @@ DEFAULTS = [
               'emacs/number':     ('#800000', False, False),
               'emacs/instance':   ('#ffffff', False, True),
               # ---- IDLE ----
+              'idle/name':         "IDLE",
               #      Name            Color     Bold  Italic
               'idle/background':   "#ffffff",
               'idle/currentline':  "#f2e6f3",
               'idle/currentcell':  "#feefff",
-              'idle/occurence':    "#e8f2fe",
+              'idle/occurrence':    "#e8f2fe",
               'idle/ctrlclick':    "#0000ff",
               'idle/sideareas':    "#efefef",
               'idle/matched_p':    "#99ff99",
@@ -639,11 +458,12 @@ DEFAULTS = [
               'idle/number':      ('#924900', False, False),
               'idle/instance':    ('#777777', True, True),
               # ---- Monokai ----
+              'monokai/name':         "Monokai",
               #      Name              Color     Bold  Italic
               'monokai/background':   "#2a2b24",
               'monokai/currentline':  "#484848",
               'monokai/currentcell':  "#3d3d3d",
-              'monokai/occurence':    "#666666",
+              'monokai/occurrence':    "#666666",
               'monokai/ctrlclick':    "#0000ff",
               'monokai/sideareas':    "#2a2b24",
               'monokai/matched_p':    "#688060",
@@ -657,11 +477,12 @@ DEFAULTS = [
               'monokai/number':      ("#ae81ff", False, False),
               'monokai/instance':    ("#ddddda", False, True),
               # ---- Pydev ----
+              'pydev/name':        "Pydev",
               #      Name            Color     Bold  Italic
               'pydev/background':  "#ffffff",
               'pydev/currentline': "#e8f2fe",
               'pydev/currentcell': "#eff8fe",
-              'pydev/occurence':   "#ffff99",
+              'pydev/occurrence':   "#ffff99",
               'pydev/ctrlclick':   "#0000ff",
               'pydev/sideareas':   "#efefef",
               'pydev/matched_p':   "#99ff99",
@@ -675,11 +496,12 @@ DEFAULTS = [
               'pydev/number':     ('#800000', False, False),
               'pydev/instance':   ('#000000', False, True),
               # ---- Scintilla ----
+              'scintilla/name':        "Scintilla",
               #         Name             Color     Bold  Italic
               'scintilla/background':  "#ffffff",
               'scintilla/currentline': "#e1f0d1",
               'scintilla/currentcell': "#edfcdc",  
-              'scintilla/occurence':   "#ffff99",
+              'scintilla/occurrence':   "#ffff99",
               'scintilla/ctrlclick':   "#0000ff",
               'scintilla/sideareas':   "#efefef",
               'scintilla/matched_p':   "#99ff99",
@@ -693,11 +515,12 @@ DEFAULTS = [
               'scintilla/number':     ('#007f7f', False, False),
               'scintilla/instance':   ('#000000', False, True),
               # ---- Spyder ----
+              'spyder/name':        "Spyder",
               #       Name            Color     Bold  Italic
               'spyder/background':  "#ffffff",
               'spyder/currentline': "#f7ecf8",
               'spyder/currentcell': "#fdfdde",              
-              'spyder/occurence':   "#ffff99",
+              'spyder/occurrence':   "#ffff99",
               'spyder/ctrlclick':   "#0000ff",
               'spyder/sideareas':   "#efefef",
               'spyder/matched_p':   "#99ff99",
@@ -711,11 +534,12 @@ DEFAULTS = [
               'spyder/number':     ('#800000', False, False),
               'spyder/instance':   ('#924900', False, True),
               # ---- Spyder/Dark ----
+              'spyder/dark/name':        "Spyder Dark",
               #           Name             Color     Bold  Italic
               'spyder/dark/background':  "#131926",
               'spyder/dark/currentline': "#2b2b43",
               'spyder/dark/currentcell': "#31314e",
-              'spyder/dark/occurence':   "#abab67",
+              'spyder/dark/occurrence':   "#abab67",
               'spyder/dark/ctrlclick':   "#0000ff",
               'spyder/dark/sideareas':   "#282828",
               'spyder/dark/matched_p':   "#009800",
@@ -729,11 +553,12 @@ DEFAULTS = [
               'spyder/dark/number':     ('#c80000', False, False),
               'spyder/dark/instance':   ('#be5f00', False, True),
               # ---- Zenburn ----
+              'zenburn/name':        "Zenburn",
               #        Name            Color     Bold  Italic
               'zenburn/background':  "#3f3f3f",
               'zenburn/currentline': "#333333",
               'zenburn/currentcell': "#2c2c2c",
-              'zenburn/occurence':   "#7a738f",
+              'zenburn/occurrence':   "#7a738f",
               'zenburn/ctrlclick':   "#0000ff",
               'zenburn/sideareas':   "#3f3f3f",
               'zenburn/matched_p':   "#688060",
@@ -757,15 +582,18 @@ DEFAULTS = [
 # 1. If you want to *change* the default value of a current option, you need to
 #    do a MINOR update in config version, e.g. from 3.0.0 to 3.1.0
 # 2. If you want to *remove* options that are no longer needed in our codebase,
-#    you need to do a MAJOR update in version, e.g. from 3.0.0 to 4.0.0
+#    or if you want to *rename* options, then you need to do a MAJOR update in
+#    version, e.g. from 3.0.0 to 4.0.0
 # 3. You don't need to touch this value if you're just adding a new option
-CONF_VERSION = '21.1.0'
+CONF_VERSION = '27.1.0'
+
 
 # XXX: Previously we had load=(not DEV) here but DEV was set to *False*.
 # Check if it *really* needs to be updated or not
 CONF = UserConfig('spyder', defaults=DEFAULTS, load=True, version=CONF_VERSION,
                   subfolder=SUBFOLDER, backup=True, raw_mode=True)
 
+
 # Removing old .spyder.ini location:
 old_location = osp.join(get_home_dir(), '.spyder.ini')
 if osp.isfile(old_location):
diff --git a/spyderlib/config/user.py b/spyderlib/config/user.py
index 6034fec..e6bd367 100644
--- a/spyderlib/config/user.py
+++ b/spyderlib/config/user.py
@@ -302,8 +302,11 @@ class UserConfig(DefaultsConfig):
         for section in old_defaults.sections():
             for option, _ in old_defaults.items(section, raw=self.raw):
                 if self.get_default(section, option) is NoDefault:
-                    self.remove_option(section, option)
-                    if len(self.items(section, raw=self.raw)) == 0:
+                    try:
+                        self.remove_option(section, option)
+                        if len(self.items(section, raw=self.raw)) == 0:
+                            self.remove_section(section)
+                    except cp.NoSectionError:
                         self.remove_section(section)
 
     def cleanup(self):
diff --git a/spyderlib/config/utils.py b/spyderlib/config/utils.py
new file mode 100644
index 0000000..20c5d10
--- /dev/null
+++ b/spyderlib/config/utils.py
@@ -0,0 +1,163 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009- The Spyder Development Team
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""
+Utilities to define configuration values
+"""
+
+import os
+import os.path as osp
+import sys
+
+from spyderlib.config.base import _
+from spyderlib.utils import iofuncs
+
+
+#==============================================================================
+# Constants
+#==============================================================================
+# File types supported by the Editor up to Spyder 2.3
+EDIT_FILETYPES = [
+    (_("Python files"), ('.py', '.pyw', '.ipy')),
+    (_("Cython/Pyrex files"), ('.pyx', '.pxd', '.pxi')),
+    (_("C files"), ('.c', '.h')),
+    (_("C++ files"), ('.cc', '.cpp', '.cxx', '.h', '.hh', '.hpp', '.hxx')),
+    (_("OpenCL files"), ('.cl', )),
+    (_("Fortran files"), ('.f', '.for', '.f77', '.f90', '.f95', '.f2k')),
+    (_("IDL files"), ('.pro', )),
+    (_("MATLAB files"), ('.m', )),
+    (_("Julia files"), ('.jl',)),
+    (_("Yaml files"), ('.yaml','.yml',)),
+    (_("Patch and diff files"), ('.patch', '.diff', '.rej')),
+    (_("Batch files"), ('.bat', '.cmd')),
+    (_("Text files"), ('.txt',)),
+    (_("reStructuredText files"), ('.txt', '.rst')),
+    (_("gettext files"), ('.po', '.pot')),
+    (_("NSIS files"), ('.nsi', '.nsh')),
+    (_("Web page files"), ('.scss', '.css', '.htm', '.html',)),
+    (_("XML files"), ('.xml',)),
+    (_("Javascript files"), ('.js',)),
+    (_("Json files"), ('.json',)),
+    (_("IPython notebooks"), ('.ipynb',)),
+    (_("Enaml files"), ('.enaml',)),
+    (_("Configuration files"), ('.properties', '.session', '.ini', '.inf',
+                                '.reg', '.cfg', '.desktop')),
+]
+
+# Filter for all files
+ALL_FILTER = "%s (*)" % _("All files")
+
+# Extensions supported by Spyder's Variable explorer
+IMPORT_EXT = list(iofuncs.iofunctions.load_extensions.values())
+
+
+#==============================================================================
+# Auxiliary functions
+#==============================================================================
+def _create_filter(title, ftypes):
+    return "%s (*%s)" % (title, " *".join(ftypes))
+
+
+def _get_filters(filetypes):
+    filters = []
+    for title, ftypes in filetypes:
+        filters.append(_create_filter(title, ftypes))
+    filters.append(ALL_FILTER)
+    return ";;".join(filters)
+
+
+def _get_extensions(filetypes):
+    ftype_list = []
+    for _title, ftypes in filetypes:
+        ftype_list += list(ftypes)
+    return ftype_list
+
+
+def _get_pygments_extensions():
+    """Return all file type extensions supported by Pygments"""
+    # NOTE: Leave this import here to keep startup process fast!
+    import pygments.lexers as lexers
+    extensions = []
+    all_lexers = lexers.get_all_lexers()
+    for lx in all_lexers:
+        lexer_exts = lx[2]
+        if lexer_exts:
+            lexer_exts = [le[1:] for le in lexer_exts]
+            lexer_exts = [le for le in lexer_exts if not le.endswith('_*')]
+            extensions = extensions + list(lexer_exts)
+    return extensions
+
+
+#==============================================================================
+# Main functions
+#==============================================================================
+def get_filter(filetypes, ext):
+    """Return filter associated to file extension"""
+    if not ext:
+        return ALL_FILTER
+    for title, ftypes in filetypes:
+        if ext in ftypes:
+            return _create_filter(title, ftypes)
+    else:
+        return ''
+
+
+def get_edit_filetypes():
+    """Get all file types supported by the Editor"""
+    pygments_exts = _get_pygments_extensions()
+    other_exts = ['.ipynb', '.md']
+    all_exts = tuple(pygments_exts + other_exts)
+    text_filetypes = (_("Supported text files"), all_exts)
+    return [text_filetypes] + EDIT_FILETYPES
+
+
+def get_edit_filters():
+    """
+    Return filters associated with the file types
+    supported by the Editor
+    """
+    edit_filetypes = get_edit_filetypes()
+    return _get_filters(edit_filetypes)
+
+
+def get_edit_extensions():
+    """
+    Return extensions associated with the file types
+    supported by the Editor
+    """
+    edit_filetypes = get_edit_filetypes()
+    return _get_extensions(edit_filetypes)+['']
+
+
+#==============================================================================
+# Detection of OS specific versions
+#==============================================================================
+def is_ubuntu():
+    "Detect if we are running in an Ubuntu-based distribution"
+    if sys.platform.startswith('linux') and osp.isfile('/etc/lsb-release'):
+        release_info = open('/etc/lsb-release').read()
+        if 'Ubuntu' in release_info:
+            return True
+        else:
+            return False
+    else:
+        return False
+
+
+def is_gtk_desktop():
+    "Detect if we are running in a Gtk-based desktop"
+    if sys.platform.startswith('linux'):
+        xdg_desktop = os.environ.get('XDG_CURRENT_DESKTOP', '')
+        if xdg_desktop:
+            gtk_desktops = ['Unity', 'GNOME', 'XFCE']
+            if any([xdg_desktop.startswith(d) for d in gtk_desktops]):
+                return True
+            else:
+                return False
+        else:
+            return False
+    else:
+        return False
diff --git a/spyderlib/dependencies.py b/spyderlib/dependencies.py
index 1b356e6..3775a50 100644
--- a/spyderlib/dependencies.py
+++ b/spyderlib/dependencies.py
@@ -23,15 +23,18 @@ class Dependency(object):
     NOK = 'NOK'
 
     def __init__(self, modname, features, required_version,
-                 installed_version=None):
+                 installed_version=None, optional=False):
         self.modname = modname
         self.features = features
         self.required_version = required_version
+        self.optional = optional
         if installed_version is None:
             try:
                 self.installed_version = programs.get_module_version(modname)
-            except ImportError:
-                # Module is not installed
+            except:
+                # NOTE: Don't add any exception type here!
+                # Modules can fail to import in several ways besides
+                # ImportError
                 self.installed_version = None
         else:
             self.installed_version = installed_version
@@ -59,7 +62,9 @@ class Dependency(object):
 
 DEPENDENCIES = []
 
-def add(modname, features, required_version, installed_version=None):
+
+def add(modname, features, required_version, installed_version=None,
+        optional=False):
     """Add Spyder dependency"""
     global DEPENDENCIES
     for dependency in DEPENDENCIES:
@@ -67,7 +72,8 @@ def add(modname, features, required_version, installed_version=None):
             raise ValueError("Dependency has already been registered: %s"\
                              % modname)
     DEPENDENCIES += [Dependency(modname, features, required_version,
-                                installed_version)]
+                                installed_version, optional)]
+
 
 def check(modname):
     """Check if required dependency is installed"""
@@ -77,18 +83,31 @@ def check(modname):
     else:
         raise RuntimeError("Unkwown dependency %s" % modname)
 
-def status():
-    """Return a complete status of Dependencies"""
+
+def status(deps=DEPENDENCIES, linesep=os.linesep):
+    """Return a status of dependencies"""
     maxwidth = 0
     col1 = []
     col2 = []
-    for dependency in DEPENDENCIES:
+    for dependency in deps:
         title1 = dependency.modname
         title1 += ' ' + dependency.required_version
         col1.append(title1)
         maxwidth = max([maxwidth, len(title1)])
         col2.append(dependency.get_installed_version())
     text = ""
-    for index in range(len(DEPENDENCIES)):
-        text += col1[index].ljust(maxwidth) + ':  ' + col2[index] + os.linesep
+    for index in range(len(deps)):
+        text += col1[index].ljust(maxwidth) + ':  ' + col2[index] + linesep
     return text
+
+
+def missing_dependencies():
+    """Return the status of missing dependencies (if any)"""
+    missing_deps = []
+    for dependency in DEPENDENCIES:
+        if not dependency.check() and not dependency.optional:
+            missing_deps.append(dependency)
+    if missing_deps:
+        return status(deps=missing_deps, linesep='<br>')
+    else:
+        return ""
diff --git a/spyderlib/fonts/spyder-charmap.json b/spyderlib/fonts/spyder-charmap.json
index 2d60254..3244be0 100644
--- a/spyderlib/fonts/spyder-charmap.json
+++ b/spyderlib/fonts/spyder-charmap.json
@@ -9,8 +9,6 @@
     "step-over": "0xE008",
     "stop": "0xE009",
     "cell": "0xE00A",
-    "cell-page": "0xE03A",
-    "cell-page-shadow": "0xE03F",
     "cell-code": "0xE03B",
     "cell-play": "0xE03C",
     "cell-next": "0xE03D",
@@ -41,6 +39,7 @@
     "circle-letter-m": "0xE023",
     "circle-percent": "0xE024",
     "circle-letter-r": "0xE025",
+    "circle-underscore": "0xE026",
     "cube-front": "0xE055",
     "cube-bottom": "0xE056",
     "cube-right": "0xE057",
diff --git a/spyderlib/fonts/spyder.ttf b/spyderlib/fonts/spyder.ttf
index 48ef0e3..bdd158c 100644
Binary files a/spyderlib/fonts/spyder.ttf and b/spyderlib/fonts/spyder.ttf differ
diff --git a/spyderlib/images/inspector.png b/spyderlib/images/help.png
similarity index 100%
rename from spyderlib/images/inspector.png
rename to spyderlib/images/help.png
diff --git a/spyderlib/images/splash.png b/spyderlib/images/splash.png
deleted file mode 100644
index f21c390..0000000
Binary files a/spyderlib/images/splash.png and /dev/null differ
diff --git a/spyderlib/images/splash.svg b/spyderlib/images/splash.svg
new file mode 100644
index 0000000..b7e73f1
--- /dev/null
+++ b/spyderlib/images/splash.svg
@@ -0,0 +1,3788 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.0"
+   width="500"
+   height="250"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="splash.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="D:\Python\spyder\img_src\ico32.png"
+   inkscape:export-xdpi="214.0081"
+   inkscape:export-ydpi="214.0081">
+  <metadata
+     id="metadata2193">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by/3.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by/3.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     inkscape:window-height="744"
+     inkscape:window-width="1280"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="1"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:zoom="1"
+     inkscape:cx="339.59356"
+     inkscape:cy="126.04479"
+     inkscape:window-x="202"
+     inkscape:window-y="69"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-maximized="0" />
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3350">
+      <stop
+         style="stop-color:#00cb2b;stop-opacity:0.24793388;"
+         offset="0"
+         id="stop3352" />
+      <stop
+         style="stop-color:#00cb2b;stop-opacity:1;"
+         offset="1"
+         id="stop3354" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3342">
+      <stop
+         style="stop-color:#005a85;stop-opacity:1;"
+         offset="0"
+         id="stop3344" />
+      <stop
+         style="stop-color:#005a85;stop-opacity:0.75206614;"
+         offset="1"
+         id="stop3346" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3310">
+      <stop
+         id="stop3312"
+         offset="0"
+         style="stop-color:#ae0202;stop-opacity:1;" />
+      <stop
+         id="stop3314"
+         offset="1"
+         style="stop-color:#e39494;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="14 : 76.887497 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="500.04999 : 76.887497 : 1"
+       inkscape:persp3d-origin="257.02499 : 52.924998 : 1"
+       id="perspective47" />
+    <linearGradient
+       id="linearGradient2795">
+      <stop
+         style="stop-color:#b8b8b8;stop-opacity:0.49803922"
+         offset="0"
+         id="stop2797" />
+      <stop
+         style="stop-color:#7f7f7f;stop-opacity:0"
+         offset="1"
+         id="stop2799" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2787">
+      <stop
+         style="stop-color:#7f7f7f;stop-opacity:0.5"
+         offset="0"
+         id="stop2789" />
+      <stop
+         style="stop-color:#7f7f7f;stop-opacity:0"
+         offset="1"
+         id="stop2791" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3676">
+      <stop
+         style="stop-color:#b2b2b2;stop-opacity:0.5"
+         offset="0"
+         id="stop3678" />
+      <stop
+         style="stop-color:#b3b3b3;stop-opacity:0"
+         offset="1"
+         id="stop3680" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3236">
+      <stop
+         style="stop-color:#f4f4f4;stop-opacity:1"
+         offset="0"
+         id="stop3244" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop3240" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4671">
+      <stop
+         style="stop-color:#ffd43b;stop-opacity:1"
+         offset="0"
+         id="stop4673" />
+      <stop
+         style="stop-color:#ffe873;stop-opacity:1"
+         offset="1"
+         id="stop4675" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4689">
+      <stop
+         style="stop-color:#5a9fd4;stop-opacity:1"
+         offset="0"
+         id="stop4691" />
+      <stop
+         style="stop-color:#306998;stop-opacity:1"
+         offset="1"
+         id="stop4693" />
+    </linearGradient>
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2987"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="172.94208"
+       y1="77.475983"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2990"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="172.94208"
+       y1="77.475983"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2587"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2589"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="172.94208"
+       y1="77.475983"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2248"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2250"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(100.2702,99.61116)" />
+    <linearGradient
+       x1="224.23996"
+       y1="144.75717"
+       x2="-65.308502"
+       y2="144.75717"
+       id="linearGradient2255"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
+    <linearGradient
+       x1="172.94208"
+       y1="76.176224"
+       x2="26.670298"
+       y2="76.313133"
+       id="linearGradient2258"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
+    <radialGradient
+       cx="61.518883"
+       cy="132.28575"
+       r="29.036913"
+       fx="61.518883"
+       fy="132.28575"
+       id="radialGradient2801"
+       xlink:href="#linearGradient2795"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.177966,0,108.7434)" />
+    <linearGradient
+       x1="150.96111"
+       y1="192.35176"
+       x2="112.03144"
+       y2="137.27299"
+       id="linearGradient1475"
+       xlink:href="#linearGradient4671"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
+    <linearGradient
+       x1="26.648937"
+       y1="20.603781"
+       x2="135.66525"
+       y2="114.39767"
+       id="linearGradient1478"
+       xlink:href="#linearGradient4689"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
+    <radialGradient
+       cx="61.518883"
+       cy="132.28575"
+       r="29.036913"
+       fx="61.518883"
+       fy="132.28575"
+       id="radialGradient1480"
+       xlink:href="#linearGradient2795"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2795"
+       id="radialGradient2421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.7490565e-8,-0.239947,1.054668,3.7915457e-7,-78.109429,148.85906)"
+       cx="61.518883"
+       cy="132.28575"
+       fx="61.518883"
+       fy="132.28575"
+       r="29.036913" />
+  </defs>
+  <image
+     y="0"
+     x="0"
+     id="image3066"
+     xlink:href="data:image/png;base64,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
+YII=
+"
+     height="250"
+     width="500" />
+  <g
+     id="g3100"
+     transform="matrix(0.5,0,0,0.5,104.70061,68.814529)">
+    <g
+       id="g3090">
+      <path
+         sodipodi:type="star"
+         style="fill:#414141;fill-opacity:1;stroke:#ebebeb;stroke-width:8.42870998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="path2747"
+         sodipodi:sides="7"
+         sodipodi:cx="21.617718"
+         sodipodi:cy="45.732677"
+         sodipodi:r1="62.576824"
+         sodipodi:r2="54.193119"
+         sodipodi:arg1="-1.0471976"
+         sodipodi:arg2="-0.59839865"
+         inkscape:flatsided="true"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="M 52.906127,-8.4604435 83.49561,36.406083 67.489778,88.295725 16.941349,108.13452 -30.085679,80.98346 -38.178995,27.287838 -1.2441662,-12.518444 z"
+         transform="matrix(0.9428415,-0.0659299,0.06648817,0.9508251,95.525121,83.109051)" />
+      <path
+         sodipodi:type="star"
+         style="fill:#414141;fill-opacity:1;stroke:#ebebeb;stroke-width:17.37169838;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="path3527"
+         sodipodi:sides="5"
+         sodipodi:cx="21.617718"
+         sodipodi:cy="45.732677"
+         sodipodi:r1="62.576824"
+         sodipodi:r2="54.193119"
+         sodipodi:arg1="-1.0471976"
+         sodipodi:arg2="-0.41887907"
+         inkscape:flatsided="true"
+         inkscape:rounded="0"
+         inkscape:randomized="0"
+         d="M 52.906127,-8.4604435 82.827089,58.743128 28.15878,107.9667 -35.549055,71.184968 -20.254353,-0.77096359 z"
+         transform="matrix(0.4002816,-0.02799041,0.02822743,0.403671,107.40863,105.92868)" />
+      <path
+         style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 94.490332,49.020095 c 5.312096,35.979066 4.818998,58.168475 4.818998,58.168475"
+         id="path3529"
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="M 127.58764,101.71591 C 144.72351,71.856661 159.02335,49.174162 159.02335,49.174162"
+         id="path3531"
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 201.33602,103.07313 c 0,0 -25.14799,8.87576 -58.75557,23.10966 22.10492,36.2029 42.32193,48.53035 42.32193,48.53035"
+         id="path3533"
+         sodipodi:nodetypes="ccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 121.68179,147.21752 c -2.66352,36.88631 -1.18423,63.0205 -1.18423,63.0205"
+         id="path3535"
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="M 96.037752,135.37929 C 72.769977,162.5216 47.621984,177.80764 47.621984,177.80764"
+         id="path3537"
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 99.30933,107.18857 c -38.090334,5.11021 -63.731425,2.64472 -63.731425,2.64472"
+         id="path3539"
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       transform="translate(57.162801,65.983781)"
+       id="g3541">
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path2473"
+         d="M 11.375561,69.98969 30.637638,50.727613 c 5.456549,-5.456549 15.437147,-5.726675 21.194641,0.03082 l 9.871802,9.871802"
+         style="fill:none;stroke:#ee0000;stroke-width:12;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path3290"
+         d="M 111.30352,50.542782 92.041442,69.804859 c -5.45655,5.45655 -15.437148,5.726675 -21.194642,-0.03082 l -9.871801,-9.871801"
+         style="fill:none;stroke:#ee0000;stroke-width:12;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         transform="matrix(0.6055665,0.6055665,-0.6286135,0.6286135,75.900286,-31.30135)"
+         d="m 102.50982,45.035332 c 0,5.969568 -2.653804,10.808859 -5.927438,10.808859 -3.273634,0 -5.927439,-4.839291 -5.927439,-10.808859 0,-5.969568 2.653805,-10.808859 5.927439,-10.808859 3.273634,0 5.927438,4.839291 5.927438,10.808859 z"
+         sodipodi:ry="10.808859"
+         sodipodi:rx="5.9274387"
+         sodipodi:cy="45.035332"
+         sodipodi:cx="96.582382"
+         id="path3340"
+         style="fill:#ff0000;fill-opacity:1;stroke:#ee0000;stroke-width:14;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+    </g>
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Candara;-inkscape-font-specification:Candara"
+     x="209.12732"
+     y="140.99556"
+     id="text2451"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan2453"
+       x="209.12732"
+       y="140.99556"
+       style="font-size:45px;fill:#ffffff;fill-opacity:1">spyder</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:28px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;font-family:Candara;-inkscape-font-specification:Candara"
+     x="346.5874"
+     y="118.50293"
+     id="text2451-4"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan2453-0"
+       x="346.5874"
+       y="118.50293"
+       style="font-size:30px;fill:#ffff00;fill-opacity:1">3</tspan></text>
+  <rect
+     style="fill:none;stroke:#ffff7b;stroke-width:0.99700844000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.64921468;stroke-dasharray:none"
+     id="rect3215"
+     width="499.00299"
+     height="249.00299"
+     x="0.49850422"
+     y="0.49849206" />
+</svg>
diff --git a/spyderlib/images/spyder_light.svg b/spyderlib/images/spyder_light.svg
deleted file mode 100644
index 858fb4f..0000000
--- a/spyderlib/images/spyder_light.svg
+++ /dev/null
@@ -1,366 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.0"
-   width="150.56873"
-   height="150.31233"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.48.2 r9819"
-   sodipodi:docname="spyder_light.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="D:\Python\spyder\img_src\ico24.png"
-   inkscape:export-xdpi="14.35"
-   inkscape:export-ydpi="14.35">
-  <metadata
-     id="metadata2193">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-        <cc:license
-           rdf:resource="http://creativecommons.org/licenses/by/3.0/" />
-      </cc:Work>
-      <cc:License
-         rdf:about="http://creativecommons.org/licenses/by/3.0/">
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Reproduction" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#Distribution" />
-        <cc:requires
-           rdf:resource="http://creativecommons.org/ns#Notice" />
-        <cc:requires
-           rdf:resource="http://creativecommons.org/ns#Attribution" />
-        <cc:permits
-           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
-      </cc:License>
-    </rdf:RDF>
-  </metadata>
-  <sodipodi:namedview
-     inkscape:window-height="813"
-     inkscape:window-width="1643"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     inkscape:zoom="2.0279948"
-     inkscape:cx="-228.44418"
-     inkscape:cy="56.434504"
-     inkscape:window-x="0"
-     inkscape:window-y="22"
-     inkscape:current-layer="svg2"
-     showgrid="false"
-     inkscape:window-maximized="0" />
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient3350">
-      <stop
-         style="stop-color:#00cb2b;stop-opacity:0.24793388;"
-         offset="0"
-         id="stop3352" />
-      <stop
-         style="stop-color:#00cb2b;stop-opacity:1;"
-         offset="1"
-         id="stop3354" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3342">
-      <stop
-         style="stop-color:#005a85;stop-opacity:1;"
-         offset="0"
-         id="stop3344" />
-      <stop
-         style="stop-color:#005a85;stop-opacity:0.75206614;"
-         offset="1"
-         id="stop3346" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3310">
-      <stop
-         id="stop3312"
-         offset="0"
-         style="stop-color:#ae0202;stop-opacity:1;" />
-      <stop
-         id="stop3314"
-         offset="1"
-         style="stop-color:#e39494;stop-opacity:1;" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 71.887497 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="486.04999 : 71.887497 : 1"
-       inkscape:persp3d-origin="243.02499 : 47.924998 : 1"
-       id="perspective47" />
-    <linearGradient
-       id="linearGradient2795">
-      <stop
-         style="stop-color:#b8b8b8;stop-opacity:0.49803922"
-         offset="0"
-         id="stop2797" />
-      <stop
-         style="stop-color:#7f7f7f;stop-opacity:0"
-         offset="1"
-         id="stop2799" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2787">
-      <stop
-         style="stop-color:#7f7f7f;stop-opacity:0.5"
-         offset="0"
-         id="stop2789" />
-      <stop
-         style="stop-color:#7f7f7f;stop-opacity:0"
-         offset="1"
-         id="stop2791" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3676">
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:0.5"
-         offset="0"
-         id="stop3678" />
-      <stop
-         style="stop-color:#b3b3b3;stop-opacity:0"
-         offset="1"
-         id="stop3680" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3236">
-      <stop
-         style="stop-color:#f4f4f4;stop-opacity:1"
-         offset="0"
-         id="stop3244" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="1"
-         id="stop3240" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4671">
-      <stop
-         style="stop-color:#ffd43b;stop-opacity:1"
-         offset="0"
-         id="stop4673" />
-      <stop
-         style="stop-color:#ffe873;stop-opacity:1"
-         offset="1"
-         id="stop4675" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4689">
-      <stop
-         style="stop-color:#5a9fd4;stop-opacity:1"
-         offset="0"
-         id="stop4691" />
-      <stop
-         style="stop-color:#306998;stop-opacity:1"
-         offset="1"
-         id="stop4693" />
-    </linearGradient>
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2987"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="172.94208"
-       y1="77.475983"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2990"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="172.94208"
-       y1="77.475983"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2587"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2589"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="172.94208"
-       y1="77.475983"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2248"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2250"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(100.2702,99.61116)" />
-    <linearGradient
-       x1="224.23996"
-       y1="144.75717"
-       x2="-65.308502"
-       y2="144.75717"
-       id="linearGradient2255"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
-    <linearGradient
-       x1="172.94208"
-       y1="76.176224"
-       x2="26.670298"
-       y2="76.313133"
-       id="linearGradient2258"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)" />
-    <radialGradient
-       cx="61.518883"
-       cy="132.28575"
-       r="29.036913"
-       fx="61.518883"
-       fy="132.28575"
-       id="radialGradient2801"
-       xlink:href="#linearGradient2795"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,0.177966,0,108.7434)" />
-    <linearGradient
-       x1="150.96111"
-       y1="192.35176"
-       x2="112.03144"
-       y2="137.27299"
-       id="linearGradient1475"
-       xlink:href="#linearGradient4671"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
-    <linearGradient
-       x1="26.648937"
-       y1="20.603781"
-       x2="135.66525"
-       y2="114.39767"
-       id="linearGradient1478"
-       xlink:href="#linearGradient4689"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.562541,0,0,0.567972,-9.399749,-5.305317)" />
-    <radialGradient
-       cx="61.518883"
-       cy="132.28575"
-       r="29.036913"
-       fx="61.518883"
-       fy="132.28575"
-       id="radialGradient1480"
-       xlink:href="#linearGradient2795"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.382716e-8,-0.296405,1.43676,4.683673e-7,-128.544,150.5202)" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2795"
-       id="radialGradient2421"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.7490565e-8,-0.239947,1.054668,3.7915457e-7,-78.109429,148.85906)"
-       cx="61.518883"
-       cy="132.28575"
-       fx="61.518883"
-       fy="132.28575"
-       r="29.036913" />
-  </defs>
-  <path
-     sodipodi:type="star"
-     style="fill:#808080;fill-opacity:1;stroke:#ebebeb;stroke-width:8.42870998000000070;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     id="path2747"
-     sodipodi:sides="7"
-     sodipodi:cx="21.617718"
-     sodipodi:cy="45.732677"
-     sodipodi:r1="62.576824"
-     sodipodi:r2="54.193119"
-     sodipodi:arg1="-1.0471976"
-     sodipodi:arg2="-0.59839865"
-     inkscape:flatsided="true"
-     inkscape:rounded="0"
-     inkscape:randomized="0"
-     d="M 52.906127,-8.4604435 83.49561,36.406083 67.489778,88.295725 16.941349,108.13452 -30.085679,80.98346 -38.178995,27.287838 -1.2441662,-12.518444 z"
-     transform="matrix(0.9428415,-0.0659299,0.06648817,0.9508251,52.105964,29.052226)" />
-  <path
-     sodipodi:type="star"
-     style="fill:#ff0000;fill-opacity:1;stroke:#ebebeb;stroke-width:17.37169838000000200;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     id="path3527"
-     sodipodi:sides="5"
-     sodipodi:cx="21.617718"
-     sodipodi:cy="45.732677"
-     sodipodi:r1="62.576824"
-     sodipodi:r2="54.193119"
-     sodipodi:arg1="-1.0471976"
-     sodipodi:arg2="-0.41887907"
-     inkscape:flatsided="true"
-     inkscape:rounded="0"
-     inkscape:randomized="0"
-     d="M 52.906127,-8.4604435 82.827089,58.743128 28.15878,107.9667 -35.549055,71.184968 -20.254353,-0.77096359 z"
-     transform="matrix(0.4002816,-0.02799041,0.02822743,0.403671,63.989476,51.871855)" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     d="M 47.61949,3.8390312 C 52.931586,39.818101 55.890173,53.131745 55.890173,53.131745"
-     id="path3529"
-     sodipodi:nodetypes="cc" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     d="M 84.168485,47.659089 C 101.30436,17.799839 111.16632,3.5000002 111.16632,3.5000002"
-     id="path3531"
-     sodipodi:nodetypes="cc" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     d="m 147.06872,51.974892 c 0,0 -14.29984,5.917175 -47.907422,20.151072 16.336882,29.707806 34.925462,44.585576 34.925462,44.585576"
-     id="path3533"
-     sodipodi:nodetypes="ccc" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     d="M 78.262632,93.160698 C 75.599109,130.04701 73.626717,146.81234 73.626717,146.81234"
-     id="path3535"
-     sodipodi:nodetypes="cc" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     d="M 52.618595,81.32246 C 29.35082,108.46478 12.092394,117.83365 12.092394,117.83365"
-     id="path3537"
-     sodipodi:nodetypes="cc" />
-  <path
-     inkscape:connector-curvature="0"
-     style="fill:none;stroke:#ebebeb;stroke-width:7.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     d="M 55.890173,53.131745 C 17.799839,58.24195 3.5,55.77646 3.5,55.77646"
-     id="path3539"
-     sodipodi:nodetypes="cc" />
-</svg>
diff --git a/spyderlib/interpreter.py b/spyderlib/interpreter.py
index a8dbf2f..4074ca0 100644
--- a/spyderlib/interpreter.py
+++ b/spyderlib/interpreter.py
@@ -16,12 +16,11 @@ import os
 import re
 import os.path as osp
 import pydoc
-from subprocess import Popen, PIPE
 from code import InteractiveConsole
 
 # Local imports:
 from spyderlib.utils.dochelpers import isdefined
-from spyderlib.utils import encoding
+from spyderlib.utils import encoding, programs
 from spyderlib.py3compat import is_text_string, getcwd
 from spyderlib.utils.misc import remove_backslashes
 
@@ -211,8 +210,7 @@ has the same effect as typing a particular string at the help> prompt.
         # Execute command
         elif cmd.startswith('!'):
             # System ! command
-            pipe = Popen(cmd[1:], shell=True,
-                         stdin=PIPE, stderr=PIPE, stdout=PIPE)
+            pipe = programs.run_shell_command(cmd[1:])
             txt_out = encoding.transcode( pipe.stdout.read().decode() )
             txt_err = encoding.transcode( pipe.stderr.read().decode().rstrip() )
             if txt_err:
@@ -334,4 +332,4 @@ has the same effect as typing a particular string at the help> prompt.
     def resetbuffer(self):
         """Remove any unhandled source text from the input buffer"""
         InteractiveConsole.resetbuffer(self)
-        
\ No newline at end of file
+        
diff --git a/spyderlib/locale/es/LC_MESSAGES/spyderlib.po b/spyderlib/locale/es/LC_MESSAGES/spyderlib.po
index be6222d..52692f4 100644
--- a/spyderlib/locale/es/LC_MESSAGES/spyderlib.po
+++ b/spyderlib/locale/es/LC_MESSAGES/spyderlib.po
@@ -82,7 +82,7 @@ msgid "Text files"
 msgstr "Archivos de Texto"
 
 #: spyderlib/config/main.py:42
-msgid "reStructured Text files"
+msgid "reStructuredText files"
 msgstr "Archivos de Texto reStructurado"
 
 #: spyderlib/config/main.py:43
@@ -320,7 +320,7 @@ msgid "Current cell:"
 msgstr "Celda seleccionada:"
 
 #: spyderlib/plugins/configdialog.py:914
-msgid "Occurence:"
+msgid "Occurrence:"
 msgstr "Ocurrencia:"
 
 #: spyderlib/plugins/configdialog.py:915
@@ -549,7 +549,7 @@ msgid "Highlight current cell"
 msgstr "Resaltar la celda actual"
 
 #: spyderlib/plugins/editor.py:131
-msgid "Highlight occurences after"
+msgid "Highlight occurrences after"
 msgstr "Resaltar ocurrencias después de"
 
 #: spyderlib/plugins/editor.py:142 spyderlib/plugins/history.py:52
diff --git a/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po b/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po
index 4fbaa71..ea83732 100644
--- a/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po
+++ b/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po
@@ -80,7 +80,7 @@ msgid "Text files"
 msgstr "Fichiers texte"
 
 #: spyderlib/config/main.py:42
-msgid "reStructured Text files"
+msgid "reStructuredText files"
 msgstr "Fichiers reST"
 
 #: spyderlib/config/main.py:43
@@ -319,8 +319,8 @@ msgid "Current cell:"
 msgstr "Cellule actuelle :"
 
 #: spyderlib/plugins/configdialog.py:914
-msgid "Occurence:"
-msgstr "Occurence :"
+msgid "Occurrence:"
+msgstr "Occurrence :"
 
 #: spyderlib/plugins/configdialog.py:915
 msgid "Link:"
@@ -549,8 +549,8 @@ msgid "Highlight current cell"
 msgstr "Surligner la cellule en cours d'édition"
 
 #: spyderlib/plugins/editor.py:131
-msgid "Highlight occurences after"
-msgstr "Surligner les occurences après"
+msgid "Highlight occurrences after"
+msgstr "Surligner les occurrences après"
 
 #: spyderlib/plugins/editor.py:142 spyderlib/plugins/history.py:52
 #: spyderlib/plugins/inspector.py:183
diff --git a/spyderlib/locale/pt_BR/LC_MESSAGES/spyderlib.po b/spyderlib/locale/pt_BR/LC_MESSAGES/spyderlib.po
index 373ad20..d24c336 100644
--- a/spyderlib/locale/pt_BR/LC_MESSAGES/spyderlib.po
+++ b/spyderlib/locale/pt_BR/LC_MESSAGES/spyderlib.po
@@ -82,7 +82,7 @@ msgid "Text files"
 msgstr "Arquivos de texto"
 
 #: spyderlib/config/main.py:42
-msgid "reStructured Text files"
+msgid "reStructuredText files"
 msgstr "Arquivos de texto reeStruturado"
 
 #: spyderlib/config/main.py:43
@@ -319,7 +319,7 @@ msgid "Current cell:"
 msgstr "Célula selecionada:"
 
 #: spyderlib/plugins/configdialog.py:914
-msgid "Occurence:"
+msgid "Occurrence:"
 msgstr "Ocorrência:"
 
 #: spyderlib/plugins/configdialog.py:915
@@ -548,7 +548,7 @@ msgid "Highlight current cell"
 msgstr "Realçar célula atual"
 
 #: spyderlib/plugins/editor.py:131
-msgid "Highlight occurences after"
+msgid "Highlight occurrences after"
 msgstr "Realçar ocorrências depois de"
 
 #: spyderlib/plugins/editor.py:142 spyderlib/plugins/history.py:52
diff --git a/spyderlib/locale/ru/LC_MESSAGES/spyderlib.mo b/spyderlib/locale/ru/LC_MESSAGES/spyderlib.mo
new file mode 100644
index 0000000..bf037bb
Binary files /dev/null and b/spyderlib/locale/ru/LC_MESSAGES/spyderlib.mo differ
diff --git a/spyderlib/locale/ru/LC_MESSAGES/spyderlib.po b/spyderlib/locale/ru/LC_MESSAGES/spyderlib.po
new file mode 100644
index 0000000..7cb449e
--- /dev/null
+++ b/spyderlib/locale/ru/LC_MESSAGES/spyderlib.po
@@ -0,0 +1,5637 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+# FULL NAME <EMAIL at ADDRESS>, 2014.
+# Zgarbul Andrey <zgarbul.andrey at gmaail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 2.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-03-19 17:58+0300\n"
+"PO-Revision-Date: 2016-04-18 19:36+0300\n"
+"Last-Translator: Roman Kulagin <Roman.Qlogin at gmail.com>\n"
+"Language-Team: русский <LL at li.org>\n"
+"Language: ru_RU\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"X-Generator: Poedit 1.5.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: spyderlib/app/restart.py:129
+msgid ""
+"It was not possible to close the previous Spyder instance.\n"
+"Restart aborted."
+msgstr ""
+"Не удалось закрыть предыдущий экземпляр Spyder.\n"
+"Перезапуск прерван."
+
+#: spyderlib/app/restart.py:131
+msgid ""
+"Spyder could not reset to factory defaults.\n"
+"Restart aborted."
+msgstr ""
+"Невозможно сбросить настройки Spyder в значения по умолчанию.\n"
+"Операция прервана."
+
+#: spyderlib/app/restart.py:133
+msgid ""
+"It was not possible to restart Spyder.\n"
+"Operation aborted."
+msgstr ""
+"Невозможно перезапустить Spyder.\n"
+"Операция прервана."
+
+#: spyderlib/app/restart.py:135
+msgid "Spyder exit error"
+msgstr "Ошибка выхода из Spyder"
+
+#: spyderlib/app/restart.py:136
+msgid "Spyder reset error"
+msgstr "Ошибка сброса настроек Spyder"
+
+#: spyderlib/app/restart.py:137
+msgid "Spyder restart error"
+msgstr "Ошибка перезапуска Spyder"
+
+#: spyderlib/app/restart.py:141
+#, python-brace-format
+msgid ""
+"\n"
+"\n"
+"{0}"
+msgstr ""
+"\n"
+"\n"
+"{0}"
+
+#: spyderlib/app/restart.py:161
+msgid "Closing Spyder"
+msgstr "Закрытие Spyder"
+
+#: spyderlib/app/restart.py:235
+msgid "Resetting Spyder to defaults"
+msgstr "Восстановить настройки по умолчанию"
+
+#: spyderlib/app/restart.py:267
+msgid "Restarting"
+msgstr "Перезапуск"
+
+#: spyderlib/app/spyder.py:112
+msgid "Initializing..."
+msgstr "Инициализация..."
+
+#: spyderlib/app/spyder.py:237
+msgid "Numpy and Scipy documentation"
+msgstr "Документация Numpy и Scipy"
+
+#: spyderlib/app/spyder.py:239 spyderlib/app/spyder.py:1073
+msgid "Matplotlib documentation"
+msgstr "Документация Matplotlib"
+
+#: spyderlib/app/spyder.py:242
+msgid "PyQt4 Reference Guide"
+msgstr "Справочное руководство по PyQt4"
+
+#: spyderlib/app/spyder.py:245
+msgid "PyQt4 API Reference"
+msgstr "Справка по API PyQt4"
+
+#: spyderlib/app/spyder.py:247
+msgid "Python(x,y)"
+msgstr "Python(x,y)"
+
+#: spyderlib/app/spyder.py:249
+msgid "WinPython"
+msgstr "WinPython"
+
+#: spyderlib/app/spyder.py:311
+msgid "Reload last session"
+msgstr "Перезапустить последнюю сессию"
+
+#: spyderlib/app/spyder.py:315
+msgid "Load session..."
+msgstr "Загрузить сессию..."
+
+#: spyderlib/app/spyder.py:318
+msgid "Load Spyder session"
+msgstr "Загрузить сессию Spyder"
+
+#: spyderlib/app/spyder.py:320
+msgid "Save session and quit..."
+msgstr "Сохранить сессию и выйти..."
+
+#: spyderlib/app/spyder.py:323
+msgid "Save current session and quit application"
+msgstr "Сохранить текущую сессию и закрыть приложение"
+
+#: spyderlib/app/spyder.py:533
+msgid "Close current pane"
+msgstr "Закрыть текущую панель"
+
+#: spyderlib/app/spyder.py:538
+msgid "Lock panes"
+msgstr "Закрепить панели"
+
+#: spyderlib/app/spyder.py:545
+msgid "Use next layout"
+msgstr "Исп. следующую компоновку"
+
+#: spyderlib/app/spyder.py:549
+msgid "Use previous layout"
+msgstr "Исп. предыдущую компоновку"
+
+#: spyderlib/app/spyder.py:558
+msgid "&Find text"
+msgstr "&Найти текст"
+
+#: spyderlib/app/spyder.py:563
+msgid "Find &next"
+msgstr "Найти &следующий"
+
+#: spyderlib/app/spyder.py:570
+msgid "Find &previous"
+msgstr "Найти &предыдущий"
+
+#: spyderlib/app/spyder.py:576
+msgid "&Replace text"
+msgstr "&Заменить текст"
+
+#: spyderlib/app/spyder.py:596 spyderlib/widgets/sourcecode/codeeditor.py:2418
+msgid "Undo"
+msgstr "Отменить"
+
+#: spyderlib/app/spyder.py:598 spyderlib/widgets/sourcecode/codeeditor.py:2421
+msgid "Redo"
+msgstr "Вернуть"
+
+#: spyderlib/app/spyder.py:600
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:638
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:452
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:425
+#: spyderlib/widgets/shell.py:120
+#: spyderlib/widgets/sourcecode/codeeditor.py:2427
+msgid "Copy"
+msgstr "Копировать"
+
+#: spyderlib/app/spyder.py:602 spyderlib/widgets/shell.py:116
+#: spyderlib/widgets/sourcecode/codeeditor.py:2424
+msgid "Cut"
+msgstr "Вырезать"
+
+#: spyderlib/app/spyder.py:604
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:635
+#: spyderlib/widgets/shell.py:124
+#: spyderlib/widgets/sourcecode/codeeditor.py:2430
+msgid "Paste"
+msgstr "Вставить"
+
+#: spyderlib/app/spyder.py:607 spyderlib/widgets/shell.py:137
+#: spyderlib/widgets/sourcecode/codeeditor.py:2433
+msgid "Select All"
+msgstr "Выделить всё"
+
+#: spyderlib/app/spyder.py:624 spyderlib/plugins/editor.py:1257
+msgid "&File"
+msgstr "&Файл"
+
+#: spyderlib/app/spyder.py:626 spyderlib/plugins/editor.py:1249
+msgid "File toolbar"
+msgstr "Панель файлов"
+
+#: spyderlib/app/spyder.py:630 spyderlib/plugins/editor.py:1258
+msgid "&Edit"
+msgstr "&Правка"
+
+#: spyderlib/app/spyder.py:631 spyderlib/plugins/editor.py:1254
+msgid "Edit toolbar"
+msgstr "Панель правки"
+
+#: spyderlib/app/spyder.py:635 spyderlib/plugins/editor.py:1259
+msgid "&Search"
+msgstr "П&оиск"
+
+#: spyderlib/app/spyder.py:636 spyderlib/plugins/editor.py:1250
+msgid "Search toolbar"
+msgstr "Панель поиска"
+
+#: spyderlib/app/spyder.py:640 spyderlib/plugins/editor.py:1260
+msgid "Sour&ce"
+msgstr "&Документ"
+
+#: spyderlib/app/spyder.py:641 spyderlib/plugins/editor.py:1251
+msgid "Source toolbar"
+msgstr "Панель кода"
+
+#: spyderlib/app/spyder.py:645 spyderlib/plugins/editor.py:775
+#: spyderlib/plugins/editor.py:1261
+msgid "&Run"
+msgstr "&Запуск"
+
+#: spyderlib/app/spyder.py:646 spyderlib/plugins/editor.py:1252
+msgid "Run toolbar"
+msgstr "Панель запуска"
+
+#: spyderlib/app/spyder.py:650 spyderlib/plugins/editor.py:723
+msgid "&Debug"
+msgstr "&Отладка"
+
+#: spyderlib/app/spyder.py:651 spyderlib/plugins/editor.py:1253
+msgid "Debug toolbar"
+msgstr "Панель отладки"
+
+#: spyderlib/app/spyder.py:655
+msgid "C&onsoles"
+msgstr "&Консоли"
+
+#: spyderlib/app/spyder.py:658 spyderlib/plugins/editor.py:1262
+msgid "&Tools"
+msgstr "&Инструменты"
+
+#: spyderlib/app/spyder.py:661
+msgid "&View"
+msgstr "&Вид"
+
+#: spyderlib/app/spyder.py:664
+msgid "&Help"
+msgstr "Спр&авка"
+
+#: spyderlib/app/spyder.py:669
+msgid "Welcome to Spyder!"
+msgstr "Добро пожаловать в Spyder!"
+
+#: spyderlib/app/spyder.py:674
+msgid "Pre&ferences"
+msgstr "&Параметры"
+
+#: spyderlib/app/spyder.py:681 spyderlib/widgets/pathmanager.py:48
+#: spyderlib/widgets/projectexplorer.py:598
+msgid "PYTHONPATH manager"
+msgstr "Менеджер PYTHONPATH"
+
+#: spyderlib/app/spyder.py:684
+msgid "Python Path Manager"
+msgstr "Менеджер путей Python"
+
+#: spyderlib/app/spyder.py:687
+msgid "Update module names list"
+msgstr "Обновить список модулей"
+
+#: spyderlib/app/spyder.py:690
+msgid "Refresh list of module names available in PYTHONPATH"
+msgstr "Обновить список имён модулей, доступных в PYTHONPATH"
+
+#: spyderlib/app/spyder.py:693
+msgid "Reset Spyder to factory defaults"
+msgstr "Вернуть Spyder к заводским настройкам"
+
+#: spyderlib/app/spyder.py:698
+msgid "Current user environment variables..."
+msgstr "Переменные окружения текущего пользователя..."
+
+#: spyderlib/app/spyder.py:700
+msgid ""
+"Show and edit current user environment variables in Windows registry (i.e. "
+"for all sessions)"
+msgstr ""
+"Показывать и редактировать переменные окружения в реестре Windows (т.е. для "
+"всех сессий)"
+
+#: spyderlib/app/spyder.py:709 spyderlib/app/spyder.py:1167
+msgid "External Tools"
+msgstr "Внешние инструменты"
+
+#: spyderlib/app/spyder.py:713
+msgid "Python(x,y) launcher"
+msgstr "Загрузчик Python(x,y)"
+
+#: spyderlib/app/spyder.py:720
+msgid "WinPython control panel"
+msgstr "контрольная панель WinPython"
+
+#: spyderlib/app/spyder.py:729
+msgid "Qt Designer"
+msgstr "Qt дизайнер"
+
+#: spyderlib/app/spyder.py:734
+msgid "Qt Linguist"
+msgstr "Qt Linguist"
+
+#: spyderlib/app/spyder.py:740
+msgid "Qt examples"
+msgstr "Примеры Qt"
+
+#: spyderlib/app/spyder.py:761
+msgid "guidata examples"
+msgstr "примеры guidata"
+
+#: spyderlib/app/spyder.py:772
+msgid "guiqwt examples"
+msgstr "примеры guiqwt"
+
+#: spyderlib/app/spyder.py:777
+msgid "Sift"
+msgstr "Sift"
+
+#: spyderlib/app/spyder.py:787
+msgid "ViTables"
+msgstr "ViTables"
+
+#: spyderlib/app/spyder.py:801
+msgid "Fullscreen mode"
+msgstr "Полноэкранный режим"
+
+#: spyderlib/app/spyder.py:813
+msgid "Main toolbar"
+msgstr "Главная панель"
+
+#: spyderlib/app/spyder.py:822
+msgid ""
+"Spyder Internal Console\n"
+"\n"
+"This console is used to report application\n"
+"internal errors and to inspect Spyder\n"
+"internals with the following commands:\n"
+"  spy.app, spy.window, dir(spy)\n"
+"\n"
+"Please don't use it to run your code\n"
+"\n"
+msgstr ""
+"Встроенная консоль Spyder\n"
+"\n"
+"Эта консоль предназначена для вывода внутренних\n"
+"ошибок приложени и изучения внутреннего\n"
+"состояния Spyder следующими командами:\n"
+"  spy.app, spy.window, dir(spy)\n"
+"\n"
+"Пожалуйста, не используйте её для\n"
+"запуска своего кода\n"
+
+#: spyderlib/app/spyder.py:839
+msgid "Loading help..."
+msgstr "Загрузка справки..."
+
+#: spyderlib/app/spyder.py:846
+msgid "Loading outline explorer..."
+msgstr "Загузка менеджера структуры..."
+
+#: spyderlib/app/spyder.py:854
+msgid "Loading editor..."
+msgstr "Загрузка редактора..."
+
+#: spyderlib/app/spyder.py:860 spyderlib/widgets/ipython.py:610
+#: spyderlib/plugins/console.py:133
+msgid "&Quit"
+msgstr "В&ыход"
+
+#: spyderlib/app/spyder.py:862 spyderlib/plugins/console.py:135
+msgid "Quit"
+msgstr "Выход"
+
+#: spyderlib/app/spyder.py:865
+msgid "&Restart"
+msgstr "Пе&резапуск"
+
+#: spyderlib/app/spyder.py:867
+msgid "Restart"
+msgstr "Перезапуск"
+
+#: spyderlib/app/spyder.py:886
+msgid "Loading file explorer..."
+msgstr "Загрузка файлового менеджера..."
+
+#: spyderlib/app/spyder.py:893
+msgid "Loading history plugin..."
+msgstr "Загрузка модуля истории..."
+
+#: spyderlib/app/spyder.py:904
+msgid "Loading online help..."
+msgstr "Загрузка онлайн-помощи..."
+
+#: spyderlib/app/spyder.py:910
+msgid "Loading project explorer..."
+msgstr "Загрузка менеджера проектов..."
+
+#: spyderlib/app/spyder.py:916
+msgid "Loading external console..."
+msgstr "Загрузка внешней консоли..."
+
+#: spyderlib/app/spyder.py:922
+msgid "Loading namespace browser..."
+msgstr "Загрузка менеджера пространств имён..."
+
+#: spyderlib/app/spyder.py:929
+msgid "Loading IPython console..."
+msgstr "Загрузка консоли IPython..."
+
+#: spyderlib/app/spyder.py:938
+msgid "Setting up main window..."
+msgstr "Создание главного окна..."
+
+#: spyderlib/app/spyder.py:941
+msgid "Dependencies..."
+msgstr "Зависимости..."
+
+#: spyderlib/app/spyder.py:945
+msgid "Report issue..."
+msgstr "Отправить отчёт о проблеме..."
+
+#: spyderlib/app/spyder.py:949
+msgid "Spyder support..."
+msgstr "Поддержка Spyder..."
+
+#: spyderlib/app/spyder.py:952
+msgid "Check for updates..."
+msgstr "Проверить обновления..."
+
+#: spyderlib/app/spyder.py:975
+msgid "Spyder documentation"
+msgstr "Документация Spyder"
+
+#: spyderlib/app/spyder.py:980
+msgid "Spyder tutorial"
+msgstr "Руководство Spyder"
+
+#: spyderlib/app/spyder.py:987
+msgid "Interactive tours"
+msgstr "Интерактивные туры"
+
+#: spyderlib/app/spyder.py:1015
+msgid "Python documentation"
+msgstr "Документация Python"
+
+#: spyderlib/app/spyder.py:1021 spyderlib/app/spyder.py:1065
+msgid "IPython documentation"
+msgstr "Документация IPython"
+
+#: spyderlib/app/spyder.py:1022
+msgid "Intro to IPython"
+msgstr "Введение в IPython"
+
+#: spyderlib/app/spyder.py:1024
+msgid "Quick reference"
+msgstr "Краткий справочник"
+
+#: spyderlib/app/spyder.py:1026
+msgid "Console help"
+msgstr "Консольная справка"
+
+#: spyderlib/app/spyder.py:1063
+msgid "Python(x,y) documentation folder"
+msgstr "Каталог с документацией Python(x,y)"
+
+#: spyderlib/app/spyder.py:1067
+msgid "guidata documentation"
+msgstr "Документация guidata"
+
+#: spyderlib/app/spyder.py:1070
+msgid "guiqwt documentation"
+msgstr "Документация guiqwt"
+
+#: spyderlib/app/spyder.py:1076
+msgid "NumPy documentation"
+msgstr "Документация NumPy"
+
+#: spyderlib/app/spyder.py:1078
+msgid "NumPy reference guide"
+msgstr "Справочное руководство NumPy"
+
+#: spyderlib/app/spyder.py:1080
+msgid "NumPy user guide"
+msgstr "Руководство пользователя NumPy"
+
+#: spyderlib/app/spyder.py:1082
+msgid "SciPy documentation"
+msgstr "Документация SciPy"
+
+#: spyderlib/app/spyder.py:1089
+msgid "Installed Python modules"
+msgstr "Установленные модули Python"
+
+#: spyderlib/app/spyder.py:1093
+msgid "Online documentation"
+msgstr "Онлайн документация"
+
+#: spyderlib/app/spyder.py:1105
+msgid "Qt documentation"
+msgstr "Документация Qt"
+
+#: spyderlib/app/spyder.py:1111
+#, python-format
+msgid "About %s..."
+msgstr "О %s..."
+
+#: spyderlib/app/spyder.py:1135
+msgid "Panes"
+msgstr "Плавающие окна"
+
+#: spyderlib/app/spyder.py:1136
+msgid "Toolbars"
+msgstr "Панели инструментов"
+
+#: spyderlib/app/spyder.py:1137
+msgid "Window layouts"
+msgstr "Компоновка окон"
+
+#: spyderlib/app/spyder.py:1146 spyderlib/app/spyder.py:1919
+#: spyderlib/app/spyder.py:1920
+msgid "Show toolbars"
+msgstr "Показывать панели инструментов"
+
+#: spyderlib/app/spyder.py:1160
+msgid "Attached console window (debugging)"
+msgstr "Прикреплённая консоль (отладка)"
+
+#: spyderlib/app/spyder.py:1324
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:572
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:573
+#: spyderlib/widgets/externalshell/pythonshell.py:553
+#: spyderlib/widgets/externalshell/systemshell.py:104
+#: spyderlib/widgets/explorer.py:597 spyderlib/widgets/explorer.py:699
+msgid "Error"
+msgstr "Ошибка"
+
+#: spyderlib/app/spyder.py:1325
+#, python-format
+msgid ""
+"<b>You have missing dependencies!</b><br><br><tt>%s</tt><br><br><b>Please "
+"install them to avoid this message.</b><br><br><i>Note</i>: Spyder could "
+"work without some of these dependencies, however to have a smooth experience "
+"when using Spyder we <i>strongly</i> recommend you to install all the listed "
+"missing dependencies.<br>Failing to install these dependencies might result "
+"in bugs. Please be sure that any found bugs are not the direct result of "
+"missing dependencies, prior to reporting a new issue."
+msgstr ""
+"<b>У Вас есть недостающие зависимости!</b><br><br><tt>%s</"
+"tt><br><br><b>Пожалуйста, установите их, чтобы сообщение исчезло.</"
+"b><br><br><i>Примечание</i>: Возможно, Spyder сможет работать без некоторых "
+"из них, однако для беспроблемного использования Spyder мы <i>настоятельно</"
+"i> рекомендуем установить все приведённые недостающие зависимости."
+"<br>Неудачная установка этих зависимостей могла привести к ошибкам. "
+"Пожалуйста, убедитесь, что любые найденные ошибки не являются прямым "
+"результатот недостающих зависимостей, прежде чем сообщать о новой проблеме."
+
+#: spyderlib/app/spyder.py:1766
+msgid "Spyder Default Layout"
+msgstr "Стандартная компоновка Spyder"
+
+#: spyderlib/app/spyder.py:1784
+msgid "Save current layout"
+msgstr "Сохранить текущую компоновку"
+
+#: spyderlib/app/spyder.py:1788
+msgid "Layout preferences"
+msgstr "Параметры компоновки"
+
+#: spyderlib/app/spyder.py:1792
+msgid "Reset to spyder default"
+msgstr "Вернуть компоновку по умолчанию"
+
+#: spyderlib/app/spyder.py:1812 spyderlib/app/spyder.py:1834
+#: spyderlib/app/spyder.py:1897 spyderlib/app/spyder.py:2775
+#: spyderlib/utils/environ.py:97 spyderlib/utils/environ.py:110
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:407
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1048
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:495
+#: spyderlib/plugins/configdialog.py:1229
+#: spyderlib/plugins/ipythonconsole.py:114
+#: spyderlib/plugins/ipythonconsole.py:834
+#: spyderlib/plugins/externalconsole.py:368
+#: spyderlib/plugins/externalconsole.py:611
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: spyderlib/app/spyder.py:1813
+msgid ""
+"Window layout will be reset to default settings: this affects window "
+"position, size and dockwidgets.\n"
+"Do you want to continue?"
+msgstr ""
+"Компоновка окон будет восстановлена по умолчанию: это отразится на позиции, "
+"размере и объединении окон.\n"
+"Хотите продолжить?"
+
+#: spyderlib/app/spyder.py:1835
+#, python-format
+msgid ""
+"Layout <b>%s</b> will be                                                "
+"overwritten. Do you want to                                                "
+"continue?"
+msgstr "Компоновка <b>%s</b> будет перезаписана. Хотите продолжить?"
+
+#: spyderlib/app/spyder.py:1898
+#, python-format
+msgid "Quick switch layout #%s has not yet been defined."
+msgstr "Быстрое переключение компоновки #%s не было определено."
+
+#: spyderlib/app/spyder.py:1916 spyderlib/app/spyder.py:1917
+msgid "Hide toolbars"
+msgstr "Скрыть ранели инструментов"
+
+#: spyderlib/app/spyder.py:2231 spyderlib/app/spyder.py:2232
+msgid "Maximize current pane"
+msgstr "Развернуть текущую панель"
+
+#: spyderlib/app/spyder.py:2235
+msgid "Restore current pane"
+msgstr "Восстановить текущую панель"
+
+#: spyderlib/app/spyder.py:2236
+msgid "Restore pane to its original size"
+msgstr "Вернуть панель к первоначальному размеру"
+
+#: spyderlib/app/spyder.py:2320
+#, python-format
+msgid "About %s"
+msgstr "О %s"
+
+#: spyderlib/app/spyder.py:2496 spyderlib/utils/programs.py:281
+#: spyderlib/widgets/externalshell/baseshell.py:139
+#: spyderlib/widgets/explorer.py:239 spyderlib/plugins/editor.py:156
+#: spyderlib/plugins/runconfig.py:321 spyderlib/plugins/runconfig.py:443
+#: spyderlib/plugins/runconfig.py:448
+msgid "Run"
+msgstr "Запуск"
+
+#: spyderlib/app/spyder.py:2497
+#, python-format
+msgid "Running an external system terminal is not supported on platform %s."
+msgstr ""
+"Запуск внешнего системного терминала не поддерживается на платформе %s."
+
+#: spyderlib/app/spyder.py:2722
+msgid "Open session"
+msgstr "Открыть сессию"
+
+#: spyderlib/app/spyder.py:2723 spyderlib/app/spyder.py:2735
+msgid "Spyder sessions"
+msgstr "Сессии Spyder"
+
+#: spyderlib/app/spyder.py:2734
+msgid "Save session"
+msgstr "Сохранить сессию"
+
+#: spyderlib/app/spyder.py:2776
+msgid ""
+"Spyder will restart and reset to default settings: <br><br>Do you want to "
+"continue?"
+msgstr ""
+"Spyder будет перезапущен, настройки возвращены по умолчанию:<br><br>Хотите "
+"продолжить?"
+
+#: spyderlib/app/spyder.py:2873 spyderlib/widgets/helperwidgets.py:243
+msgid "Spyder updates"
+msgstr "Обновления Spyder"
+
+#: spyderlib/app/spyder.py:2874 spyderlib/plugins/configdialog.py:799
+msgid "Check for updates on startup"
+msgstr "Проверять обновления при старте"
+
+#: spyderlib/app/spyder.py:2892
+#, python-format
+msgid ""
+"<b>Spyder %s is available!</b> <br><br>Please use your package manager to "
+"update Spyder or go to our <a href=\"%s\">Releases</a> page to download this "
+"new version. <br><br>If you are not sure how to proceed to update Spyder "
+"please refer to our  <a href=\"%s\">Installation</a> instructions."
+msgstr ""
+"<b>Доступен Spyder %s!</b><br><br>Пожалйста, используйте свой пакетный "
+"менеджер или перейдите на нашу страницу <a href=\"%s\">Релизов</a> для "
+"загрузки новой версии.<br><br>Если Вы не уверены, как произвести обновление "
+"Spyder, ознакомьтесь с нашими инструкциями по <a href=\"%s\">Установке</a>."
+
+#: spyderlib/app/spyder.py:2904
+msgid "Spyder is up to date."
+msgstr "Spyder обновлён."
+
+#: spyderlib/app/tour.py:121
+msgid "Welcome to the Introduction tour"
+msgstr "Добро пожаловать в обучающий тур"
+
+#: spyderlib/app/tour.py:122
+msgid ""
+"<b>Spyder</b> is a powerful Interactive Development Environment (or IDE) for "
+"the Python programming language.<br><br>Here we are going to guide you "
+"through its most important features.<br><br>Please use the arrow keys or "
+"click on the buttons below to move along the tour."
+msgstr ""
+"<b>Spyder</b> - мощная Интерактивная Среда Разработки (или IDE) для языка "
+"программирования Python.<br><br>Здесь мы ознакомим Вас с наиболее важными "
+"возможностями.<br><br>Пожалуйста, используйте клавиши со стрелками или "
+"кнопки внизу, чтобы двигаться вдоль тура."
+
+#: spyderlib/app/tour.py:131
+msgid "The Editor"
+msgstr "Текстовый редактор"
+
+#: spyderlib/app/tour.py:132
+msgid ""
+"This is the pane where you write Python code before evaluating it. You can "
+"get automatic suggestions and completions while writing, by pressing the "
+"<b>Tab</b> key next to a given text.<br><br>The Editor comes with a line "
+"number area (highlighted here in red), where Spyder shows warnings and "
+"syntax errors. They can help you to detect potential problems before running "
+"the code.<br><br>You can also set debug breakpoints in the line number area, "
+"by doing a double click next to a non-empty line."
+msgstr ""
+"Это панель, в которой Вы пишете код Python перед его выполнением. Вы можете "
+"получать предложения и автодополнение по ходу ввода, нажимая клавишу <b>Tab</"
+"b> после ввода текста.<br><br>В Редактор входит панель номеров строк "
+"(подсвечена здесь красным), на которой Spyder показывает предупреждения и "
+"синтаксические ошибки. Они могут помочь Вам найти потенциальные проблемы "
+"перед запуском кода.<br><br>Также Вы можете установить отладочные точки "
+"останова на панели номеров строк двойным щелчком рядом с непустой строкой."
+
+#: spyderlib/app/tour.py:147
+msgid "The IPython console"
+msgstr "Консоль IPython"
+
+#: spyderlib/app/tour.py:148
+#, python-brace-format
+msgid ""
+"This is one of panes where you can run or execute the code you wrote on the "
+"Editor. To do it you need to press the <b>F5</b> key.<br><br>This console "
+"comes with several useful features that greatly improve your programming "
+"workflow (like syntax highlighting and inline plots). If you want to know "
+"more about them, please follow this <a href=\"{0}\">link</a>.<br><br>Please "
+"click on the button below to run some simple code in this console. This will "
+"be useful to show you other important features."
+msgstr ""
+"Это одна из панелей, где можно запустить или выполнить код, написанный в "
+"Редакторе. Чтобы это сделать нужно нажать клавишу<b>F5</b>.<br><br>В этой "
+"консоли есть несколько полезных функций, которые значительно улучшают Ваш "
+"процесс программирования (такие как подсветка синтаксиса и встроенные "
+"графики). Если вы хотите узнать о них больше, перейдите по этой <a href="
+"\"{0}\">ссылке</a>.<br><br>Пожалуйста, нажмите на кнопку ниже, чтобы "
+"запустить простой код в этой консоли. Это будет полезно, чтобы показать Вам "
+"другие важные функции."
+
+#: spyderlib/app/tour.py:164
+msgid "The Variable Explorer"
+msgstr "Менеджер Переменных"
+
+#: spyderlib/app/tour.py:165
+msgid ""
+"In this pane you can view and edit the variables generated during the "
+"execution of a program, or those entered directly in one of Spyder consoles."
+"<br><br>As you can see, the Variable Explorer is showing the variables "
+"generated during the last step of this tour. By doing a double-click on any "
+"of them, a new window will be opened, where you can inspect and modify their "
+"contents."
+msgstr ""
+"В этой панели можно изучать и редактировать переменные, созданные в ходе "
+"работы программы или введенные напрямую в консолях Spyder.<br><br>Как можно "
+"увидеть, Менеджер Переменных показывает переменные, созданные на предыдущем "
+"шаге тура. Двойным щелчком на любом из них открывается окно, где можно "
+"тщательно изучить и изменить содержимое."
+
+#: spyderlib/app/tour.py:177
+msgid "The Python console"
+msgstr "Консоль Python"
+
+#: spyderlib/app/tour.py:178
+msgid ""
+"You can also run your code on a Python console. These consoles are useful "
+"because they let you run a file in a console dedicated only to it.To select "
+"this behavior, please press the <b>F6</b> key.<br><br>By pressing the button "
+"below and then focusing the Variable Explorer, you will notice that Python "
+"consoles are also connected to that pane, and that the Variable Explorer "
+"only shows the variables of the currently focused console."
+msgstr ""
+"Вы также можете запустить свой код в консоли Python. Эти консоли полезны, "
+"поскольку они позволяют запускать файл в консоли, предназначенной только для "
+"него. Чтобы выбрать такое поведение, нажмите клавишу <b>F6</b>.<br><br>Нажав "
+"на кнопку ниже и перейдя к Менеджеру Переменных, Вы заметите, что консоли "
+"Python также подключены к этой панели, и что Менеджер Переменных отображает "
+"только переменные текущей выбранной консоли."
+
+#: spyderlib/app/tour.py:192 spyderlib/widgets/internalshell.py:266
+#: spyderlib/plugins/help.py:490 spyderlib/plugins/help.py:940
+msgid "Help"
+msgstr "Справка"
+
+#: spyderlib/app/tour.py:193
+msgid ""
+"This pane displays documentation of the functions, classes, methods or "
+"modules you are currently using in the Editor or the Consoles.<br><br>To use "
+"it, you need to press <b>Ctrl+I</b> in front of an object. If that object "
+"has some documentation associated with it, it will be displayed here."
+msgstr ""
+"Эта панель показывает документацию по функциям, классам, методам и модулям, "
+"используемым сейчас в Редакторе или Консолях.<br><br>Чтобы воспользоваться "
+"ею, нажмите <b>Ctrl+I</b> напротив объекта. Если у объекта есть какая-либо "
+"документация, она будет показана здесь."
+
+#: spyderlib/app/tour.py:203
+msgid "The File Explorer"
+msgstr "Файловый менеджер"
+
+#: spyderlib/app/tour.py:204
+msgid ""
+"This pane lets you navigate through the directories and files present in "
+"your computer.<br><br>You can also open any of these files with its "
+"corresponding application, by doing a double click on it.<br><br>There is "
+"one exception to this rule: plain-text files will always be opened in the "
+"Spyder Editor."
+msgstr ""
+"Эта панель позволяет перемещаться по директориям и файлам на Вашем "
+"компьютере.<br><br>Вы также можете открыть любой из файлов соответствующим "
+"ему приложением двойным щелчком по нему.<br><br>Существует одно исключение "
+"из этого правила: простые текстовые файлы всегда будут открыты в редакторе "
+"Spyder."
+
+#: spyderlib/app/tour.py:214
+msgid "The History Log"
+msgstr "Журнал истории"
+
+#: spyderlib/app/tour.py:215
+msgid ""
+"This pane records all commands introduced in the Python and IPython consoles."
+msgstr ""
+"Эта панель записывает все команды, введённые в консолях Python и IPython."
+
+#: spyderlib/app/tour.py:263
+#, fuzzy
+msgid "<b>Spyder</b> is an interactive development environment based on bla"
+msgstr "<b>Spyder</b> - интерактивная среда разработки, основанная на bla"
+
+#: spyderlib/app/tour.py:267
+msgid "Welcome to Spyder introduction tour"
+msgstr "Добро пожаловать в обучающий тур Spyder"
+
+#: spyderlib/app/tour.py:268
+msgid "Spyder is an interactive development environment based on bla"
+msgstr "Spyder - интерактивная среда разработки, основанная на bla"
+
+#: spyderlib/app/tour.py:273
+msgid "Introduction tour"
+msgstr "Обучающий тур"
+
+#: spyderlib/app/tour.py:274
+msgid "New features in version 3.0"
+msgstr "Новые возможности в версии 3.0"
+
+#: spyderlib/app/tour.py:552 spyderlib/plugins/ipythonconsole.py:324
+msgid "Run code"
+msgstr "Выполнить код"
+
+#: spyderlib/app/tour.py:821
+msgid "Go to step: "
+msgstr "Перейти к шагу:"
+
+#: spyderlib/config/ipython.py:23
+msgid "Jupyter Qtconsole integration"
+msgstr "Интеграция Qt-консоли Jupyter"
+
+#: spyderlib/config/ipython.py:25
+#, fuzzy
+msgid "Manipulate Jupyter notebooks on the Editor"
+msgstr "Работать с блокнотами Jupyter в Редакторе"
+
+#: spyderlib/config/base.py:241
+msgid ""
+"Update LANGUAGE_CODES (inside config/base.py) if a new translation has been "
+"added to Spyder"
+msgstr ""
+"Обновите LANGUAGE_CODES (в файле config/base.py) если добавили новый перевод "
+"в Spyder"
+
+#: spyderlib/config/utils.py:24
+msgid "Python files"
+msgstr "Файлы Python"
+
+#: spyderlib/config/utils.py:25
+msgid "Cython/Pyrex files"
+msgstr "Файлы Cython/Pyrex"
+
+#: spyderlib/config/utils.py:26
+msgid "C files"
+msgstr "Файлы C"
+
+#: spyderlib/config/utils.py:27
+msgid "C++ files"
+msgstr "Файлы C++"
+
+#: spyderlib/config/utils.py:28
+msgid "OpenCL files"
+msgstr "Файлы OpenCL"
+
+#: spyderlib/config/utils.py:29
+msgid "Fortran files"
+msgstr "Файлы Fortran"
+
+#: spyderlib/config/utils.py:30
+msgid "IDL files"
+msgstr "Файлы IDL"
+
+#: spyderlib/config/utils.py:31
+msgid "MATLAB files"
+msgstr "Файлы MATLAB"
+
+#: spyderlib/config/utils.py:32
+msgid "Julia files"
+msgstr "Файлы Julia"
+
+#: spyderlib/config/utils.py:33
+msgid "Yaml files"
+msgstr "Файлы Yaml"
+
+#: spyderlib/config/utils.py:34
+msgid "Patch and diff files"
+msgstr "Файлы патчей и diff"
+
+#: spyderlib/config/utils.py:35
+msgid "Batch files"
+msgstr "Файлы Batch"
+
+#: spyderlib/config/utils.py:36 spyderlib/utils/iofuncs.py:515
+msgid "Text files"
+msgstr "Текстовые файлы"
+
+#: spyderlib/config/utils.py:37
+msgid "reStructuredText files"
+msgstr "Файлы reStructuredText"
+
+#: spyderlib/config/utils.py:38
+msgid "gettext files"
+msgstr "Файлы gettext"
+
+#: spyderlib/config/utils.py:39
+msgid "NSIS files"
+msgstr "Файлы NSIS"
+
+#: spyderlib/config/utils.py:40
+msgid "Web page files"
+msgstr "Файлы Веб-страниц"
+
+#: spyderlib/config/utils.py:41
+msgid "XML files"
+msgstr "Файлы XML"
+
+#: spyderlib/config/utils.py:42
+msgid "Javascript files"
+msgstr "Файлы Javascript"
+
+#: spyderlib/config/utils.py:43
+msgid "Json files"
+msgstr "Файлы Json"
+
+#: spyderlib/config/utils.py:44
+#, fuzzy
+msgid "IPython notebooks"
+msgstr "Блокноты IPython"
+
+#: spyderlib/config/utils.py:45
+msgid "Enaml files"
+msgstr "Файлы Enaml"
+
+#: spyderlib/config/utils.py:46
+msgid "Configuration files"
+msgstr "Файлы настроек"
+
+#: spyderlib/config/utils.py:51 spyderlib/widgets/explorer.py:670
+msgid "All files"
+msgstr "Все файлы"
+
+#: spyderlib/config/utils.py:113
+msgid "Supported text files"
+msgstr "Поддерживаемые текстовые файлы"
+
+#: spyderlib/utils/environ.py:98
+msgid ""
+"Module <b>pywin32 was not found</b>.<br>Please restart this Windows "
+"<i>session</i> (not the computer) for changes to take effect."
+msgstr ""
+"Модуль <b>pywin32 не найден</b>.<br>Пожалуйста, перезапустите <i>сессию</i> "
+"Windows  (не компьютер), чтобы изменения вступили в силу."
+
+#: spyderlib/utils/environ.py:111
+msgid ""
+"If you accept changes, this will modify the current user environment "
+"variables directly <b>in Windows registry</b>. Use it with precautions, at "
+"your own risks.<br><br>Note that for changes to take effect, you will need "
+"to restart the parent process of this application (simply restart Spyder if "
+"you have executed it from a Windows shortcut, otherwise restart any "
+"application from which you may have executed it, like <i>Python(x,y) Home</"
+"i> for example)"
+msgstr ""
+"Если Вы примете изменения, это переопределит переменные окружения для "
+"текущего пользователя непосредственно <b>в реестре Windows</b>. Используйте "
+"с осторожностью, на свой риск.<br><br>Имейте в виду, чтобы изменения "
+"вступили в силу, необходимо перезагрузить родительский процесс приложения "
+"(просто перезапустите Spyder, если запускали его ярлыком Windows, или "
+"перезапустите приложение из которого Вы его запускали, например <i>Python(x,"
+"y) Home</i>)"
+
+#: spyderlib/utils/codeanalysis.py:91
+msgid "Real-time code analysis on the Editor"
+msgstr "Анализ кода в Редакторе в реальном времени"
+
+#: spyderlib/utils/codeanalysis.py:95
+msgid "Real-time code style analysis on the Editor"
+msgstr "Анализ стиля кода в Редакторе в реальном времени"
+
+#: spyderlib/utils/iofuncs.py:497
+msgid "Supported files"
+msgstr "Поддерживаемые файлы"
+
+#: spyderlib/utils/iofuncs.py:499
+msgid "All files (*.*)"
+msgstr "Все файлы (*.*)"
+
+#: spyderlib/utils/iofuncs.py:509
+msgid "Spyder data files"
+msgstr "Файлы данных Spyder"
+
+#: spyderlib/utils/iofuncs.py:511
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1014
+msgid "NumPy arrays"
+msgstr "Массивы NumPy"
+
+#: spyderlib/utils/iofuncs.py:512
+msgid "NumPy zip arrays"
+msgstr "Сжатые массивы NumPy"
+
+#: spyderlib/utils/iofuncs.py:513
+msgid "Matlab files"
+msgstr "Файлы Matlab"
+
+#: spyderlib/utils/iofuncs.py:514
+msgid "CSV text files"
+msgstr "Текстовые файлы CSV"
+
+#: spyderlib/utils/iofuncs.py:516
+msgid "JPEG images"
+msgstr "Изображения JPEG"
+
+#: spyderlib/utils/iofuncs.py:517
+msgid "PNG images"
+msgstr "Изображения PNG"
+
+#: spyderlib/utils/iofuncs.py:518
+msgid "GIF images"
+msgstr "Изображения GIF"
+
+#: spyderlib/utils/iofuncs.py:519
+msgid "TIFF images"
+msgstr "Изображения TIFF"
+
+#: spyderlib/utils/iofuncs.py:520 spyderlib/utils/iofuncs.py:521
+msgid "Pickle files"
+msgstr "Архивы Pickle"
+
+#: spyderlib/utils/iofuncs.py:522
+msgid "JSON files"
+msgstr "Файлы JSON"
+
+#: spyderlib/utils/iofuncs.py:541 spyderlib/utils/iofuncs.py:548
+#, python-format
+msgid "<b>Unsupported file type '%s'</b>"
+msgstr "<b>Неподдерживаемый тип файла '%s'</b>"
+
+#: spyderlib/utils/programs.py:282
+msgid "It was not possible to run this file in an external terminal"
+msgstr "Невозможно запустить файл во внешнем терминале"
+
+#: spyderlib/utils/help/sphinxify.py:212 spyderlib/utils/help/sphinxify.py:222
+msgid ""
+"It was not possible to generate rich text help for this object.</br>Please "
+"see it in plain text."
+msgstr ""
+"Невозможно создать форматированную текстовую справку по объекту.</"
+"br>Пожалуйста, просмотрите в виде обычного текста."
+
+#: spyderlib/utils/introspection/manager.py:31
+#: spyderlib/utils/introspection/manager.py:36
+msgid "Editor's code completion, go-to-definition and help"
+msgstr "Автодополнение кода редактора, переход к определению и справка"
+
+#: spyderlib/utils/syntaxhighlighters.py:32
+msgid "Syntax highlighting for Matlab, Julia and other file types"
+msgstr "Подсветка синтаксиса для Matlab, Julia и других типов файлов"
+
+#: spyderlib/utils/syntaxhighlighters.py:41
+msgid "Background:"
+msgstr "Фон:"
+
+#: spyderlib/utils/syntaxhighlighters.py:42
+#: spyderlib/widgets/sourcecode/codeeditor.py:103
+msgid "Current line:"
+msgstr "Текущая строка:"
+
+#: spyderlib/utils/syntaxhighlighters.py:43
+msgid "Current cell:"
+msgstr "Текущий блок:"
+
+#: spyderlib/utils/syntaxhighlighters.py:44
+msgid "Occurrence:"
+msgstr "Вхождения слова:"
+
+#: spyderlib/utils/syntaxhighlighters.py:45
+msgid "Link:"
+msgstr "Ссылка:"
+
+#: spyderlib/utils/syntaxhighlighters.py:46
+msgid "Side areas:"
+msgstr "Боковые панели:"
+
+#: spyderlib/utils/syntaxhighlighters.py:47
+msgid "Matched <br>parens:"
+msgstr "Парные <br>скобки:"
+
+#: spyderlib/utils/syntaxhighlighters.py:48
+msgid "Unmatched <br>parens:"
+msgstr "Скобки <br>без пары:"
+
+#: spyderlib/utils/syntaxhighlighters.py:49
+msgid "Normal text:"
+msgstr "Обычный текст:"
+
+#: spyderlib/utils/syntaxhighlighters.py:50
+msgid "Keyword:"
+msgstr "Ключевое слово:"
+
+#: spyderlib/utils/syntaxhighlighters.py:51
+msgid "Builtin:"
+msgstr "Встроенные:"
+
+#: spyderlib/utils/syntaxhighlighters.py:52
+msgid "Definition:"
+msgstr "Определение:"
+
+#: spyderlib/utils/syntaxhighlighters.py:53
+msgid "Comment:"
+msgstr "Комментарий:"
+
+#: spyderlib/utils/syntaxhighlighters.py:54
+msgid "String:"
+msgstr "Строка:"
+
+#: spyderlib/utils/syntaxhighlighters.py:55
+msgid "Number:"
+msgstr "Число:"
+
+#: spyderlib/utils/syntaxhighlighters.py:56
+msgid "Instance:"
+msgstr "Экземпляр класса:"
+
+#: spyderlib/workers/updates.py:86 spyderlib/workers/updates.py:88
+msgid "Unable to retrieve information."
+msgstr "Невозможно получить информацию."
+
+#: spyderlib/workers/updates.py:90
+msgid ""
+"Unable to connect to the internet. <br><br>Make sure the connection is "
+"working properly."
+msgstr ""
+"Не удалось подключиться к интернету.<br><br>Убедитесь, что соединение "
+"работает должным образом."
+
+#: spyderlib/workers/updates.py:93
+msgid "Unable to check for updates."
+msgstr "Не удалось проверить обновления."
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:113
+msgid "Index"
+msgstr "Индекс"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:115
+#: spyderlib/plugins/shortcuts.py:517
+msgid "Name"
+msgstr "Действие"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:118
+msgid "Tuple"
+msgstr "Кортеж"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:121
+msgid "List"
+msgstr "Список"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:124
+msgid "Dictionary"
+msgstr "Словарь"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:126
+msgid "Key"
+msgstr "Клавиша"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:130
+#: spyderlib/plugins/help.py:399
+msgid "Object"
+msgstr "Объект"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:132
+msgid "Attribute"
+msgstr "Атрибут"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:134
+msgid "elements"
+msgstr "элементы"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:310
+msgid "Type"
+msgstr "Тип"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:310
+msgid "Size"
+msgstr "Размер"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:310
+msgid "Value"
+msgstr "Значение"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:408
+msgid ""
+"Opening this variable can be slow\n"
+"\n"
+"Do you want to continue anyway?"
+msgstr ""
+"Открытие этой переменной может занять время\n"
+"\n"
+"Желаете продолжить?"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:416
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:570
+msgid "Edit item"
+msgstr "Редактировать элемент"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:417
+#, python-format
+msgid "<b>Unable to retrieve data.</b><br><br>Error message:<br>%s"
+msgstr "<b>Не удалось вывести данные.</b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:571
+#, python-format
+msgid "<b>Unable to assign data to item.</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно назначить данные элементу.</b><br><br>Сообщение об ошибке:<br>"
+"%s"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:633
+msgid "Resize rows to contents"
+msgstr "Размер строк по содержимому"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:641
+#: spyderlib/widgets/explorer.py:241
+msgid "Edit"
+msgstr "Редактировать"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:644
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:983
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1000
+msgid "Plot"
+msgstr "График"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:648
+msgid "Histogram"
+msgstr "Гистограмма"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:652
+msgid "Show image"
+msgstr "Показать изображение"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:656
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1008
+msgid "Save array"
+msgstr "Сохранить массив"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:660
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:947
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:955
+msgid "Insert"
+msgstr "Вставить"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:663
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:897
+msgid "Remove"
+msgstr "Удалить"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:666
+#: spyderlib/plugins/variableexplorer.py:42
+msgid "Truncate values"
+msgstr "Обрезать значения"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:670
+#: spyderlib/plugins/variableexplorer.py:44
+msgid "Show arrays min/max"
+msgstr "Показывать min/max массивов"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:674
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:914
+#: spyderlib/widgets/explorer.py:542 spyderlib/widgets/explorer.py:550
+#: spyderlib/widgets/explorer.py:561
+msgid "Rename"
+msgstr "Переименовать"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:677
+msgid "Duplicate"
+msgstr "Создать копию"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:895
+msgid "Do you want to remove selected item?"
+msgstr "Вы хотите удалить выбранный элемент?"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:896
+msgid "Do you want to remove all selected items?"
+msgstr "Вы хотите удалить все выбранные элементы?"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:914
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:947
+msgid "Key:"
+msgstr "Ключ:"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:955
+msgid "Value:"
+msgstr "Значение:"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:971
+msgid "Import error"
+msgstr "Ошибка импорта"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:972
+msgid "Please install <b>matplotlib</b> or <b>guiqwt</b>."
+msgstr "Пожалуйста, установите <b>matplotlib</b> или <b>guiqwt</b>."
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:984
+#, python-format
+msgid "<b>Unable to plot data.</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Не удалось построить график по данным.</b><br><br>Сообщение об ошибке:<br>"
+"%s"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1001
+#, python-format
+msgid "<b>Unable to show image.</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Не удалось показать изображение.</b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1024
+#, python-format
+msgid "<b>Unable to save array</b><br><br>Error message:<br>%s"
+msgstr "<b>Не удалось сохранить массив</b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1049
+msgid "It was not possible to copy this array"
+msgstr "Не удалось скопировать этот массив"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1074
+msgid "Clipboard contents"
+msgstr "Содержимое буфера обмена"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1089
+msgid "Import from clipboard"
+msgstr "Импортировать из буфера обмена"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1091
+msgid "Empty clipboard"
+msgstr "Очистить буфер обмена"
+
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1092
+msgid "Nothing to be imported from clipboard."
+msgstr "Нечего импортировать из буфера обмена."
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:496
+msgid "It was not possible to copy values for this array"
+msgstr "Не удалось скопировать значения этого массива"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:531
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:564
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:524
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:564
+msgid "Format"
+msgstr "Форматировать"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:536
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:528
+msgid "Resize"
+msgstr "Изменить размер"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:539
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:532
+#: spyderlib/plugins/ipythonconsole.py:191
+#: spyderlib/plugins/externalconsole.py:111
+msgid "Background color"
+msgstr "Цвет фона"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:565
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:565
+msgid "Float formatting"
+msgstr "Форматирование чисел"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:573
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:574
+#, python-format
+msgid "Format (%s) is incorrect"
+msgstr "Формат (%s) неверный"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:607
+msgid "Array is empty"
+msgstr "Массив пустой"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:610
+msgid "Arrays with more than 3 dimensions are not supported"
+msgstr "Массивы с размерностью более 3 не поддерживаются"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:613
+msgid "The 'xlabels' argument length do no match array column number"
+msgstr "Длина аргумента 'xlabels' не соответствует числу столбцов массива"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:617
+msgid "The 'ylabels' argument length do no match array row number"
+msgstr "Длина аргумента 'ylabels' не соответствует числу строк массива"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:624
+#, python-format
+msgid "%s arrays"
+msgstr "%s массивы"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:625
+#, python-format
+msgid "%s are currently not supported"
+msgstr "%s на данный момент не поддерживается"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:632
+msgid "NumPy array"
+msgstr "Массив NumPy"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:634
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:788
+msgid "Array editor"
+msgstr "Редактор массивов"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:636
+msgid "read only"
+msgstr "только чтение"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:666
+msgid "Record array fields:"
+msgstr "Заполнить поля массива:"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:678
+msgid "Masked data"
+msgstr "Скрытые данные"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:678
+msgid "Data"
+msgstr "Данные"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:678
+msgid "Mask"
+msgstr "Маска"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:689
+msgid "Axis:"
+msgstr "Оси:"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:694
+msgid "Index:"
+msgstr "Индекс:"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:707
+msgid "<u>Warning</u>: changes are applied separately"
+msgstr "<u>Предупреждение</u>: изменения применяются раздельно"
+
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:708
+msgid ""
+"For performance reasons, changes applied to masked array won't be reflected "
+"in array's data (and vice-versa)."
+msgstr ""
+"По соображениям производительности, изменения принятые для скрытых массивов "
+"не будут отражены в данных массивов (и наоборот)."
+
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:430
+msgid "To bool"
+msgstr "В булево"
+
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:430
+msgid "To complex"
+msgstr "В комплексное"
+
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:431
+msgid "To int"
+msgstr "В целое"
+
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:431
+msgid "To float"
+msgstr "В вещественное"
+
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:432
+msgid "To str"
+msgstr "В строку"
+
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:506
+#, python-format
+msgid "%s editor"
+msgstr "%s редактор"
+
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:538
+msgid "Column min/max"
+msgstr "Min/max столбца"
+
+#: spyderlib/widgets/variableexplorer/utils.py:28
+msgid "View and edit DataFrames and Series in the Variable Explorer"
+msgstr ""
+"Показ и редактирование структур DataFrame и Serie в Менеджере Переменных"
+
+#: spyderlib/widgets/variableexplorer/utils.py:33
+msgid "View and edit two and three dimensional arrays in the Variable Explorer"
+msgstr ""
+"Просмотр и редактирование 2-х и 3-мерных массивов в Менеджере Переменных"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:151
+#: spyderlib/widgets/editor.py:468 spyderlib/widgets/ipython.py:580
+#: spyderlib/widgets/externalshell/baseshell.py:152
+#: spyderlib/widgets/explorer.py:1040 spyderlib/plugins/help.py:443
+#: spyderlib/plugins/history.py:103
+msgid "Options"
+msgstr "Опции"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:195
+msgid "Refresh"
+msgstr "Обновить"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:199
+msgid "Refresh periodically"
+msgstr "Обновлять периодически"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:203
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:456
+msgid "Import data"
+msgstr "Импортировать данные"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:206
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:544
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:565
+msgid "Save data"
+msgstr "Сохранить данные"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:211
+msgid "Save data as..."
+msgstr "Сохранить данные как..."
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:218
+#: spyderlib/plugins/variableexplorer.py:33
+msgid "Exclude private references"
+msgstr "Исключить приватные ссылки"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:219
+msgid "Exclude references which name starts with an underscore"
+msgstr "Исключить ссылки, имена которых начинаются с подчёркивания"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:226
+#: spyderlib/plugins/variableexplorer.py:35
+msgid "Exclude all-uppercase references"
+msgstr "Исключить ссылки со всеми буквами в верхнем регистре"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:227
+msgid "Exclude references which name is uppercase"
+msgstr "Исключить ссылки с именем в верхнем регистре"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:233
+#: spyderlib/plugins/variableexplorer.py:34
+msgid "Exclude capitalized references"
+msgstr "Исключить ссылки с прописной буквы"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:234
+msgid "Exclude references which name starts with an uppercase character"
+msgstr ""
+"Исключить ссылки, имена которых начинаются с символа в верхнем регистре"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:241
+#: spyderlib/plugins/variableexplorer.py:36
+msgid "Exclude unsupported data types"
+msgstr "Исключить неподдерживаемые типы данных"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:242
+msgid ""
+"Exclude references to unsupported data types (i.e. which won't be handled/"
+"saved correctly)"
+msgstr ""
+"Исключить ссылки на неподдерживаемые типы данных (т.е. которые не будут "
+"правильно обработаны/сохранены)"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:351
+#, fuzzy, python-format
+msgid "Object <b>%s</b> is not picklable"
+msgstr "Объект <b>%s</b> не архивируемый"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:476
+#, python-format
+msgid ""
+"<b>Unsupported file extension '%s'</b><br><br>Would you like to import it "
+"anyway (by selecting a known file format)?"
+msgstr ""
+"<b>Неподдерживаемое расширение файла '%s'</b><br><br>Хотите его "
+"импортировать (выбрав известный формат файла)?"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:484
+msgid "Open file as:"
+msgstr "Открыть файл как:"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:532
+#, python-format
+msgid "<b>Unable to load '%s'</b><br><br>Error message:<br>%s"
+msgstr "<b>Не удалось загрузить '%s'</b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:566
+#, python-format
+msgid "<b>Unable to save current workspace</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно сохранить текущую рабочую область</b><br><br>Сообщение об "
+"ошибке:<br>%s"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:116
+#: spyderlib/widgets/variableexplorer/importwizard.py:431
+msgid "Import as"
+msgstr "Импортировать как"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:118
+msgid "data"
+msgstr "данные"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:122
+msgid "code"
+msgstr "код"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:125
+#: spyderlib/widgets/variableexplorer/importwizard.py:504
+msgid "text"
+msgstr "текст"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:138
+msgid "Column separator:"
+msgstr "Разделитель столбцов:"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:142
+msgid "Tab"
+msgstr "табуляция"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:145
+#: spyderlib/widgets/variableexplorer/importwizard.py:163
+msgid "other"
+msgstr "другой"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:156
+msgid "Row separator:"
+msgstr "Разделитель строк:"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:160
+msgid "EOL"
+msgstr "Конец строки"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:175
+msgid "Additional options"
+msgstr "Дополнительные опции"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:179
+msgid "Skip rows:"
+msgstr "Пропустить строки:"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:190
+msgid "Comments:"
+msgstr "Комментарии:"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:196
+msgid "Transpose"
+msgstr "Транспонировать"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:434
+msgid "array"
+msgstr "массив"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:439
+msgid "list"
+msgstr "список"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:444
+msgid "DataFrame"
+msgstr "DataFrame"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:487
+#: spyderlib/widgets/variableexplorer/importwizard.py:569
+msgid "Import wizard"
+msgstr "Мастер импорта"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:492
+msgid "Raw text"
+msgstr "Необработанный текст"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:495
+msgid "variable_name"
+msgstr "имя_переменной"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:506
+msgid "table"
+msgstr "таблица"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:507
+msgid "Preview"
+msgstr "Предварительный просмотр"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:511
+msgid "Variable Name"
+msgstr "Имя переменной"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:519
+msgid "Cancel"
+msgstr "Отмена"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:525
+#: spyderlib/widgets/explorer.py:1031
+msgid "Previous"
+msgstr "Предыдущая"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:529
+#: spyderlib/widgets/explorer.py:1034
+#: spyderlib/plugins/workingdirectory.py:179
+msgid "Next"
+msgstr "Далее"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:532
+msgid "Done"
+msgstr "Сделано"
+
+#: spyderlib/widgets/variableexplorer/importwizard.py:570
+#, python-format
+msgid ""
+"<b>Unable to proceed to next step</b><br><br>Please check your entries."
+"<br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно перейти к следующему шагу</b><br><br>Пожалуйста, проверьте "
+"введенные данные.<br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/variableexplorer/texteditor.py:72
+msgid "Text editor"
+msgstr "Текстовый редактор"
+
+#: spyderlib/widgets/comboboxes.py:165
+msgid "Press enter to validate this entry"
+msgstr "Нажмите Enter для подтверждения этого поля"
+
+#: spyderlib/widgets/comboboxes.py:166
+msgid "This entry is incorrect"
+msgstr "Это поле неверно"
+
+#: spyderlib/widgets/comboboxes.py:209
+msgid "Press enter to validate this path"
+msgstr "Нажмите Enter для подтверждения этого пути"
+
+#: spyderlib/widgets/onecolumntree.py:50
+msgid "Collapse all"
+msgstr "Свернуть всё"
+
+#: spyderlib/widgets/onecolumntree.py:54
+msgid "Expand all"
+msgstr "Развернуть всё"
+
+#: spyderlib/widgets/onecolumntree.py:58
+msgid "Restore"
+msgstr "Восстановить"
+
+#: spyderlib/widgets/onecolumntree.py:59
+msgid "Restore original tree layout"
+msgstr "Восстановить оригинальную структуру дерева"
+
+#: spyderlib/widgets/onecolumntree.py:63
+msgid "Collapse selection"
+msgstr "Свернуть выделенное"
+
+#: spyderlib/widgets/onecolumntree.py:67
+msgid "Expand selection"
+msgstr "Развернуть выделенное"
+
+#: spyderlib/widgets/editor.py:341 spyderlib/plugins/editor.py:645
+msgid "File switcher..."
+msgstr "Переключение по файлам..."
+
+#: spyderlib/widgets/editor.py:344
+msgid "Copy path to clipboard"
+msgstr "Копировать путь в буфер обмена"
+
+#: spyderlib/widgets/editor.py:348
+msgid "Close all to the right"
+msgstr "Закрыть все правее"
+
+#: spyderlib/widgets/editor.py:350
+msgid "Close all but this"
+msgstr "Закрыть все кроме этой"
+
+#: spyderlib/widgets/editor.py:365
+#: spyderlib/widgets/sourcecode/codeeditor.py:94
+#: spyderlib/widgets/sourcecode/codeeditor.py:2901
+#: spyderlib/plugins/editor.py:96 spyderlib/plugins/editor.py:556
+#: spyderlib/plugins/editor.py:1636 spyderlib/plugins/help.py:123
+#: spyderlib/plugins/help.py:391 spyderlib/plugins/__init__.py:523
+msgid "Editor"
+msgstr "Редактор"
+
+#: spyderlib/widgets/editor.py:914
+msgid "Temporary file"
+msgstr "Временный файл"
+
+#: spyderlib/widgets/editor.py:1011
+msgid "New window"
+msgstr "Новое окно"
+
+#: spyderlib/widgets/editor.py:1012
+msgid "Create a new editor window"
+msgstr "Создать новое окно редактора"
+
+#: spyderlib/widgets/editor.py:1015
+msgid "Split vertically"
+msgstr "Разделить по вертикали"
+
+#: spyderlib/widgets/editor.py:1017
+msgid "Split vertically this editor window"
+msgstr "Разделить окна редактора по вертикали"
+
+#: spyderlib/widgets/editor.py:1019
+msgid "Split horizontally"
+msgstr "Разделить по горизонтали"
+
+#: spyderlib/widgets/editor.py:1021
+msgid "Split horizontally this editor window"
+msgstr "Разделить окна редактора по горизонтали"
+
+#: spyderlib/widgets/editor.py:1023
+msgid "Close this panel"
+msgstr "Закрыть эту панель"
+
+#: spyderlib/widgets/editor.py:1180
+#, python-format
+msgid "<b>%s</b> has been modified.<br>Do you want to save changes?"
+msgstr "<b>%s</b> был изменён.<br>Хотите сохранить изменения?"
+
+#: spyderlib/widgets/editor.py:1242
+msgid "Save"
+msgstr "Сохранить"
+
+#: spyderlib/widgets/editor.py:1243
+#, python-format
+msgid "<b>Unable to save script '%s'</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Не удалось сохранить скрипт '%s'</b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/editor.py:1263 spyderlib/plugins/editor.py:657
+msgid "Save file"
+msgstr "Сохранить файл"
+
+#: spyderlib/widgets/editor.py:1477
+#, python-format
+msgid ""
+"<b>%s</b> is unavailable (this file may have been removed, moved or renamed "
+"outside Spyder).<br>Do you want to close it?"
+msgstr ""
+"<b>%s</b> недоступен (этот файл мог быть удален, перемещён или переименован "
+"вне Spyder).<br>Хотите его закрыть?"
+
+#: spyderlib/widgets/editor.py:1497
+#, python-format
+msgid ""
+"<b>%s</b> has been modified outside Spyder.<br>Do you want to reload it and "
+"lose all your changes?"
+msgstr ""
+"<b>%s</b> был изменён вне Spyder.<br>Хотите перегрузить его и потерять все "
+"изменения?"
+
+#: spyderlib/widgets/editor.py:1593
+#, python-format
+msgid ""
+"All changes to <b>%s</b> will be lost.<br>Do you want to revert file from "
+"disk?"
+msgstr ""
+"Все изменения для <b>%s</b> были потеряны.<br>Хотите перегрузить файл с "
+"диска?"
+
+#: spyderlib/widgets/editor.py:1733
+#, python-format
+msgid "Loading %s..."
+msgstr "Загрузка %s..."
+
+#: spyderlib/widgets/editor.py:1743
+#, python-format
+msgid ""
+"<b>%s</b> contains mixed end-of-line characters.<br>Spyder will fix this "
+"automatically."
+msgstr ""
+"<b>%s</b> содержит смешанные символы конца строки.<br>Spyder исправит это "
+"автоматически."
+
+#: spyderlib/widgets/editor.py:2108
+msgid "Close window"
+msgstr "Закрыть окно"
+
+#: spyderlib/widgets/editor.py:2110
+msgid "Close this window"
+msgstr "Закрыть это окно"
+
+#: spyderlib/widgets/shell.py:128
+msgid "Save history log..."
+msgstr "Сохранить журнал истории..."
+
+#: spyderlib/widgets/shell.py:130
+msgid "Save current history log (i.e. all inputs and outputs) in a text file"
+msgstr ""
+"Сохранить текущий журнал истории (т.е. все вводы и выводы) в текстовом файле"
+
+#: spyderlib/widgets/shell.py:133 spyderlib/widgets/projectexplorer.py:1015
+#: spyderlib/widgets/explorer.py:480 spyderlib/plugins/configdialog.py:1000
+msgid "Delete"
+msgstr "Удалить"
+
+#: spyderlib/widgets/shell.py:256
+msgid "Save history log"
+msgstr "Сохранить журнал истории"
+
+#: spyderlib/widgets/shell.py:259
+msgid "History logs"
+msgstr "Журналы истории"
+
+#: spyderlib/widgets/shell.py:270
+#, python-format
+msgid "<b>Unable to save file '%s'</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно сохранить файл <i>%s</i></b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/shell.py:712
+msgid "Copy without prompts"
+msgstr "Копировать без подтверждения"
+
+#: spyderlib/widgets/shell.py:715 spyderlib/widgets/shell.py:719
+msgid "Clear line"
+msgstr "Очистить строку"
+
+#: spyderlib/widgets/shell.py:721
+msgid "Clear shell"
+msgstr "Очистить оболочку"
+
+#: spyderlib/widgets/shell.py:725
+msgid "Clear shell contents ('cls' command)"
+msgstr "Очистить содержание оболочки (команда 'cls')"
+
+#: spyderlib/widgets/ipython.py:246
+msgid "Reset IPython namespace"
+msgstr "Перезагрузить пространство имён IPython"
+
+#: spyderlib/widgets/ipython.py:247
+msgid ""
+"All user-defined variables will be removed.<br>Are you sure you want to "
+"reset the namespace?"
+msgstr ""
+"Все определённые пользователем переменные будут удалены.<br>Вы уверены, что "
+"хотите переустановить пространство имён?"
+
+#: spyderlib/widgets/ipython.py:363 spyderlib/widgets/ipython.py:380
+#: spyderlib/widgets/externalshell/baseshell.py:250
+#: spyderlib/widgets/mixins.py:656
+msgid "Arguments"
+msgstr "Аргументы"
+
+#: spyderlib/widgets/ipython.py:518
+msgid "An error ocurred while starting the kernel"
+msgstr "При запуске ядра произошла ошибка"
+
+#: spyderlib/widgets/ipython.py:533
+#: spyderlib/widgets/externalshell/baseshell.py:106
+#: spyderlib/plugins/help.py:391 spyderlib/plugins/runconfig.py:185
+#: spyderlib/plugins/runconfig.py:455 spyderlib/plugins/externalconsole.py:56
+#: spyderlib/plugins/externalconsole.py:999
+msgid "Console"
+msgstr "Консоль"
+
+#: spyderlib/widgets/ipython.py:547
+msgid "Restart kernel"
+msgstr "Перезапустить ядро"
+
+#: spyderlib/widgets/ipython.py:567 spyderlib/widgets/findinfiles.py:333
+msgid "Stop"
+msgstr "Стоп"
+
+#: spyderlib/widgets/ipython.py:569
+msgid "Stop the current command"
+msgstr "Остановить текущую команду"
+
+#: spyderlib/widgets/ipython.py:593
+msgid "Inspect current object"
+msgstr "Проверить текущий объект"
+
+#: spyderlib/widgets/ipython.py:598
+msgid "Clear line or block"
+msgstr "Очистить строку или блок"
+
+#: spyderlib/widgets/ipython.py:602
+msgid "Reset namespace"
+msgstr "Перезагрузить пространство имён"
+
+#: spyderlib/widgets/ipython.py:605
+msgid "Clear console"
+msgstr "Очистить консоль"
+
+#: spyderlib/widgets/ipython.py:661
+msgid ""
+"It seems the kernel died unexpectedly. Use 'Restart kernel' to continue "
+"using this console."
+msgstr ""
+"По видимому ядро неожиданно умерло. Используйте 'Перезапустить ядро' для "
+"продолжения работы в консоли."
+
+#: spyderlib/widgets/ipython.py:681
+msgid "Changing backend to Qt for Mayavi"
+msgstr "Изменить бэкенд для Mayavi на Qt"
+
+#: spyderlib/widgets/ipython.py:690
+msgid "Kernel process is either remote or unspecified. Cannot interrupt"
+msgstr ""
+"Процесс ядра либо подключён удалённо, либо неопределим. Невозможно прервать"
+
+#: spyderlib/widgets/ipython.py:699
+msgid "Kernel process is either remote or unspecified. Cannot restart."
+msgstr ""
+"Процесс ядра либо подключён удалённо, либо неопределим. Невозможно "
+"перезапустить."
+
+#: spyderlib/widgets/ipython.py:778
+msgid "Connecting to kernel..."
+msgstr "Подключение к ядру..."
+
+#: spyderlib/widgets/pathmanager.py:86
+msgid "Move to top"
+msgstr "Переместить вверх"
+
+#: spyderlib/widgets/pathmanager.py:92
+msgid "Move up"
+msgstr "Переместить выше"
+
+#: spyderlib/widgets/pathmanager.py:98
+msgid "Move down"
+msgstr "Переместить ниже"
+
+#: spyderlib/widgets/pathmanager.py:104
+msgid "Move to bottom"
+msgstr "Переместить вниз"
+
+#: spyderlib/widgets/pathmanager.py:115 spyderlib/widgets/pathmanager.py:230
+msgid "Add path"
+msgstr "Добавить путь"
+
+#: spyderlib/widgets/pathmanager.py:120 spyderlib/widgets/pathmanager.py:213
+msgid "Remove path"
+msgstr "Удалить путь"
+
+#: spyderlib/widgets/pathmanager.py:130
+msgid "Synchronize..."
+msgstr "Синхронизация..."
+
+#: spyderlib/widgets/pathmanager.py:132
+msgid "Synchronize Spyder's path list with PYTHONPATH environment variable"
+msgstr "Синхронизировать список путей Spyder с переменной среды PYTHONPATH"
+
+#: spyderlib/widgets/pathmanager.py:144
+msgid "Synchronize"
+msgstr "Синхронизировать"
+
+#: spyderlib/widgets/pathmanager.py:145
+msgid ""
+"This will synchronize Spyder's path list with <b>PYTHONPATH</b> environment "
+"variable for current user, allowing you to run your Python modules outside "
+"Spyder without having to configure sys.path. <br>Do you want to clear "
+"contents of PYTHONPATH before adding Spyder's path list?"
+msgstr ""
+"Будет синхронизирован список путей Spyder с переменной среды PYTHONPATH для "
+"текущего пользователя, позволяя Вам запускать Ваши модули Python вне Spyder "
+"без необходимости настраивать sys.path.<br>Хотите очистить содержимое "
+"PYTHONPATH перед добавлением списка путей Spyder?"
+
+#: spyderlib/widgets/pathmanager.py:214
+msgid "Do you really want to remove selected path?"
+msgstr "Вы действительно хотите удалить выбранный путь?"
+
+#: spyderlib/widgets/pathmanager.py:223 spyderlib/widgets/findinfiles.py:504
+#: spyderlib/widgets/projectexplorer.py:899
+#: spyderlib/widgets/externalshell/pythonshell.py:638
+#: spyderlib/widgets/explorer.py:584 spyderlib/plugins/configdialog.py:490
+#: spyderlib/plugins/configdialog.py:505
+#: spyderlib/plugins/workingdirectory.py:290
+#: spyderlib/plugins/runconfig.py:176 spyderlib/plugins/runconfig.py:240
+msgid "Select directory"
+msgstr "Выберите каталог"
+
+#: spyderlib/widgets/pathmanager.py:231
+msgid ""
+"This directory is already included in Spyder path list.<br>Do you want to "
+"move it to the top of the list?"
+msgstr ""
+"Этот каталог уже имеется в списке путей Spyder.<br>Хотите переместить его на "
+"вершину списка?"
+
+#: spyderlib/widgets/findinfiles.py:158
+msgid "Unexpected error: see internal console"
+msgstr "Неожиданная ошибка: смотрите во встроенной консоли"
+
+#: spyderlib/widgets/findinfiles.py:209 spyderlib/widgets/findinfiles.py:233
+#: spyderlib/widgets/findinfiles.py:280
+msgid "invalid regular expression"
+msgstr "неверное регулярное выражение"
+
+#: spyderlib/widgets/findinfiles.py:278
+msgid "permission denied errors were encountered"
+msgstr "обнаружены ошибки отказа в доступе"
+
+#: spyderlib/widgets/findinfiles.py:315
+msgid "Search pattern"
+msgstr "Найти по шаблону"
+
+#: spyderlib/widgets/findinfiles.py:318 spyderlib/widgets/findinfiles.py:352
+#: spyderlib/widgets/findinfiles.py:364 spyderlib/widgets/findreplace.py:77
+msgid "Regular expression"
+msgstr "Регулярное выражение"
+
+#: spyderlib/widgets/findinfiles.py:327
+msgid "Search"
+msgstr "Найти"
+
+#: spyderlib/widgets/findinfiles.py:330
+msgid "Start search"
+msgstr "Начать поиск"
+
+#: spyderlib/widgets/findinfiles.py:336
+msgid "Stop search"
+msgstr "Остановить поиск"
+
+#: spyderlib/widgets/findinfiles.py:346
+msgid "Included filenames pattern"
+msgstr "Включить шаблон имён файлов"
+
+#: spyderlib/widgets/findinfiles.py:355
+msgid "Include:"
+msgstr "Включить:"
+
+#: spyderlib/widgets/findinfiles.py:358
+msgid "Excluded filenames pattern"
+msgstr "Исключить шаблон имён файлов"
+
+#: spyderlib/widgets/findinfiles.py:367
+msgid "Exclude:"
+msgstr "Исключить:"
+
+#: spyderlib/widgets/findinfiles.py:377
+msgid "PYTHONPATH"
+msgstr "PYTHONPATH"
+
+#: spyderlib/widgets/findinfiles.py:380
+msgid ""
+"Search in all directories listed in sys.path which are outside the Python "
+"installation directory"
+msgstr ""
+"Искать во всех каталогах, указанных в sys.path, которые отсутствуют в "
+"установочном каталоге Python"
+
+#: spyderlib/widgets/findinfiles.py:382
+msgid "Hg repository"
+msgstr "Hg-репозиторий"
+
+#: spyderlib/widgets/findinfiles.py:385
+msgid "Search in current directory hg repository"
+msgstr "Поиск в текущем каталоге hg-репозитория"
+
+#: spyderlib/widgets/findinfiles.py:386
+msgid "Here:"
+msgstr "Здесь:"
+
+#: spyderlib/widgets/findinfiles.py:390
+msgid "Search recursively in this directory"
+msgstr "Искать рекурсивно в каталоге"
+
+#: spyderlib/widgets/findinfiles.py:395
+msgid "Browse a search directory"
+msgstr "Выбрать каталог поиска"
+
+#: spyderlib/widgets/findinfiles.py:425
+msgid "Hide advanced options"
+msgstr "Скрыть дополнительные опции"
+
+#: spyderlib/widgets/findinfiles.py:428
+msgid "Show advanced options"
+msgstr "Показать дополнительные опции"
+
+#: spyderlib/widgets/findinfiles.py:569
+msgid "Search canceled"
+msgstr "Поиск отменён"
+
+#: spyderlib/widgets/findinfiles.py:573
+msgid "String not found"
+msgstr "Строка не найдена"
+
+#: spyderlib/widgets/findinfiles.py:575
+msgid "matches in"
+msgstr "совпадений в"
+
+#: spyderlib/widgets/findinfiles.py:576
+msgid "file"
+msgstr "файл"
+
+#: spyderlib/widgets/findinfiles.py:584
+msgid "interrupted"
+msgstr "прервано"
+
+#: spyderlib/widgets/findinfiles.py:689 spyderlib/plugins/findinfiles.py:114
+msgid "Find in files"
+msgstr "Найти в файлах"
+
+#: spyderlib/widgets/tabs.py:142
+msgid "Browse tabs"
+msgstr "Обзор вкладок"
+
+#: spyderlib/widgets/tabs.py:271
+msgid "Close current tab"
+msgstr "Закрыть текущую вкладку"
+
+#: spyderlib/widgets/pydocgui.py:107
+msgid "Module or package:"
+msgstr "Модуль или пакет:"
+
+#: spyderlib/widgets/editortools.py:94 spyderlib/widgets/editortools.py:130
+#, python-format
+msgid "Line %s"
+msgstr "Строка %s"
+
+#: spyderlib/widgets/editortools.py:99
+#, python-format
+msgid "Class defined at line %s"
+msgstr "Класс определён в строке %s"
+
+#: spyderlib/widgets/editortools.py:107
+#, python-format
+msgid "Method defined at line %s"
+msgstr "Метод определён в строке %s"
+
+#: spyderlib/widgets/editortools.py:117
+#, python-format
+msgid "Function defined at line %s"
+msgstr "Функция определена в строке %s"
+
+#: spyderlib/widgets/editortools.py:149
+#, python-format
+msgid "Cell starts at line %s"
+msgstr "Блок начинается в строке %s"
+
+#: spyderlib/widgets/editortools.py:195
+#: spyderlib/plugins/outlineexplorer.py:48
+msgid "Outline"
+msgstr "Структура"
+
+#: spyderlib/widgets/editortools.py:202 spyderlib/widgets/editortools.py:539
+msgid "Go to cursor position"
+msgstr "Перейти к позиции курсора"
+
+#: spyderlib/widgets/editortools.py:205
+msgid "Show absolute path"
+msgstr "Показать полный путь"
+
+#: spyderlib/widgets/editortools.py:208 spyderlib/widgets/explorer.py:178
+msgid "Show all files"
+msgstr "Показать все файлы"
+
+#: spyderlib/widgets/editortools.py:211
+msgid "Show special comments"
+msgstr "Показать специальные комментарии"
+
+#: spyderlib/widgets/editortools.py:510 spyderlib/plugins/editor.py:615
+msgid "Show/hide outline explorer"
+msgstr "Показать/скрыть менеджер структуры"
+
+#: spyderlib/widgets/fileswitcher.py:108
+msgid "unsaved file"
+msgstr "несохранённый файл"
+
+#: spyderlib/widgets/fileswitcher.py:228
+msgid ""
+"Press <b>Enter</b> to switch files or <b>Esc</b> to cancel.<br><br>Type to "
+"filter filenames.<br><br>Use <b>:number</b> to go to a line, e.g. "
+"<b><code>main:42</code></b><br>Use <b>@symbol_text</b> to go to a symbol, e."
+"g. <b><code>@init</code></b><br><br> Press <b>Ctrl+W</b> to close current "
+"tab.<br>"
+msgstr ""
+"Нажмите <b>Enter</b> для перехода к файлу или <b>Esc</b> для отмены."
+"<br><br>Введите текст для фильтрации имен файлов.<br><br>Используйте <b>:"
+"номер</b> для перехода к строке, напр. <b><code>main:42</code></"
+"b><br>Используйте <b>@имя</b> для перехода к идентификатору, напр. "
+"<b><code>@init</code></b><br><br> Нажмите <b>Ctrl+W</b> для закрытия текущей "
+"вкладки."
+
+#: spyderlib/widgets/fileswitcher.py:485
+msgid "lines"
+msgstr " строк"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:97
+msgid "Go to line:"
+msgstr "Перейти к строке:"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:105
+msgid "Line count:"
+msgstr "Количество строк:"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1269
+msgid "Breakpoint"
+msgstr "Точка останова"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1270
+msgid "Condition:"
+msgstr "Условие:"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1672
+msgid "Code analysis"
+msgstr "Анализ кода"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1726
+msgid "To do"
+msgstr "Список задач"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1967
+msgid "Removal error"
+msgstr "Ошибка удаления"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1968
+#, fuzzy
+msgid ""
+"It was not possible to remove outputs from this notebook. The error is:\n"
+"\n"
+msgstr ""
+"Невозможно удалить результаты из notebook. Ошибка:\n"
+"\n"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1980
+#: spyderlib/widgets/explorer.py:524
+msgid "Conversion error"
+msgstr "Ошибка преобразования"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1981
+#: spyderlib/widgets/explorer.py:525
+#, fuzzy
+msgid ""
+"It was not possible to convert this notebook. The error is:\n"
+"\n"
+msgstr ""
+"Не удалось конвертировать эту notebook. Ошибка:\n"
+"\n"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2438
+#: spyderlib/plugins/editor.py:879
+msgid "Comment"
+msgstr "Комментировать"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2438
+#: spyderlib/plugins/editor.py:879
+msgid "Uncomment"
+msgstr "Раскомментировать"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2442
+msgid "Clear all ouput"
+msgstr "Очистить вывод"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2445
+#: spyderlib/widgets/explorer.py:253
+msgid "Convert to Python script"
+msgstr "Сохранить как скрипт Python"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2448
+msgid "Go to definition"
+msgstr "Перейти к определению"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2451
+#: spyderlib/plugins/editor.py:816
+msgid "Run cell"
+msgstr "Выполнить &блок"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2455
+#: spyderlib/plugins/editor.py:824
+msgid "Run cell and advance"
+msgstr "Выполнить блок и перейти далее"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2459
+#: spyderlib/plugins/editor.py:800
+msgid "Run &selection or current line"
+msgstr "Выполнить в&ыделенное или текущую строку"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2462
+#: spyderlib/widgets/browser.py:34
+msgid "Zoom in"
+msgstr "Увеличить"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2465
+#: spyderlib/widgets/browser.py:31
+msgid "Zoom out"
+msgstr "Уменьшить"
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:2468
+msgid "Zoom reset"
+msgstr "Восстановить масштаб"
+
+#: spyderlib/widgets/internalshell.py:258
+msgid "Help..."
+msgstr "Справка..."
+
+#: spyderlib/widgets/internalshell.py:275
+msgid "Shell special commands:"
+msgstr "Специальные команды оболочки:"
+
+#: spyderlib/widgets/internalshell.py:276
+msgid "Internal editor:"
+msgstr "Встроенный редактор:"
+
+#: spyderlib/widgets/internalshell.py:277
+msgid "External editor:"
+msgstr "Внешний редактор:"
+
+#: spyderlib/widgets/internalshell.py:278
+msgid "Run script:"
+msgstr "Выполнить скрипт:"
+
+#: spyderlib/widgets/internalshell.py:279
+msgid "Remove references:"
+msgstr "Удалить ссылки:"
+
+#: spyderlib/widgets/internalshell.py:280
+msgid "System commands:"
+msgstr "Системные команды:"
+
+#: spyderlib/widgets/internalshell.py:281
+msgid "Python help:"
+msgstr "Справка Python:"
+
+#: spyderlib/widgets/internalshell.py:282
+msgid "GUI-based editor:"
+msgstr "Визуальный редактор:"
+
+#: spyderlib/widgets/projectexplorer.py:335
+msgid "its own configuration file"
+msgstr "его собственный файл конфигурации"
+
+#: spyderlib/widgets/projectexplorer.py:337
+msgid " and "
+msgstr " и "
+
+#: spyderlib/widgets/projectexplorer.py:341
+#, python-format
+msgid "the following projects:<br>%s"
+msgstr "следующие проекты:<br>%s"
+
+#: spyderlib/widgets/projectexplorer.py:545
+msgid "Project..."
+msgstr "Проект..."
+
+#: spyderlib/widgets/projectexplorer.py:549
+#: spyderlib/plugins/projectexplorer.py:64
+msgid "New project..."
+msgstr "Новый проект..."
+
+#: spyderlib/widgets/projectexplorer.py:558
+msgid "Existing directory"
+msgstr "Существующий каталог"
+
+#: spyderlib/widgets/projectexplorer.py:562
+msgid "Existing Spyder project"
+msgstr "Существующий проект Spyder"
+
+#: spyderlib/widgets/projectexplorer.py:566
+msgid "Existing Pydev project"
+msgstr "Существующий проект Pydev"
+
+#: spyderlib/widgets/projectexplorer.py:583
+msgid "Open project"
+msgstr "Открыть проект"
+
+#: spyderlib/widgets/projectexplorer.py:588
+msgid "Close project"
+msgstr "Закрыть проект"
+
+#: spyderlib/widgets/projectexplorer.py:593
+msgid "Close unrelated projects"
+msgstr "Закрыть несвязанные проекты"
+
+#: spyderlib/widgets/projectexplorer.py:602
+msgid "Edit related projects"
+msgstr "Редактировать связанные проекты"
+
+#: spyderlib/widgets/projectexplorer.py:610
+msgid "Add to PYTHONPATH"
+msgstr "Добавить в PYTHONPATH"
+
+#: spyderlib/widgets/projectexplorer.py:615
+msgid "Remove from PYTHONPATH"
+msgstr "Удалить из PYTHONPATH"
+
+#: spyderlib/widgets/projectexplorer.py:620
+msgid "Properties"
+msgstr "Свойства"
+
+#: spyderlib/widgets/projectexplorer.py:655
+msgid "Show horizontal scrollbar"
+msgstr "Показывать горизонтальную полосу прокрутки"
+
+#: spyderlib/widgets/projectexplorer.py:692
+msgid "Workspace"
+msgstr "Рабочая область"
+
+#: spyderlib/widgets/projectexplorer.py:693
+#, python-format
+msgid ""
+"The workspace was unable to load or save %s<br><br>Please check if you have "
+"the permission to write the associated configuration files."
+msgstr ""
+"Рабочую область не удалось загрузить или сохранить %s<br><br>Пожалуйста, "
+"проверьте, достаточно ли у Вас прав для записи соответствующих файлов "
+"конфигурации."
+
+#: spyderlib/widgets/projectexplorer.py:752
+msgid "Import directory"
+msgstr "Импортировать каталог"
+
+#: spyderlib/widgets/projectexplorer.py:754
+#, python-format
+msgid ""
+"The following directory is not in workspace:<br><b>%s</b><br><br>Do you want "
+"to continue (and copy the directory to workspace)?"
+msgstr ""
+"Выбранного каталога нет в рабочей области:<br><b>%s</b><br><br>Хотите "
+"продолжить (и скопировать каталог в область)?"
+
+#: spyderlib/widgets/projectexplorer.py:770
+#: spyderlib/widgets/projectexplorer.py:1187 spyderlib/widgets/explorer.py:501
+#, python-format
+msgid "<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr "<b>Невозможно %s <i>%s</i></b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/projectexplorer.py:772
+#: spyderlib/widgets/projectexplorer.py:1183
+msgid "copy"
+msgstr "скопировать"
+
+#: spyderlib/widgets/projectexplorer.py:823
+#: spyderlib/widgets/projectexplorer.py:830
+#: spyderlib/widgets/projectexplorer.py:1101
+#: spyderlib/widgets/projectexplorer.py:1186 spyderlib/widgets/explorer.py:500
+msgid "Project Explorer"
+msgstr "Менеджер проектов"
+
+#: spyderlib/widgets/projectexplorer.py:824
+#, python-format
+msgid "The project <b>%s</b> is already opened!"
+msgstr "Проект <b>%s</b> уже открыт!"
+
+#: spyderlib/widgets/projectexplorer.py:831
+#, python-format
+msgid ""
+"The project root path directory is inside the workspace but not as the "
+"expected tree level. It is not a directory of the workspace:<br><b>%s</b>"
+msgstr ""
+"Корневой каталог проекта находится в рабочей области, но не в качестве "
+"ожидаемого уровня дерева. Он не является каталогом рабочей области:<br><b>"
+"%s</b>"
+
+#: spyderlib/widgets/projectexplorer.py:842
+msgid "Project name:"
+msgstr "Имя проекта:"
+
+#: spyderlib/widgets/projectexplorer.py:851
+#, python-format
+msgid "A project named <b>%s</b> already exists"
+msgstr "Проект с именем <b>%s</b> уже существует"
+
+#: spyderlib/widgets/projectexplorer.py:856
+#, python-format
+msgid ""
+"Invalid project name.<br><br>Name must match the following regular "
+"expression:<br><b>%s</b>"
+msgstr ""
+"Неверное имя проекта.<br><br>Название должно соответствовать регулярному "
+"выражению:<br><b>%s</b>"
+
+#: spyderlib/widgets/projectexplorer.py:863
+#, python-format
+msgid ""
+"The following directory is not empty:<br><b>%s</b><br><br>Do you want to "
+"continue?"
+msgstr "Выбранный каталог не пуст:<br><b>%s</b><br><br>Хотите продолжить?"
+
+#: spyderlib/widgets/projectexplorer.py:876
+msgid "New project"
+msgstr "Новый проект"
+
+#: spyderlib/widgets/projectexplorer.py:884
+msgid ""
+"The current workspace has not been configured yet.\n"
+"Do you want to do this now?"
+msgstr ""
+"Текущая рабочая область ещё не сконфигурирована.\n"
+"Сделать это сейчас?"
+
+#: spyderlib/widgets/projectexplorer.py:922
+msgid "Import existing project"
+msgstr "Импортировать существующий проект"
+
+#: spyderlib/widgets/projectexplorer.py:935
+msgid "Select projects to import"
+msgstr "Выбрать проекты для импорта"
+
+#: spyderlib/widgets/projectexplorer.py:947
+#, python-format
+msgid "The folder <i>%s</i> does not contain a valid %s project"
+msgstr "Каталог <i>%s</i> не содержит подходящего проекта %s"
+
+#: spyderlib/widgets/projectexplorer.py:977
+msgid "Import existing Pydev project"
+msgstr "Импортировать существующий проект Pydev"
+
+#: spyderlib/widgets/projectexplorer.py:978
+#, python-format
+msgid ""
+"<b>Unable to read Pydev project <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Не удалось прочитать проект Pydev <i>%s</i></b><br><br>Сообщение об "
+"ошибке:<br>%s"
+
+#: spyderlib/widgets/projectexplorer.py:1016
+#, python-format
+msgid ""
+"Do you really want to delete project <b>%s</b>?<br><br>Note: project files "
+"won't be deleted from disk."
+msgstr ""
+"Вы действительно хотите удалить проект <b>%s</b>?<br><br>Примечание: файлы "
+"проекта не будут удалены с диска."
+
+#: spyderlib/widgets/projectexplorer.py:1069
+msgid "Related projects"
+msgstr "Смежные проекты"
+
+#: spyderlib/widgets/projectexplorer.py:1077
+#, python-format
+msgid "Select projects which are related to <b>%s</b>"
+msgstr "Выбранные проекты связаны с <b>%s</b>"
+
+#: spyderlib/widgets/projectexplorer.py:1102
+#, python-format
+msgid ""
+"Statistics on source files only:<br>(Python, Cython, IPython, Enaml,C/C++, "
+"Fortran)<br><br><b>%s</b> files.<br><b>%s</b> lines of code."
+msgstr ""
+"Статистика по исходному коду только:<br>(Python, Cython, IPython, Enaml,C/C+"
+"+, Fortran)<br><br><b>%s</b> файлов.<br><b>%s</b> строк кода."
+
+#: spyderlib/widgets/projectexplorer.py:1150
+#: spyderlib/widgets/projectexplorer.py:1164
+#: spyderlib/plugins/projectexplorer.py:53
+msgid "Project explorer"
+msgstr "Менеджер проектов"
+
+#: spyderlib/widgets/projectexplorer.py:1151
+#, python-format
+msgid "File <b>%s</b> already exists.<br>Do you want to overwrite it?"
+msgstr "Файл <b>%s</b> уже существует.<br>Хотите его перезаписать?"
+
+#: spyderlib/widgets/projectexplorer.py:1165
+#, python-format
+msgid "Folder <b>%s</b> already exists."
+msgstr "Каталог <b>%s</b> уже существует."
+
+#: spyderlib/widgets/projectexplorer.py:1185
+msgid "move"
+msgstr "переместить"
+
+#: spyderlib/widgets/projectexplorer.py:1195
+msgid "Select an existing workspace directory, or create a new one"
+msgstr "Выберите каталог рабочей области или создайте новый"
+
+#: spyderlib/widgets/projectexplorer.py:1196
+msgid ""
+"<u><b>What is the workspace?</b></u><br><br>A <b>Spyder workspace</b> is a "
+"directory on your filesystem that contains Spyder projects and <b>."
+"spyderworkspace</b> configuration file.<br><br>A <b>Spyder project</b> is a "
+"directory with source code (and other related files) and a configuration "
+"file (named <b>.spyderproject</b>) with project settings (PYTHONPATH, linked "
+"projects, ...).<br>"
+msgstr ""
+"<u><b>Что такое рабочая область?</b></u><br><br>A <b>Рабочая область Spyder</"
+"b> - каталог в вашей файловой системе, содержащий проекты Spyder и файл "
+"конфигурации <b>.spyderworkspace</b>.<br><br>A <b>Проект Spyder</b> - "
+"каталог с исходным кодом (и другими связанными файлами) и конфигурационным "
+"файлом (с расширением <b>.spyderproject</b>), содержащим настройки проекта "
+"(PYTHONPATH, взаимосвязанные проекты и т.п.)."
+
+#: spyderlib/widgets/projectexplorer.py:1225
+msgid "This is the current workspace directory"
+msgstr "Это текущий каталог рабочей области"
+
+#: spyderlib/widgets/projectexplorer.py:1255
+#, python-format
+msgid ""
+"The following directory is not a Spyder workspace:<br>%s<br><br>Do you want "
+"to create a new workspace in this directory?"
+msgstr ""
+"Выбранный каталог не является рабочей областью Spyder:<br>%s<br><br>Хотите "
+"создать новую рабочую область в этом каталоге?"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:284
+msgid "Variables"
+msgstr "Значения"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:285
+msgid "Show/hide global variables explorer"
+msgstr "Показать/скрыть менеджер глобальных переменных"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:289
+msgid "Terminate"
+msgstr "Прекратить"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:290
+msgid ""
+"Attempts to stop the process. The process\n"
+"may not exit as a result of clicking this\n"
+"button (it is given the chance to prompt\n"
+"the user for any unsaved files, etc)."
+msgstr ""
+"Попытка остановить процесс. Процесс\n"
+"имеет право не завершится после нажатия этой\n"
+"кнопки (например, чтобы спросить у пользователя\n"
+"о несохранённых файлах и т.п.)."
+
+#: spyderlib/widgets/externalshell/pythonshell.py:303
+msgid "Interact"
+msgstr ""
+
+#: spyderlib/widgets/externalshell/pythonshell.py:305
+msgid "Debug"
+msgstr "Отладка"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:307
+#: spyderlib/widgets/externalshell/pythonshell.py:373
+msgid "Arguments..."
+msgstr "Аргументы..."
+
+#: spyderlib/widgets/externalshell/pythonshell.py:309
+msgid "Post Mortem Debug"
+msgstr "Отладка в случае падения"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:311
+#: spyderlib/plugins/editor.py:783
+msgid "Run settings"
+msgstr "Настройки Запуска"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:315
+msgid "Working directory"
+msgstr "Рабочий каталог"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:317
+msgid "Set current working directory"
+msgstr "Установить текущий рабочий каталог"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:319
+msgid "Environment variables"
+msgstr "Переменные среды"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:323
+msgid "Show sys.path contents"
+msgstr "Показать содержимое sys.path"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:369
+#, python-format
+msgid "Arguments: %s"
+msgstr "Аргументы: %s"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:371
+msgid "No argument"
+msgstr "Нет аргументов"
+
+#: spyderlib/widgets/externalshell/pythonshell.py:550
+msgid ""
+"The kernel failed to start!! That's all we know... Please close this console "
+"and open a new one."
+msgstr ""
+"Ошибка запуска ядра!! Это всё, что известно... Пожалуйста, закройте консоль "
+"и откройте новую."
+
+#: spyderlib/widgets/externalshell/pythonshell.py:554
+msgid "A Python console failed to start!"
+msgstr "Консоль Python не удалось запустить!"
+
+#: spyderlib/widgets/externalshell/systemshell.py:105
+msgid "Process failed to start"
+msgstr "Процесс не удалось запустить"
+
+#: spyderlib/widgets/externalshell/baseshell.py:141
+msgid "Run again this program"
+msgstr "Запустить эту программу снова"
+
+#: spyderlib/widgets/externalshell/baseshell.py:144
+msgid "Kill"
+msgstr "Убить"
+
+#: spyderlib/widgets/externalshell/baseshell.py:146
+msgid "Kills the current process, causing it to exit immediately"
+msgstr "Убивает текущий процесс, заставляя его немедленно завершиться"
+
+#: spyderlib/widgets/externalshell/baseshell.py:172
+#: spyderlib/plugins/externalconsole.py:69
+msgid "Show elapsed time"
+msgstr "Показывать прошедшее время"
+
+#: spyderlib/widgets/externalshell/baseshell.py:219
+msgid "<span style='color: #44AA44'><b>Running...</b></span>"
+msgstr "<span style='color: #44AA44'><b>Запуск...</b></span>"
+
+#: spyderlib/widgets/externalshell/baseshell.py:225
+msgid "Terminated."
+msgstr "Прекращено."
+
+#: spyderlib/widgets/externalshell/baseshell.py:251
+msgid "Command line arguments:"
+msgstr "Аргументы командной строки:"
+
+#: spyderlib/widgets/arraybuilder.py:162
+msgid ""
+"\n"
+"           <b>Numpy Array/Matrix Helper</b><br>\n"
+"           Type an array in Matlab    : <code>[1 2;3 4]</code><br>\n"
+"           or Spyder simplified syntax : <code>1 2;3 4</code>\n"
+"           <br><br>\n"
+"           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.\n"
+"           <br><br>\n"
+"           <b>Hint:</b><br>\n"
+"           Use two spaces or two tabs to generate a ';'.\n"
+"           "
+msgstr ""
+"\n"
+"           <b>Помощник Массивов/Матриц Numpy</b><br>\n"
+"           Введите массив в Matlab-   : <code>[1 2;3 4]</code><br>\n"
+"           или Spyder-стиле : <code>1 2;3 4</code>\n"
+"           <br><br>\n"
+"           Нажмите 'Enter' для массива или 'Ctrl+Enter' для матрицы.\n"
+"           <br><br>\n"
+"           <b>Трюк:</b><br>\n"
+"           Два пробели или две табуляции образуют ';'.\n"
+"           "
+
+#: spyderlib/widgets/arraybuilder.py:173
+msgid ""
+"\n"
+"           <b>Numpy Array/Matrix Helper</b><br>\n"
+"           Enter an array in the table. <br>\n"
+"           Use Tab to move between cells.\n"
+"           <br><br>\n"
+"           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.\n"
+"           <br><br>\n"
+"           <b>Hint:</b><br>\n"
+"           Use two tabs at the end of a row to move to the next row.\n"
+"           "
+msgstr ""
+"\n"
+"           <b>Помощник Массивов/Матриц Numpy</b><br>\n"
+"           Введите массив в таблицу. <br>\n"
+"           Используйте Tab для перемещения по ячейкам.\n"
+"           <br><br>\n"
+"\n"
+"           Нажмите 'Enter' для массива или 'Ctrl+Enter' для матрицы.\n"
+"           <br><br>\n"
+"           <b>Трюк:</b><br>\n"
+"           Две табуляции в конце строки перемещают на следующую строку.\n"
+"           "
+
+#: spyderlib/widgets/arraybuilder.py:337
+msgid "Array dimensions not valid"
+msgstr "Неверная размерность массива"
+
+#: spyderlib/widgets/dependencies.py:59
+msgid "Module"
+msgstr "Модуль"
+
+#: spyderlib/widgets/dependencies.py:59
+msgid " Required "
+msgstr " требуется"
+
+#: spyderlib/widgets/dependencies.py:60
+msgid " Installed "
+msgstr " установлен"
+
+#: spyderlib/widgets/dependencies.py:60
+msgid "Provided features"
+msgstr "Предоставляемые возможности"
+
+#: spyderlib/widgets/dependencies.py:130
+msgid "Dependencies"
+msgstr "Зависимости"
+
+#: spyderlib/widgets/dependencies.py:137
+#, python-format
+msgid ""
+"Spyder depends on several Python modules to provide the right functionality "
+"for all its panes. The table below shows the required and installed versions "
+"(if any) of all of them.<br><br><b>Note</b>: You can safely use Spyder "
+"without the following modules installed: <b>%s</b> and <b>%s</b>"
+msgstr ""
+"Spyder зависит от нескольких модулей Python для обеспечения верной "
+"функциональности всех панелей. В таблице ниже показаны требуемые и "
+"установленные версии (если таковые имеются) каждого из них."
+"<br><br><b>Примечание</b>: Вы можете безопасно работать  в Spyder без "
+"следующих модулей: <b>%s</b> и <b>%s</b>."
+
+#: spyderlib/widgets/dependencies.py:150
+msgid "Copy to clipboard"
+msgstr "Копировать в буфер обмена"
+
+#: spyderlib/widgets/explorer.py:174
+msgid "Edit filename filters..."
+msgstr "Редактировать фильтры имён файлов..."
+
+#: spyderlib/widgets/explorer.py:188
+msgid "Edit filename filters"
+msgstr "Редактировать фильтры имён файлов"
+
+#: spyderlib/widgets/explorer.py:189
+msgid "Name filters:"
+msgstr "Фильтры имён:"
+
+#: spyderlib/widgets/explorer.py:208
+msgid "File..."
+msgstr "Файл..."
+
+#: spyderlib/widgets/explorer.py:212
+msgid "Module..."
+msgstr "Модуль..."
+
+#: spyderlib/widgets/explorer.py:216
+msgid "Folder..."
+msgstr "Каталог..."
+
+#: spyderlib/widgets/explorer.py:220
+msgid "Package..."
+msgstr "Пакет..."
+
+#: spyderlib/widgets/explorer.py:243
+msgid "Move..."
+msgstr "Перемещение..."
+
+#: spyderlib/widgets/explorer.py:246
+msgid "Delete..."
+msgstr "Удаление..."
+
+#: spyderlib/widgets/explorer.py:249
+msgid "Rename..."
+msgstr "Переименование..."
+
+#: spyderlib/widgets/explorer.py:252
+msgid "Open"
+msgstr "Открыть"
+
+# Варинаты:
+# - оставить без перевода
+# - использовать кальку: "коммитить"
+# - воспользоваться переводом из источников про Git (например, книга ProGit): "зафиксирвать изменения/индекс".
+#: spyderlib/widgets/explorer.py:287
+msgid "Commit"
+msgstr ""
+
+#: spyderlib/widgets/explorer.py:290
+msgid "Browse repository"
+msgstr "Просмотр репозитария"
+
+#: spyderlib/widgets/explorer.py:301
+msgid "Open command prompt here"
+msgstr "Открыть командную строку здесь"
+
+#: spyderlib/widgets/explorer.py:303
+msgid "Open terminal here"
+msgstr "Открыть терминал здесь"
+
+#: spyderlib/widgets/explorer.py:308
+msgid "Open Python console here"
+msgstr "Открыть консоль Python здесь"
+
+#: spyderlib/widgets/explorer.py:322
+msgid "New"
+msgstr "Новый"
+
+#: spyderlib/widgets/explorer.py:330
+msgid "Import"
+msgstr "Импортировать"
+
+#: spyderlib/widgets/explorer.py:481
+#, python-format
+msgid "Do you really want to delete <b>%s</b>?"
+msgstr "Вы точно хотите удалить <b>%s</b>?"
+
+#: spyderlib/widgets/explorer.py:499
+msgid "delete"
+msgstr "удалить"
+
+#: spyderlib/widgets/explorer.py:543
+msgid "New name:"
+msgstr "Новое имя:"
+
+#: spyderlib/widgets/explorer.py:551
+#, python-format
+msgid ""
+"Do you really want to rename <b>%s</b> and overwrite the existing file <b>"
+"%s</b>?"
+msgstr ""
+"Вы действительно хотите переименовать <b>%s</b> или перезаписать "
+"существующий файл <b>%s</b>?"
+
+#: spyderlib/widgets/explorer.py:562
+#, python-format
+msgid "<b>Unable to rename file <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно переименовать файл <i>%s</i></b><br><br>Сообщение об ошибке:"
+"<br>%s"
+
+#: spyderlib/widgets/explorer.py:598
+#, python-format
+msgid "<b>Unable to move <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно переместить файл <i>%s</i></b><br><br>Сообщение об ошибке:<br>"
+"%s"
+
+#: spyderlib/widgets/explorer.py:616
+#, python-format
+msgid "<b>Unable to create folder <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно создать каталог <i>%s</i></b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/explorer.py:629 spyderlib/widgets/explorer.py:663
+#, python-format
+msgid "<b>Unable to create file <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Невозможно создать файл <i>%s</i></b><br><br>Сообщение об ошибке:<br>%s"
+
+#: spyderlib/widgets/explorer.py:637
+msgid "New folder"
+msgstr "Новый каталог"
+
+#: spyderlib/widgets/explorer.py:638
+msgid "Folder name:"
+msgstr "Имя каталога:"
+
+#: spyderlib/widgets/explorer.py:643
+msgid "New package"
+msgstr "Новый пакет"
+
+#: spyderlib/widgets/explorer.py:644
+msgid "Package name:"
+msgstr "Имя пакета:"
+
+#: spyderlib/widgets/explorer.py:662 spyderlib/widgets/explorer.py:669
+#: spyderlib/plugins/editor.py:630 spyderlib/plugins/workingdirectory.py:82
+msgid "New file"
+msgstr "Новый файл"
+
+#: spyderlib/widgets/explorer.py:684
+msgid "New module"
+msgstr "Новый модуль"
+
+#: spyderlib/widgets/explorer.py:685 spyderlib/plugins/console.py:232
+#: spyderlib/plugins/externalconsole.py:223
+#: spyderlib/plugins/externalconsole.py:1211
+msgid "Python scripts"
+msgstr "Скрипты Python"
+
+#: spyderlib/widgets/explorer.py:696
+#, python-format
+msgid ""
+"For %s support, please install one of the<br/> following tools:<br/><br/>  %s"
+msgstr ""
+"Для поддержки %s, установите, пожалуйста,<br/> один из следующих "
+"инструментов:<br/><br/>  %s"
+
+#: spyderlib/widgets/explorer.py:700
+#, python-format
+msgid "<b>Unable to find external program.</b><br><br>%s"
+msgstr "<b>Не удалось найти внешнюю программу.</b><br><br>%s"
+
+#: spyderlib/widgets/explorer.py:903
+msgid "Show current directory only"
+msgstr "Показывать только текущий каталог"
+
+#: spyderlib/widgets/explorer.py:1001
+msgid "You don't have the right permissions to open this directory"
+msgstr "У Вас нет прав на открытие этой директории"
+
+#: spyderlib/widgets/explorer.py:1029 spyderlib/plugins/externalconsole.py:70
+msgid "Show icons and text"
+msgstr "Показывать иконки и текст"
+
+#: spyderlib/widgets/explorer.py:1037
+msgid "Parent"
+msgstr "Родительская"
+
+#: spyderlib/widgets/findreplace.py:59
+msgid "Search string"
+msgstr "Найти строку"
+
+#: spyderlib/widgets/findreplace.py:83
+msgid "Case Sensitive"
+msgstr "С учетом регистра"
+
+#: spyderlib/widgets/findreplace.py:89
+msgid "Whole words"
+msgstr "Слова целиком"
+
+#: spyderlib/widgets/findreplace.py:95
+msgid "Highlight matches"
+msgstr "Подсвечивать найденные"
+
+#: spyderlib/widgets/findreplace.py:109
+msgid "Replace with:"
+msgstr "Заменить на:"
+
+#: spyderlib/widgets/findreplace.py:111
+msgid "Replace string"
+msgstr "Заменить строку"
+
+#: spyderlib/widgets/findreplace.py:114
+msgid "Replace/find"
+msgstr "Заменить/найти"
+
+#: spyderlib/widgets/findreplace.py:121
+msgid "Replace all"
+msgstr "Заменить все"
+
+#: spyderlib/widgets/formlayout.py:209 spyderlib/plugins/configdialog.py:612
+msgid "Italic"
+msgstr "Курсив"
+
+#: spyderlib/widgets/formlayout.py:214 spyderlib/plugins/configdialog.py:609
+msgid "Bold"
+msgstr "Жирный"
+
+#: spyderlib/widgets/status.py:23
+msgid "CPU and memory usage info in the status bar"
+msgstr "Информация об использовании ЦП и памяти в строке состояния"
+
+#: spyderlib/widgets/status.py:92
+msgid "Memory:"
+msgstr "Память:"
+
+#: spyderlib/widgets/status.py:93
+msgid ""
+"Memory usage status: requires the `psutil` (>=v0.3) library on non-Windows "
+"platforms"
+msgstr ""
+"Состояние использования памяти: требуется библиотека `psutil` (>=v0.3) на не-"
+"Windows платформах"
+
+#: spyderlib/widgets/status.py:105
+msgid "CPU:"
+msgstr "ЦП:"
+
+#: spyderlib/widgets/status.py:106
+msgid "CPU usage status: requires the `psutil` (>=v0.3) library"
+msgstr "Состояние использования ЦП: требуется библиотека `psutil` (>=v0.3)"
+
+#: spyderlib/widgets/status.py:128
+msgid "Permissions:"
+msgstr "Доступ:"
+
+#: spyderlib/widgets/status.py:142
+msgid "End-of-lines:"
+msgstr "Конец строки:"
+
+#: spyderlib/widgets/status.py:156
+msgid "Encoding:"
+msgstr "Кодировка:"
+
+#: spyderlib/widgets/status.py:169
+msgid "Line:"
+msgstr "Строка:"
+
+#: spyderlib/widgets/status.py:173
+msgid "Column:"
+msgstr "Столбец:"
+
+#: spyderlib/widgets/browser.py:131
+msgid "Home"
+msgstr "Домой"
+
+#: spyderlib/widgets/browser.py:166
+msgid "Find text"
+msgstr "Найти текст"
+
+#: spyderlib/widgets/browser.py:184
+msgid "Address:"
+msgstr "Адрес:"
+
+#: spyderlib/widgets/browser.py:220
+msgid "Unable to load page"
+msgstr "Не удалось загрузить страницу"
+
+#: spyderlib/plugins/configdialog.py:139
+msgid "Reset to defaults"
+msgstr "Восстановить значения по умолчанию"
+
+#: spyderlib/plugins/configdialog.py:151
+msgid "Preferences"
+msgstr "Параметры"
+
+#: spyderlib/plugins/configdialog.py:487
+msgid "Invalid directory path"
+msgstr "Неверный путь каталога"
+
+#: spyderlib/plugins/configdialog.py:517
+msgid "Invalid file path"
+msgstr "Неверный путь файла"
+
+#: spyderlib/plugins/configdialog.py:520 spyderlib/plugins/configdialog.py:537
+msgid "Select file"
+msgstr "Выберите файл"
+
+#: spyderlib/plugins/configdialog.py:536
+msgid "All files (*)"
+msgstr "Все файлы (*)"
+
+#: spyderlib/plugins/configdialog.py:666
+msgid "Font: "
+msgstr "Шрифт: "
+
+#: spyderlib/plugins/configdialog.py:672
+msgid "Size: "
+msgstr "Размер: "
+
+#: spyderlib/plugins/configdialog.py:691
+msgid "Font style"
+msgstr "Стиль шрифта"
+
+#: spyderlib/plugins/configdialog.py:751
+msgid "Spyder needs to restart to change the following setting:"
+msgstr "Необходим перезапуск Spyder для изменения параметра:"
+
+#: spyderlib/plugins/configdialog.py:754
+msgid "Spyder needs to restart to change the following settings:"
+msgstr "Необходим перезапуск Spyder для изменения настроек:"
+
+#: spyderlib/plugins/configdialog.py:756
+msgid "Do you wish to restart now?"
+msgstr "Хотите выполнить перезапуск сейчас?"
+
+#: spyderlib/plugins/configdialog.py:762
+msgid "Information"
+msgstr "Информация"
+
+#: spyderlib/plugins/configdialog.py:777 spyderlib/plugins/configdialog.py:784
+msgid "General"
+msgstr "Основные"
+
+#: spyderlib/plugins/configdialog.py:787
+msgid "Language"
+msgstr "Язык"
+
+#: spyderlib/plugins/configdialog.py:790
+msgid "Use a single instance"
+msgstr "Запускать только одну копию"
+
+#: spyderlib/plugins/configdialog.py:792
+msgid ""
+"Set this to open external<br> Python files in an already running instance "
+"(Requires a restart)"
+msgstr ""
+"Отметьте для открытия внешних<br> файлов Python в уже запущенном окружении "
+"(требуется перезапуск)"
+
+#: spyderlib/plugins/configdialog.py:795
+msgid "Prompt when exiting"
+msgstr "Спрашиваить подтверждение при закрытии"
+
+#: spyderlib/plugins/configdialog.py:796
+msgid "Pop up internal console when internal errors appear"
+msgstr "Переходить во встроенную консоль при появлении внутренних ошибок"
+
+#: spyderlib/plugins/configdialog.py:816 spyderlib/plugins/editor.py:105
+#: spyderlib/plugins/ipythonconsole.py:158
+#: spyderlib/plugins/externalconsole.py:66
+msgid "Interface"
+msgstr "Интерфейс"
+
+#: spyderlib/plugins/configdialog.py:824
+msgid "Qt windows style"
+msgstr "Стиль окон Qt"
+
+#: spyderlib/plugins/configdialog.py:830
+msgid "Icon theme"
+msgstr "Тема значков"
+
+#: spyderlib/plugins/configdialog.py:834
+msgid "Vertical title bars in panes"
+msgstr "Названия плавающих окон - вертикально"
+
+#: spyderlib/plugins/configdialog.py:836
+msgid "Vertical tabs in panes"
+msgstr "Вертикальные вкладки на плавающих окнах"
+
+#: spyderlib/plugins/configdialog.py:838
+msgid "Animated toolbars and panes"
+msgstr "Анимировать панели инструментов и плавающие окна"
+
+#: spyderlib/plugins/configdialog.py:840
+msgid "Tear off menus"
+msgstr "Открепляемые меню"
+
+#: spyderlib/plugins/configdialog.py:841
+msgid "Set this to detach any<br> menu from the main window"
+msgstr "Отметьте для возможности отделить<br> любое меню от главного окна"
+
+#: spyderlib/plugins/configdialog.py:843
+msgid "Custom margin for panes:"
+msgstr "Настроить отступы панелей:"
+
+#: spyderlib/plugins/configdialog.py:873
+msgid "Status bar"
+msgstr "Панель состояния"
+
+#: spyderlib/plugins/configdialog.py:874
+msgid "Show status bar"
+msgstr "Показывать панель состояния"
+
+#: spyderlib/plugins/configdialog.py:876
+msgid "Show memory usage every"
+msgstr "Показывать использование памяти каждые"
+
+#: spyderlib/plugins/configdialog.py:885
+msgid "Show CPU usage every"
+msgstr "Показывать загрузку ЦП каждые"
+
+#: spyderlib/plugins/configdialog.py:920
+msgid "Plain text font"
+msgstr "Шрифт текста"
+
+#: spyderlib/plugins/configdialog.py:926
+msgid "Rich text font"
+msgstr "Шрифт форматированного текста"
+
+#: spyderlib/plugins/configdialog.py:929
+msgid "Fonts"
+msgstr "Шрифты"
+
+#: spyderlib/plugins/configdialog.py:943
+msgid "Appearance"
+msgstr "Внешний вид"
+
+#: spyderlib/plugins/configdialog.py:945
+#: spyderlib/plugins/ipythonconsole.py:465
+msgid "Advanced Settings"
+msgstr "Дополнительные параметры"
+
+#: spyderlib/plugins/configdialog.py:981
+msgid "Syntax coloring"
+msgstr "Подсветка синтаксиса"
+
+#: spyderlib/plugins/configdialog.py:993
+msgid ""
+"Here you can select the color scheme used in the Editor and all other Spyder "
+"plugins.<br><br>You can also edit the color schemes provided by Spyder or "
+"create your own ones by using the options provided below.<br>"
+msgstr ""
+"Здесь можно выбрать цветовую схему, используемую в Редакторе и всех других "
+"модулях Spyder.<br><br>Вы можете редактировать цветовые схемы, предлагаемые "
+"Spyder, или создать новую с помощью опций, приведённых ниже."
+
+#: spyderlib/plugins/configdialog.py:998
+msgid "Edit selected"
+msgstr "Редактировать выбранную"
+
+#: spyderlib/plugins/configdialog.py:999
+msgid "Create new scheme"
+msgstr "Создать новую схему"
+
+#: spyderlib/plugins/configdialog.py:1003
+msgid "Reset"
+msgstr "Восстановить"
+
+#: spyderlib/plugins/configdialog.py:1010
+msgid "Scheme:"
+msgstr "Схема: "
+
+#: spyderlib/plugins/configdialog.py:1041
+msgid "Manage color schemes"
+msgstr "Настроить цветовые схемы"
+
+#: spyderlib/plugins/configdialog.py:1230
+msgid "Are you sure you want to delete this scheme?"
+msgstr "Вы уверены, что хотите удалить цветовую схему?"
+
+#: spyderlib/plugins/configdialog.py:1347
+msgid "Text"
+msgstr "Текст"
+
+#: spyderlib/plugins/configdialog.py:1349
+msgid "Highlight"
+msgstr "Подсветка"
+
+#: spyderlib/plugins/configdialog.py:1351
+msgid "Background"
+msgstr "Фон"
+
+#: spyderlib/plugins/configdialog.py:1355
+msgid "Scheme name:"
+msgstr "Название схемы:"
+
+#: spyderlib/plugins/configdialog.py:1362
+msgid "Color scheme editor"
+msgstr "Редактор цветовой схемы"
+
+#: spyderlib/plugins/editor.py:102
+msgid "Edit template for new modules"
+msgstr "Редактировать шаблон для новых модулей"
+
+#: spyderlib/plugins/editor.py:107
+msgid "Sort files according to full path"
+msgstr "Сортировать файлы по полному пути"
+
+#: spyderlib/plugins/editor.py:109
+msgid "Show tab bar"
+msgstr "Показывать панель вкладок"
+
+#: spyderlib/plugins/editor.py:116 spyderlib/plugins/editor.py:187
+#: spyderlib/plugins/help.py:161 spyderlib/plugins/ipythonconsole.py:202
+#: spyderlib/plugins/history.py:41 spyderlib/plugins/externalconsole.py:80
+#: spyderlib/plugins/externalconsole.py:123
+msgid "Source code"
+msgstr "Исходный код"
+
+#: spyderlib/plugins/editor.py:117
+msgid "Show line numbers"
+msgstr "Показывать номера строк"
+
+#: spyderlib/plugins/editor.py:118 spyderlib/plugins/editor.py:931
+msgid "Show blank spaces"
+msgstr "Показывать отступы"
+
+#: spyderlib/plugins/editor.py:119
+msgid "Show vertical line after"
+msgstr "Рисовать вертикальную линию после"
+
+#: spyderlib/plugins/editor.py:120
+msgid "characters"
+msgstr "символов"
+
+#: spyderlib/plugins/editor.py:125
+msgid "Highlight current line"
+msgstr "Подсвечивать текущую строку"
+
+#: spyderlib/plugins/editor.py:127
+msgid "Highlight current cell"
+msgstr "Подсвечивать текущий блок"
+
+#: spyderlib/plugins/editor.py:129
+msgid "Highlight occurrences after"
+msgstr "Подсвечивать вхождения слова через"
+
+#: spyderlib/plugins/editor.py:137 spyderlib/plugins/help.py:162
+#: spyderlib/plugins/help.py:364 spyderlib/plugins/console.py:162
+#: spyderlib/plugins/history.py:42 spyderlib/plugins/history.py:154
+#: spyderlib/plugins/externalconsole.py:85
+msgid "Wrap lines"
+msgstr "Переносить строки"
+
+#: spyderlib/plugins/editor.py:157
+msgid "Save all files before running script"
+msgstr "Сохранить все файлы перед выполнением скрипта"
+
+#: spyderlib/plugins/editor.py:160
+msgid "Run selection"
+msgstr "Выполнить выделение"
+
+#: spyderlib/plugins/editor.py:161
+msgid "Maintain focus in the Editor after running cells or selections"
+msgstr "Сохранять фокус в Редакторе после запуска блоков или выделений"
+
+#: spyderlib/plugins/editor.py:164 spyderlib/plugins/externalconsole.py:329
+msgid "Introspection"
+msgstr "Интроспекция"
+
+#: spyderlib/plugins/editor.py:167 spyderlib/plugins/console.py:169
+#: spyderlib/plugins/externalconsole.py:124
+msgid "Automatic code completion"
+msgstr "Автоматическое дополнение кода"
+
+#: spyderlib/plugins/editor.py:169 spyderlib/plugins/externalconsole.py:126
+msgid "Case sensitive code completion"
+msgstr "Чувствительное к регистру автодополнение"
+
+#: spyderlib/plugins/editor.py:171 spyderlib/plugins/console.py:173
+#: spyderlib/plugins/externalconsole.py:128
+msgid "Enter key selects completion"
+msgstr "Клавиша Enter выбирает автодополнение"
+
+#: spyderlib/plugins/editor.py:173 spyderlib/plugins/ipythonconsole.py:168
+#: spyderlib/plugins/console.py:165 spyderlib/plugins/externalconsole.py:130
+msgid "Display balloon tips"
+msgstr "Показывать всплывающие подсказки"
+
+#: spyderlib/plugins/editor.py:174
+msgid "Link to object definition"
+msgstr "Ссылка на место определения объекта"
+
+#: spyderlib/plugins/editor.py:176
+msgid ""
+"If this option is enabled, clicking on an object\n"
+"name (left-click + Ctrl key) will go this object\n"
+"definition (if resolved)."
+msgstr ""
+"Если эта опция активна, при нажатии на имя объекта\n"
+"(левая кнопка мыши + клавиша Ctrl) произойдёт\n"
+"переход в место его определения (если возможно)."
+
+#: spyderlib/plugins/editor.py:180
+msgid ""
+"<b>Warning:</b><br>The Python module <i>rope</i> is not installed on this "
+"computer: calltips, code completion and go-to-definition features won't be "
+"available."
+msgstr ""
+"<b>Предупреждение:</b><br>Модуль Python <i>rope</i> не установлен на этом "
+"компьютере: подсказки вызова функций, автодополнение кода и переход к "
+"определению будут недоступны."
+
+#: spyderlib/plugins/editor.py:188
+msgid "Automatic insertion of parentheses, braces and brackets"
+msgstr "Автоматическая вставка круглых, фигурных и квадратных скобок"
+
+#: spyderlib/plugins/editor.py:191
+msgid "Automatic insertion of closing quotes"
+msgstr "Автоматическая вставка закрывающих кавычек"
+
+#: spyderlib/plugins/editor.py:193
+msgid "Automatic insertion of colons after 'for', 'if', 'def', etc"
+msgstr "Автоматическая вставка двоеточия после 'for', 'if', 'def' и т.п."
+
+#: spyderlib/plugins/editor.py:196
+msgid "Automatic indentation after 'else', 'elif', etc."
+msgstr "Автоматическая вставка отступа после 'else', 'elif' и т.п."
+
+#: spyderlib/plugins/editor.py:198
+msgid "Indentation characters: "
+msgstr "Символы отступа: "
+
+#: spyderlib/plugins/editor.py:199
+msgid "2 spaces"
+msgstr "2 пробела"
+
+#: spyderlib/plugins/editor.py:200
+msgid "3 spaces"
+msgstr "3 пробела"
+
+#: spyderlib/plugins/editor.py:201
+msgid "4 spaces"
+msgstr "4 пробела"
+
+#: spyderlib/plugins/editor.py:202
+msgid "5 spaces"
+msgstr "5 пробелов"
+
+#: spyderlib/plugins/editor.py:203
+msgid "6 spaces"
+msgstr "6 пробелов"
+
+#: spyderlib/plugins/editor.py:204
+msgid "7 spaces"
+msgstr "7 пробелов"
+
+#: spyderlib/plugins/editor.py:205
+msgid "8 spaces"
+msgstr "8 пробелов"
+
+#: spyderlib/plugins/editor.py:206
+msgid "Tabulations"
+msgstr "Отступы"
+
+#: spyderlib/plugins/editor.py:207
+msgid "Tab stop width:"
+msgstr "Ширина табуляции:"
+
+#: spyderlib/plugins/editor.py:207
+msgid "pixels"
+msgstr "пикселей"
+
+#: spyderlib/plugins/editor.py:209
+msgid "Tab always indent"
+msgstr "Клавиша Tab - всегда отступ"
+
+#: spyderlib/plugins/editor.py:211
+msgid ""
+"If enabled, pressing Tab will always indent,\n"
+"even when the cursor is not at the beginning\n"
+"of a line (when this option is enabled, code\n"
+"completion may be triggered using the alternate\n"
+"shortcut: Ctrl+Space)"
+msgstr ""
+"Если активно, нажатие Tab будет делать отступ\n"
+"всегда, даже когда курсор не в начале строки\n"
+"(когда эта опция включена, автодополнение\n"
+"кода можно будет включить альтернативной\n"
+"комбинацией: Ctrl+Space)"
+
+#: spyderlib/plugins/editor.py:216
+msgid "Intelligent backspace"
+msgstr "Умная клавиша backspace"
+
+#: spyderlib/plugins/editor.py:218
+msgid "Automatically remove trailing spaces when saving files"
+msgstr ""
+"Автоматически удалять лишние пробелы в конце строк при сохранении файлов"
+
+#: spyderlib/plugins/editor.py:222
+msgid "Analysis"
+msgstr "Анализ"
+
+#: spyderlib/plugins/editor.py:224
+msgid "<i>(Refer to the {} page)</i>"
+msgstr "<i>(смотреть стр. {})</i>"
+
+#: spyderlib/plugins/editor.py:228
+msgid "Real-time code analysis"
+msgstr "Анализ кода в реальном времени"
+
+#: spyderlib/plugins/editor.py:230
+msgid ""
+"<p>If enabled, Python source code will be analyzed using pyflakes, lines "
+"containing errors or warnings will be highlighted.</p><p><u>Note</u>: add "
+"<b>analysis:ignore</b> in a comment to ignore code analysis warnings.</p>"
+msgstr ""
+"<p>Если активно, код Python будет анализироваться с помощью pyflakes, строки "
+"с ошибками или предупреждениями будут подсвечены.</p><p><u>Примечание</u>: "
+"добавьте <b>analysis:ignore</b> в комментарий, чтобы игнорировать "
+"предупреждения анализатора кода.</p>"
+
+#: spyderlib/plugins/editor.py:238
+#, python-format
+msgid "Code analysis requires pyflakes %s+"
+msgstr "Для анализа кода требуется pyflakes %s+"
+
+#: spyderlib/plugins/editor.py:240
+msgid "Real-time code style analysis"
+msgstr "Анализ стиля кода в реальном времени"
+
+#: spyderlib/plugins/editor.py:242
+msgid ""
+"<p>If enabled, Python source code will be analyzedusing pep8, lines that are "
+"not following PEP8 style guide will be highlighted.</p><p><u>Note</u>: add "
+"<b>analysis:ignore</b> in a comment to ignore style analysis warnings.</p>"
+msgstr ""
+"<p>Если активно, код Python будет анализироваться с помощью pep8, строки не "
+"соответсвующие стилю PEP8, будут подсвечены.</p><p><u>Примечание</u>: "
+"добавьте <b>analysis:ignore</b> в комментарий, чтобы игнорировать "
+"предупреждения анализатора стиля.</p>"
+
+#: spyderlib/plugins/editor.py:249
+msgid "Code annotations (TODO, FIXME, XXX, HINT, TIP, @todo)"
+msgstr "Аннотации кода (TODO, FIXME, XXX, HINT, TIP, @todo)"
+
+#: spyderlib/plugins/editor.py:252
+msgid "Perform analysis when saving file and every"
+msgstr "Выполнять анализ при сохранении файла и каждые"
+
+#: spyderlib/plugins/editor.py:256
+msgid "Perform analysis only when saving file"
+msgstr "Выполнять анализ только при сохранении файла"
+
+#: spyderlib/plugins/editor.py:315
+msgid "End-of-line characters"
+msgstr "Символы конца строки"
+
+#: spyderlib/plugins/editor.py:316
+msgid ""
+"When opening a text file containing mixed end-of-line characters (this may "
+"raise syntax errors in the consoles on Windows platforms), Spyder may fix "
+"the file automatically."
+msgstr ""
+"Когда открывается текстовый файл, содержащий смешанные символы конца строки "
+"(это может увеличить число синтаксических ошибок в консолях на платформах "
+"Windows), Spyder может исправить файл автоматически."
+
+#: spyderlib/plugins/editor.py:322
+msgid "Fix automatically and show warning message box"
+msgstr "Автоматически исправлять и показывать окно предупреждений"
+
+#: spyderlib/plugins/editor.py:333 spyderlib/plugins/ipythonconsole.py:459
+#: spyderlib/plugins/variableexplorer.py:41
+#: spyderlib/plugins/externalconsole.py:327
+msgid "Display"
+msgstr "Отображение"
+
+#: spyderlib/plugins/editor.py:335
+msgid "Code Introspection/Analysis"
+msgstr "Интроспекция/анализ кода"
+
+#: spyderlib/plugins/editor.py:338 spyderlib/plugins/externalconsole.py:331
+msgid "Advanced settings"
+msgstr "Дополнительные настройки"
+
+#: spyderlib/plugins/editor.py:621
+msgid "Show/hide project explorer"
+msgstr "Показать/скрыть менеджер проектов"
+
+#: spyderlib/plugins/editor.py:629
+msgid "&New file..."
+msgstr "&Новый файл"
+
+#: spyderlib/plugins/editor.py:637
+msgid "&Open..."
+msgstr "&Открыть"
+
+#: spyderlib/plugins/editor.py:638 spyderlib/plugins/editor.py:1683
+#: spyderlib/plugins/workingdirectory.py:69
+msgid "Open file"
+msgstr "Открыть файл"
+
+#: spyderlib/plugins/editor.py:647
+msgid "Fast switch between files"
+msgstr "Быстрое переключение между файлами"
+
+#: spyderlib/plugins/editor.py:652
+msgid "&Revert"
+msgstr "За&грузить заново"
+
+#: spyderlib/plugins/editor.py:653
+msgid "Revert file from disk"
+msgstr "Загрузить файл с диска"
+
+#: spyderlib/plugins/editor.py:656
+msgid "&Save"
+msgstr "&Сохранить"
+
+#: spyderlib/plugins/editor.py:664
+msgid "Sav&e all"
+msgstr "Сохранить &все"
+
+#: spyderlib/plugins/editor.py:665
+msgid "Save all files"
+msgstr "Сохранить все файлы"
+
+#: spyderlib/plugins/editor.py:673
+msgid "Save &as..."
+msgstr "Сохранить &как..."
+
+#: spyderlib/plugins/editor.py:674
+msgid "Save current file as..."
+msgstr "Сохранить текущий файл как..."
+
+#: spyderlib/plugins/editor.py:678 spyderlib/plugins/editor.py:679
+msgid "Print preview..."
+msgstr "Предварительный просмотр..."
+
+#: spyderlib/plugins/editor.py:680
+msgid "&Print..."
+msgstr "&Печать"
+
+#: spyderlib/plugins/editor.py:681
+msgid "Print current file..."
+msgstr "Печатать текущий файл"
+
+#: spyderlib/plugins/editor.py:684
+msgid "&Close"
+msgstr "&Закрыть"
+
+#: spyderlib/plugins/editor.py:685
+msgid "Close current file"
+msgstr "Закрыть текущий файл"
+
+#: spyderlib/plugins/editor.py:688
+msgid "C&lose all"
+msgstr "Закрыть вс&е"
+
+#: spyderlib/plugins/editor.py:689
+msgid "Close all opened files"
+msgstr "Закрыть все открытые файлы"
+
+#: spyderlib/plugins/editor.py:696
+msgid "Set/Clear breakpoint"
+msgstr "Поставить/Убрать точку останова"
+
+#: spyderlib/plugins/editor.py:703
+msgid "Set/Edit conditional breakpoint"
+msgstr "Поставить/Редактировать условную точку останова"
+
+#: spyderlib/plugins/editor.py:710
+msgid "Clear breakpoints in all files"
+msgstr "Очистить точки останова во всех файлах"
+
+#: spyderlib/plugins/editor.py:712
+msgid "Breakpoints"
+msgstr "Точки останова"
+
+#: spyderlib/plugins/editor.py:716
+msgid "Debug with winpdb"
+msgstr "Отладка с помощью winpdb"
+
+#: spyderlib/plugins/editor.py:724
+msgid "Debug file"
+msgstr "Отладка файла"
+
+#: spyderlib/plugins/editor.py:728
+msgid "Step"
+msgstr "Шаг"
+
+#: spyderlib/plugins/editor.py:729
+msgid "Run current line"
+msgstr "Выполнить текущую строку"
+
+#: spyderlib/plugins/editor.py:735
+msgid "Continue"
+msgstr "Продолжить"
+
+#: spyderlib/plugins/editor.py:736
+msgid "Continue execution until next breakpoint"
+msgstr "Продолжить выполнение до следующей точки останова"
+
+#: spyderlib/plugins/editor.py:743
+msgid "Step Into"
+msgstr "Шаг в функцию"
+
+#: spyderlib/plugins/editor.py:744
+msgid "Step into function or method of current line"
+msgstr "Войти в функцию или метод текущей линии"
+
+#: spyderlib/plugins/editor.py:751
+msgid "Step Return"
+msgstr "Шаг из функции"
+
+#: spyderlib/plugins/editor.py:752
+msgid "Run until current function or method returns"
+msgstr "Выполнять пока функция или метод не завершатся"
+
+#: spyderlib/plugins/editor.py:759
+msgid "Exit"
+msgstr "Выход"
+
+#: spyderlib/plugins/editor.py:760
+msgid "Exit Debug"
+msgstr "Завершить отладку"
+
+#: spyderlib/plugins/editor.py:771
+msgid "Debugging control"
+msgstr "Управление отладкой"
+
+#: spyderlib/plugins/editor.py:776
+msgid "Run file"
+msgstr "Выполнить файл"
+
+#: spyderlib/plugins/editor.py:781
+msgid "&Configure..."
+msgstr "&Настроить"
+
+#: spyderlib/plugins/editor.py:791
+msgid "Re-run &last script"
+msgstr "Перезапустить последний скрипт"
+
+#: spyderlib/plugins/editor.py:793
+msgid "Run again last file"
+msgstr "Выполнить снова последний файл"
+
+#: spyderlib/plugins/editor.py:803
+msgid "Run selection or current line"
+msgstr "Выполнить выделенное или текущую строку"
+
+#: spyderlib/plugins/editor.py:819
+#, python-format
+msgid ""
+"Run current cell (Ctrl+Enter)\n"
+"[Use #%% to create cells]"
+msgstr ""
+"Выполнить текущий блок (Ctrl+Enter)\n"
+"[Используйте #%% для создания блоков]"
+
+#: spyderlib/plugins/editor.py:827
+msgid "Run current cell and go to the next one (Shift+Enter)"
+msgstr "Выполнить текущий блок и перейти к следующему (Shift+Enter)"
+
+#: spyderlib/plugins/editor.py:833
+msgid "Show todo list"
+msgstr "Показать список задач"
+
+#: spyderlib/plugins/editor.py:834
+msgid "Show TODO/FIXME/XXX/HINT/TIP/@todo comments list"
+msgstr "Показать список комментариев TODO/FIXME/XXX/HINT/TIP/@todo"
+
+#: spyderlib/plugins/editor.py:841
+msgid "Show warning/error list"
+msgstr "Показать список предупреждений/ошибок"
+
+#: spyderlib/plugins/editor.py:842
+msgid "Show code analysis warnings/errors"
+msgstr "Показать предупреждения/ошибки анализа кода"
+
+#: spyderlib/plugins/editor.py:848
+msgid "Previous warning/error"
+msgstr "Предыдущее предупреждение/ошибка"
+
+#: spyderlib/plugins/editor.py:849
+msgid "Go to previous code analysis warning/error"
+msgstr "Перейти к предыдущему предупреждению/ошибке анализа кода"
+
+#: spyderlib/plugins/editor.py:852
+msgid "Next warning/error"
+msgstr "Следующее предупреждение/ошибка"
+
+#: spyderlib/plugins/editor.py:853
+msgid "Go to next code analysis warning/error"
+msgstr "Перейти к следующему предупреждению/ошибке анализа кода"
+
+#: spyderlib/plugins/editor.py:857
+msgid "Last edit location"
+msgstr "Последнее место редактирования"
+
+#: spyderlib/plugins/editor.py:858
+msgid "Go to last edit location"
+msgstr "Перейти к последнему месту редактирования"
+
+#: spyderlib/plugins/editor.py:864
+msgid "Previous cursor position"
+msgstr "Предыдущая позиция курсора"
+
+#: spyderlib/plugins/editor.py:865
+msgid "Go to previous cursor position"
+msgstr "Перейти к предыдущей позиции курсора"
+
+#: spyderlib/plugins/editor.py:871
+msgid "Next cursor position"
+msgstr "Следующая позиция курсора"
+
+#: spyderlib/plugins/editor.py:872
+msgid "Go to next cursor position"
+msgstr "Перейти к следующей позиции курсора"
+
+#: spyderlib/plugins/editor.py:880
+msgid "Comment current line or selection"
+msgstr "Комментировать текущую строку/выделение"
+
+#: spyderlib/plugins/editor.py:884
+msgid "Add &block comment"
+msgstr "Добавить &блок комментариев"
+
+#: spyderlib/plugins/editor.py:885
+msgid "Add block comment around current line or selection"
+msgstr "Добавить блок комментариев вокруг текущей строки/выделения"
+
+#: spyderlib/plugins/editor.py:891
+msgid "R&emove block comment"
+msgstr "У&далить блок комментариев"
+
+#: spyderlib/plugins/editor.py:892
+msgid "Remove comment block around current line or selection"
+msgstr "Убрать блок комментариев вокруг текущей строки/выделения"
+
+#: spyderlib/plugins/editor.py:903
+msgid "Indent"
+msgstr "Добавить отступ"
+
+#: spyderlib/plugins/editor.py:904
+msgid "Indent current line or selection"
+msgstr "Добавить отступ к текущей строке или выделению"
+
+#: spyderlib/plugins/editor.py:907
+msgid "Unindent"
+msgstr "Убрать отступ"
+
+#: spyderlib/plugins/editor.py:908
+msgid "Unindent current line or selection"
+msgstr "Убрать отступ у текущей строки/выделения"
+
+#: spyderlib/plugins/editor.py:913
+msgid "Carriage return and line feed (Windows)"
+msgstr "Возврат каретки и перевод строки (Windows)"
+
+#: spyderlib/plugins/editor.py:916
+msgid "Line feed (UNIX)"
+msgstr "Перевод строки (UNIX)"
+
+#: spyderlib/plugins/editor.py:919
+msgid "Carriage return (Mac)"
+msgstr "Возврат каретки (Mac)"
+
+#: spyderlib/plugins/editor.py:925
+msgid "Convert end-of-line characters"
+msgstr "Преобразовать символы конца строки"
+
+#: spyderlib/plugins/editor.py:929
+msgid "Remove trailing spaces"
+msgstr "Удалить лишние пробелы в конце строк"
+
+#: spyderlib/plugins/editor.py:933
+msgid "Fix indentation"
+msgstr "Исправить отступы"
+
+#: spyderlib/plugins/editor.py:934
+msgid "Replace tab characters by space characters"
+msgstr "Заменить символы табуляции пробелами"
+
+#: spyderlib/plugins/editor.py:937
+msgid "Go to line..."
+msgstr "Перейти к строке..."
+
+#: spyderlib/plugins/editor.py:945
+msgid "Set console working directory"
+msgstr "Установить рабочий каталог консоли"
+
+#: spyderlib/plugins/editor.py:947
+msgid ""
+"Set current console (and file explorer) working directory to current script "
+"directory"
+msgstr ""
+"Установить каталог текущего скрипта как рабочий для текущей консоли (и "
+"файлового менеджера) "
+
+#: spyderlib/plugins/editor.py:952
+msgid "Maximum number of recent files..."
+msgstr "Максимальное количество недавних файлов..."
+
+#: spyderlib/plugins/editor.py:955
+msgid "Clear this list"
+msgstr "Очистить этот список"
+
+#: spyderlib/plugins/editor.py:955
+msgid "Clear recent files list"
+msgstr "Очистить список недавних файлов"
+
+#: spyderlib/plugins/editor.py:957
+msgid "Open &recent"
+msgstr "Открыть не&давние"
+
+#: spyderlib/plugins/editor.py:1263
+msgid "?"
+msgstr "?"
+
+#: spyderlib/plugins/editor.py:1490
+msgid "Spyder Editor"
+msgstr "Редактор Spyder"
+
+#: spyderlib/plugins/editor.py:1491
+msgid "This is a temporary script file."
+msgstr "Это временный скриптовый файл."
+
+#: spyderlib/plugins/editor.py:1559
+msgid "untitled"
+msgstr "untitled"
+
+#: spyderlib/plugins/editor.py:1637
+msgid "Maximum number of recent files"
+msgstr "Максимальное количество недавних файлов"
+
+#: spyderlib/plugins/editor.py:1768
+msgid "Printing..."
+msgstr "Печать..."
+
+#: spyderlib/plugins/help.py:42
+msgid "Show help for objects in the Editor and Consoles in a dedicated pane"
+msgstr ""
+"Показывать справку об объектах в Редакторе и Консолях в специальной панели"
+
+#: spyderlib/plugins/help.py:115
+msgid "Automatic connections"
+msgstr "Автоматические соединения"
+
+#: spyderlib/plugins/help.py:116
+msgid ""
+"This pane can automatically show an object's help information after a left "
+"parenthesis is written next to it. Below you can decide to which plugin you "
+"want to connect it to turn on this feature."
+msgstr ""
+"Инспектор объектов может автоматически показывать справочную информацию по "
+"объекту после ввода открывающей круглой скобки вслед за ним. Ниже вы можете "
+"решить, какой модуль вы хотите подключить, чтобы включить эту возможность."
+
+#: spyderlib/plugins/help.py:128
+msgid ""
+"This feature requires the Rope or Jedi libraries.\n"
+"It seems you don't have either installed."
+msgstr ""
+"Эта функция требует библиотеки Rope или Jedi.\n"
+"Похоже, Вы их не установили."
+
+#: spyderlib/plugins/help.py:131
+msgid "Python Console"
+msgstr "Консоль Python"
+
+#: spyderlib/plugins/help.py:133
+msgid "IPython Console"
+msgstr "Консоль IPython"
+
+#: spyderlib/plugins/help.py:145
+msgid "Additional features"
+msgstr "Дополнительные возможности"
+
+#: spyderlib/plugins/help.py:146
+msgid "Render mathematical equations"
+msgstr "Отрисовывать математические выражения"
+
+#: spyderlib/plugins/help.py:152
+msgid "This feature requires Sphinx 1.1 or superior."
+msgstr "Эта возможность требует Sphinx 1.1 или выше."
+
+#: spyderlib/plugins/help.py:153
+#, python-format
+msgid "Sphinx %s is currently installed."
+msgstr "Sphinx %s на данный момент установлено."
+
+#: spyderlib/plugins/help.py:351
+msgid "No further documentation available"
+msgstr "Дополнительная документация отсутствует"
+
+#: spyderlib/plugins/help.py:384
+msgid "Source"
+msgstr "Исходник"
+
+#: spyderlib/plugins/help.py:413
+msgid "Plain Text"
+msgstr "Простой текст"
+
+#: spyderlib/plugins/help.py:417
+msgid "Show Source"
+msgstr "Показать исходник"
+
+#: spyderlib/plugins/help.py:421
+msgid "Rich Text"
+msgstr "Форматированный текст"
+
+#: spyderlib/plugins/help.py:431
+msgid "Automatic import"
+msgstr "Автоматический импорт"
+
+#: spyderlib/plugins/help.py:700
+#, python-format
+msgid ""
+"Here you can get help of any object by pressing %s in front of it, either on "
+"the Editor or the Console.%sHelp can also be shown automatically after "
+"writing a left parenthesis next to an object. You can activate this behavior "
+"in %s."
+msgstr ""
+"Здесь Вы можете получить справку по любому объекту, наведя текстовый курсор "
+"на него и нажав %s, как в Редакторе, так и в Консоли.%sСправка также может "
+"автоматически показываться при вводе открывающей круглой скобки после "
+"объекта. Вы можете активировать эту возможность в %s."
+
+#: spyderlib/plugins/help.py:706
+msgid "Preferences > Help"
+msgstr "Параметры > Справка"
+
+#: spyderlib/plugins/help.py:713
+msgid "Usage"
+msgstr "Использование"
+
+#: spyderlib/plugins/help.py:714
+msgid "New to Spyder? Read our"
+msgstr "Используете Spyder впервые? Прочитайте наше"
+
+#: spyderlib/plugins/help.py:715
+msgid "tutorial"
+msgstr "руководство"
+
+#: spyderlib/plugins/help.py:722
+msgid ""
+"Please consider installing Sphinx to get documentation rendered in rich text."
+msgstr ""
+"Пожалуйста, подумайте об установке Sphinx для просмотра документации в "
+"форматированном виде."
+
+#: spyderlib/plugins/help.py:895
+msgid "Unlock"
+msgstr "Разблокировать"
+
+#: spyderlib/plugins/help.py:895
+msgid "Lock"
+msgstr "Заблокировать"
+
+#: spyderlib/plugins/help.py:941
+#, python-format
+msgid ""
+"The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible "
+"Sphinx version or doc string decoding failed.<br><br>Error message:<br>%s"
+msgstr ""
+"Следующая ошибка появляется при вызове <b>Sphinx %s</b>. <br>Несовместимая "
+"версия Sphinx или ошибка декодирования строки документации.<br><br>Сообщение "
+"об ошибке:<br>%s"
+
+#: spyderlib/plugins/help.py:985
+msgid "No source code available."
+msgstr "Исходный код не доступен."
+
+#: spyderlib/plugins/findinfiles.py:135
+msgid "&Find in files"
+msgstr "Найти в &файлах"
+
+#: spyderlib/plugins/findinfiles.py:138
+msgid "Search text in multiple files"
+msgstr "Искать текст в нескольких файлах"
+
+#: spyderlib/plugins/ipythonconsole.py:62
+msgid "Symbolic mathematics in the IPython Console"
+msgstr "Символьная математика в консоли Python"
+
+#: spyderlib/plugins/ipythonconsole.py:111
+#, python-format
+msgid ""
+"The authenticity of host <b>%s</b> can't be established. Are you sure you "
+"want to continue connecting?"
+msgstr ""
+"Подлинность хоста <b>%s</b> не может быть установлена. Вы уверены, что "
+"хотите продолжить соединение?"
+
+#: spyderlib/plugins/ipythonconsole.py:123
+msgid "The authenticity of the host can't be established"
+msgstr "Подлинность хоста не может быть установлена"
+
+#: spyderlib/plugins/ipythonconsole.py:130
+#, python-format
+msgid "Tunnel '%s' failed to start"
+msgstr "Туннель '%s' не удалось запустить"
+
+#: spyderlib/plugins/ipythonconsole.py:135
+msgid "Could not connect to remote host"
+msgstr "Не удалось подключиться к удалённому хосту"
+
+#: spyderlib/plugins/ipythonconsole.py:151
+#: spyderlib/plugins/ipythonconsole.py:691
+msgid "IPython console"
+msgstr "Консоль IPython"
+
+#: spyderlib/plugins/ipythonconsole.py:159
+msgid "Display initial banner"
+msgstr "Показывать стартовый баннер"
+
+#: spyderlib/plugins/ipythonconsole.py:160
+msgid ""
+"This option lets you hide the message shown at\n"
+"the top of the console when it's opened."
+msgstr ""
+"Эта обция позволяет Вам спрятать сообщение,\n"
+"показываемое вверху консоли при открытии."
+
+#: spyderlib/plugins/ipythonconsole.py:162
+msgid "Use a pager to display additional text inside the console"
+msgstr ""
+"Использовать постраничный вывод для показа дополнительного текста в консоли"
+
+#: spyderlib/plugins/ipythonconsole.py:164
+msgid ""
+"Useful if you don't want to fill the console with long help or completion "
+"texts.\n"
+"Note: Use the Q key to get out of the pager."
+msgstr ""
+"Полезно, если Вы не хотите захламлять консоль длинной справкой или сплошным "
+"текстом.\n"
+"Примечание: Используйте клавишу Q для выхода из постраничного вывода."
+
+#: spyderlib/plugins/ipythonconsole.py:169
+msgid "Ask for confirmation before closing"
+msgstr "Спрашивать подтверждение перед закрытием"
+
+#: spyderlib/plugins/ipythonconsole.py:179
+msgid "Completion Type"
+msgstr "Тип автодополнения"
+
+#: spyderlib/plugins/ipythonconsole.py:180
+msgid "Decide what type of completion to use"
+msgstr "Выберите какой тип автодополнения использовать"
+
+#: spyderlib/plugins/ipythonconsole.py:183
+msgid "Completion:"
+msgstr "Автодополнение:"
+
+#: spyderlib/plugins/ipythonconsole.py:192
+msgid "Light background"
+msgstr "Светлый фон"
+
+#: spyderlib/plugins/ipythonconsole.py:194
+msgid "Dark background"
+msgstr "Тёмный фон"
+
+#: spyderlib/plugins/ipythonconsole.py:204
+msgid "Buffer:  "
+msgstr "Буфер:  "
+
+#: spyderlib/plugins/ipythonconsole.py:204
+#: spyderlib/plugins/externalconsole.py:82
+msgid " lines"
+msgstr " строк"
+
+#: spyderlib/plugins/ipythonconsole.py:206
+msgid ""
+"Set the maximum number of lines of text shown in the\n"
+"console before truncation. Specifying -1 disables it\n"
+"(not recommended!)"
+msgstr ""
+"Установите максимальное количество линий, показываемых\n"
+"в консоли перед усечением. Значение -1 отключает функцию\n"
+"(не рекомендуется!)"
+
+#: spyderlib/plugins/ipythonconsole.py:215
+msgid "Support for graphics (Matplotlib)"
+msgstr "Поддержка графики (Matplotlib)"
+
+#: spyderlib/plugins/ipythonconsole.py:216
+msgid "Activate support"
+msgstr "Активировать поддержку"
+
+#: spyderlib/plugins/ipythonconsole.py:217
+msgid "Automatically load Pylab and NumPy modules"
+msgstr "Автоматически загружать модули Pylab и NumPy"
+
+#: spyderlib/plugins/ipythonconsole.py:220
+msgid ""
+"This lets you load graphics support without importing \n"
+"the commands to do plots. Useful to work with other\n"
+"plotting libraries different to Matplotlib or to develop \n"
+"GUIs with Spyder."
+msgstr ""
+"Это позволит загружать поддержку графики без импорта\n"
+"команд построения графиков. Полезно для работы с\n"
+"графическими библиотеками, отличными от Matplotlib или\n"
+"разработки GUI в Spyder."
+
+#: spyderlib/plugins/ipythonconsole.py:238
+msgid ""
+"This feature requires the Matplotlib library.\n"
+"It seems you don't have it installed."
+msgstr ""
+"Эта функция требует библиотеку Matplotlib.\n"
+"Похоже, Вы её не установили."
+
+#: spyderlib/plugins/ipythonconsole.py:243
+msgid "Inline"
+msgstr "Встроенный"
+
+#: spyderlib/plugins/ipythonconsole.py:244
+msgid "Automatic"
+msgstr "Автоматически"
+
+#: spyderlib/plugins/ipythonconsole.py:245
+msgid "Graphics backend"
+msgstr "Графический бэкенд"
+
+#: spyderlib/plugins/ipythonconsole.py:246
+#, python-format
+msgid ""
+"Decide how graphics are going to be displayed in the console. If unsure, "
+"please select <b>%s</b> to put graphics inside the console or <b>%s</b> to "
+"interact with them (through zooming and panning) in a separate window."
+msgstr ""
+"Выберите как графика будет отображаться в консоли. Если не уверены, "
+"пожалуйста выберите <b>%s</b> для вставки графики в консоль или <b>%s</b> "
+"для взаимодействия с ними (через масштабирование и панорамирование) в "
+"отдельном окне."
+
+#: spyderlib/plugins/ipythonconsole.py:266
+#: spyderlib/plugins/externalconsole.py:290
+msgid "Backend:"
+msgstr "Бэкенд:"
+
+#: spyderlib/plugins/ipythonconsole.py:268
+#: spyderlib/plugins/externalconsole.py:292
+msgid "This option will be applied the next time a console is opened."
+msgstr "Эта опция будет принята при следующем открытии консоли."
+
+#: spyderlib/plugins/ipythonconsole.py:279
+msgid "Inline backend"
+msgstr "Встроенный бекэнд"
+
+#: spyderlib/plugins/ipythonconsole.py:280
+msgid "Decide how to render the figures created by this backend"
+msgstr "Выберите как рендерить графики, созданные этим бэкендом"
+
+#: spyderlib/plugins/ipythonconsole.py:284
+msgid "Format:"
+msgstr "Формат:"
+
+#: spyderlib/plugins/ipythonconsole.py:287
+msgid "Resolution:"
+msgstr "Разрешение:"
+
+#: spyderlib/plugins/ipythonconsole.py:287
+msgid "dpi"
+msgstr "dpi"
+
+#: spyderlib/plugins/ipythonconsole.py:289
+msgid "Only used when the format is PNG. Default is 72"
+msgstr "Используется только для формата PNG. 72 по умолчанию"
+
+#: spyderlib/plugins/ipythonconsole.py:292
+msgid "Width:"
+msgstr "Ширина:"
+
+#: spyderlib/plugins/ipythonconsole.py:292
+#: spyderlib/plugins/ipythonconsole.py:296
+msgid "inches"
+msgstr "дюймов"
+
+#: spyderlib/plugins/ipythonconsole.py:294
+msgid "Default is 6"
+msgstr "6 по умолчанию"
+
+#: spyderlib/plugins/ipythonconsole.py:296
+msgid "Height:"
+msgstr "Высота:"
+
+#: spyderlib/plugins/ipythonconsole.py:298
+msgid "Default is 4"
+msgstr "4 по умолчанию"
+
+#: spyderlib/plugins/ipythonconsole.py:325
+msgid ""
+"You can run several lines of code when a console is started. Please "
+"introduce each one separated by commas, for example:<br><i>import os, import "
+"sys</i>"
+msgstr ""
+"Вы можете выполнить несколько строк кода при запуске консоли. Пожалуйста, "
+"введите их через запятую, например:<br><i>import os, import sys</i>"
+
+#: spyderlib/plugins/ipythonconsole.py:331
+msgid "Lines:"
+msgstr "Строки:"
+
+#: spyderlib/plugins/ipythonconsole.py:340
+msgid "Run a file"
+msgstr "Выполнить файл"
+
+#: spyderlib/plugins/ipythonconsole.py:341
+msgid ""
+"You can also run a whole file at startup instead of just some lines (This is "
+"similar to have a PYTHONSTARTUP file)."
+msgstr ""
+"При старте Вы также можете запустить весь файл вместо нескольких строк "
+"(Подобно использованию файла PYTHONSTARTUP)."
+
+#: spyderlib/plugins/ipythonconsole.py:345
+msgid "Use the following file:"
+msgstr "Использовать следующий файл:"
+
+#: spyderlib/plugins/ipythonconsole.py:359
+msgid "Greedy completion"
+msgstr "Скупое автодополнение"
+
+#: spyderlib/plugins/ipythonconsole.py:360
+msgid ""
+"Enable <tt>Tab</tt> completion on elements of lists, results of function "
+"calls, etc, <i>without</i> assigning them to a variable.<br>For example, you "
+"can get completions on things like <tt>li[0].<Tab></tt> or <tt>ins."
+"meth().<Tab></tt>"
+msgstr ""
+"Включает автодополнение по <tt>Tab</tt> для элементов списков, результатов "
+"вызова функций, и т.п. <i>без</i> присвоения их переменной.<br>Например, Вы "
+"можете сделать автодополнение для таких вещей, как <tt>li[0].<Tab></"
+"tt> или <tt>ins.meth().<Tab></tt>"
+
+#: spyderlib/plugins/ipythonconsole.py:368
+msgid "Use the greedy completer"
+msgstr "Включить скупое автодополнение"
+
+#: spyderlib/plugins/ipythonconsole.py:379
+msgid "Autocall"
+msgstr "Автовызов"
+
+#: spyderlib/plugins/ipythonconsole.py:380
+msgid ""
+"Autocall makes IPython automatically call any callable object even if you "
+"didn't type explicit parentheses.<br>For example, if you type <i>str 43</i> "
+"it becomes <i>str(43)</i> automatically."
+msgstr ""
+"Автовызов позволяет IPython автоматически вызывать объекты без явного ввода "
+"скобок.<br>Например, если Вы введете <i>str 43</i>, будет выполнено "
+"<i>str(43)</i> автоматически."
+
+#: spyderlib/plugins/ipythonconsole.py:387
+msgid "Smart"
+msgstr "Умный"
+
+#: spyderlib/plugins/ipythonconsole.py:388
+msgid "Full"
+msgstr "Все"
+
+#: spyderlib/plugins/ipythonconsole.py:389
+msgid "Off"
+msgstr "Отключён"
+
+#: spyderlib/plugins/ipythonconsole.py:391
+msgid "Autocall:  "
+msgstr "Автовызов: "
+
+#: spyderlib/plugins/ipythonconsole.py:392
+#, python-format
+msgid ""
+"On <b>%s</b> mode, Autocall is not applied if there are no arguments after "
+"the callable. On <b>%s</b> mode, all callable objects are automatically "
+"called (even if no arguments are present)."
+msgstr ""
+"В режиме <b>%s</b> Автовызов не происходит если отсутствуют аргументы у "
+"вызываемого. В режиме <b>%s</b> все вызываемые объекты вызываются (даже если "
+"аргументы не переданы)."
+
+#: spyderlib/plugins/ipythonconsole.py:404
+msgid "Symbolic Mathematics"
+msgstr "Символьная математика"
+
+#: spyderlib/plugins/ipythonconsole.py:405
+msgid ""
+"Perfom symbolic operations in the console (e.g. integrals, derivatives, "
+"vector calculus, etc) and get the outputs in a beautifully printed style."
+msgstr ""
+"Производит символьные операции в консоли (напр. интегралы, производные, "
+"векторное исчисление и др.) и выводит результат в приятном глазу виде."
+
+#: spyderlib/plugins/ipythonconsole.py:410
+msgid "Use symbolic math"
+msgstr "Использовать символьную математику"
+
+#: spyderlib/plugins/ipythonconsole.py:411
+msgid ""
+"This option loads the Sympy library to work with.<br>Please refer to its "
+"documentation to learn how to use it."
+msgstr ""
+"Эта опция подгружает для работы библиотеку Sympy.<br>Пожалуйста ознакомьтесь "
+"с документацией для её использования."
+
+#: spyderlib/plugins/ipythonconsole.py:424
+msgid ""
+"This feature requires the Sympy library.\n"
+"It seems you don't have it installed."
+msgstr ""
+"Эта функция требует библиотеку Sympy.\n"
+"По-видимому, она не установлена."
+
+#: spyderlib/plugins/ipythonconsole.py:429
+msgid "Prompts"
+msgstr "Приглашения к вводу/выводу"
+
+#: spyderlib/plugins/ipythonconsole.py:430
+msgid "Modify how Input and Output prompts are shown in the console."
+msgstr "Определите как показывать приглашения Ввода и Вывода в консоли."
+
+#: spyderlib/plugins/ipythonconsole.py:433
+msgid "Input prompt:"
+msgstr "Строка ввода:"
+
+#: spyderlib/plugins/ipythonconsole.py:435
+#, python-format
+msgid ""
+"Default is<br>In [<span class=\"in-prompt-number\">%i</span>]:"
+msgstr ""
+"По умолчанию: <br>In [<span class=\"in-prompt-number\">%i</"
+"span>]:"
+
+#: spyderlib/plugins/ipythonconsole.py:439
+msgid "Output prompt:"
+msgstr "Строка вывода:"
+
+#: spyderlib/plugins/ipythonconsole.py:441
+#, python-format
+msgid ""
+"Default is<br>Out[<span class=\"out-prompt-number\">%i</span>]:"
+msgstr ""
+"По умолчанию: <br>Out [<span class=\"out-prompt-number\">%i</"
+"span>]:"
+
+#: spyderlib/plugins/ipythonconsole.py:461
+#: spyderlib/plugins/externalconsole.py:275
+msgid "Graphics"
+msgstr "Графика"
+
+#: spyderlib/plugins/ipythonconsole.py:463
+#: spyderlib/plugins/workingdirectory.py:44
+msgid "Startup"
+msgstr "Запуск"
+
+#: spyderlib/plugins/ipythonconsole.py:477
+#: spyderlib/plugins/ipythonconsole.py:751
+msgid "Connect to an existing kernel"
+msgstr "Подключиться к работающему ядру"
+
+#: spyderlib/plugins/ipythonconsole.py:479
+msgid ""
+"Please enter the connection info of the kernel you want to connect to. For "
+"that you can either select its JSON connection file using the <tt>Browse</"
+"tt> button, or write directly its id, in case it's a local kernel (for "
+"example <tt>kernel-3764.json</tt> or just <tt>3764</tt>)."
+msgstr ""
+"Пожалуйста, введите информацию о соединении для ядра, к которому пытаетесь "
+"подключиться. Для этого либо выберите JSON-файл соединения кнопкой "
+"<tt>Обзор</tt>, либо, если ядро локальное, введите его id (напр. "
+"<tt>kernel-3764.json</tt> или просто <tt>3764</tt>)."
+
+#: spyderlib/plugins/ipythonconsole.py:490
+msgid "Connection info:"
+msgstr "Информация о соединении:"
+
+#: spyderlib/plugins/ipythonconsole.py:492
+msgid "Path to connection file or kernel id"
+msgstr "Путь к файлу соединения или id ядра"
+
+#: spyderlib/plugins/ipythonconsole.py:494
+#: spyderlib/plugins/ipythonconsole.py:511
+msgid "Browse"
+msgstr "Обзор"
+
+#: spyderlib/plugins/ipythonconsole.py:503
+msgid "This is a remote kernel"
+msgstr "Это удалённо-управляемое ядро"
+
+#: spyderlib/plugins/ipythonconsole.py:507
+msgid "username at hostname:port"
+msgstr "username at hostname:port"
+
+#: spyderlib/plugins/ipythonconsole.py:510
+msgid "Path to ssh key file"
+msgstr "Путь к ключу ssh"
+
+#: spyderlib/plugins/ipythonconsole.py:519
+msgid "Password or ssh key passphrase"
+msgstr "Пароль или кодовая фраза ключа ssh"
+
+#: spyderlib/plugins/ipythonconsole.py:523
+msgid "Host name"
+msgstr "Имя хоста"
+
+#: spyderlib/plugins/ipythonconsole.py:524
+msgid "Ssh key"
+msgstr "Ключ ssh"
+
+#: spyderlib/plugins/ipythonconsole.py:525
+msgid "Password"
+msgstr "Пароль"
+
+#: spyderlib/plugins/ipythonconsole.py:554
+msgid "Open IPython connection file"
+msgstr "Открыть файл соединения IPython"
+
+#: spyderlib/plugins/ipythonconsole.py:560
+msgid "Select ssh key"
+msgstr "Выберите ключ ssh"
+
+#: spyderlib/plugins/ipythonconsole.py:739
+msgid "Open an &IPython console"
+msgstr "Открыть консоль &IPython"
+
+#: spyderlib/plugins/ipythonconsole.py:742
+#, python-format
+msgid "Use %s+T when the console is selected to open a new one"
+msgstr "Используйте %s+T когда консоль выбрана, чтобы открыть новую"
+
+#: spyderlib/plugins/ipythonconsole.py:745
+msgid "Open a new console"
+msgstr "Открыть новую консоль"
+
+#: spyderlib/plugins/ipythonconsole.py:752
+msgid "Open a new IPython console connected to an existing kernel"
+msgstr "Открыть новую консоль IPython, подключенную к существующему ядру"
+
+#: spyderlib/plugins/ipythonconsole.py:835
+#, python-format
+msgid ""
+"No IPython console is currently available to run <b>%s</b>.<br><br>Please "
+"open a new one and try again."
+msgstr ""
+"Сейчас нет доступных консолей IPython для запуска <b>%s</b>."
+"<br><br>Пожалуйста, откройте новую и попытайтесь снова."
+
+#: spyderlib/plugins/ipythonconsole.py:970
+msgid ""
+"Do you want to close all other consoles connected to the same kernel as this "
+"one?"
+msgstr "Хотите закрыть все другие консоли, подключённые к тому же ядру?"
+
+#: spyderlib/plugins/ipythonconsole.py:1052
+msgid "Connection error"
+msgstr "Ошибка соединения"
+
+#: spyderlib/plugins/ipythonconsole.py:1053
+msgid ""
+"Could not open ssh tunnel. The error was:\n"
+"\n"
+msgstr ""
+"Не удалось открыть ssh-туннель. Произошла ошибка:\n"
+"\n"
+
+#: spyderlib/plugins/ipythonconsole.py:1090
+msgid "IPython"
+msgstr "IPython"
+
+#: spyderlib/plugins/ipythonconsole.py:1091
+#, python-format
+msgid "Unable to connect to IPython <b>%s"
+msgstr "Не удалось подключиться к IPython <b>%s"
+
+#: spyderlib/plugins/ipythonconsole.py:1142
+msgid "Are you sure you want to restart the kernel?"
+msgstr "Вы уверены, что хотите перезапустить ядро?"
+
+#: spyderlib/plugins/ipythonconsole.py:1144
+msgid "Restart kernel?"
+msgstr "Перезапустить ядро?"
+
+#: spyderlib/plugins/variableexplorer.py:24
+msgid "Autorefresh"
+msgstr "Автообновление"
+
+#: spyderlib/plugins/variableexplorer.py:25
+msgid "Enable autorefresh"
+msgstr "Включить автообновление"
+
+#: spyderlib/plugins/variableexplorer.py:27
+msgid "Refresh interval: "
+msgstr "Интервал обновления: "
+
+#: spyderlib/plugins/variableexplorer.py:28
+msgid " ms"
+msgstr " мс"
+
+#: spyderlib/plugins/variableexplorer.py:31
+msgid "Filter"
+msgstr "Фильтр"
+
+#: spyderlib/plugins/variableexplorer.py:46
+msgid "Edit data in the remote process"
+msgstr "Редактировать данные в удалённом процессе"
+
+#: spyderlib/plugins/variableexplorer.py:47
+msgid ""
+"Editors are opened in the remote process for NumPy arrays, PIL images, "
+"lists, tuples and dictionaries.\n"
+"This avoids transfering large amount of data between the remote process and "
+"Spyder (through the socket)."
+msgstr ""
+"Редакторы открыты в удалённом процессе для массивов NumPy, изображений PIL, "
+"списков, кортежей и словарей.\n"
+"Это позволяет избежать передачи больших объёмов данных между удалённым "
+"процессом и Spyder (через сокет)."
+
+#: spyderlib/plugins/variableexplorer.py:183
+msgid "Variable explorer"
+msgstr "Менеджер переменных"
+
+#: spyderlib/plugins/console.py:108
+msgid "Internal console"
+msgstr "Встроенная консоль"
+
+#: spyderlib/plugins/console.py:138 spyderlib/plugins/externalconsole.py:1033
+msgid "&Run..."
+msgstr "&Выполнить..."
+
+#: spyderlib/plugins/console.py:140 spyderlib/plugins/externalconsole.py:1034
+msgid "Run a Python script"
+msgstr "Выполнить скрипт Python"
+
+#: spyderlib/plugins/console.py:143
+msgid "Environment variables..."
+msgstr "Переменные окружения"
+
+#: spyderlib/plugins/console.py:145
+msgid "Show and edit environment variables (for current session)"
+msgstr "Показать и редактировать переменные окружения (для текущей сессии)"
+
+#: spyderlib/plugins/console.py:149
+msgid "Show sys.path contents..."
+msgstr "Показать содержимое sys.path..."
+
+#: spyderlib/plugins/console.py:151
+msgid "Show (read-only) sys.path"
+msgstr "Показать (только чтение) sys.path"
+
+#: spyderlib/plugins/console.py:154
+msgid "Buffer..."
+msgstr "Буфер..."
+
+#: spyderlib/plugins/console.py:155 spyderlib/plugins/history.py:39
+#: spyderlib/plugins/externalconsole.py:84
+msgid "Set maximum line count"
+msgstr "Установить максимальное число строк"
+
+#: spyderlib/plugins/console.py:158
+msgid "External editor path..."
+msgstr "Путь к внешнему редактору..."
+
+#: spyderlib/plugins/console.py:159
+msgid "Set external editor executable path"
+msgstr "Установить путь запуска внешнего редактора"
+
+#: spyderlib/plugins/console.py:178
+msgid "Internal console settings"
+msgstr "Настройки встроенной консоли"
+
+#: spyderlib/plugins/console.py:231 spyderlib/plugins/externalconsole.py:1210
+msgid "Run Python script"
+msgstr "Запуск скрипта Python"
+
+#: spyderlib/plugins/console.py:277
+msgid "Buffer"
+msgstr "Буфер"
+
+#: spyderlib/plugins/console.py:278
+msgid "Maximum line count"
+msgstr "Максимальное количество строк"
+
+#: spyderlib/plugins/console.py:288
+msgid "External editor"
+msgstr "Внешний редактор"
+
+#: spyderlib/plugins/console.py:289
+msgid "External editor executable path:"
+msgstr "Путь запуска внешнего редактора:"
+
+#: spyderlib/plugins/projectexplorer.py:68
+msgid "&Font..."
+msgstr "&Шрифт"
+
+#: spyderlib/plugins/projectexplorer.py:69
+msgid "Set font style"
+msgstr "Установить стиль шрифта"
+
+#: spyderlib/plugins/projectexplorer.py:126
+msgid "Select a new font"
+msgstr "Выбрать новый шрифт"
+
+#: spyderlib/plugins/workingdirectory.py:37
+msgid ""
+"The <b>global working directory</b> is the working directory for newly "
+"opened <i>consoles</i> (Python/IPython consoles and terminals), for the "
+"<i>file explorer</i>, for the <i>find in files</i> plugin and for new files "
+"created in the <i>editor</i>."
+msgstr ""
+"<b>Глобальный рабочий каталог</b> - рабочий каталог для новых <i>консолей</"
+"i> (консоли и терминалы Python/IPython), для <i>файлового менеджера</i>, для "
+"модуля <i>поиск по файлам</i> и для новых файлов в <i>редакторе</i>."
+
+#: spyderlib/plugins/workingdirectory.py:46
+msgid "At startup, the global working directory is:"
+msgstr "Глобальный рабочий каталог при загрузке:"
+
+#: spyderlib/plugins/workingdirectory.py:50
+msgid "the same as in last session"
+msgstr "такая же как в последней сессии"
+
+#: spyderlib/plugins/workingdirectory.py:52
+msgid "At startup, Spyder will restore the global directory from last session"
+msgstr "При загрузке Spyder восстановит глобальный каталог из прошлой сессии"
+
+#: spyderlib/plugins/workingdirectory.py:56 spyderlib/plugins/runconfig.py:480
+msgid "the following directory:"
+msgstr "следующий каталог:"
+
+#: spyderlib/plugins/workingdirectory.py:58
+msgid "At startup, the global working directory will be the specified path"
+msgstr "При запуске глобальный рабочий каталог будет иметь указанный путь"
+
+#: spyderlib/plugins/workingdirectory.py:70
+msgid "Files are opened from:"
+msgstr "Файлы открываются из:"
+
+#: spyderlib/plugins/workingdirectory.py:74
+#: spyderlib/plugins/workingdirectory.py:87
+msgid "the current file directory"
+msgstr "текущего каталога"
+
+#: spyderlib/plugins/workingdirectory.py:78
+#: spyderlib/plugins/workingdirectory.py:91
+msgid "the global working directory"
+msgstr "глобального рабочего каталога"
+
+#: spyderlib/plugins/workingdirectory.py:83
+msgid "Files are created in:"
+msgstr "Файлы создаются в:"
+
+#: spyderlib/plugins/workingdirectory.py:97
+msgid "Change to file base directory"
+msgstr "Изменить на каталог файла"
+
+#: spyderlib/plugins/workingdirectory.py:99
+msgid "When opening a file"
+msgstr "При открытии файла"
+
+#: spyderlib/plugins/workingdirectory.py:101
+msgid "When saving a file"
+msgstr "При сохранении файла"
+
+#: spyderlib/plugins/workingdirectory.py:171
+msgid "Back"
+msgstr "Назад"
+
+#: spyderlib/plugins/workingdirectory.py:190
+msgid ""
+"This is the working directory for newly\n"
+"opened consoles (Python/IPython consoles and\n"
+"terminals), for the file explorer, for the\n"
+"find in files plugin and for new files\n"
+"created in the editor"
+msgstr ""
+"Это - рабочий каталог для новосозданных\n"
+"консолей (консолей и терминалов Python/IPython),\n"
+"для файлового менеджера, для модуля\n"
+"поиска в файлах и для новых файлов,\n"
+"созданных в редакторе"
+
+#: spyderlib/plugins/workingdirectory.py:218
+msgid "Browse a working directory"
+msgstr "Просмотреть рабочий каталог"
+
+#: spyderlib/plugins/workingdirectory.py:225
+msgid "Change to parent directory"
+msgstr "Изменить на родительский каталог"
+
+#: spyderlib/plugins/workingdirectory.py:232
+msgid "Global working directory"
+msgstr "Глобальный рабочий каталог"
+
+#: spyderlib/plugins/explorer.py:50
+msgid "File explorer"
+msgstr "Файловый менеджер"
+
+#: spyderlib/plugins/shortcuts.py:134
+msgid ""
+"Press the new shortcut and select 'Ok': \n"
+"(Press 'Tab' once to switch focus between the shortcut entry \n"
+"and the buttons below it)"
+msgstr ""
+"Нажмите новую комбинацию клавиш и выберите 'Ok': \n"
+"(Нажатие 'Tab' один раз переключает фокус между\n"
+"полем ввода комбинации клавиш и кнопками под ним)"
+
+#: spyderlib/plugins/shortcuts.py:137
+msgid "Current shortcut:"
+msgstr "Текущая комбинация клавиш:"
+
+#: spyderlib/plugins/shortcuts.py:139
+msgid "New shortcut:"
+msgstr "Новая комбинация клавиш:"
+
+#: spyderlib/plugins/shortcuts.py:152
+#, python-brace-format
+msgid "Shortcut: {0}"
+msgstr "Комбинация клавиш: {0}"
+
+#: spyderlib/plugins/shortcuts.py:273
+msgid "Please introduce a different shortcut"
+msgstr "Пожалуйста, введите другую комбинацию клавиш"
+
+#: spyderlib/plugins/shortcuts.py:310
+msgid "The new shorcut conflicts with:"
+msgstr "Новая комбинация клавиш конфликтует с:"
+
+#: spyderlib/plugins/shortcuts.py:321
+#, python-brace-format
+msgid ""
+"A compound sequence can have {break} a maximum of 4 subsequences.{break}"
+msgstr "Не более 4 комбинаций клавиш {break} для одного действия.{break}"
+
+#: spyderlib/plugins/shortcuts.py:326
+msgid "Invalid key entered"
+msgstr "Введен неверный ключ"
+
+#: spyderlib/plugins/shortcuts.py:515
+msgid "Context"
+msgstr "Контекст"
+
+#: spyderlib/plugins/shortcuts.py:519
+msgid "Shortcut"
+msgstr "Комбинация клавиш"
+
+# Не понятно, зачем переводить, если колонка с этим именем не видна
+#: spyderlib/plugins/shortcuts.py:521
+#, fuzzy
+msgid "Score"
+msgstr "Метка"
+
+#: spyderlib/plugins/shortcuts.py:681
+msgid "Conflicts"
+msgstr "Конфликты"
+
+#: spyderlib/plugins/shortcuts.py:682
+msgid "The following conflicts have been detected:"
+msgstr "Обнаружены следующие конфликты:"
+
+#: spyderlib/plugins/shortcuts.py:767
+msgid "Keyboard shortcuts"
+msgstr "Комбинации клавиш"
+
+#: spyderlib/plugins/shortcuts.py:775
+msgid "Search: "
+msgstr "Поиск:"
+
+#: spyderlib/plugins/shortcuts.py:776
+msgid "Reset to default values"
+msgstr "Восстановить значения по умолчанию"
+
+#: spyderlib/plugins/runconfig.py:28
+msgid "Execute in current Python or IPython console"
+msgstr "Выполнить в текущей консоли Python или IPython"
+
+#: spyderlib/plugins/runconfig.py:29
+msgid "Execute in a new dedicated Python console"
+msgstr "Выполнить в новой отдельной консоли Python"
+
+#: spyderlib/plugins/runconfig.py:30
+msgid "Execute in an external System terminal"
+msgstr "Выполнить во внешнем системном терминале"
+
+#: spyderlib/plugins/runconfig.py:40
+#, python-format
+msgid "Always show %s on a first file run"
+msgstr "Всегда показывать %s при первом запуске файла"
+
+#: spyderlib/plugins/runconfig.py:159
+msgid "General settings"
+msgstr "Основные настройки"
+
+#: spyderlib/plugins/runconfig.py:162 spyderlib/plugins/runconfig.py:208
+msgid "Command line options:"
+msgstr "Опции командной строки:"
+
+#: spyderlib/plugins/runconfig.py:168
+msgid "Working directory:"
+msgstr "Рабочий каталог:"
+
+#: spyderlib/plugins/runconfig.py:180 spyderlib/plugins/runconfig.py:491
+msgid "Enter debugging mode when errors appear during execution"
+msgstr "Запускать отладочный режим, если происходят ошибки в ходе выполнения"
+
+#: spyderlib/plugins/runconfig.py:196 spyderlib/plugins/runconfig.py:501
+msgid "Dedicated Python console"
+msgstr "Отдельная консоль Python"
+
+#: spyderlib/plugins/runconfig.py:200 spyderlib/plugins/runconfig.py:503
+msgid "Interact with the Python console after execution"
+msgstr "Перейти в консоль Python после выполнения"
+
+#: spyderlib/plugins/runconfig.py:204
+msgid "Show warning when killing running process"
+msgstr "Показывать предупреждение при завершении работающего процесса"
+
+#: spyderlib/plugins/runconfig.py:213
+msgid "<b>-u</b> is added to the other options you set here"
+msgstr "<b>-u</b> добавлен к другим опциям, которые Вы здесь установили"
+
+#: spyderlib/plugins/runconfig.py:223
+msgid "this dialog"
+msgstr "это диалоговое окно"
+
+#: spyderlib/plugins/runconfig.py:282
+msgid "Run configuration"
+msgstr "Запустить конфигурацию"
+
+#: spyderlib/plugins/runconfig.py:283
+#, python-format
+msgid "The following working directory is not valid:<br><b>%s</b>"
+msgstr "Следующий рабочий каталог не применим:<br><b>%s</b>"
+
+#: spyderlib/plugins/runconfig.py:361
+#, python-format
+msgid "Run settings for %s"
+msgstr "Настройки Запуска для %s"
+
+#: spyderlib/plugins/runconfig.py:393
+msgid "Select a run configuration:"
+msgstr "Выберите конфигурацию запуска:"
+
+#: spyderlib/plugins/runconfig.py:422 spyderlib/plugins/runconfig.py:447
+msgid "Run Settings"
+msgstr "Настройки Запуска"
+
+#: spyderlib/plugins/runconfig.py:449
+#, python-format
+msgid ""
+"The following are the default <i>%s</i>. These options may be overriden "
+"using the <b>%s</b> dialog box (see the <b>%s</b> menu)"
+msgstr ""
+"Следующие - стандартные <i>%s</i>. Эти опции можно перезаписать с помощью "
+"диалогового окна <b>%s</b> (см. меню <b>%s</b>)"
+
+#: spyderlib/plugins/runconfig.py:475
+msgid "Default working directory is:"
+msgstr "Рабочий каталог по умолчанию:"
+
+#: spyderlib/plugins/runconfig.py:477
+msgid "the script directory"
+msgstr "каталог скриптов"
+
+#: spyderlib/plugins/runconfig.py:506
+msgid "Show warning when killing running processes"
+msgstr "Показывать предупреждение при завершении работающих процессов"
+
+#: spyderlib/plugins/runconfig.py:515
+msgid "Run Settings dialog"
+msgstr "диалог Настроек Запуска"
+
+#: spyderlib/plugins/history.py:35
+msgid "Settings"
+msgstr "Настройки"
+
+#: spyderlib/plugins/history.py:37
+msgid "History depth: "
+msgstr "Глубина истории: "
+
+#: spyderlib/plugins/history.py:37
+msgid " entries"
+msgstr " записей"
+
+#: spyderlib/plugins/history.py:44
+msgid "Scroll automatically to last entry"
+msgstr "Автоматически пролистывать к последней записи"
+
+#: spyderlib/plugins/history.py:123
+msgid "History log"
+msgstr "Журнал истории"
+
+#: spyderlib/plugins/history.py:150
+msgid "History..."
+msgstr "История..."
+
+#: spyderlib/plugins/history.py:152
+msgid "Set history maximum entries"
+msgstr "Установить максимум записей истории"
+
+#: spyderlib/plugins/history.py:263
+msgid "History"
+msgstr "История"
+
+#: spyderlib/plugins/history.py:264
+msgid "Maximum entries"
+msgstr "Максимум записей"
+
+#: spyderlib/plugins/externalconsole.py:48
+msgid "Interactive data plotting in the consoles"
+msgstr "Интерактивные графики в консолях"
+
+#: spyderlib/plugins/externalconsole.py:68
+msgid "One tab per script"
+msgstr "Одна вкладка на скрипт"
+
+#: spyderlib/plugins/externalconsole.py:82
+msgid "Buffer: "
+msgstr "Буфер: "
+
+#: spyderlib/plugins/externalconsole.py:87
+msgid "Merge process standard output/error channels"
+msgstr "Объединить стандартные потоки вывода/ошибок"
+
+#: spyderlib/plugins/externalconsole.py:89
+msgid ""
+"Merging the output channels of the process means that\n"
+"the standard error won't be written in red anymore,\n"
+"but this has the effect of speeding up display."
+msgstr ""
+"Объединение потоков вывода процесса означает, что\n"
+"стандартные ошибки не будут более выделяться красным,\n"
+"но это увеличит скорость отображения на дисплее."
+
+#: spyderlib/plugins/externalconsole.py:93
+msgid "Colorize standard error channel using ANSI escape codes"
+msgstr "Выделить цветом стандартный поток ошибок управляющими кодами ANSI"
+
+#: spyderlib/plugins/externalconsole.py:95
+msgid ""
+"This method is the only way to have colorized standard\n"
+"error channel when the output channels have been merged."
+msgstr ""
+"Это единственный способ цветового выделения стандартного\n"
+"потока ошибок, когда потоки вывода объединены."
+
+#: spyderlib/plugins/externalconsole.py:112
+msgid ""
+"This option will be applied the next time a Python console or a terminal is "
+"opened."
+msgstr ""
+"Эта опция будет применена при следующем открытии консоли Python<br>или "
+"терминала."
+
+#: spyderlib/plugins/externalconsole.py:115
+msgid "Light background (white color)"
+msgstr "Светлый фон (белый цвет)"
+
+#: spyderlib/plugins/externalconsole.py:140
+msgid "User Module Reloader (UMR)"
+msgstr "Перезагрузка модулей пользователя (UMR)"
+
+#: spyderlib/plugins/externalconsole.py:141
+msgid ""
+"UMR forces Python to reload modules which were imported when executing a \n"
+"script in the external console with the 'runfile' function."
+msgstr ""
+"UMR заставляет Python перезагружать модули, импортированные при \n"
+"выполнении скрипта во внешней консоли функцией  'runfile'."
+
+#: spyderlib/plugins/externalconsole.py:144
+msgid "Enable UMR"
+msgstr "Включить UMR"
+
+#: spyderlib/plugins/externalconsole.py:146
+msgid ""
+"This option will enable the User Module Reloader (UMR) in Python/IPython "
+"consoles. UMR forces Python to reload deeply modules during import when "
+"running a Python script using the Spyder's builtin function <b>runfile</b>."
+"<br><br><b>1.</b> UMR may require to restart the console in which it will be "
+"called (otherwise only newly imported modules will be reloaded when "
+"executing scripts).<br><br><b>2.</b> If errors occur when re-running a PyQt-"
+"based program, please check that the Qt objects are properly destroyed (e.g. "
+"you may have to use the attribute <b>Qt.WA_DeleteOnClose</b> on your main "
+"window, using the <b>setAttribute</b> method)"
+msgstr ""
+"Эта опция включает Перезагрузчик Модулей Пользователя (UMR) в консолях "
+"Python/IPython. UMR заставляет Python рекурсивно перезагружать все модули "
+"при запуске скрипта Python встроенной функцией Spyder <b>runfile</b>."
+"<br><br><b>1.</b> UMR может потребовать перезапустить консоль, в которой был "
+"вызван (в противном случае только вновь импортируемые модули будут "
+"перезагружены при выполнении скриптов).<br><br><b>2.</b>Если при перезапуске "
+"программ на PyQt происходят ошибки, убедитесь, что Qt-объекты уничтожены "
+"должным образом (напр. можно установить атрибут <b>Qt.WA_DeleteOnClose</b> "
+"для Вашего главного окна с помощью метода <b>setAttribute</b>)"
+
+#: spyderlib/plugins/externalconsole.py:161
+msgid "Show reloaded modules list"
+msgstr "Показать список перезагруженных модулей"
+
+#: spyderlib/plugins/externalconsole.py:163
+msgid "Please note that these changes will be applied only to new consoles"
+msgstr ""
+"Обратите внимание, что эти изменения будут применяться только к новым "
+"консолям"
+
+#: spyderlib/plugins/externalconsole.py:166
+msgid "Set UMR excluded (not reloaded) modules"
+msgstr "Установить модули-исключения для UMR (не перезагружаемые)"
+
+#: spyderlib/plugins/externalconsole.py:177
+msgid "Python executable"
+msgstr "Исполняемый файл Python"
+
+#: spyderlib/plugins/externalconsole.py:179
+msgid ""
+"Select the Python interpreter executable binary in which Spyder will run "
+"scripts:"
+msgstr ""
+"Выберите исполняемый бинарный файл интерпретатора Python,\n"
+"который Spyder будет запускать скрипты:"
+
+#: spyderlib/plugins/externalconsole.py:182
+msgid "Default (i.e. the same as Spyder's)"
+msgstr "По умолчанию (тот же, что для Spyder)"
+
+#: spyderlib/plugins/externalconsole.py:186
+msgid "Use the following Python interpreter:"
+msgstr "Использовать следующий интепретатор Python:"
+
+#: spyderlib/plugins/externalconsole.py:190
+msgid "Executables"
+msgstr "Исполняемые файлы"
+
+#: spyderlib/plugins/externalconsole.py:208
+msgid "PYTHONSTARTUP replacement"
+msgstr "Замена PYTHONSTARTUP"
+
+#: spyderlib/plugins/externalconsole.py:210
+msgid ""
+"This option will override the PYTHONSTARTUP environment variable which\n"
+"defines the script to be executed during the Python console startup."
+msgstr ""
+"Эта опция перезапишет переменную среды PYTHONSTARTUP, которая\n"
+"определяет скрипт, запускаемый при старте консоли Python."
+
+#: spyderlib/plugins/externalconsole.py:215
+msgid "Default PYTHONSTARTUP script"
+msgstr "Скрипт PYTHONSTARTUP по умолчанию"
+
+#: spyderlib/plugins/externalconsole.py:219
+msgid "Use the following startup script:"
+msgstr "Использовать следующий скрипт запуска:"
+
+#: spyderlib/plugins/externalconsole.py:236
+msgid "Monitor"
+msgstr "Монитор"
+
+#: spyderlib/plugins/externalconsole.py:237
+msgid ""
+"The monitor provides introspection features to console: code completion, "
+"calltips and variable explorer. Because it relies on several modules, "
+"disabling the monitor may be useful to accelerate console startup."
+msgstr ""
+"Монитор обеспечивает возможность самоанализа в консоли: автодополнение, "
+"подсказки вызова функций и менеджер переменных. Так как он зависит от "
+"нескольких модулей, отключение монитора может быть полезно для ускорения "
+"запуска консоли."
+
+#: spyderlib/plugins/externalconsole.py:244
+msgid "Enable monitor"
+msgstr "Включить монитор"
+
+#: spyderlib/plugins/externalconsole.py:257
+msgid "Default library"
+msgstr "Библиотека по умолчанию"
+
+#: spyderlib/plugins/externalconsole.py:262
+msgid "Qt-Python Bindings"
+msgstr ""
+
+#: spyderlib/plugins/externalconsole.py:264
+msgid "Library:"
+msgstr "Библиотека:"
+
+#: spyderlib/plugins/externalconsole.py:266
+msgid ""
+"This option will act on<br> libraries such as Matplotlib, guidata or ETS"
+msgstr ""
+"Эта опция будет действовать на<br> \n"
+"библиотеки, такие как Matplotlib, guidata или ETS"
+
+#: spyderlib/plugins/externalconsole.py:276
+msgid ""
+"Decide which backend to use to display graphics. If unsure, please select "
+"the <b>Automatic</b> backend.<br><br><b>Note:</b> We support a very limited "
+"number of backends in our Python consoles. If you prefer to work with a "
+"different one, please use an IPython console."
+msgstr ""
+"Выберите какой бэкенд использовать для отображения графики. Если не уверены, "
+"выберите <b>Автоматически</b>.<br><br><b>Примечание:</b> Мы поддерживаем "
+"очень ограниченный набор бэкендов в консолях Python. Если Вы предпочитаете "
+"работать с другим, пожалуйста используйте консоль IPython."
+
+#: spyderlib/plugins/externalconsole.py:303
+msgid "Enthought Tool Suite"
+msgstr ""
+
+#: spyderlib/plugins/externalconsole.py:304
+msgid ""
+"Enthought Tool Suite (ETS) supports PyQt4 (qt4) and wxPython (wx) graphical "
+"user interfaces."
+msgstr ""
+
+#: spyderlib/plugins/externalconsole.py:308
+msgid "ETS_TOOLKIT:"
+msgstr ""
+
+#: spyderlib/plugins/externalconsole.py:333
+msgid "External modules"
+msgstr "Внешние модули"
+
+#: spyderlib/plugins/externalconsole.py:369
+#, python-format
+msgid ""
+"You selected a <b>Python %d</b> interpreter for the console but Spyder is "
+"running on <b>Python %d</b>!.<br><br>Although this is possible, we recommend "
+"you to install and run Spyder directly with your selected interpreter, to "
+"avoid seeing false warnings and errors due to the incompatible syntax "
+"between these two Python versions."
+msgstr ""
+"Вы выбрали интерпретатор <b>Python %d</b> для консоли, но Spyder запущен на "
+"<b>Python %d</b>!.<br><br>Мы рекомендуем, если возможно, установить и "
+"запустить Spyder непосредственно выбранным интерпретатором, чтобы избежать "
+"появления ложных предупреждений и ошибок, связанных с несовместимостями в "
+"синтаксисе между этими двумя версиями Python."
+
+#: spyderlib/plugins/externalconsole.py:532
+msgid "Trying to kill a kernel?"
+msgstr "Попытаться убить ядро?"
+
+#: spyderlib/plugins/externalconsole.py:533
+msgid ""
+"You can't close this kernel because it has one or more consoles connected to "
+"it.<br><br>You need to close them instead or you can kill the kernel using "
+"the second button from right to left."
+msgstr ""
+"Вы не можете закрыть это ядро, т.к. к нему подключены одна или более "
+"консолей<br><br>Сначала Вам нужно их закрыть или можете убить ядро второй "
+"кнопкой справа."
+
+#: spyderlib/plugins/externalconsole.py:612
+#, python-format
+msgid ""
+"No Python console is currently selected to run <b>%s</b>.<br><br>Please "
+"select or open a new Python console and try again."
+msgstr ""
+"Сейчас нет доступных консолей Python для запуска <b>%s</b>."
+"<br><br>Пожалуйста, откройте новую и попытайтесь снова."
+
+#: spyderlib/plugins/externalconsole.py:692
+#, python-format
+msgid ""
+"%s is already running in a separate process.\n"
+"Do you want to kill the process before starting a new one?"
+msgstr ""
+"%s всегда запускается в отдельном процессе.\n"
+"Хотите убить процесс перед запуском нового?"
+
+#: spyderlib/plugins/externalconsole.py:852
+msgid "Kernel"
+msgstr "Ядро"
+
+#: spyderlib/plugins/externalconsole.py:862
+#, fuzzy
+msgid ""
+"Either:<ol><li>Your IPython frontend and kernel versions are "
+"<b>incompatible</b> or</li><li>You <b>don't have</b> IPython installed in "
+"your external interpreter.</li></ol>In any case, we're sorry but we can't "
+"create a console for you."
+msgstr ""
+"Либо:<ol><li>версии Ваших пользовательского и ядерного IPython "
+"<b>несовместимы</b>, либо</li><li>у Вас <b>не установлен</b> IPython в Вашем "
+"внешнем интерпретаторе.</li></ol>В любом случае, мы сожалеем, что не можем "
+"создать консоль для Вас."
+
+#: spyderlib/plugins/externalconsole.py:886
+msgid "Command Window"
+msgstr "Командное окно"
+
+#: spyderlib/plugins/externalconsole.py:888
+msgid "Terminal"
+msgstr "Терминал"
+
+#: spyderlib/plugins/externalconsole.py:941
+#, python-format
+msgid "Kernel %s"
+msgstr "Ядро %s"
+
+#: spyderlib/plugins/externalconsole.py:1021
+msgid "Open a &Python console"
+msgstr "Открыть консоль &Python"
+
+#: spyderlib/plugins/externalconsole.py:1025
+msgid "Open &command prompt"
+msgstr "Открыть &командную строку"
+
+#: spyderlib/plugins/externalconsole.py:1026
+msgid "Open a Windows command prompt"
+msgstr "Открыть командную строку Windows"
+
+#: spyderlib/plugins/externalconsole.py:1028
+msgid "Open a &terminal"
+msgstr "Открыть &терминал"
+
+#: spyderlib/plugins/externalconsole.py:1029
+msgid "Open a terminal window"
+msgstr "Открыть окно терминала"
+
+#: spyderlib/plugins/externalconsole.py:1186
+msgid "Open an IPython console"
+msgstr "Открыть консоль IPython"
+
+#: spyderlib/plugins/externalconsole.py:1187
+msgid ""
+"The console monitor was disabled: the IPython kernel will be started as "
+"expected, but an IPython console will have to be connected manually to the "
+"kernel."
+msgstr ""
+"Монитор консоли был отключен: ядро IPython будет запущено как ожидалось, но "
+"консоль IPython нужно будет подключить к ядру вручную."
+
+#: spyderlib/plugins/externalconsole.py:1219
+#: spyderlib/plugins/externalconsole.py:1232
+#: spyderlib/plugins/externalconsole.py:1236
+msgid "UMR"
+msgstr "UMR"
+
+#: spyderlib/plugins/externalconsole.py:1220
+msgid ""
+"UMR excluded modules:\n"
+"(example: guidata, guiqwt)"
+msgstr ""
+"Модули-исключения для UMR:\n"
+"(например: guidata, guiqwt)"
+
+#: spyderlib/plugins/externalconsole.py:1233
+#, python-format
+msgid ""
+"The following modules are not installed on your machine:\n"
+"%s"
+msgstr ""
+"Следующие модули не установлены на Вашей машине:\n"
+"%s"
+
+#: spyderlib/plugins/externalconsole.py:1237
+msgid ""
+"Please note that these changes will be applied only to new Python/IPython "
+"consoles"
+msgstr ""
+"Обратите внимание, что эти изменения будут применяться только к новым "
+"консолям Python/IPython"
+
+#: spyderlib/plugins/layoutdialog.py:174
+msgid "Move Up"
+msgstr "Вверх"
+
+#: spyderlib/plugins/layoutdialog.py:175
+msgid "Move Down"
+msgstr "Вниз"
+
+#: spyderlib/plugins/layoutdialog.py:176
+msgid "Delete Layout"
+msgstr "Удалить"
+
+#: spyderlib/plugins/layoutdialog.py:180
+msgid "Layout Display and Order"
+msgstr "Показывать и Выбирать компоновку"
+
+#: spyderlib/plugins/onlinehelp.py:68
+msgid "Online help"
+msgstr "Онлайн справка"
+
+#~ msgid "Debugging"
+#~ msgstr "Отладка"
+
+#~ msgid "Updates"
+#~ msgstr "Обновления"
+
+#~ msgid "Set shell font style"
+#~ msgstr "Установить стиль шрифта среды"
+
+#~ msgid "Text and margin font style"
+#~ msgstr "Стиль шрифта текста и отступов"
+
+#~ msgid "tab"
+#~ msgstr "табуляция"
+
+#~ msgid "Rich text help on the Object Inspector"
+#~ msgstr "Форматированная справка в Инспекторе объектов"
+
+#~ msgid "Object inspector"
+#~ msgstr "Инспектор объектов"
+
+#~ msgid "Preferences > Object Inspector"
+#~ msgstr "Параметры > Инспектор объектов"
+
+#~ msgid "Set as current console's working directory"
+#~ msgstr "Установить рабочую папку для текущей консоли"
+
+#~ msgid "Loading object inspector..."
+#~ msgstr "Загрузка инспектора объектов..."
+
+#~ msgid "The Object Inspector"
+#~ msgstr "Инспектор объектов"
+
+#~ msgid "(Experimental) Editor's code completion, go-to-definition and help"
+#~ msgstr ""
+#~ "(Experimental) Автодополнение кода редактора, переход к определению и "
+#~ "справка"
+
+#~ msgid ""
+#~ "This path is incorrect.\n"
+#~ "Enter a correct directory path,\n"
+#~ "then press enter to validate"
+#~ msgstr ""
+#~ "Этот путь неверный.\n"
+#~ "Введите правильный путь к папке и\n"
+#~ "нажмите Enter для подтверждения."
+
+#~ msgid "Save Python script"
+#~ msgstr "Сохранить скрипт Python"
+
+#~ msgid "Vertical dockwidget tabs"
+#~ msgstr "Разместить вертикально вкладки плавающих окон"
+
+#~ msgid "Custom dockwidget margin:"
+#~ msgstr "Дополнительный отступ между плавающими окнами:"
+
+#~ msgid ""
+#~ "<u>Note</u>: add <b>analysis:ignore</b> in a comment to ignore code/style "
+#~ "analysis warnings. For more informations on style guide for Python code, "
+#~ "please refer to the %s page."
+#~ msgstr ""
+#~ "<u>Примечание</u>: добавлять <b>analysis:ignore</b> в комментарий для "
+#~ "игнорирования предупреждений анализа кода/стиля. Для дополнительной "
+#~ "информации по стилю кода Python, перейдите на страницу %s."
+
+#~ msgid "Run &selection"
+#~ msgstr "Выполнить в&ыделение"
+
+#~ msgid "(for example: kernel-3764.json, or simply 3764)"
+#~ msgstr "(например: kernel-3764.json, или просто 3764)"
+
+#~ msgid "Mismatch between kernel and frontend"
+#~ msgstr "Несовместимость ядра и интерфейса"
+
+#~ msgid ""
+#~ "Your IPython frontend and kernel versions are <b>incompatible!!</"
+#~ "b><br><br>We're sorry but we can't create an IPython console for you."
+#~ msgstr ""
+#~ "Версии Ваших интерфейса и ядра IPython <b>несовместимы!!</b><br><br>Мы "
+#~ "извиняемся, но мы не можем создать консоль IPython."
+
+#~ msgid ""
+#~ "%s will be closed.\n"
+#~ "Do you want to kill the associated kernel and all of its clients?"
+#~ msgstr ""
+#~ "%s была закрыта.\n"
+#~ "Хотите убить связанное ядро и все его клиенты?"
+
+#~ msgid "Filter:"
+#~ msgstr "Фильтр:"
+
+#~ msgid "(press <b>Enter</b> to edit file)"
+#~ msgstr "(нажмите <b>Enter</b> для редактирования файла)"
+
+#~ msgid "&Edit file"
+#~ msgstr "&Редактировать файл"
+
+#~ msgid "&Close file"
+#~ msgstr "&Закрыть файл"
+
+#~ msgid "Hint: press <b>Alt</b> to show accelerators"
+#~ msgstr "Совет: нажмите <b>Alt</b>, чтобы увидеть акселераторы"
+
+#~ msgid "Import as array"
+#~ msgstr "Импортировать как массив"
+
+#~ msgid "Interrupt kernel"
+#~ msgstr "Прервать ядро"
diff --git a/spyderlib/locale/spyderlib.pot b/spyderlib/locale/spyderlib.pot
index f5f2f8d..5aab4e9 100644
--- a/spyderlib/locale/spyderlib.pot
+++ b/spyderlib/locale/spyderlib.pot
@@ -1,4667 +1,5117 @@
 # SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR ORGANIZATION
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
 #
+#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2015-08-29 22:49+COT\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-03-19 17:55+0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: ENCODING\n"
-"Generated-By: pygettext.py 1.5\n"
+"Content-Transfer-Encoding: 8bit\n"
 
-
-#: spyderlib/config/base.py:241
-msgid "Update LANGUAGE_CODES (inside config/base.py) if a new translation has been added to Spyder"
+#: spyderlib/app/restart.py:129
+msgid ""
+"It was not possible to close the previous Spyder instance.\n"
+"Restart aborted."
 msgstr ""
 
-#: spyderlib/config/ipython.py:23 spyderlib/config/ipython.py:25
-#: spyderlib/config/ipython.py:32
-msgid "IPython Console integration"
+#: spyderlib/app/restart.py:131
+msgid ""
+"Spyder could not reset to factory defaults.\n"
+"Restart aborted."
 msgstr ""
 
-#: spyderlib/config/main.py:29
-msgid "Python files"
+#: spyderlib/app/restart.py:133
+msgid ""
+"It was not possible to restart Spyder.\n"
+"Operation aborted."
 msgstr ""
 
-#: spyderlib/config/main.py:30
-msgid "Cython/Pyrex files"
+#: spyderlib/app/restart.py:135
+msgid "Spyder exit error"
 msgstr ""
 
-#: spyderlib/config/main.py:31
-msgid "C files"
+#: spyderlib/app/restart.py:136
+msgid "Spyder reset error"
 msgstr ""
 
-#: spyderlib/config/main.py:32
-msgid "C++ files"
+#: spyderlib/app/restart.py:137
+msgid "Spyder restart error"
 msgstr ""
 
-#: spyderlib/config/main.py:33
-msgid "OpenCL files"
+#: spyderlib/app/restart.py:141
+#, python-brace-format
+msgid ""
+"\n"
+"\n"
+"{0}"
 msgstr ""
 
-#: spyderlib/config/main.py:34
-msgid "Fortran files"
+#: spyderlib/app/restart.py:161
+msgid "Closing Spyder"
 msgstr ""
 
-#: spyderlib/config/main.py:35
-msgid "IDL files"
+#: spyderlib/app/restart.py:235
+msgid "Resetting Spyder to defaults"
 msgstr ""
 
-#: spyderlib/config/main.py:36
-msgid "MATLAB files"
+#: spyderlib/app/restart.py:267
+msgid "Restarting"
 msgstr ""
 
-#: spyderlib/config/main.py:37
-msgid "Julia files"
+#: spyderlib/app/spyder.py:112
+msgid "Initializing..."
 msgstr ""
 
-#: spyderlib/config/main.py:38
-msgid "Yaml files"
+#: spyderlib/app/spyder.py:237
+msgid "Numpy and Scipy documentation"
 msgstr ""
 
-#: spyderlib/config/main.py:39
-msgid "Patch and diff files"
+#: spyderlib/app/spyder.py:239 spyderlib/app/spyder.py:1073
+msgid "Matplotlib documentation"
 msgstr ""
 
-#: spyderlib/config/main.py:40
-msgid "Batch files"
+#: spyderlib/app/spyder.py:242
+msgid "PyQt4 Reference Guide"
 msgstr ""
 
-#: spyderlib/config/main.py:41 spyderlib/utils/iofuncs.py:500
-msgid "Text files"
+#: spyderlib/app/spyder.py:245
+msgid "PyQt4 API Reference"
 msgstr ""
 
-#: spyderlib/config/main.py:42
-msgid "reStructured Text files"
+#: spyderlib/app/spyder.py:247
+msgid "Python(x,y)"
 msgstr ""
 
-#: spyderlib/config/main.py:43
-msgid "gettext files"
+#: spyderlib/app/spyder.py:249
+msgid "WinPython"
 msgstr ""
 
-#: spyderlib/config/main.py:44
-msgid "NSIS files"
+#: spyderlib/app/spyder.py:311
+msgid "Reload last session"
 msgstr ""
 
-#: spyderlib/config/main.py:45
-msgid "Web page files"
+#: spyderlib/app/spyder.py:315
+msgid "Load session..."
 msgstr ""
 
-#: spyderlib/config/main.py:46
-msgid "XML files"
+#: spyderlib/app/spyder.py:318
+msgid "Load Spyder session"
 msgstr ""
 
-#: spyderlib/config/main.py:47
-msgid "Javascript files"
+#: spyderlib/app/spyder.py:320
+msgid "Save session and quit..."
 msgstr ""
 
-#: spyderlib/config/main.py:48
-msgid "Json files"
+#: spyderlib/app/spyder.py:323
+msgid "Save current session and quit application"
 msgstr ""
 
-#: spyderlib/config/main.py:49
-msgid "IPython notebooks"
+#: spyderlib/app/spyder.py:533
+msgid "Close current pane"
 msgstr ""
 
-#: spyderlib/config/main.py:50
-msgid "Enaml files"
+#: spyderlib/app/spyder.py:538
+msgid "Lock panes"
 msgstr ""
 
-#: spyderlib/config/main.py:51
-msgid "Configuration files"
+#: spyderlib/app/spyder.py:545
+msgid "Use next layout"
 msgstr ""
 
-#: spyderlib/config/main.py:58 spyderlib/widgets/explorer.py:660
-msgid "All files"
+#: spyderlib/app/spyder.py:549
+msgid "Use previous layout"
 msgstr ""
 
-#: spyderlib/plugins/__init__.py:513 spyderlib/plugins/editor.py:95
-#: spyderlib/plugins/editor.py:551 spyderlib/plugins/editor.py:1600
-#: spyderlib/plugins/inspector.py:139 spyderlib/plugins/inspector.py:419
-#: spyderlib/widgets/editor.py:357
-#: spyderlib/widgets/sourcecode/codeeditor.py:95
-#: spyderlib/widgets/sourcecode/codeeditor.py:2902
-msgid "Editor"
+#: spyderlib/app/spyder.py:558
+msgid "&Find text"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:133
-msgid "Reset to defaults"
+#: spyderlib/app/spyder.py:563
+msgid "Find &next"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:145
-msgid "Preferences"
+#: spyderlib/app/spyder.py:570
+msgid "Find &previous"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:473
-msgid "Invalid directory path"
+#: spyderlib/app/spyder.py:576
+msgid "&Replace text"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:476 spyderlib/plugins/configdialog.py:491
-#: spyderlib/plugins/runconfig.py:176 spyderlib/plugins/runconfig.py:240
-#: spyderlib/plugins/workingdirectory.py:295 spyderlib/widgets/explorer.py:574
-#: spyderlib/widgets/externalshell/pythonshell.py:640
-#: spyderlib/widgets/findinfiles.py:505 spyderlib/widgets/pathmanager.py:223
-#: spyderlib/widgets/projectexplorer.py:899
-msgid "Select directory"
+#: spyderlib/app/spyder.py:596 spyderlib/widgets/sourcecode/codeeditor.py:2418
+msgid "Undo"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:503
-msgid "Invalid file path"
+#: spyderlib/app/spyder.py:598 spyderlib/widgets/sourcecode/codeeditor.py:2421
+msgid "Redo"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:506 spyderlib/plugins/configdialog.py:523
-msgid "Select file"
+#: spyderlib/app/spyder.py:600
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:638
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:452
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:425
+#: spyderlib/widgets/shell.py:120
+#: spyderlib/widgets/sourcecode/codeeditor.py:2427
+msgid "Copy"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:522
-msgid "All files (*)"
+#: spyderlib/app/spyder.py:602 spyderlib/widgets/shell.py:116
+#: spyderlib/widgets/sourcecode/codeeditor.py:2424
+msgid "Cut"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:595 spyderlib/widgets/formlayout.py:214
-msgid "Bold"
+#: spyderlib/app/spyder.py:604
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:635
+#: spyderlib/widgets/shell.py:124
+#: spyderlib/widgets/sourcecode/codeeditor.py:2430
+msgid "Paste"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:598 spyderlib/widgets/formlayout.py:209
-msgid "Italic"
+#: spyderlib/app/spyder.py:607 spyderlib/widgets/shell.py:137
+#: spyderlib/widgets/sourcecode/codeeditor.py:2433
+msgid "Select All"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:640
-msgid "Font: "
+#: spyderlib/app/spyder.py:624 spyderlib/plugins/editor.py:1257
+msgid "&File"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:644
-msgid "Size: "
+#: spyderlib/app/spyder.py:626 spyderlib/plugins/editor.py:1249
+msgid "File toolbar"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:653 spyderlib/plugins/history.py:48
-msgid "Font style"
+#: spyderlib/app/spyder.py:630 spyderlib/plugins/editor.py:1258
+msgid "&Edit"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:708
-msgid "Spyder needs to restart to change the following setting:"
+#: spyderlib/app/spyder.py:631 spyderlib/plugins/editor.py:1254
+msgid "Edit toolbar"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:711
-msgid "Spyder needs to restart to change the following settings:"
+#: spyderlib/app/spyder.py:635 spyderlib/plugins/editor.py:1259
+msgid "&Search"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:713
-msgid "Do you wish to restart now?"
+#: spyderlib/app/spyder.py:636 spyderlib/plugins/editor.py:1250
+msgid "Search toolbar"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:719
-msgid "Information"
+#: spyderlib/app/spyder.py:640 spyderlib/plugins/editor.py:1260
+msgid "Sour&ce"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:734
-msgid "General"
+#: spyderlib/app/spyder.py:641 spyderlib/plugins/editor.py:1251
+msgid "Source toolbar"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:741 spyderlib/plugins/editor.py:104
-#: spyderlib/plugins/externalconsole.py:67
-#: spyderlib/plugins/ipythonconsole.py:162
-msgid "Interface"
+#: spyderlib/app/spyder.py:645 spyderlib/plugins/editor.py:775
+#: spyderlib/plugins/editor.py:1261
+msgid "&Run"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:744
-msgid "Qt windows style"
+#: spyderlib/app/spyder.py:646 spyderlib/plugins/editor.py:1252
+msgid "Run toolbar"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:750
-msgid "Icon theme"
+#: spyderlib/app/spyder.py:650 spyderlib/plugins/editor.py:723
+msgid "&Debug"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:755
-msgid "Language"
+#: spyderlib/app/spyder.py:651 spyderlib/plugins/editor.py:1253
+msgid "Debug toolbar"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:759
-msgid "Use a single instance"
+#: spyderlib/app/spyder.py:655
+msgid "C&onsoles"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:761
-msgid "Set this to open external<br> Python files in an already running instance (Requires a restart)"
+#: spyderlib/app/spyder.py:658 spyderlib/plugins/editor.py:1262
+msgid "&Tools"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:764
-msgid "Vertical title bars in panes"
+#: spyderlib/app/spyder.py:661
+msgid "&View"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:766
-msgid "Vertical tabs in panes"
+#: spyderlib/app/spyder.py:664
+msgid "&Help"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:768
-msgid "Animated toolbars and panes"
+#: spyderlib/app/spyder.py:669
+msgid "Welcome to Spyder!"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:770
-msgid "Tear off menus"
+#: spyderlib/app/spyder.py:674
+msgid "Pre&ferences"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:771
-msgid "Set this to detach any<br> menu from the main window"
+#: spyderlib/app/spyder.py:681 spyderlib/widgets/pathmanager.py:48
+#: spyderlib/widgets/projectexplorer.py:598
+msgid "PYTHONPATH manager"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:773
-msgid "Custom margin for panes:"
+#: spyderlib/app/spyder.py:684
+msgid "Python Path Manager"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:782
-msgid "Prompt when exiting"
+#: spyderlib/app/spyder.py:687
+msgid "Update module names list"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:813
-msgid "Status bar"
+#: spyderlib/app/spyder.py:690
+msgid "Refresh list of module names available in PYTHONPATH"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:814
-msgid "Show status bar"
+#: spyderlib/app/spyder.py:693
+msgid "Reset Spyder to factory defaults"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:816
-msgid "Show memory usage every"
+#: spyderlib/app/spyder.py:698
+msgid "Current user environment variables..."
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:825
-msgid "Show CPU usage every"
+#: spyderlib/app/spyder.py:700
+msgid ""
+"Show and edit current user environment variables in Windows registry (i.e. "
+"for all sessions)"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:858
-msgid "Debugging"
+#: spyderlib/app/spyder.py:709 spyderlib/app/spyder.py:1167
+msgid "External Tools"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:859
-msgid "Pop up internal console when internal errors appear"
+#: spyderlib/app/spyder.py:713
+msgid "Python(x,y) launcher"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:868
-msgid "Updates"
+#: spyderlib/app/spyder.py:720
+msgid "WinPython control panel"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:869 spyderlib/spyder.py:2872
-msgid "Check for updates on startup"
+#: spyderlib/app/spyder.py:729
+msgid "Qt Designer"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:902
-msgid "Syntax coloring"
+#: spyderlib/app/spyder.py:734
+msgid "Qt Linguist"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:911
-msgid "Background:"
+#: spyderlib/app/spyder.py:740
+msgid "Qt examples"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:912
-#: spyderlib/widgets/sourcecode/codeeditor.py:104
-msgid "Current line:"
+#: spyderlib/app/spyder.py:761
+msgid "guidata examples"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:913
-msgid "Current cell:"
+#: spyderlib/app/spyder.py:772
+msgid "guiqwt examples"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:914
-msgid "Occurence:"
+#: spyderlib/app/spyder.py:777
+msgid "Sift"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:915
-msgid "Link:"
+#: spyderlib/app/spyder.py:787
+msgid "ViTables"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:916
-msgid "Side areas:"
+#: spyderlib/app/spyder.py:801
+msgid "Fullscreen mode"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:917
-msgid "Matched parentheses:"
+#: spyderlib/app/spyder.py:813
+msgid "Main toolbar"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:918
-msgid "Unmatched parentheses:"
+#: spyderlib/app/spyder.py:822
+msgid ""
+"Spyder Internal Console\n"
+"\n"
+"This console is used to report application\n"
+"internal errors and to inspect Spyder\n"
+"internals with the following commands:\n"
+"  spy.app, spy.window, dir(spy)\n"
+"\n"
+"Please don't use it to run your code\n"
+"\n"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:919
-msgid "Normal text:"
+#: spyderlib/app/spyder.py:839
+msgid "Loading help..."
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:920
-msgid "Keyword:"
+#: spyderlib/app/spyder.py:846
+msgid "Loading outline explorer..."
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:921
-msgid "Builtin:"
+#: spyderlib/app/spyder.py:854
+msgid "Loading editor..."
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:922
-msgid "Definition:"
+#: spyderlib/app/spyder.py:860 spyderlib/widgets/ipython.py:610
+#: spyderlib/plugins/console.py:133
+msgid "&Quit"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:923
-msgid "Comment:"
+#: spyderlib/app/spyder.py:862 spyderlib/plugins/console.py:135
+msgid "Quit"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:924
-msgid "String:"
+#: spyderlib/app/spyder.py:865
+msgid "&Restart"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:925
-msgid "Number:"
+#: spyderlib/app/spyder.py:867
+msgid "Restart"
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:926
-msgid "Instance:"
+#: spyderlib/app/spyder.py:886
+msgid "Loading file explorer..."
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:932
-msgid "Color scheme"
+#: spyderlib/app/spyder.py:893
+msgid "Loading history plugin..."
 msgstr ""
 
-#: spyderlib/plugins/configdialog.py:954 spyderlib/plugins/shortcuts.py:776
-msgid "Reset to default values"
+#: spyderlib/app/spyder.py:904
+msgid "Loading online help..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:109
-msgid "Internal console"
+#: spyderlib/app/spyder.py:910
+msgid "Loading project explorer..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:129 spyderlib/spyder.py:869
-#: spyderlib/widgets/ipython.py:595
-msgid "&Quit"
+#: spyderlib/app/spyder.py:916
+msgid "Loading external console..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:131 spyderlib/spyder.py:871
-msgid "Quit"
+#: spyderlib/app/spyder.py:922
+msgid "Loading namespace browser..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:134 spyderlib/plugins/externalconsole.py:1039
-msgid "&Run..."
+#: spyderlib/app/spyder.py:929
+msgid "Loading IPython console..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:136 spyderlib/plugins/externalconsole.py:1040
-msgid "Run a Python script"
+#: spyderlib/app/spyder.py:938
+msgid "Setting up main window..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:139
-msgid "Environment variables..."
+#: spyderlib/app/spyder.py:941
+msgid "Dependencies..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:141
-msgid "Show and edit environment variables (for current session)"
+#: spyderlib/app/spyder.py:945
+msgid "Report issue..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:145
-msgid "Show sys.path contents..."
+#: spyderlib/app/spyder.py:949
+msgid "Spyder support..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:147
-msgid "Show (read-only) sys.path"
+#: spyderlib/app/spyder.py:952
+msgid "Check for updates..."
 msgstr ""
 
-#: spyderlib/plugins/console.py:150
-msgid "Buffer..."
+#: spyderlib/app/spyder.py:975
+msgid "Spyder documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:151 spyderlib/plugins/externalconsole.py:87
-#: spyderlib/plugins/history.py:41
-msgid "Set maximum line count"
+#: spyderlib/app/spyder.py:980
+msgid "Spyder tutorial"
 msgstr ""
 
-#: spyderlib/plugins/console.py:154 spyderlib/plugins/explorer.py:67
-#: spyderlib/plugins/history.py:169 spyderlib/plugins/inspector.py:388
-#: spyderlib/plugins/projectexplorer.py:68
-msgid "&Font..."
+#: spyderlib/app/spyder.py:987
+msgid "Interactive tours"
 msgstr ""
 
-#: spyderlib/plugins/console.py:155 spyderlib/plugins/history.py:170
-msgid "Set shell font style"
+#: spyderlib/app/spyder.py:1015
+msgid "Python documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:158
-msgid "External editor path..."
+#: spyderlib/app/spyder.py:1021 spyderlib/app/spyder.py:1065
+msgid "IPython documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:159
-msgid "Set external editor executable path"
+#: spyderlib/app/spyder.py:1022
+msgid "Intro to IPython"
 msgstr ""
 
-#: spyderlib/plugins/console.py:162 spyderlib/plugins/editor.py:139
-#: spyderlib/plugins/externalconsole.py:88 spyderlib/plugins/history.py:44
-#: spyderlib/plugins/history.py:172 spyderlib/plugins/inspector.py:180
-#: spyderlib/plugins/inspector.py:391
-msgid "Wrap lines"
+#: spyderlib/app/spyder.py:1024
+msgid "Quick reference"
 msgstr ""
 
-#: spyderlib/plugins/console.py:165 spyderlib/plugins/editor.py:181
-#: spyderlib/plugins/externalconsole.py:133
-#: spyderlib/plugins/ipythonconsole.py:172
-msgid "Display balloon tips"
+#: spyderlib/app/spyder.py:1026
+msgid "Console help"
 msgstr ""
 
-#: spyderlib/plugins/console.py:169 spyderlib/plugins/editor.py:175
-#: spyderlib/plugins/externalconsole.py:127
-msgid "Automatic code completion"
+#: spyderlib/app/spyder.py:1063
+msgid "Python(x,y) documentation folder"
 msgstr ""
 
-#: spyderlib/plugins/console.py:173 spyderlib/plugins/editor.py:179
-#: spyderlib/plugins/externalconsole.py:131
-msgid "Enter key selects completion"
+#: spyderlib/app/spyder.py:1067
+msgid "guidata documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:178
-msgid "Internal console settings"
+#: spyderlib/app/spyder.py:1070
+msgid "guiqwt documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:231 spyderlib/plugins/externalconsole.py:1220
-msgid "Run Python script"
+#: spyderlib/app/spyder.py:1076
+msgid "NumPy documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:232 spyderlib/plugins/externalconsole.py:226
-#: spyderlib/plugins/externalconsole.py:1221 spyderlib/widgets/explorer.py:675
-msgid "Python scripts"
+#: spyderlib/app/spyder.py:1078
+msgid "NumPy reference guide"
 msgstr ""
 
-#: spyderlib/plugins/console.py:278 spyderlib/plugins/explorer.py:117
-#: spyderlib/plugins/history.py:285 spyderlib/plugins/inspector.py:665
-#: spyderlib/plugins/projectexplorer.py:126
-msgid "Select a new font"
+#: spyderlib/app/spyder.py:1080
+msgid "NumPy user guide"
 msgstr ""
 
-#: spyderlib/plugins/console.py:286
-msgid "Buffer"
+#: spyderlib/app/spyder.py:1082
+msgid "SciPy documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:287
-msgid "Maximum line count"
+#: spyderlib/app/spyder.py:1089
+msgid "Installed Python modules"
 msgstr ""
 
-#: spyderlib/plugins/console.py:297
-msgid "External editor"
+#: spyderlib/app/spyder.py:1093
+msgid "Online documentation"
 msgstr ""
 
-#: spyderlib/plugins/console.py:298
-msgid "External editor executable path:"
+#: spyderlib/app/spyder.py:1105
+msgid "Qt documentation"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:101
-msgid "Edit template for new modules"
+#: spyderlib/app/spyder.py:1111
+#, python-format
+msgid "About %s..."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:106
-msgid "Text and margin font style"
+#: spyderlib/app/spyder.py:1135
+msgid "Panes"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:109
-msgid "Sort files according to full path"
+#: spyderlib/app/spyder.py:1136
+msgid "Toolbars"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:111
-msgid "Show tab bar"
+#: spyderlib/app/spyder.py:1137
+msgid "Window layouts"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:118 spyderlib/plugins/editor.py:195
-#: spyderlib/plugins/externalconsole.py:83
-#: spyderlib/plugins/externalconsole.py:126 spyderlib/plugins/history.py:43
-#: spyderlib/plugins/inspector.py:179 spyderlib/plugins/ipythonconsole.py:206
-msgid "Source code"
+#: spyderlib/app/spyder.py:1146 spyderlib/app/spyder.py:1919
+#: spyderlib/app/spyder.py:1920
+msgid "Show toolbars"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:119
-msgid "Show line numbers"
+#: spyderlib/app/spyder.py:1160
+msgid "Attached console window (debugging)"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:120 spyderlib/plugins/editor.py:916
-msgid "Show blank spaces"
+#: spyderlib/app/spyder.py:1324
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:572
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:573
+#: spyderlib/widgets/externalshell/pythonshell.py:553
+#: spyderlib/widgets/externalshell/systemshell.py:104
+#: spyderlib/widgets/explorer.py:597 spyderlib/widgets/explorer.py:699
+msgid "Error"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:121
-msgid "Show vertical line after"
+#: spyderlib/app/spyder.py:1325
+#, python-format
+msgid ""
+"<b>You have missing dependencies!</b><br><br><tt>%s</tt><br><br><b>Please "
+"install them to avoid this message.</b><br><br><i>Note</i>: Spyder could "
+"work without some of these dependencies, however to have a smooth experience "
+"when using Spyder we <i>strongly</i> recommend you to install all the listed "
+"missing dependencies.<br>Failing to install these dependencies might result "
+"in bugs. Please be sure that any found bugs are not the direct result of "
+"missing dependencies, prior to reporting a new issue."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:122
-msgid "characters"
+#: spyderlib/app/spyder.py:1766
+msgid "Spyder Default Layout"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:127
-msgid "Highlight current line"
+#: spyderlib/app/spyder.py:1784
+msgid "Save current layout"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:129
-msgid "Highlight current cell"
+#: spyderlib/app/spyder.py:1788
+msgid "Layout preferences"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:131
-msgid "Highlight occurences after"
+#: spyderlib/app/spyder.py:1792
+msgid "Reset to spyder default"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:142 spyderlib/plugins/history.py:52
-#: spyderlib/plugins/inspector.py:183
-msgid "Syntax color scheme: "
+#: spyderlib/app/spyder.py:1812 spyderlib/app/spyder.py:1834
+#: spyderlib/app/spyder.py:1897 spyderlib/app/spyder.py:2775
+#: spyderlib/utils/environ.py:97 spyderlib/utils/environ.py:110
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:407
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1048
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:495
+#: spyderlib/plugins/configdialog.py:1229
+#: spyderlib/plugins/ipythonconsole.py:114
+#: spyderlib/plugins/ipythonconsole.py:834
+#: spyderlib/plugins/externalconsole.py:368
+#: spyderlib/plugins/externalconsole.py:611
+msgid "Warning"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:164 spyderlib/plugins/runconfig.py:321
-#: spyderlib/plugins/runconfig.py:443 spyderlib/plugins/runconfig.py:448
-#: spyderlib/spyder.py:2501 spyderlib/utils/programs.py:175
-#: spyderlib/widgets/explorer.py:240
-#: spyderlib/widgets/externalshell/baseshell.py:140
-msgid "Run"
+#: spyderlib/app/spyder.py:1813
+msgid ""
+"Window layout will be reset to default settings: this affects window "
+"position, size and dockwidgets.\n"
+"Do you want to continue?"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:165
-msgid "Save all files before running script"
+#: spyderlib/app/spyder.py:1835
+#, python-format
+msgid ""
+"Layout <b>%s</b> will be                                                "
+"overwritten. Do you want to                                                "
+"continue?"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:168
-msgid "Run selection"
+#: spyderlib/app/spyder.py:1898
+#, python-format
+msgid "Quick switch layout #%s has not yet been defined."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:169
-msgid "Maintain focus in the Editor after running cells or selections"
+#: spyderlib/app/spyder.py:1916 spyderlib/app/spyder.py:1917
+msgid "Hide toolbars"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:172 spyderlib/plugins/externalconsole.py:334
-msgid "Introspection"
+#: spyderlib/app/spyder.py:2231 spyderlib/app/spyder.py:2232
+msgid "Maximize current pane"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:177 spyderlib/plugins/externalconsole.py:129
-msgid "Case sensitive code completion"
+#: spyderlib/app/spyder.py:2235
+msgid "Restore current pane"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:182
-msgid "Link to object definition"
+#: spyderlib/app/spyder.py:2236
+msgid "Restore pane to its original size"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:184
-msgid ""
-"If this option is enabled, clicking on an object\n"
-"name (left-click + Ctrl key) will go this object\n"
-"definition (if resolved)."
+#: spyderlib/app/spyder.py:2320
+#, python-format
+msgid "About %s"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:188
-msgid "<b>Warning:</b><br>The Python module <i>rope</i> is not installed on this computer: calltips, code completion and go-to-definition features won't be available."
+#: spyderlib/app/spyder.py:2496 spyderlib/utils/programs.py:281
+#: spyderlib/widgets/externalshell/baseshell.py:139
+#: spyderlib/widgets/explorer.py:239 spyderlib/plugins/editor.py:156
+#: spyderlib/plugins/runconfig.py:321 spyderlib/plugins/runconfig.py:443
+#: spyderlib/plugins/runconfig.py:448
+msgid "Run"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:196
-msgid "Automatic insertion of parentheses, braces and brackets"
+#: spyderlib/app/spyder.py:2497
+#, python-format
+msgid "Running an external system terminal is not supported on platform %s."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:199
-msgid "Automatic insertion of closing quotes"
+#: spyderlib/app/spyder.py:2722
+msgid "Open session"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:201
-msgid "Automatic insertion of colons after 'for', 'if', 'def', etc"
+#: spyderlib/app/spyder.py:2723 spyderlib/app/spyder.py:2735
+msgid "Spyder sessions"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:204
-msgid "Automatic indentation after 'else', 'elif', etc."
+#: spyderlib/app/spyder.py:2734
+msgid "Save session"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:206
-msgid "Indentation characters: "
+#: spyderlib/app/spyder.py:2776
+msgid ""
+"Spyder will restart and reset to default settings: <br><br>Do you want to "
+"continue?"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:207
-msgid "4 spaces"
+#: spyderlib/app/spyder.py:2873 spyderlib/widgets/helperwidgets.py:243
+msgid "Spyder updates"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:208
-msgid "2 spaces"
+#: spyderlib/app/spyder.py:2874 spyderlib/plugins/configdialog.py:799
+msgid "Check for updates on startup"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:209
-msgid "tab"
+#: spyderlib/app/spyder.py:2892
+#, python-format
+msgid ""
+"<b>Spyder %s is available!</b> <br><br>Please use your package manager to "
+"update Spyder or go to our <a href=\"%s\">Releases</a> page to download this "
+"new version. <br><br>If you are not sure how to proceed to update Spyder "
+"please refer to our  <a href=\"%s\">Installation</a> instructions."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:210
-msgid "Tab stop width:"
+#: spyderlib/app/spyder.py:2904
+msgid "Spyder is up to date."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:210
-msgid "pixels"
+#: spyderlib/app/tour.py:121
+msgid "Welcome to the Introduction tour"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:212
-msgid "Tab always indent"
+#: spyderlib/app/tour.py:122
+msgid ""
+"<b>Spyder</b> is a powerful Interactive Development Environment (or IDE) for "
+"the Python programming language.<br><br>Here we are going to guide you "
+"through its most important features.<br><br>Please use the arrow keys or "
+"click on the buttons below to move along the tour."
+msgstr ""
+
+#: spyderlib/app/tour.py:131
+msgid "The Editor"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:214
+#: spyderlib/app/tour.py:132
 msgid ""
-"If enabled, pressing Tab will always indent,\n"
-"even when the cursor is not at the beginning\n"
-"of a line (when this option is enabled, code\n"
-"completion may be triggered using the alternate\n"
-"shortcut: Ctrl+Space)"
+"This is the pane where you write Python code before evaluating it. You can "
+"get automatic suggestions and completions while writing, by pressing the "
+"<b>Tab</b> key next to a given text.<br><br>The Editor comes with a line "
+"number area (highlighted here in red), where Spyder shows warnings and "
+"syntax errors. They can help you to detect potential problems before running "
+"the code.<br><br>You can also set debug breakpoints in the line number area, "
+"by doing a double click next to a non-empty line."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:219
-msgid "Intelligent backspace"
+#: spyderlib/app/tour.py:147
+msgid "The IPython console"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:221
-msgid "Automatically remove trailing spaces when saving files"
+#: spyderlib/app/tour.py:148
+#, python-brace-format
+msgid ""
+"This is one of panes where you can run or execute the code you wrote on the "
+"Editor. To do it you need to press the <b>F5</b> key.<br><br>This console "
+"comes with several useful features that greatly improve your programming "
+"workflow (like syntax highlighting and inline plots). If you want to know "
+"more about them, please follow this <a href=\"{0}\">link</a>.<br><br>Please "
+"click on the button below to run some simple code in this console. This will "
+"be useful to show you other important features."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:225
-msgid "Analysis"
+#: spyderlib/app/tour.py:164
+msgid "The Variable Explorer"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:227
-msgid "<i>(Refer to the {} page)</i>"
+#: spyderlib/app/tour.py:165
+msgid ""
+"In this pane you can view and edit the variables generated during the "
+"execution of a program, or those entered directly in one of Spyder consoles."
+"<br><br>As you can see, the Variable Explorer is showing the variables "
+"generated during the last step of this tour. By doing a double-click on any "
+"of them, a new window will be opened, where you can inspect and modify their "
+"contents."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:231
-msgid "Real-time code analysis"
+#: spyderlib/app/tour.py:177
+msgid "The Python console"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:233
-msgid "<p>If enabled, Python source code will be analyzedusing pyflakes, lines containing errors or warnings will be highlighted.</p><p><u>Note</u>: add <b>analysis:ignore</b> in a comment to ignore code analysis warnings.</p>"
+#: spyderlib/app/tour.py:178
+msgid ""
+"You can also run your code on a Python console. These consoles are useful "
+"because they let you run a file in a console dedicated only to it.To select "
+"this behavior, please press the <b>F6</b> key.<br><br>By pressing the button "
+"below and then focusing the Variable Explorer, you will notice that Python "
+"consoles are also connected to that pane, and that the Variable Explorer "
+"only shows the variables of the currently focused console."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:241
-msgid "Code analysis requires pyflakes %s+"
+#: spyderlib/app/tour.py:192 spyderlib/widgets/internalshell.py:266
+#: spyderlib/plugins/help.py:490 spyderlib/plugins/help.py:940
+msgid "Help"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:243
-msgid "Real-time code style analysis"
+#: spyderlib/app/tour.py:193
+msgid ""
+"This pane displays documentation of the functions, classes, methods or "
+"modules you are currently using in the Editor or the Consoles.<br><br>To use "
+"it, you need to press <b>Ctrl+I</b> in front of an object. If that object "
+"has some documentation associated with it, it will be displayed here."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:245
-msgid "<p>If enabled, Python source code will be analyzedusing pep8, lines that are not following PEP8 style guide will be highlighted.</p><p><u>Note</u>: add <b>analysis:ignore</b> in a comment to ignore style analysis warnings.</p>"
+#: spyderlib/app/tour.py:203
+msgid "The File Explorer"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:252
-msgid "Code annotations (TODO, FIXME, XXX, HINT, TIP, @todo)"
+#: spyderlib/app/tour.py:204
+msgid ""
+"This pane lets you navigate through the directories and files present in "
+"your computer.<br><br>You can also open any of these files with its "
+"corresponding application, by doing a double click on it.<br><br>There is "
+"one exception to this rule: plain-text files will always be opened in the "
+"Spyder Editor."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:255
-msgid "Perform analysis when saving file and every"
+#: spyderlib/app/tour.py:214
+msgid "The History Log"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:259
-msgid "Perform analysis only when saving file"
+#: spyderlib/app/tour.py:215
+msgid ""
+"This pane records all commands introduced in the Python and IPython consoles."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:318
-msgid "End-of-line characters"
+#: spyderlib/app/tour.py:263
+msgid "<b>Spyder</b> is an interactive development environment based on bla"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:319
-msgid "When opening a text file containing mixed end-of-line characters (this may raise syntax errors in the consoles on Windows platforms), Spyder may fix the file automatically."
+#: spyderlib/app/tour.py:267
+msgid "Welcome to Spyder introduction tour"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:325
-msgid "Fix automatically and show warning message box"
+#: spyderlib/app/tour.py:268
+msgid "Spyder is an interactive development environment based on bla"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:336 spyderlib/plugins/externalconsole.py:332
-#: spyderlib/plugins/ipythonconsole.py:463
-#: spyderlib/plugins/variableexplorer.py:41
-msgid "Display"
+#: spyderlib/app/tour.py:273
+msgid "Introduction tour"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:338
-msgid "Code Introspection/Analysis"
+#: spyderlib/app/tour.py:274
+msgid "New features in version 3.0"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:341 spyderlib/plugins/externalconsole.py:336
-msgid "Advanced settings"
+#: spyderlib/app/tour.py:552 spyderlib/plugins/ipythonconsole.py:324
+msgid "Run code"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:607 spyderlib/widgets/editortools.py:510
-msgid "Show/hide outline explorer"
+#: spyderlib/app/tour.py:821
+msgid "Go to step: "
 msgstr ""
 
-#: spyderlib/plugins/editor.py:613
-msgid "Show/hide project explorer"
+#: spyderlib/config/ipython.py:23
+msgid "Jupyter Qtconsole integration"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:621
-msgid "&New file..."
+#: spyderlib/config/ipython.py:25
+msgid "Manipulate Jupyter notebooks on the Editor"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:622 spyderlib/plugins/workingdirectory.py:82
-#: spyderlib/widgets/explorer.py:652 spyderlib/widgets/explorer.py:659
-msgid "New file"
+#: spyderlib/config/base.py:241
+msgid ""
+"Update LANGUAGE_CODES (inside config/base.py) if a new translation has been "
+"added to Spyder"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:629
-msgid "&Open..."
+#: spyderlib/config/utils.py:24
+msgid "Python files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:630 spyderlib/plugins/editor.py:1643
-#: spyderlib/plugins/workingdirectory.py:69
-msgid "Open file"
+#: spyderlib/config/utils.py:25
+msgid "Cython/Pyrex files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:637
-msgid "&Revert"
+#: spyderlib/config/utils.py:26
+msgid "C files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:638
-msgid "Revert file from disk"
+#: spyderlib/config/utils.py:27
+msgid "C++ files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:641
-msgid "&Save"
+#: spyderlib/config/utils.py:28
+msgid "OpenCL files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:642
-msgid "Save file"
+#: spyderlib/config/utils.py:29
+msgid "Fortran files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:649
-msgid "Sav&e all"
+#: spyderlib/config/utils.py:30
+msgid "IDL files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:650
-msgid "Save all files"
+#: spyderlib/config/utils.py:31
+msgid "MATLAB files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:658
-msgid "Save &as..."
+#: spyderlib/config/utils.py:32
+msgid "Julia files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:659
-msgid "Save current file as..."
+#: spyderlib/config/utils.py:33
+msgid "Yaml files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:663 spyderlib/plugins/editor.py:664
-msgid "Print preview..."
+#: spyderlib/config/utils.py:34
+msgid "Patch and diff files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:665
-msgid "&Print..."
+#: spyderlib/config/utils.py:35
+msgid "Batch files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:666
-msgid "Print current file..."
+#: spyderlib/config/utils.py:36 spyderlib/utils/iofuncs.py:515
+msgid "Text files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:669
-msgid "&Close"
+#: spyderlib/config/utils.py:37
+msgid "reStructuredText files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:670
-msgid "Close current file"
+#: spyderlib/config/utils.py:38
+msgid "gettext files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:673
-msgid "C&lose all"
+#: spyderlib/config/utils.py:39
+msgid "NSIS files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:674
-msgid "Close all opened files"
+#: spyderlib/config/utils.py:40
+msgid "Web page files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:681
-msgid "Set/Clear breakpoint"
+#: spyderlib/config/utils.py:41
+msgid "XML files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:688
-msgid "Set/Edit conditional breakpoint"
+#: spyderlib/config/utils.py:42
+msgid "Javascript files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:695
-msgid "Clear breakpoints in all files"
+#: spyderlib/config/utils.py:43
+msgid "Json files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:697
-msgid "Breakpoints"
+#: spyderlib/config/utils.py:44
+msgid "IPython notebooks"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:701
-msgid "Debug with winpdb"
+#: spyderlib/config/utils.py:45
+msgid "Enaml files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:708 spyderlib/spyder.py:659
-msgid "&Debug"
+#: spyderlib/config/utils.py:46
+msgid "Configuration files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:709
-msgid "Debug file"
+#: spyderlib/config/utils.py:51 spyderlib/widgets/explorer.py:670
+msgid "All files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:713
-msgid "Step"
+#: spyderlib/config/utils.py:113
+msgid "Supported text files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:714
-msgid "Run current line"
+#: spyderlib/utils/environ.py:98
+msgid ""
+"Module <b>pywin32 was not found</b>.<br>Please restart this Windows "
+"<i>session</i> (not the computer) for changes to take effect."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:720
-msgid "Continue"
+#: spyderlib/utils/environ.py:111
+msgid ""
+"If you accept changes, this will modify the current user environment "
+"variables directly <b>in Windows registry</b>. Use it with precautions, at "
+"your own risks.<br><br>Note that for changes to take effect, you will need "
+"to restart the parent process of this application (simply restart Spyder if "
+"you have executed it from a Windows shortcut, otherwise restart any "
+"application from which you may have executed it, like <i>Python(x,y) Home</"
+"i> for example)"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:721
-msgid "Continue execution until next breakpoint"
+#: spyderlib/utils/codeanalysis.py:91
+msgid "Real-time code analysis on the Editor"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:728
-msgid "Step Into"
+#: spyderlib/utils/codeanalysis.py:95
+msgid "Real-time code style analysis on the Editor"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:729
-msgid "Step into function or method of current line"
+#: spyderlib/utils/iofuncs.py:497
+msgid "Supported files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:736
-msgid "Step Return"
+#: spyderlib/utils/iofuncs.py:499
+msgid "All files (*.*)"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:737
-msgid "Run until current function or method returns"
+#: spyderlib/utils/iofuncs.py:509
+msgid "Spyder data files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:744
-msgid "Exit"
+#: spyderlib/utils/iofuncs.py:511
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1014
+msgid "NumPy arrays"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:745
-msgid "Exit Debug"
+#: spyderlib/utils/iofuncs.py:512
+msgid "NumPy zip arrays"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:756
-msgid "Debugging control"
+#: spyderlib/utils/iofuncs.py:513
+msgid "Matlab files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:760 spyderlib/plugins/editor.py:1236
-#: spyderlib/spyder.py:654
-msgid "&Run"
+#: spyderlib/utils/iofuncs.py:514
+msgid "CSV text files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:761
-msgid "Run file"
+#: spyderlib/utils/iofuncs.py:516
+msgid "JPEG images"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:766
-msgid "&Configure..."
+#: spyderlib/utils/iofuncs.py:517
+msgid "PNG images"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:768
-#: spyderlib/widgets/externalshell/pythonshell.py:311
-msgid "Run settings"
+#: spyderlib/utils/iofuncs.py:518
+msgid "GIF images"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:776
-msgid "Re-run &last script"
+#: spyderlib/utils/iofuncs.py:519
+msgid "TIFF images"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:778
-msgid "Run again last file"
+#: spyderlib/utils/iofuncs.py:520 spyderlib/utils/iofuncs.py:521
+msgid "Pickle files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:785
-#: spyderlib/widgets/sourcecode/codeeditor.py:2462
-msgid "Run &selection or current line"
+#: spyderlib/utils/iofuncs.py:522
+msgid "JSON files"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:788
-msgid "Run selection or current line"
+#: spyderlib/utils/iofuncs.py:541 spyderlib/utils/iofuncs.py:548
+#, python-format
+msgid "<b>Unsupported file type '%s'</b>"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:801
-msgid "Run cell"
+#: spyderlib/utils/programs.py:282
+msgid "It was not possible to run this file in an external terminal"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:804
+#: spyderlib/utils/help/sphinxify.py:212 spyderlib/utils/help/sphinxify.py:222
 msgid ""
-"Run current cell (Ctrl+Enter)\n"
-"[Use #%% to create cells]"
+"It was not possible to generate rich text help for this object.</br>Please "
+"see it in plain text."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:809
-msgid "Run cell and advance"
+#: spyderlib/utils/introspection/manager.py:31
+#: spyderlib/utils/introspection/manager.py:36
+msgid "Editor's code completion, go-to-definition and help"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:812
-msgid "Run current cell and go to the next one (Shift+Enter)"
+#: spyderlib/utils/syntaxhighlighters.py:32
+msgid "Syntax highlighting for Matlab, Julia and other file types"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:818
-msgid "Show todo list"
+#: spyderlib/utils/syntaxhighlighters.py:41
+msgid "Background:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:819
-msgid "Show TODO/FIXME/XXX/HINT/TIP/@todo comments list"
+#: spyderlib/utils/syntaxhighlighters.py:42
+#: spyderlib/widgets/sourcecode/codeeditor.py:103
+msgid "Current line:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:826
-msgid "Show warning/error list"
+#: spyderlib/utils/syntaxhighlighters.py:43
+msgid "Current cell:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:827
-msgid "Show code analysis warnings/errors"
+#: spyderlib/utils/syntaxhighlighters.py:44
+msgid "Occurrence:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:833
-msgid "Previous warning/error"
+#: spyderlib/utils/syntaxhighlighters.py:45
+msgid "Link:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:834
-msgid "Go to previous code analysis warning/error"
+#: spyderlib/utils/syntaxhighlighters.py:46
+msgid "Side areas:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:837
-msgid "Next warning/error"
+#: spyderlib/utils/syntaxhighlighters.py:47
+msgid "Matched <br>parens:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:838
-msgid "Go to next code analysis warning/error"
+#: spyderlib/utils/syntaxhighlighters.py:48
+msgid "Unmatched <br>parens:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:842
-msgid "Last edit location"
+#: spyderlib/utils/syntaxhighlighters.py:49
+msgid "Normal text:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:843
-msgid "Go to last edit location"
+#: spyderlib/utils/syntaxhighlighters.py:50
+msgid "Keyword:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:849
-msgid "Previous cursor position"
+#: spyderlib/utils/syntaxhighlighters.py:51
+msgid "Builtin:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:850
-msgid "Go to previous cursor position"
+#: spyderlib/utils/syntaxhighlighters.py:52
+msgid "Definition:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:856
-msgid "Next cursor position"
+#: spyderlib/utils/syntaxhighlighters.py:53
+msgid "Comment:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:857
-msgid "Go to next cursor position"
+#: spyderlib/utils/syntaxhighlighters.py:54
+msgid "String:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:864
-#: spyderlib/widgets/sourcecode/codeeditor.py:2449
-msgid "Comment"
+#: spyderlib/utils/syntaxhighlighters.py:55
+msgid "Number:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:864
-#: spyderlib/widgets/sourcecode/codeeditor.py:2449
-msgid "Uncomment"
+#: spyderlib/utils/syntaxhighlighters.py:56
+msgid "Instance:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:865
-msgid "Comment current line or selection"
+#: spyderlib/workers/updates.py:86 spyderlib/workers/updates.py:88
+msgid "Unable to retrieve information."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:869
-msgid "Add &block comment"
+#: spyderlib/workers/updates.py:90
+msgid ""
+"Unable to connect to the internet. <br><br>Make sure the connection is "
+"working properly."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:870
-msgid "Add block comment around current line or selection"
+#: spyderlib/workers/updates.py:93
+msgid "Unable to check for updates."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:876
-msgid "R&emove block comment"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:113
+msgid "Index"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:877
-msgid "Remove comment block around current line or selection"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:115
+#: spyderlib/plugins/shortcuts.py:517
+msgid "Name"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:888
-msgid "Indent"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:118
+msgid "Tuple"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:889
-msgid "Indent current line or selection"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:121
+msgid "List"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:892
-msgid "Unindent"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:124
+msgid "Dictionary"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:893
-msgid "Unindent current line or selection"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:126
+msgid "Key"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:898
-msgid "Carriage return and line feed (Windows)"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:130
+#: spyderlib/plugins/help.py:399
+msgid "Object"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:901
-msgid "Line feed (UNIX)"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:132
+msgid "Attribute"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:904
-msgid "Carriage return (Mac)"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:134
+msgid "elements"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:910
-msgid "Convert end-of-line characters"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:310
+msgid "Type"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:914
-msgid "Remove trailing spaces"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:310
+msgid "Size"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:918
-msgid "Fix indentation"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:310
+msgid "Value"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:919
-msgid "Replace tab characters by space characters"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:408
+msgid ""
+"Opening this variable can be slow\n"
+"\n"
+"Do you want to continue anyway?"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:922
-msgid "Go to line..."
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:416
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:570
+msgid "Edit item"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:930
-msgid "Set console working directory"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:417
+#, python-format
+msgid "<b>Unable to retrieve data.</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:932
-msgid "Set current console (and file explorer) working directory to current script directory"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:571
+#, python-format
+msgid "<b>Unable to assign data to item.</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:937
-msgid "Maximum number of recent files..."
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:633
+msgid "Resize rows to contents"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:940
-msgid "Clear recent files list"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:641
+#: spyderlib/widgets/explorer.py:241
+msgid "Edit"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:940
-msgid "Clear this list"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:644
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:983
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1000
+msgid "Plot"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:942
-msgid "Open &recent"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:648
+msgid "Histogram"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1224 spyderlib/spyder.py:635
-msgid "File toolbar"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:652
+msgid "Show image"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1225 spyderlib/spyder.py:645
-msgid "Search toolbar"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:656
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1008
+msgid "Save array"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1226 spyderlib/spyder.py:650
-msgid "Source toolbar"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:660
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:947
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:955
+msgid "Insert"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1227 spyderlib/spyder.py:655
-msgid "Run toolbar"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:663
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:897
+msgid "Remove"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1228 spyderlib/spyder.py:660
-msgid "Debug toolbar"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:666
+#: spyderlib/plugins/variableexplorer.py:42
+msgid "Truncate values"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1229 spyderlib/spyder.py:640
-msgid "Edit toolbar"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:670
+#: spyderlib/plugins/variableexplorer.py:44
+msgid "Show arrays min/max"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1232 spyderlib/spyder.py:633
-msgid "&File"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:674
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:914
+#: spyderlib/widgets/explorer.py:542 spyderlib/widgets/explorer.py:550
+#: spyderlib/widgets/explorer.py:561
+msgid "Rename"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1233 spyderlib/spyder.py:639
-msgid "&Edit"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:677
+msgid "Duplicate"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1234 spyderlib/spyder.py:644
-msgid "&Search"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:895
+msgid "Do you want to remove selected item?"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1235 spyderlib/spyder.py:649
-msgid "Sour&ce"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:896
+msgid "Do you want to remove all selected items?"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1237 spyderlib/spyder.py:667
-msgid "&Tools"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:914
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:947
+msgid "Key:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1238
-msgid "?"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:955
+msgid "Value:"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1458
-msgid "Spyder Editor"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:971
+msgid "Import error"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1459
-msgid "This is a temporary script file."
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:972
+msgid "Please install <b>matplotlib</b> or <b>guiqwt</b>."
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1527
-msgid "untitled"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:984
+#, python-format
+msgid "<b>Unable to plot data.</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1601
-msgid "Maximum number of recent files"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1001
+#, python-format
+msgid "<b>Unable to show image.</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/editor.py:1726
-msgid "Printing..."
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1024
+#, python-format
+msgid "<b>Unable to save array</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/explorer.py:55
-msgid "File explorer"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1049
+msgid "It was not possible to copy this array"
 msgstr ""
 
-#: spyderlib/plugins/explorer.py:68 spyderlib/plugins/inspector.py:389
-#: spyderlib/plugins/projectexplorer.py:69
-msgid "Set font style"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1074
+msgid "Clipboard contents"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:49
-msgid "Interactive data plotting in the consoles"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1089
+msgid "Import from clipboard"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:57
-#: spyderlib/plugins/externalconsole.py:1005
-#: spyderlib/plugins/inspector.py:419 spyderlib/plugins/runconfig.py:185
-#: spyderlib/plugins/runconfig.py:455
-#: spyderlib/widgets/externalshell/baseshell.py:107
-#: spyderlib/widgets/ipython.py:521
-msgid "Console"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1091
+msgid "Empty clipboard"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:71
-msgid "One tab per script"
+#: spyderlib/widgets/variableexplorer/collectionseditor.py:1092
+msgid "Nothing to be imported from clipboard."
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:72
-#: spyderlib/widgets/externalshell/baseshell.py:173
-msgid "Show elapsed time"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:496
+msgid "It was not possible to copy values for this array"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:73 spyderlib/widgets/explorer.py:1016
-msgid "Show icons and text"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:531
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:564
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:524
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:564
+msgid "Format"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:85
-msgid "Buffer: "
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:536
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:528
+msgid "Resize"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:85
-#: spyderlib/plugins/ipythonconsole.py:208
-msgid " lines"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:539
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:532
+#: spyderlib/plugins/ipythonconsole.py:191
+#: spyderlib/plugins/externalconsole.py:111
+msgid "Background color"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:90
-msgid "Merge process standard output/error channels"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:565
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:565
+msgid "Float formatting"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:92
-msgid ""
-"Merging the output channels of the process means that\n"
-"the standard error won't be written in red anymore,\n"
-"but this has the effect of speeding up display."
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:573
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:574
+#, python-format
+msgid "Format (%s) is incorrect"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:96
-msgid "Colorize standard error channel using ANSI escape codes"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:607
+msgid "Array is empty"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:98
-msgid ""
-"This method is the only way to have colorized standard\n"
-"error channel when the output channels have been merged."
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:610
+msgid "Arrays with more than 3 dimensions are not supported"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:114
-#: spyderlib/plugins/ipythonconsole.py:195
-#: spyderlib/widgets/arrayeditor.py:461
-#: spyderlib/widgets/dataframeeditor.py:516
-msgid "Background color"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:613
+msgid "The 'xlabels' argument length do no match array column number"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:115
-msgid "This option will be applied the next time a Python console or a terminal is opened."
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:617
+msgid "The 'ylabels' argument length do no match array row number"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:118
-msgid "Light background (white color)"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:624
+#, python-format
+msgid "%s arrays"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:143
-msgid "User Module Reloader (UMR)"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:625
+#, python-format
+msgid "%s are currently not supported"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:144
-msgid ""
-"UMR forces Python to reload modules which were imported when executing a \n"
-"script in the external console with the 'runfile' function."
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:632
+msgid "NumPy array"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:147
-msgid "Enable UMR"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:634
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:788
+msgid "Array editor"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:148
-msgid "This option will enable the User Module Reloader (UMR) in Python/IPython consoles. UMR forces Python to reload deeply modules during import when running a Python script using the Spyder's builtin function <b>runfile</b>.<br><br><b>1.</b> UMR may require to restart the console in which it will be called (otherwise only newly imported modules will be reloaded when executing scripts).<br><br><b>2.</b> If errors occur when re-running a PyQt-based program, please check that the Qt obje [...]
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:636
+msgid "read only"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:164
-msgid "Show reloaded modules list"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:666
+msgid "Record array fields:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:165
-msgid "Please note that these changes will be applied only to new consoles"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:678
+msgid "Masked data"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:169
-msgid "Set UMR excluded (not reloaded) modules"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:678
+msgid "Data"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:180
-msgid "Python executable"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:678
+msgid "Mask"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:182
-msgid "Select the Python interpreter executable binary in which Spyder will run scripts:"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:689
+msgid "Axis:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:185
-msgid "Default (i.e. the same as Spyder's)"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:694
+msgid "Index:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:189
-msgid "Use the following Python interpreter:"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:707
+msgid "<u>Warning</u>: changes are applied separately"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:193
-msgid "Executables"
+#: spyderlib/widgets/variableexplorer/arrayeditor.py:708
+msgid ""
+"For performance reasons, changes applied to masked array won't be reflected "
+"in array's data (and vice-versa)."
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:211
-msgid "PYTHONSTARTUP replacement"
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:430
+msgid "To bool"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:213
-msgid ""
-"This option will override the PYTHONSTARTUP environment variable which\n"
-"defines the script to be executed during the Python console startup."
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:430
+msgid "To complex"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:218
-msgid "Default PYTHONSTARTUP script"
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:431
+msgid "To int"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:222
-msgid "Use the following startup script:"
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:431
+msgid "To float"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:239
-msgid "Monitor"
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:432
+msgid "To str"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:240
-msgid "The monitor provides introspection features to console: code completion, calltips and variable explorer. Because it relies on several modules, disabling the monitor may be useful to accelerate console startup."
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:506
+#, python-format
+msgid "%s editor"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:247
-msgid "Enable monitor"
+#: spyderlib/widgets/variableexplorer/dataframeeditor.py:538
+msgid "Column min/max"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:260
-msgid "Default library"
+#: spyderlib/widgets/variableexplorer/utils.py:28
+msgid "View and edit DataFrames and Series in the Variable Explorer"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:265
-msgid "Qt-Python Bindings"
+#: spyderlib/widgets/variableexplorer/utils.py:33
+msgid "View and edit two and three dimensional arrays in the Variable Explorer"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:267
-msgid "Library:"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:151
+#: spyderlib/widgets/editor.py:468 spyderlib/widgets/ipython.py:580
+#: spyderlib/widgets/externalshell/baseshell.py:152
+#: spyderlib/widgets/explorer.py:1040 spyderlib/plugins/help.py:443
+#: spyderlib/plugins/history.py:103
+msgid "Options"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:269
-msgid "This option will act on<br> libraries such as Matplotlib, guidata or ETS"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:195
+msgid "Refresh"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:278
-#: spyderlib/plugins/ipythonconsole.py:465
-msgid "Graphics"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:199
+msgid "Refresh periodically"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:279
-msgid "Decide which backend to use to display graphics. If unsure, please select the <b>Automatic</b> backend.<br><br><b>Note:</b> We support a very limited number of backends in our Python consoles. If you prefer to work with a different one, please use an IPython console."
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:203
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:456
+msgid "Import data"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:295
-#: spyderlib/plugins/ipythonconsole.py:270
-msgid "Backend:"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:206
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:544
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:565
+msgid "Save data"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:297
-#: spyderlib/plugins/ipythonconsole.py:272
-msgid "This option will be applied the next time a console is opened."
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:211
+msgid "Save data as..."
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:308
-msgid "Enthought Tool Suite"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:218
+#: spyderlib/plugins/variableexplorer.py:33
+msgid "Exclude private references"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:309
-msgid "Enthought Tool Suite (ETS) supports PyQt4 (qt4) and wxPython (wx) graphical user interfaces."
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:219
+msgid "Exclude references which name starts with an underscore"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:313
-msgid "ETS_TOOLKIT:"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:226
+#: spyderlib/plugins/variableexplorer.py:35
+msgid "Exclude all-uppercase references"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:338
-msgid "External modules"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:227
+msgid "Exclude references which name is uppercase"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:374
-#: spyderlib/plugins/externalconsole.py:617
-#: spyderlib/plugins/ipythonconsole.py:114
-#: spyderlib/plugins/ipythonconsole.py:832 spyderlib/spyder.py:1803
-#: spyderlib/spyder.py:1825 spyderlib/spyder.py:1888 spyderlib/spyder.py:2774
-#: spyderlib/utils/environ.py:95 spyderlib/utils/environ.py:108
-#: spyderlib/widgets/dicteditor.py:452
-msgid "Warning"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:233
+#: spyderlib/plugins/variableexplorer.py:34
+msgid "Exclude capitalized references"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:375
-msgid "You selected a <b>Python %d</b> interpreter for the console but Spyder is running on <b>Python %d</b>!.<br><br>Although this is possible, we recommend you to install and run Spyder directly with your selected interpreter, to avoid seeing false warnings and errors due to the incompatible syntax between these two Python versions."
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:234
+msgid "Exclude references which name starts with an uppercase character"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:538
-msgid "Trying to kill a kernel?"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:241
+#: spyderlib/plugins/variableexplorer.py:36
+msgid "Exclude unsupported data types"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:539
-msgid "You can't close this kernel because it has one or more consoles connected to it.<br><br>You need to close them instead or you can kill the kernel using the second button from right to left."
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:242
+msgid ""
+"Exclude references to unsupported data types (i.e. which won't be handled/"
+"saved correctly)"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:618
-msgid "No Python console is currently selected to run <b>%s</b>.<br><br>Please select or open a new Python console and try again."
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:351
+#, python-format
+msgid "Object <b>%s</b> is not picklable"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:698
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:476
+#, python-format
 msgid ""
-"%s is already running in a separate process.\n"
-"Do you want to kill the process before starting a new one?"
+"<b>Unsupported file extension '%s'</b><br><br>Would you like to import it "
+"anyway (by selecting a known file format)?"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:858
-msgid "Kernel"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:484
+msgid "Open file as:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:868
-msgid "Either:<ol><li>Your IPython frontend and kernel versions are <b>incompatible</b> or</li><li>You <b>don't have</b> IPython installed in your external interpreter.</li></ol>In any case, we're sorry but we can't create a console for you."
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:532
+#, python-format
+msgid "<b>Unable to load '%s'</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:892
-msgid "Command Window"
+#: spyderlib/widgets/variableexplorer/namespacebrowser.py:566
+#, python-format
+msgid "<b>Unable to save current workspace</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:894
-msgid "Terminal"
+#: spyderlib/widgets/variableexplorer/importwizard.py:116
+#: spyderlib/widgets/variableexplorer/importwizard.py:431
+msgid "Import as"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:947
-msgid "Kernel %s"
+#: spyderlib/widgets/variableexplorer/importwizard.py:118
+msgid "data"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1027
-msgid "Open a &Python console"
+#: spyderlib/widgets/variableexplorer/importwizard.py:122
+msgid "code"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1031
-msgid "Open &command prompt"
+#: spyderlib/widgets/variableexplorer/importwizard.py:125
+#: spyderlib/widgets/variableexplorer/importwizard.py:504
+msgid "text"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1032
-msgid "Open a Windows command prompt"
+#: spyderlib/widgets/variableexplorer/importwizard.py:138
+msgid "Column separator:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1034
-msgid "Open a &terminal"
+#: spyderlib/widgets/variableexplorer/importwizard.py:142
+msgid "Tab"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1035
-msgid "Open a terminal window"
+#: spyderlib/widgets/variableexplorer/importwizard.py:145
+#: spyderlib/widgets/variableexplorer/importwizard.py:163
+msgid "other"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1196
-msgid "Open an IPython console"
+#: spyderlib/widgets/variableexplorer/importwizard.py:156
+msgid "Row separator:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1197
-msgid "The console monitor was disabled: the IPython kernel will be started as expected, but an IPython console will have to be connected manually to the kernel."
+#: spyderlib/widgets/variableexplorer/importwizard.py:160
+msgid "EOL"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1229
-#: spyderlib/plugins/externalconsole.py:1242
-#: spyderlib/plugins/externalconsole.py:1246
-msgid "UMR"
+#: spyderlib/widgets/variableexplorer/importwizard.py:175
+msgid "Additional options"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1230
-msgid ""
-"UMR excluded modules:\n"
-"(example: guidata, guiqwt)"
+#: spyderlib/widgets/variableexplorer/importwizard.py:179
+msgid "Skip rows:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1243
-msgid ""
-"The following modules are not installed on your machine:\n"
-"%s"
+#: spyderlib/widgets/variableexplorer/importwizard.py:190
+msgid "Comments:"
 msgstr ""
 
-#: spyderlib/plugins/externalconsole.py:1247
-msgid "Please note that these changes will be applied only to new Python/IPython consoles"
+#: spyderlib/widgets/variableexplorer/importwizard.py:196
+msgid "Transpose"
 msgstr ""
 
-#: spyderlib/plugins/findinfiles.py:96 spyderlib/widgets/findinfiles.py:690
-msgid "Find in files"
+#: spyderlib/widgets/variableexplorer/importwizard.py:434
+msgid "array"
 msgstr ""
 
-#: spyderlib/plugins/findinfiles.py:117
-msgid "&Find in files"
+#: spyderlib/widgets/variableexplorer/importwizard.py:439
+msgid "list"
 msgstr ""
 
-#: spyderlib/plugins/findinfiles.py:120
-msgid "Search text in multiple files"
+#: spyderlib/widgets/variableexplorer/importwizard.py:444
+msgid "DataFrame"
 msgstr ""
 
-#: spyderlib/plugins/history.py:37
-msgid "Settings"
+#: spyderlib/widgets/variableexplorer/importwizard.py:487
+#: spyderlib/widgets/variableexplorer/importwizard.py:569
+msgid "Import wizard"
 msgstr ""
 
-#: spyderlib/plugins/history.py:39
-msgid " entries"
+#: spyderlib/widgets/variableexplorer/importwizard.py:492
+msgid "Raw text"
 msgstr ""
 
-#: spyderlib/plugins/history.py:39
-msgid "History depth: "
+#: spyderlib/widgets/variableexplorer/importwizard.py:495
+msgid "variable_name"
 msgstr ""
 
-#: spyderlib/plugins/history.py:46
-msgid "Scroll automatically to last entry"
+#: spyderlib/widgets/variableexplorer/importwizard.py:506
+msgid "table"
 msgstr ""
 
-#: spyderlib/plugins/history.py:118 spyderlib/plugins/inspector.py:472
-#: spyderlib/widgets/editor.py:459 spyderlib/widgets/explorer.py:1027
-#: spyderlib/widgets/externalshell/baseshell.py:153
-#: spyderlib/widgets/externalshell/namespacebrowser.py:139
-#: spyderlib/widgets/ipython.py:568
-msgid "Options"
+#: spyderlib/widgets/variableexplorer/importwizard.py:507
+msgid "Preview"
 msgstr ""
 
-#: spyderlib/plugins/history.py:138
-msgid "History log"
+#: spyderlib/widgets/variableexplorer/importwizard.py:511
+msgid "Variable Name"
 msgstr ""
 
-#: spyderlib/plugins/history.py:165
-msgid "History..."
+#: spyderlib/widgets/variableexplorer/importwizard.py:519
+msgid "Cancel"
 msgstr ""
 
-#: spyderlib/plugins/history.py:167
-msgid "Set history maximum entries"
+#: spyderlib/widgets/variableexplorer/importwizard.py:525
+#: spyderlib/widgets/explorer.py:1031
+msgid "Previous"
 msgstr ""
 
-#: spyderlib/plugins/history.py:274
-msgid "History"
+#: spyderlib/widgets/variableexplorer/importwizard.py:529
+#: spyderlib/widgets/explorer.py:1034
+#: spyderlib/plugins/workingdirectory.py:179
+msgid "Next"
 msgstr ""
 
-#: spyderlib/plugins/history.py:275
-msgid "Maximum entries"
+#: spyderlib/widgets/variableexplorer/importwizard.py:532
+msgid "Done"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:58
-msgid "Rich text help on the Object Inspector"
+#: spyderlib/widgets/variableexplorer/importwizard.py:570
+#, python-format
+msgid ""
+"<b>Unable to proceed to next step</b><br><br>Please check your entries."
+"<br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:125
-msgid "Plain text font style"
+#: spyderlib/widgets/variableexplorer/texteditor.py:72
+msgid "Text editor"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:128
-msgid "Rich text font style"
+#: spyderlib/widgets/comboboxes.py:165
+msgid "Press enter to validate this entry"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:131
-msgid "Automatic connections"
+#: spyderlib/widgets/comboboxes.py:166
+msgid "This entry is incorrect"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:132
-msgid "The Object Inspector can automatically show an object's help information after a left parenthesis is written next to it. Below you can decide to which plugin you want to connect it to turn on this feature."
+#: spyderlib/widgets/comboboxes.py:209
+msgid "Press enter to validate this path"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:144
-msgid ""
-"This feature requires the Rope or Jedi libraries.\n"
-"It seems you don't have either installed."
+#: spyderlib/widgets/onecolumntree.py:50
+msgid "Collapse all"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:147
-msgid "Python Console"
+#: spyderlib/widgets/onecolumntree.py:54
+msgid "Expand all"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:149
-msgid "IPython Console"
+#: spyderlib/widgets/onecolumntree.py:58
+msgid "Restore"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:161
-msgid "Additional features"
+#: spyderlib/widgets/onecolumntree.py:59
+msgid "Restore original tree layout"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:162
-msgid "Render mathematical equations"
+#: spyderlib/widgets/onecolumntree.py:63
+msgid "Collapse selection"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:168
-msgid "This feature requires Sphinx 1.1 or superior."
+#: spyderlib/widgets/onecolumntree.py:67
+msgid "Expand selection"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:170
-msgid "Sphinx %s is currently installed."
+#: spyderlib/widgets/editor.py:341 spyderlib/plugins/editor.py:645
+msgid "File switcher..."
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:373
-msgid "No further documentation available"
+#: spyderlib/widgets/editor.py:344
+msgid "Copy path to clipboard"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:412
-msgid "Source"
+#: spyderlib/widgets/editor.py:348
+msgid "Close all to the right"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:427 spyderlib/widgets/dicteditor.py:173
-msgid "Object"
+#: spyderlib/widgets/editor.py:350
+msgid "Close all but this"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:442
-msgid "Plain Text"
+#: spyderlib/widgets/editor.py:365
+#: spyderlib/widgets/sourcecode/codeeditor.py:94
+#: spyderlib/widgets/sourcecode/codeeditor.py:2901
+#: spyderlib/plugins/editor.py:96 spyderlib/plugins/editor.py:556
+#: spyderlib/plugins/editor.py:1636 spyderlib/plugins/help.py:123
+#: spyderlib/plugins/help.py:391 spyderlib/plugins/__init__.py:523
+msgid "Editor"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:446
-msgid "Show Source"
+#: spyderlib/widgets/editor.py:914
+msgid "Temporary file"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:450
-msgid "Rich Text"
+#: spyderlib/widgets/editor.py:1011
+msgid "New window"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:460
-msgid "Automatic import"
+#: spyderlib/widgets/editor.py:1012
+msgid "Create a new editor window"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:520 spyderlib/plugins/inspector.py:983
-msgid "Object inspector"
+#: spyderlib/widgets/editor.py:1015
+msgid "Split vertically"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:740
-msgid "Here you can get help of any object by pressing %s in front of it, either on the Editor or the Console.%sHelp can also be shown automatically after writing a left parenthesis next to an object. You can activate this behavior in %s."
+#: spyderlib/widgets/editor.py:1017
+msgid "Split vertically this editor window"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:746
-msgid "Preferences > Object Inspector"
+#: spyderlib/widgets/editor.py:1019
+msgid "Split horizontally"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:753
-msgid "Usage"
+#: spyderlib/widgets/editor.py:1021
+msgid "Split horizontally this editor window"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:754
-msgid "New to Spyder? Read our"
+#: spyderlib/widgets/editor.py:1023
+msgid "Close this panel"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:755
-msgid "tutorial"
+#: spyderlib/widgets/editor.py:1180
+#, python-format
+msgid "<b>%s</b> has been modified.<br>Do you want to save changes?"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:762
-msgid "Please consider installing Sphinx to get documentation rendered in rich text."
+#: spyderlib/widgets/editor.py:1242
+msgid "Save"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:939
-msgid "Lock"
+#: spyderlib/widgets/editor.py:1243
+#, python-format
+msgid "<b>Unable to save script '%s'</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:939
-msgid "Unlock"
+#: spyderlib/widgets/editor.py:1263 spyderlib/plugins/editor.py:657
+msgid "Save file"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:984
-msgid "The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible Sphinx version or doc string decoding failed.<br><br>Error message:<br>%s"
+#: spyderlib/widgets/editor.py:1477
+#, python-format
+msgid ""
+"<b>%s</b> is unavailable (this file may have been removed, moved or renamed "
+"outside Spyder).<br>Do you want to close it?"
 msgstr ""
 
-#: spyderlib/plugins/inspector.py:1028
-msgid "No source code available."
+#: spyderlib/widgets/editor.py:1497
+#, python-format
+msgid ""
+"<b>%s</b> has been modified outside Spyder.<br>Do you want to reload it and "
+"lose all your changes?"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:62
-msgid "Symbolic mathematics in the IPython Console"
+#: spyderlib/widgets/editor.py:1593
+#, python-format
+msgid ""
+"All changes to <b>%s</b> will be lost.<br>Do you want to revert file from "
+"disk?"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:111
-msgid "The authenticity of host <b>%s</b> can't be established. Are you sure you want to continue connecting?"
+#: spyderlib/widgets/editor.py:1733
+#, python-format
+msgid "Loading %s..."
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:123
-msgid "The authenticity of the host can't be established"
+#: spyderlib/widgets/editor.py:1743
+#, python-format
+msgid ""
+"<b>%s</b> contains mixed end-of-line characters.<br>Spyder will fix this "
+"automatically."
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:130
-msgid "Tunnel '%s' failed to start"
+#: spyderlib/widgets/editor.py:2108
+msgid "Close window"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:135
-msgid "Could not connect to remote host"
+#: spyderlib/widgets/editor.py:2110
+msgid "Close this window"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:151
-#: spyderlib/plugins/ipythonconsole.py:689
-msgid "IPython console"
+#: spyderlib/widgets/shell.py:128
+msgid "Save history log..."
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:163
-msgid "Display initial banner"
+#: spyderlib/widgets/shell.py:130
+msgid "Save current history log (i.e. all inputs and outputs) in a text file"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:164
-msgid ""
-"This option lets you hide the message shown at\n"
-"the top of the console when it's opened."
+#: spyderlib/widgets/shell.py:133 spyderlib/widgets/projectexplorer.py:1015
+#: spyderlib/widgets/explorer.py:480 spyderlib/plugins/configdialog.py:1000
+msgid "Delete"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:166
-msgid "Use a pager to display additional text inside the console"
+#: spyderlib/widgets/shell.py:256
+msgid "Save history log"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:168
-msgid ""
-"Useful if you don't want to fill the console with long help or completion texts.\n"
-"Note: Use the Q key to get out of the pager."
+#: spyderlib/widgets/shell.py:259
+msgid "History logs"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:173
-msgid "Ask for confirmation before closing"
+#: spyderlib/widgets/shell.py:270
+#, python-format
+msgid "<b>Unable to save file '%s'</b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:183
-msgid "Completion Type"
+#: spyderlib/widgets/shell.py:712
+msgid "Copy without prompts"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:184
-msgid "Decide what type of completion to use"
+#: spyderlib/widgets/shell.py:715 spyderlib/widgets/shell.py:719
+msgid "Clear line"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:187
-msgid "Completion:"
+#: spyderlib/widgets/shell.py:721
+msgid "Clear shell"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:196
-msgid "Light background"
+#: spyderlib/widgets/shell.py:725
+msgid "Clear shell contents ('cls' command)"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:198
-msgid "Dark background"
+#: spyderlib/widgets/ipython.py:246
+msgid "Reset IPython namespace"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:208
-msgid "Buffer:  "
+#: spyderlib/widgets/ipython.py:247
+msgid ""
+"All user-defined variables will be removed.<br>Are you sure you want to "
+"reset the namespace?"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:210
-msgid ""
-"Set the maximum number of lines of text shown in the\n"
-"console before truncation. Specifying -1 disables it\n"
-"(not recommended!)"
+#: spyderlib/widgets/ipython.py:363 spyderlib/widgets/ipython.py:380
+#: spyderlib/widgets/externalshell/baseshell.py:250
+#: spyderlib/widgets/mixins.py:656
+msgid "Arguments"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:219
-msgid "Support for graphics (Matplotlib)"
+#: spyderlib/widgets/ipython.py:518
+msgid "An error ocurred while starting the kernel"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:220
-msgid "Activate support"
+#: spyderlib/widgets/ipython.py:533
+#: spyderlib/widgets/externalshell/baseshell.py:106
+#: spyderlib/plugins/help.py:391 spyderlib/plugins/runconfig.py:185
+#: spyderlib/plugins/runconfig.py:455 spyderlib/plugins/externalconsole.py:56
+#: spyderlib/plugins/externalconsole.py:999
+msgid "Console"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:221
-msgid "Automatically load Pylab and NumPy modules"
+#: spyderlib/widgets/ipython.py:547
+msgid "Restart kernel"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:224
-msgid ""
-"This lets you load graphics support without importing \n"
-"the commands to do plots. Useful to work with other\n"
-"plotting libraries different to Matplotlib or to develop \n"
-"GUIs with Spyder."
+#: spyderlib/widgets/ipython.py:567 spyderlib/widgets/findinfiles.py:333
+msgid "Stop"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:242
-msgid ""
-"This feature requires the Matplotlib library.\n"
-"It seems you don't have it installed."
+#: spyderlib/widgets/ipython.py:569
+msgid "Stop the current command"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:247
-msgid "Inline"
+#: spyderlib/widgets/ipython.py:593
+msgid "Inspect current object"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:248
-msgid "Automatic"
+#: spyderlib/widgets/ipython.py:598
+msgid "Clear line or block"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:249
-msgid "Graphics backend"
+#: spyderlib/widgets/ipython.py:602
+msgid "Reset namespace"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:250
-msgid "Decide how graphics are going to be displayed in the console. If unsure, please select <b>%s</b> to put graphics inside the console or <b>%s</b> to interact with them (through zooming and panning) in a separate window."
+#: spyderlib/widgets/ipython.py:605
+msgid "Clear console"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:283
-msgid "Inline backend"
+#: spyderlib/widgets/ipython.py:661
+msgid ""
+"It seems the kernel died unexpectedly. Use 'Restart kernel' to continue "
+"using this console."
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:284
-msgid "Decide how to render the figures created by this backend"
+#: spyderlib/widgets/ipython.py:681
+msgid "Changing backend to Qt for Mayavi"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:288
-msgid "Format:"
+#: spyderlib/widgets/ipython.py:690
+msgid "Kernel process is either remote or unspecified. Cannot interrupt"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:291
-msgid "Resolution:"
+#: spyderlib/widgets/ipython.py:699
+msgid "Kernel process is either remote or unspecified. Cannot restart."
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:291
-msgid "dpi"
+#: spyderlib/widgets/ipython.py:778
+msgid "Connecting to kernel..."
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:293
-msgid "Only used when the format is PNG. Default is 72"
+#: spyderlib/widgets/pathmanager.py:86
+msgid "Move to top"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:296
-msgid "Width:"
+#: spyderlib/widgets/pathmanager.py:92
+msgid "Move up"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:296
-#: spyderlib/plugins/ipythonconsole.py:300
-msgid "inches"
+#: spyderlib/widgets/pathmanager.py:98
+msgid "Move down"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:298
-msgid "Default is 6"
+#: spyderlib/widgets/pathmanager.py:104
+msgid "Move to bottom"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:300
-msgid "Height:"
+#: spyderlib/widgets/pathmanager.py:115 spyderlib/widgets/pathmanager.py:230
+msgid "Add path"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:302
-msgid "Default is 4"
+#: spyderlib/widgets/pathmanager.py:120 spyderlib/widgets/pathmanager.py:213
+msgid "Remove path"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:328 spyderlib/tour.py:552
-msgid "Run code"
+#: spyderlib/widgets/pathmanager.py:130
+msgid "Synchronize..."
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:329
-msgid "You can run several lines of code when a console is started. Please introduce each one separated by commas, for example:<br><i>import os, import sys</i>"
+#: spyderlib/widgets/pathmanager.py:132
+msgid "Synchronize Spyder's path list with PYTHONPATH environment variable"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:335
-msgid "Lines:"
+#: spyderlib/widgets/pathmanager.py:144
+msgid "Synchronize"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:344
-msgid "Run a file"
+#: spyderlib/widgets/pathmanager.py:145
+msgid ""
+"This will synchronize Spyder's path list with <b>PYTHONPATH</b> environment "
+"variable for current user, allowing you to run your Python modules outside "
+"Spyder without having to configure sys.path. <br>Do you want to clear "
+"contents of PYTHONPATH before adding Spyder's path list?"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:345
-msgid "You can also run a whole file at startup instead of just some lines (This is similar to have a PYTHONSTARTUP file)."
+#: spyderlib/widgets/pathmanager.py:214
+msgid "Do you really want to remove selected path?"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:349
-msgid "Use the following file:"
+#: spyderlib/widgets/pathmanager.py:223 spyderlib/widgets/findinfiles.py:504
+#: spyderlib/widgets/projectexplorer.py:899
+#: spyderlib/widgets/externalshell/pythonshell.py:638
+#: spyderlib/widgets/explorer.py:584 spyderlib/plugins/configdialog.py:490
+#: spyderlib/plugins/configdialog.py:505
+#: spyderlib/plugins/workingdirectory.py:290
+#: spyderlib/plugins/runconfig.py:176 spyderlib/plugins/runconfig.py:240
+msgid "Select directory"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:363
-msgid "Greedy completion"
+#: spyderlib/widgets/pathmanager.py:231
+msgid ""
+"This directory is already included in Spyder path list.<br>Do you want to "
+"move it to the top of the list?"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:364
-msgid "Enable <tt>Tab</tt> completion on elements of lists, results of function calls, etc, <i>without</i> assigning them to a variable.<br>For example, you can get completions on things like <tt>li[0].<Tab></tt> or <tt>ins.meth().<Tab></tt>"
+#: spyderlib/widgets/findinfiles.py:158
+msgid "Unexpected error: see internal console"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:372
-msgid "Use the greedy completer"
+#: spyderlib/widgets/findinfiles.py:209 spyderlib/widgets/findinfiles.py:233
+#: spyderlib/widgets/findinfiles.py:280
+msgid "invalid regular expression"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:383
-msgid "Autocall"
+#: spyderlib/widgets/findinfiles.py:278
+msgid "permission denied errors were encountered"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:384
-msgid "Autocall makes IPython automatically call any callable object even if you didn't type explicit parentheses.<br>For example, if you type <i>str 43</i> it becomes <i>str(43)</i> automatically."
+#: spyderlib/widgets/findinfiles.py:315
+msgid "Search pattern"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:391
-msgid "Smart"
+#: spyderlib/widgets/findinfiles.py:318 spyderlib/widgets/findinfiles.py:352
+#: spyderlib/widgets/findinfiles.py:364 spyderlib/widgets/findreplace.py:77
+msgid "Regular expression"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:392
-msgid "Full"
+#: spyderlib/widgets/findinfiles.py:327
+msgid "Search"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:393
-msgid "Off"
+#: spyderlib/widgets/findinfiles.py:330
+msgid "Start search"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:395
-msgid "Autocall:  "
+#: spyderlib/widgets/findinfiles.py:336
+msgid "Stop search"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:396
-msgid "On <b>%s</b> mode, Autocall is not applied if there are no arguments after the callable. On <b>%s</b> mode, all callable objects are automatically called (even if no arguments are present)."
+#: spyderlib/widgets/findinfiles.py:346
+msgid "Included filenames pattern"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:408
-msgid "Symbolic Mathematics"
+#: spyderlib/widgets/findinfiles.py:355
+msgid "Include:"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:409
-msgid "Perfom symbolic operations in the console (e.g. integrals, derivatives, vector calculus, etc) and get the outputs in a beautifully printed style."
+#: spyderlib/widgets/findinfiles.py:358
+msgid "Excluded filenames pattern"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:414
-msgid "Use symbolic math"
+#: spyderlib/widgets/findinfiles.py:367
+msgid "Exclude:"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:415
-msgid "This option loads the Sympy library to work with.<br>Please refer to its documentation to learn how to use it."
+#: spyderlib/widgets/findinfiles.py:377
+msgid "PYTHONPATH"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:428
+#: spyderlib/widgets/findinfiles.py:380
 msgid ""
-"This feature requires the Sympy library.\n"
-"It seems you don't have it installed."
+"Search in all directories listed in sys.path which are outside the Python "
+"installation directory"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:433
-msgid "Prompts"
+#: spyderlib/widgets/findinfiles.py:382
+msgid "Hg repository"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:434
-msgid "Modify how Input and Output prompts are shown in the console."
+#: spyderlib/widgets/findinfiles.py:385
+msgid "Search in current directory hg repository"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:437
-msgid "Input prompt:"
+#: spyderlib/widgets/findinfiles.py:386
+msgid "Here:"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:439
-msgid "Default is<br>In [<span class=\"in-prompt-number\">%i</span>]:"
+#: spyderlib/widgets/findinfiles.py:390
+msgid "Search recursively in this directory"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:443
-msgid "Output prompt:"
+#: spyderlib/widgets/findinfiles.py:395
+msgid "Browse a search directory"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:445
-msgid "Default is<br>Out[<span class=\"out-prompt-number\">%i</span>]:"
+#: spyderlib/widgets/findinfiles.py:425
+msgid "Hide advanced options"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:467
-#: spyderlib/plugins/workingdirectory.py:44
-msgid "Startup"
+#: spyderlib/widgets/findinfiles.py:428
+msgid "Show advanced options"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:469
-msgid "Advanced Settings"
+#: spyderlib/widgets/findinfiles.py:569
+msgid "Search canceled"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:481
-#: spyderlib/plugins/ipythonconsole.py:749
-msgid "Connect to an existing kernel"
+#: spyderlib/widgets/findinfiles.py:573
+msgid "String not found"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:483
-msgid "Please enter the connection info of the kernel you want to connect to. For that you can either select its JSON connection file using the <tt>Browse</tt> button, or write directly its id, in case it's a local kernel (for example <tt>kernel-3764.json</tt> or just <tt>3764</tt>)."
+#: spyderlib/widgets/findinfiles.py:575
+msgid "matches in"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:494
-msgid "Connection info:"
+#: spyderlib/widgets/findinfiles.py:576
+msgid "file"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:496
-msgid "Path to connection file or kernel id"
+#: spyderlib/widgets/findinfiles.py:584
+msgid "interrupted"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:498
-#: spyderlib/plugins/ipythonconsole.py:515
-msgid "Browse"
+#: spyderlib/widgets/findinfiles.py:689 spyderlib/plugins/findinfiles.py:114
+msgid "Find in files"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:507
-msgid "This is a remote kernel"
+#: spyderlib/widgets/tabs.py:142
+msgid "Browse tabs"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:511
-msgid "username at hostname:port"
+#: spyderlib/widgets/tabs.py:271
+msgid "Close current tab"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:514
-msgid "Path to ssh key file"
+#: spyderlib/widgets/pydocgui.py:107
+msgid "Module or package:"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:523
-msgid "Password or ssh key passphrase"
+#: spyderlib/widgets/editortools.py:94 spyderlib/widgets/editortools.py:130
+#, python-format
+msgid "Line %s"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:527
-msgid "Host name"
+#: spyderlib/widgets/editortools.py:99
+#, python-format
+msgid "Class defined at line %s"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:528
-msgid "Ssh key"
+#: spyderlib/widgets/editortools.py:107
+#, python-format
+msgid "Method defined at line %s"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:529
-msgid "Password"
+#: spyderlib/widgets/editortools.py:117
+#, python-format
+msgid "Function defined at line %s"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:558
-msgid "Open IPython connection file"
+#: spyderlib/widgets/editortools.py:149
+#, python-format
+msgid "Cell starts at line %s"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:564
-msgid "Select ssh key"
+#: spyderlib/widgets/editortools.py:195
+#: spyderlib/plugins/outlineexplorer.py:48
+msgid "Outline"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:737
-msgid "Open an &IPython console"
+#: spyderlib/widgets/editortools.py:202 spyderlib/widgets/editortools.py:539
+msgid "Go to cursor position"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:740
-msgid "Use %s+T when the console is selected to open a new one"
+#: spyderlib/widgets/editortools.py:205
+msgid "Show absolute path"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:743
-msgid "Open a new console"
+#: spyderlib/widgets/editortools.py:208 spyderlib/widgets/explorer.py:178
+msgid "Show all files"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:750
-msgid "Open a new IPython console connected to an existing kernel"
+#: spyderlib/widgets/editortools.py:211
+msgid "Show special comments"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:833
-msgid "No IPython console is currently available to run <b>%s</b>.<br><br>Please open a new one and try again."
+#: spyderlib/widgets/editortools.py:510 spyderlib/plugins/editor.py:615
+msgid "Show/hide outline explorer"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:968
-msgid "Do you want to close all other consoles connected to the same kernel as this one?"
+#: spyderlib/widgets/fileswitcher.py:108
+msgid "unsaved file"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:1050
-msgid "Connection error"
+#: spyderlib/widgets/fileswitcher.py:228
+msgid ""
+"Press <b>Enter</b> to switch files or <b>Esc</b> to cancel.<br><br>Type to "
+"filter filenames.<br><br>Use <b>:number</b> to go to a line, e.g. "
+"<b><code>main:42</code></b><br>Use <b>@symbol_text</b> to go to a symbol, e."
+"g. <b><code>@init</code></b><br><br> Press <b>Ctrl+W</b> to close current "
+"tab.<br>"
+msgstr ""
+
+#: spyderlib/widgets/fileswitcher.py:485
+msgid "lines"
+msgstr ""
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:97
+msgid "Go to line:"
+msgstr ""
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:105
+msgid "Line count:"
+msgstr ""
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1269
+msgid "Breakpoint"
+msgstr ""
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1270
+msgid "Condition:"
+msgstr ""
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1672
+msgid "Code analysis"
+msgstr ""
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1726
+msgid "To do"
+msgstr ""
+
+#: spyderlib/widgets/sourcecode/codeeditor.py:1967
+msgid "Removal error"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:1051
+#: spyderlib/widgets/sourcecode/codeeditor.py:1968
 msgid ""
-"Could not open ssh tunnel. The error was:\n"
+"It was not possible to remove outputs from this notebook. The error is:\n"
 "\n"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:1088
-msgid "IPython"
+#: spyderlib/widgets/sourcecode/codeeditor.py:1980
+#: spyderlib/widgets/explorer.py:524
+msgid "Conversion error"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:1089
-msgid "Unable to connect to IPython <b>%s"
+#: spyderlib/widgets/sourcecode/codeeditor.py:1981
+#: spyderlib/widgets/explorer.py:525
+msgid ""
+"It was not possible to convert this notebook. The error is:\n"
+"\n"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:1140
-msgid "Are you sure you want to restart the kernel?"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2438
+#: spyderlib/plugins/editor.py:879
+msgid "Comment"
 msgstr ""
 
-#: spyderlib/plugins/ipythonconsole.py:1142
-msgid "Restart kernel?"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2438
+#: spyderlib/plugins/editor.py:879
+msgid "Uncomment"
 msgstr ""
 
-#: spyderlib/plugins/layoutdialog.py:174
-msgid "Move Up"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2442
+msgid "Clear all ouput"
 msgstr ""
 
-#: spyderlib/plugins/layoutdialog.py:175
-msgid "Move Down"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2445
+#: spyderlib/widgets/explorer.py:253
+msgid "Convert to Python script"
 msgstr ""
 
-#: spyderlib/plugins/layoutdialog.py:176
-msgid "Delete Layout"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2448
+msgid "Go to definition"
 msgstr ""
 
-#: spyderlib/plugins/layoutdialog.py:180
-msgid "Layout Dispay and Order"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2451
+#: spyderlib/plugins/editor.py:816
+msgid "Run cell"
 msgstr ""
 
-#: spyderlib/plugins/onlinehelp.py:68
-msgid "Online help"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2455
+#: spyderlib/plugins/editor.py:824
+msgid "Run cell and advance"
 msgstr ""
 
-#: spyderlib/plugins/outlineexplorer.py:48
-#: spyderlib/widgets/editortools.py:195
-msgid "Outline"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2459
+#: spyderlib/plugins/editor.py:800
+msgid "Run &selection or current line"
 msgstr ""
 
-#: spyderlib/plugins/projectexplorer.py:53
-#: spyderlib/widgets/projectexplorer.py:1150
-#: spyderlib/widgets/projectexplorer.py:1164
-msgid "Project explorer"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2462
+#: spyderlib/widgets/browser.py:34
+msgid "Zoom in"
 msgstr ""
 
-#: spyderlib/plugins/projectexplorer.py:64
-#: spyderlib/widgets/projectexplorer.py:549
-msgid "New project..."
+#: spyderlib/widgets/sourcecode/codeeditor.py:2465
+#: spyderlib/widgets/browser.py:31
+msgid "Zoom out"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:28
-msgid "Execute in current Python or IPython console"
+#: spyderlib/widgets/sourcecode/codeeditor.py:2468
+msgid "Zoom reset"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:29
-msgid "Execute in a new dedicated Python console"
+#: spyderlib/widgets/internalshell.py:258
+msgid "Help..."
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:30
-msgid "Execute in an external System terminal"
+#: spyderlib/widgets/internalshell.py:275
+msgid "Shell special commands:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:40
-msgid "Always show %s on a first file run"
+#: spyderlib/widgets/internalshell.py:276
+msgid "Internal editor:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:159
-msgid "General settings"
+#: spyderlib/widgets/internalshell.py:277
+msgid "External editor:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:162 spyderlib/plugins/runconfig.py:208
-msgid "Command line options:"
+#: spyderlib/widgets/internalshell.py:278
+msgid "Run script:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:168
-msgid "Working directory:"
+#: spyderlib/widgets/internalshell.py:279
+msgid "Remove references:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:180 spyderlib/plugins/runconfig.py:491
-msgid "Enter debugging mode when errors appear during execution"
+#: spyderlib/widgets/internalshell.py:280
+msgid "System commands:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:196 spyderlib/plugins/runconfig.py:501
-msgid "Dedicated Python console"
+#: spyderlib/widgets/internalshell.py:281
+msgid "Python help:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:200 spyderlib/plugins/runconfig.py:503
-msgid "Interact with the Python console after execution"
+#: spyderlib/widgets/internalshell.py:282
+msgid "GUI-based editor:"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:204
-msgid "Show warning when killing running process"
+#: spyderlib/widgets/projectexplorer.py:335
+msgid "its own configuration file"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:213
-msgid "<b>-u</b> is added to the other options you set here"
+#: spyderlib/widgets/projectexplorer.py:337
+msgid " and "
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:223
-msgid "this dialog"
+#: spyderlib/widgets/projectexplorer.py:341
+#, python-format
+msgid "the following projects:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:282
-msgid "Run configuration"
+#: spyderlib/widgets/projectexplorer.py:545
+msgid "Project..."
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:283
-msgid "The following working directory is not valid:<br><b>%s</b>"
+#: spyderlib/widgets/projectexplorer.py:549
+#: spyderlib/plugins/projectexplorer.py:64
+msgid "New project..."
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:361
-msgid "Run settings for %s"
+#: spyderlib/widgets/projectexplorer.py:558
+msgid "Existing directory"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:393
-msgid "Select a run configuration:"
+#: spyderlib/widgets/projectexplorer.py:562
+msgid "Existing Spyder project"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:422 spyderlib/plugins/runconfig.py:447
-msgid "Run Settings"
+#: spyderlib/widgets/projectexplorer.py:566
+msgid "Existing Pydev project"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:449
-msgid "The following are the default <i>%s</i>. These options may be overriden using the <b>%s</b> dialog box (see the <b>%s</b> menu)"
+#: spyderlib/widgets/projectexplorer.py:583
+msgid "Open project"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:475
-msgid "Default working directory is:"
+#: spyderlib/widgets/projectexplorer.py:588
+msgid "Close project"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:477
-msgid "the script directory"
+#: spyderlib/widgets/projectexplorer.py:593
+msgid "Close unrelated projects"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:480 spyderlib/plugins/workingdirectory.py:56
-msgid "the following directory:"
+#: spyderlib/widgets/projectexplorer.py:602
+msgid "Edit related projects"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:506
-msgid "Show warning when killing running processes"
+#: spyderlib/widgets/projectexplorer.py:610
+msgid "Add to PYTHONPATH"
 msgstr ""
 
-#: spyderlib/plugins/runconfig.py:515
-msgid "Run Settings dialog"
+#: spyderlib/widgets/projectexplorer.py:615
+msgid "Remove from PYTHONPATH"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:134
+#: spyderlib/widgets/projectexplorer.py:620
+msgid "Properties"
+msgstr ""
+
+#: spyderlib/widgets/projectexplorer.py:655
+msgid "Show horizontal scrollbar"
+msgstr ""
+
+#: spyderlib/widgets/projectexplorer.py:692
+msgid "Workspace"
+msgstr ""
+
+#: spyderlib/widgets/projectexplorer.py:693
+#, python-format
 msgid ""
-"Press the new shortcut and select 'Ok': \n"
-"(Press 'Tab' once to switch focus between the shortcut entry \n"
-"and the buttons below it)"
+"The workspace was unable to load or save %s<br><br>Please check if you have "
+"the permission to write the associated configuration files."
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:137
-msgid "Current shortcut:"
+#: spyderlib/widgets/projectexplorer.py:752
+msgid "Import directory"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:139
-msgid "New shortcut:"
+#: spyderlib/widgets/projectexplorer.py:754
+#, python-format
+msgid ""
+"The following directory is not in workspace:<br><b>%s</b><br><br>Do you want "
+"to continue (and copy the directory to workspace)?"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:152
-msgid "Shortcut: {0}"
+#: spyderlib/widgets/projectexplorer.py:770
+#: spyderlib/widgets/projectexplorer.py:1187 spyderlib/widgets/explorer.py:501
+#, python-format
+msgid "<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:273
-msgid "Please introduce a different shortcut"
+#: spyderlib/widgets/projectexplorer.py:772
+#: spyderlib/widgets/projectexplorer.py:1183
+msgid "copy"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:310
-msgid "The new shorcut conflicts with:"
+#: spyderlib/widgets/projectexplorer.py:823
+#: spyderlib/widgets/projectexplorer.py:830
+#: spyderlib/widgets/projectexplorer.py:1101
+#: spyderlib/widgets/projectexplorer.py:1186 spyderlib/widgets/explorer.py:500
+msgid "Project Explorer"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:321
-msgid "A compound sequence can have {break} a maximum of 4 subsequences.{break}"
+#: spyderlib/widgets/projectexplorer.py:824
+#, python-format
+msgid "The project <b>%s</b> is already opened!"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:326
-msgid "Invalid key entered"
+#: spyderlib/widgets/projectexplorer.py:831
+#, python-format
+msgid ""
+"The project root path directory is inside the workspace but not as the "
+"expected tree level. It is not a directory of the workspace:<br><b>%s</b>"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:515
-msgid "Context"
+#: spyderlib/widgets/projectexplorer.py:842
+msgid "Project name:"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:517 spyderlib/widgets/dicteditor.py:158
-msgid "Name"
+#: spyderlib/widgets/projectexplorer.py:851
+#, python-format
+msgid "A project named <b>%s</b> already exists"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:519
-msgid "Shortcut"
+#: spyderlib/widgets/projectexplorer.py:856
+#, python-format
+msgid ""
+"Invalid project name.<br><br>Name must match the following regular "
+"expression:<br><b>%s</b>"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:521
-msgid "Score"
+#: spyderlib/widgets/projectexplorer.py:863
+#, python-format
+msgid ""
+"The following directory is not empty:<br><b>%s</b><br><br>Do you want to "
+"continue?"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:681
-msgid "Conflicts"
+#: spyderlib/widgets/projectexplorer.py:876
+msgid "New project"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:682
-msgid "The following conflicts have been detected:"
+#: spyderlib/widgets/projectexplorer.py:884
+msgid ""
+"The current workspace has not been configured yet.\n"
+"Do you want to do this now?"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:767
-msgid "Keyboard shortcuts"
+#: spyderlib/widgets/projectexplorer.py:922
+msgid "Import existing project"
 msgstr ""
 
-#: spyderlib/plugins/shortcuts.py:775
-msgid "Search: "
+#: spyderlib/widgets/projectexplorer.py:935
+msgid "Select projects to import"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:24
-msgid "Autorefresh"
+#: spyderlib/widgets/projectexplorer.py:947
+#, python-format
+msgid "The folder <i>%s</i> does not contain a valid %s project"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:25
-msgid "Enable autorefresh"
+#: spyderlib/widgets/projectexplorer.py:977
+msgid "Import existing Pydev project"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:27
-msgid "Refresh interval: "
+#: spyderlib/widgets/projectexplorer.py:978
+#, python-format
+msgid ""
+"<b>Unable to read Pydev project <i>%s</i></b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:28
-msgid " ms"
+#: spyderlib/widgets/projectexplorer.py:1016
+#, python-format
+msgid ""
+"Do you really want to delete project <b>%s</b>?<br><br>Note: project files "
+"won't be deleted from disk."
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:31
-msgid "Filter"
+#: spyderlib/widgets/projectexplorer.py:1069
+msgid "Related projects"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:33
-#: spyderlib/widgets/externalshell/namespacebrowser.py:214
-msgid "Exclude private references"
+#: spyderlib/widgets/projectexplorer.py:1077
+#, python-format
+msgid "Select projects which are related to <b>%s</b>"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:34
-#: spyderlib/widgets/externalshell/namespacebrowser.py:229
-msgid "Exclude capitalized references"
+#: spyderlib/widgets/projectexplorer.py:1102
+#, python-format
+msgid ""
+"Statistics on source files only:<br>(Python, Cython, IPython, Enaml,C/C++, "
+"Fortran)<br><br><b>%s</b> files.<br><b>%s</b> lines of code."
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:35
-#: spyderlib/widgets/externalshell/namespacebrowser.py:222
-msgid "Exclude all-uppercase references"
+#: spyderlib/widgets/projectexplorer.py:1150
+#: spyderlib/widgets/projectexplorer.py:1164
+#: spyderlib/plugins/projectexplorer.py:53
+msgid "Project explorer"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:36
-#: spyderlib/widgets/externalshell/namespacebrowser.py:237
-msgid "Exclude unsupported data types"
+#: spyderlib/widgets/projectexplorer.py:1151
+#, python-format
+msgid "File <b>%s</b> already exists.<br>Do you want to overwrite it?"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:42
-#: spyderlib/widgets/dicteditor.py:708
-msgid "Truncate values"
+#: spyderlib/widgets/projectexplorer.py:1165
+#, python-format
+msgid "Folder <b>%s</b> already exists."
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:44
-#: spyderlib/widgets/dicteditor.py:712
-msgid "Show arrays min/max"
+#: spyderlib/widgets/projectexplorer.py:1185
+msgid "move"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:46
-msgid "Edit data in the remote process"
+#: spyderlib/widgets/projectexplorer.py:1195
+msgid "Select an existing workspace directory, or create a new one"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:47
+#: spyderlib/widgets/projectexplorer.py:1196
 msgid ""
-"Editors are opened in the remote process for NumPy arrays, PIL images, lists, tuples and dictionaries.\n"
-"This avoids transfering large amount of data between the remote process and Spyder (through the socket)."
+"<u><b>What is the workspace?</b></u><br><br>A <b>Spyder workspace</b> is a "
+"directory on your filesystem that contains Spyder projects and <b>."
+"spyderworkspace</b> configuration file.<br><br>A <b>Spyder project</b> is a "
+"directory with source code (and other related files) and a configuration "
+"file (named <b>.spyderproject</b>) with project settings (PYTHONPATH, linked "
+"projects, ...).<br>"
 msgstr ""
 
-#: spyderlib/plugins/variableexplorer.py:183
-msgid "Variable explorer"
+#: spyderlib/widgets/projectexplorer.py:1225
+msgid "This is the current workspace directory"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:37
-msgid "The <b>global working directory</b> is the working directory for newly opened <i>consoles</i> (Python/IPython consoles and terminals), for the <i>file explorer</i>, for the <i>find in files</i> plugin and for new files created in the <i>editor</i>."
+#: spyderlib/widgets/projectexplorer.py:1255
+#, python-format
+msgid ""
+"The following directory is not a Spyder workspace:<br>%s<br><br>Do you want "
+"to create a new workspace in this directory?"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:46
-msgid "At startup, the global working directory is:"
+#: spyderlib/widgets/externalshell/pythonshell.py:284
+msgid "Variables"
+msgstr ""
+
+#: spyderlib/widgets/externalshell/pythonshell.py:285
+msgid "Show/hide global variables explorer"
+msgstr ""
+
+#: spyderlib/widgets/externalshell/pythonshell.py:289
+msgid "Terminate"
+msgstr ""
+
+#: spyderlib/widgets/externalshell/pythonshell.py:290
+msgid ""
+"Attempts to stop the process. The process\n"
+"may not exit as a result of clicking this\n"
+"button (it is given the chance to prompt\n"
+"the user for any unsaved files, etc)."
+msgstr ""
+
+#: spyderlib/widgets/externalshell/pythonshell.py:303
+msgid "Interact"
+msgstr ""
+
+#: spyderlib/widgets/externalshell/pythonshell.py:305
+msgid "Debug"
+msgstr ""
+
+#: spyderlib/widgets/externalshell/pythonshell.py:307
+#: spyderlib/widgets/externalshell/pythonshell.py:373
+msgid "Arguments..."
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:50
-msgid "the same as in last session"
+#: spyderlib/widgets/externalshell/pythonshell.py:309
+msgid "Post Mortem Debug"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:52
-msgid "At startup, Spyder will restore the global directory from last session"
+#: spyderlib/widgets/externalshell/pythonshell.py:311
+#: spyderlib/plugins/editor.py:783
+msgid "Run settings"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:58
-msgid "At startup, the global working directory will be the specified path"
+#: spyderlib/widgets/externalshell/pythonshell.py:315
+msgid "Working directory"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:70
-msgid "Files are opened from:"
+#: spyderlib/widgets/externalshell/pythonshell.py:317
+msgid "Set current working directory"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:74
-#: spyderlib/plugins/workingdirectory.py:87
-msgid "the current file directory"
+#: spyderlib/widgets/externalshell/pythonshell.py:319
+msgid "Environment variables"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:78
-#: spyderlib/plugins/workingdirectory.py:91
-msgid "the global working directory"
+#: spyderlib/widgets/externalshell/pythonshell.py:323
+msgid "Show sys.path contents"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:83
-msgid "Files are created in:"
+#: spyderlib/widgets/externalshell/pythonshell.py:369
+#, python-format
+msgid "Arguments: %s"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:97
-msgid "Change to file base directory"
+#: spyderlib/widgets/externalshell/pythonshell.py:371
+msgid "No argument"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:99
-msgid "When opening a file"
+#: spyderlib/widgets/externalshell/pythonshell.py:550
+msgid ""
+"The kernel failed to start!! That's all we know... Please close this console "
+"and open a new one."
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:101
-msgid "When saving a file"
+#: spyderlib/widgets/externalshell/pythonshell.py:554
+msgid "A Python console failed to start!"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:171
-msgid "Back"
+#: spyderlib/widgets/externalshell/systemshell.py:105
+msgid "Process failed to start"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:179
-#: spyderlib/widgets/explorer.py:1021 spyderlib/widgets/importwizard.py:529
-msgid "Next"
+#: spyderlib/widgets/externalshell/baseshell.py:141
+msgid "Run again this program"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:190
-msgid ""
-"This is the working directory for newly\n"
-"opened consoles (Python/IPython consoles and\n"
-"terminals), for the file explorer, for the\n"
-"find in files plugin and for new files\n"
-"created in the editor"
+#: spyderlib/widgets/externalshell/baseshell.py:144
+msgid "Kill"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:216
-msgid "Browse a working directory"
+#: spyderlib/widgets/externalshell/baseshell.py:146
+msgid "Kills the current process, causing it to exit immediately"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:222
-msgid "Set as current console's working directory"
+#: spyderlib/widgets/externalshell/baseshell.py:172
+#: spyderlib/plugins/externalconsole.py:69
+msgid "Show elapsed time"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:230
-msgid "Change to parent directory"
+#: spyderlib/widgets/externalshell/baseshell.py:219
+msgid "<span style='color: #44AA44'><b>Running...</b></span>"
 msgstr ""
 
-#: spyderlib/plugins/workingdirectory.py:237
-msgid "Global working directory"
+#: spyderlib/widgets/externalshell/baseshell.py:225
+msgid "Terminated."
 msgstr ""
 
-#: spyderlib/restart_app.py:129
-msgid ""
-"It was not possible to close the previous Spyder instance.\n"
-"Restart aborted."
+#: spyderlib/widgets/externalshell/baseshell.py:251
+msgid "Command line arguments:"
 msgstr ""
 
-#: spyderlib/restart_app.py:131
+#: spyderlib/widgets/arraybuilder.py:162
 msgid ""
-"Spyder could not reset to factory defaults.\n"
-"Restart aborted."
+"\n"
+"           <b>Numpy Array/Matrix Helper</b><br>\n"
+"           Type an array in Matlab    : <code>[1 2;3 4]</code><br>\n"
+"           or Spyder simplified syntax : <code>1 2;3 4</code>\n"
+"           <br><br>\n"
+"           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.\n"
+"           <br><br>\n"
+"           <b>Hint:</b><br>\n"
+"           Use two spaces or two tabs to generate a ';'.\n"
+"           "
 msgstr ""
 
-#: spyderlib/restart_app.py:133
+#: spyderlib/widgets/arraybuilder.py:173
 msgid ""
-"It was not possible to restart Spyder.\n"
-"Operation aborted."
+"\n"
+"           <b>Numpy Array/Matrix Helper</b><br>\n"
+"           Enter an array in the table. <br>\n"
+"           Use Tab to move between cells.\n"
+"           <br><br>\n"
+"           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.\n"
+"           <br><br>\n"
+"           <b>Hint:</b><br>\n"
+"           Use two tabs at the end of a row to move to the next row.\n"
+"           "
 msgstr ""
 
-#: spyderlib/restart_app.py:135
-msgid "Spyder exit error"
+#: spyderlib/widgets/arraybuilder.py:337
+msgid "Array dimensions not valid"
 msgstr ""
 
-#: spyderlib/restart_app.py:136
-msgid "Spyder reset error"
+#: spyderlib/widgets/dependencies.py:59
+msgid "Module"
 msgstr ""
 
-#: spyderlib/restart_app.py:137
-msgid "Spyder restart error"
+#: spyderlib/widgets/dependencies.py:59
+msgid " Required "
 msgstr ""
 
-#: spyderlib/restart_app.py:161
-msgid "Closing Spyder"
+#: spyderlib/widgets/dependencies.py:60
+msgid " Installed "
 msgstr ""
 
-#: spyderlib/restart_app.py:234
-msgid "Resetting Spyder to defaults"
+#: spyderlib/widgets/dependencies.py:60
+msgid "Provided features"
 msgstr ""
 
-#: spyderlib/restart_app.py:266
-msgid "Restarting"
+#: spyderlib/widgets/dependencies.py:130
+msgid "Dependencies"
 msgstr ""
 
-#: spyderlib/spyder.py:124
-msgid "Initializing..."
+#: spyderlib/widgets/dependencies.py:137
+#, python-format
+msgid ""
+"Spyder depends on several Python modules to provide the right functionality "
+"for all its panes. The table below shows the required and installed versions "
+"(if any) of all of them.<br><br><b>Note</b>: You can safely use Spyder "
+"without the following modules installed: <b>%s</b> and <b>%s</b>"
 msgstr ""
 
-#: spyderlib/spyder.py:247
-msgid "Numpy and Scipy documentation"
+#: spyderlib/widgets/dependencies.py:150
+msgid "Copy to clipboard"
 msgstr ""
 
-#: spyderlib/spyder.py:249 spyderlib/spyder.py:1084
-msgid "Matplotlib documentation"
+#: spyderlib/widgets/explorer.py:174
+msgid "Edit filename filters..."
 msgstr ""
 
-#: spyderlib/spyder.py:252
-msgid "PyQt4 Reference Guide"
+#: spyderlib/widgets/explorer.py:188
+msgid "Edit filename filters"
 msgstr ""
 
-#: spyderlib/spyder.py:255
-msgid "PyQt4 API Reference"
+#: spyderlib/widgets/explorer.py:189
+msgid "Name filters:"
 msgstr ""
 
-#: spyderlib/spyder.py:257
-msgid "Python(x,y)"
+#: spyderlib/widgets/explorer.py:208
+msgid "File..."
 msgstr ""
 
-#: spyderlib/spyder.py:259
-msgid "WinPython"
+#: spyderlib/widgets/explorer.py:212
+msgid "Module..."
 msgstr ""
 
-#: spyderlib/spyder.py:305
-msgid "Reload last session"
+#: spyderlib/widgets/explorer.py:216
+msgid "Folder..."
 msgstr ""
 
-#: spyderlib/spyder.py:309
-msgid "Load session..."
+#: spyderlib/widgets/explorer.py:220
+msgid "Package..."
 msgstr ""
 
-#: spyderlib/spyder.py:312
-msgid "Load Spyder session"
+#: spyderlib/widgets/explorer.py:243
+msgid "Move..."
 msgstr ""
 
-#: spyderlib/spyder.py:314
-msgid "Save session and quit..."
+#: spyderlib/widgets/explorer.py:246
+msgid "Delete..."
 msgstr ""
 
-#: spyderlib/spyder.py:317
-msgid "Save current session and quit application"
+#: spyderlib/widgets/explorer.py:249
+msgid "Rename..."
 msgstr ""
 
-#: spyderlib/spyder.py:530
-msgid "Close current pane"
+#: spyderlib/widgets/explorer.py:252
+msgid "Open"
 msgstr ""
 
-#: spyderlib/spyder.py:535
-msgid "Lock panes"
+#: spyderlib/widgets/explorer.py:287
+msgid "Commit"
 msgstr ""
 
-#: spyderlib/spyder.py:542
-msgid "Use next layout"
+#: spyderlib/widgets/explorer.py:290
+msgid "Browse repository"
 msgstr ""
 
-#: spyderlib/spyder.py:546
-msgid "Use previous layout"
+#: spyderlib/widgets/explorer.py:301
+msgid "Open command prompt here"
 msgstr ""
 
-#: spyderlib/spyder.py:555
-msgid "&Find text"
+#: spyderlib/widgets/explorer.py:303
+msgid "Open terminal here"
 msgstr ""
 
-#: spyderlib/spyder.py:560
-msgid "Find &next"
+#: spyderlib/widgets/explorer.py:308
+msgid "Open Python console here"
 msgstr ""
 
-#: spyderlib/spyder.py:567
-msgid "Find &previous"
+#: spyderlib/widgets/explorer.py:322
+msgid "New"
 msgstr ""
 
-#: spyderlib/spyder.py:573
-msgid "&Replace text"
+#: spyderlib/widgets/explorer.py:330
+msgid "Import"
 msgstr ""
 
-#: spyderlib/spyder.py:580 spyderlib/widgets/editor.py:339
-msgid "File switcher..."
+#: spyderlib/widgets/explorer.py:481
+#, python-format
+msgid "Do you really want to delete <b>%s</b>?"
 msgstr ""
 
-#: spyderlib/spyder.py:582
-msgid "Fast switch between files"
+#: spyderlib/widgets/explorer.py:499
+msgid "delete"
 msgstr ""
 
-#: spyderlib/spyder.py:600 spyderlib/widgets/sourcecode/codeeditor.py:2425
-msgid "Undo"
+#: spyderlib/widgets/explorer.py:543
+msgid "New name:"
 msgstr ""
 
-#: spyderlib/spyder.py:602 spyderlib/widgets/sourcecode/codeeditor.py:2428
-msgid "Redo"
+#: spyderlib/widgets/explorer.py:551
+#, python-format
+msgid ""
+"Do you really want to rename <b>%s</b> and overwrite the existing file <b>"
+"%s</b>?"
 msgstr ""
 
-#: spyderlib/spyder.py:604 spyderlib/widgets/arrayeditor.py:392
-#: spyderlib/widgets/dataframeeditor.py:418
-#: spyderlib/widgets/dicteditor.py:680 spyderlib/widgets/shell.py:126
-#: spyderlib/widgets/sourcecode/codeeditor.py:2434
-msgid "Copy"
+#: spyderlib/widgets/explorer.py:562
+#, python-format
+msgid "<b>Unable to rename file <i>%s</i></b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/spyder.py:606 spyderlib/widgets/shell.py:122
-#: spyderlib/widgets/sourcecode/codeeditor.py:2431
-msgid "Cut"
+#: spyderlib/widgets/explorer.py:598
+#, python-format
+msgid "<b>Unable to move <i>%s</i></b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/spyder.py:608 spyderlib/widgets/dicteditor.py:677
-#: spyderlib/widgets/shell.py:130
-#: spyderlib/widgets/sourcecode/codeeditor.py:2437
-msgid "Paste"
+#: spyderlib/widgets/explorer.py:616
+#, python-format
+msgid "<b>Unable to create folder <i>%s</i></b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/spyder.py:610 spyderlib/widgets/explorer.py:470
-#: spyderlib/widgets/projectexplorer.py:1015 spyderlib/widgets/shell.py:139
-#: spyderlib/widgets/sourcecode/codeeditor.py:2440
-msgid "Delete"
+#: spyderlib/widgets/explorer.py:629 spyderlib/widgets/explorer.py:663
+#, python-format
+msgid "<b>Unable to create file <i>%s</i></b><br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/spyder.py:614 spyderlib/widgets/shell.py:143
-#: spyderlib/widgets/sourcecode/codeeditor.py:2444
-msgid "Select All"
+#: spyderlib/widgets/explorer.py:637
+msgid "New folder"
 msgstr ""
 
-#: spyderlib/spyder.py:664
-msgid "C&onsoles"
+#: spyderlib/widgets/explorer.py:638
+msgid "Folder name:"
 msgstr ""
 
-#: spyderlib/spyder.py:670
-msgid "&View"
+#: spyderlib/widgets/explorer.py:643
+msgid "New package"
 msgstr ""
 
-#: spyderlib/spyder.py:673
-msgid "&Help"
+#: spyderlib/widgets/explorer.py:644
+msgid "Package name:"
 msgstr ""
 
-#: spyderlib/spyder.py:678
-msgid "Welcome to Spyder!"
+#: spyderlib/widgets/explorer.py:662 spyderlib/widgets/explorer.py:669
+#: spyderlib/plugins/editor.py:630 spyderlib/plugins/workingdirectory.py:82
+msgid "New file"
 msgstr ""
 
-#: spyderlib/spyder.py:683
-msgid "Pre&ferences"
+#: spyderlib/widgets/explorer.py:684
+msgid "New module"
 msgstr ""
 
-#: spyderlib/spyder.py:690 spyderlib/widgets/pathmanager.py:48
-#: spyderlib/widgets/projectexplorer.py:598
-msgid "PYTHONPATH manager"
+#: spyderlib/widgets/explorer.py:685 spyderlib/plugins/console.py:232
+#: spyderlib/plugins/externalconsole.py:223
+#: spyderlib/plugins/externalconsole.py:1211
+msgid "Python scripts"
 msgstr ""
 
-#: spyderlib/spyder.py:693
-msgid "Python Path Manager"
+#: spyderlib/widgets/explorer.py:696
+#, python-format
+msgid ""
+"For %s support, please install one of the<br/> following tools:<br/><br/>  %s"
 msgstr ""
 
-#: spyderlib/spyder.py:696
-msgid "Update module names list"
+#: spyderlib/widgets/explorer.py:700
+#, python-format
+msgid "<b>Unable to find external program.</b><br><br>%s"
 msgstr ""
 
-#: spyderlib/spyder.py:699
-msgid "Refresh list of module names available in PYTHONPATH"
+#: spyderlib/widgets/explorer.py:903
+msgid "Show current directory only"
 msgstr ""
 
-#: spyderlib/spyder.py:702
-msgid "Reset Spyder to factory defaults"
+#: spyderlib/widgets/explorer.py:1001
+msgid "You don't have the right permissions to open this directory"
 msgstr ""
 
-#: spyderlib/spyder.py:707
-msgid "Current user environment variables..."
+#: spyderlib/widgets/explorer.py:1029 spyderlib/plugins/externalconsole.py:70
+msgid "Show icons and text"
 msgstr ""
 
-#: spyderlib/spyder.py:709
-msgid "Show and edit current user environment variables in Windows registry (i.e. for all sessions)"
+#: spyderlib/widgets/explorer.py:1037
+msgid "Parent"
 msgstr ""
 
-#: spyderlib/spyder.py:718 spyderlib/spyder.py:1178
-msgid "External Tools"
+#: spyderlib/widgets/findreplace.py:59
+msgid "Search string"
 msgstr ""
 
-#: spyderlib/spyder.py:722
-msgid "Python(x,y) launcher"
+#: spyderlib/widgets/findreplace.py:83
+msgid "Case Sensitive"
 msgstr ""
 
-#: spyderlib/spyder.py:729
-msgid "WinPython control panel"
+#: spyderlib/widgets/findreplace.py:89
+msgid "Whole words"
 msgstr ""
 
-#: spyderlib/spyder.py:738
-msgid "Qt Designer"
+#: spyderlib/widgets/findreplace.py:95
+msgid "Highlight matches"
 msgstr ""
 
-#: spyderlib/spyder.py:743
-msgid "Qt Linguist"
+#: spyderlib/widgets/findreplace.py:109
+msgid "Replace with:"
 msgstr ""
 
-#: spyderlib/spyder.py:749
-msgid "Qt examples"
+#: spyderlib/widgets/findreplace.py:111
+msgid "Replace string"
 msgstr ""
 
-#: spyderlib/spyder.py:770
-msgid "guidata examples"
+#: spyderlib/widgets/findreplace.py:114
+msgid "Replace/find"
 msgstr ""
 
-#: spyderlib/spyder.py:781
-msgid "guiqwt examples"
+#: spyderlib/widgets/findreplace.py:121
+msgid "Replace all"
 msgstr ""
 
-#: spyderlib/spyder.py:786
-msgid "Sift"
+#: spyderlib/widgets/formlayout.py:209 spyderlib/plugins/configdialog.py:612
+msgid "Italic"
 msgstr ""
 
-#: spyderlib/spyder.py:796
-msgid "ViTables"
+#: spyderlib/widgets/formlayout.py:214 spyderlib/plugins/configdialog.py:609
+msgid "Bold"
 msgstr ""
 
-#: spyderlib/spyder.py:810
-msgid "Fullscreen mode"
+#: spyderlib/widgets/status.py:23
+msgid "CPU and memory usage info in the status bar"
 msgstr ""
 
-#: spyderlib/spyder.py:822
-msgid "Main toolbar"
+#: spyderlib/widgets/status.py:92
+msgid "Memory:"
 msgstr ""
 
-#: spyderlib/spyder.py:831
+#: spyderlib/widgets/status.py:93
 msgid ""
-"Spyder Internal Console\n"
-"\n"
-"This console is used to report application\n"
-"internal errors and to inspect Spyder\n"
-"internals with the following commands:\n"
-"  spy.app, spy.window, dir(spy)\n"
-"\n"
-"Please don't use it to run your code\n"
-"\n"
+"Memory usage status: requires the `psutil` (>=v0.3) library on non-Windows "
+"platforms"
 msgstr ""
 
-#: spyderlib/spyder.py:848
-msgid "Loading object inspector..."
+#: spyderlib/widgets/status.py:105
+msgid "CPU:"
 msgstr ""
 
-#: spyderlib/spyder.py:855
-msgid "Loading outline explorer..."
+#: spyderlib/widgets/status.py:106
+msgid "CPU usage status: requires the `psutil` (>=v0.3) library"
 msgstr ""
 
-#: spyderlib/spyder.py:863
-msgid "Loading editor..."
+#: spyderlib/widgets/status.py:128
+msgid "Permissions:"
+msgstr ""
+
+#: spyderlib/widgets/status.py:142
+msgid "End-of-lines:"
 msgstr ""
 
-#: spyderlib/spyder.py:874
-msgid "&Restart"
+#: spyderlib/widgets/status.py:156
+msgid "Encoding:"
 msgstr ""
 
-#: spyderlib/spyder.py:876
-msgid "Restart"
+#: spyderlib/widgets/status.py:169
+msgid "Line:"
 msgstr ""
 
-#: spyderlib/spyder.py:895
-msgid "Loading file explorer..."
+#: spyderlib/widgets/status.py:173
+msgid "Column:"
 msgstr ""
 
-#: spyderlib/spyder.py:902
-msgid "Loading history plugin..."
+#: spyderlib/widgets/browser.py:131
+msgid "Home"
 msgstr ""
 
-#: spyderlib/spyder.py:913
-msgid "Loading online help..."
+#: spyderlib/widgets/browser.py:166
+msgid "Find text"
 msgstr ""
 
-#: spyderlib/spyder.py:919
-msgid "Loading project explorer..."
+#: spyderlib/widgets/browser.py:184
+msgid "Address:"
 msgstr ""
 
-#: spyderlib/spyder.py:930
-msgid "Loading external console..."
+#: spyderlib/widgets/browser.py:220
+msgid "Unable to load page"
 msgstr ""
 
-#: spyderlib/spyder.py:939
-msgid "Loading namespace browser..."
+#: spyderlib/plugins/configdialog.py:139
+msgid "Reset to defaults"
 msgstr ""
 
-#: spyderlib/spyder.py:946
-msgid "Loading IPython console..."
+#: spyderlib/plugins/configdialog.py:151
+msgid "Preferences"
 msgstr ""
 
-#: spyderlib/spyder.py:956
-msgid "Setting up main window..."
+#: spyderlib/plugins/configdialog.py:487
+msgid "Invalid directory path"
 msgstr ""
 
-#: spyderlib/spyder.py:959
-msgid "Optional dependencies..."
+#: spyderlib/plugins/configdialog.py:517
+msgid "Invalid file path"
 msgstr ""
 
-#: spyderlib/spyder.py:963
-msgid "Report issue..."
+#: spyderlib/plugins/configdialog.py:520 spyderlib/plugins/configdialog.py:537
+msgid "Select file"
 msgstr ""
 
-#: spyderlib/spyder.py:967
-msgid "Spyder support..."
+#: spyderlib/plugins/configdialog.py:536
+msgid "All files (*)"
 msgstr ""
 
-#: spyderlib/spyder.py:970
-msgid "Check for updates..."
+#: spyderlib/plugins/configdialog.py:666
+msgid "Font: "
 msgstr ""
 
-#: spyderlib/spyder.py:993
-msgid "Spyder documentation"
+#: spyderlib/plugins/configdialog.py:672
+msgid "Size: "
 msgstr ""
 
-#: spyderlib/spyder.py:997
-msgid "Spyder tutorial"
+#: spyderlib/plugins/configdialog.py:691
+msgid "Font style"
 msgstr ""
 
-#: spyderlib/spyder.py:1002
-msgid "Interactive tours"
+#: spyderlib/plugins/configdialog.py:751
+msgid "Spyder needs to restart to change the following setting:"
 msgstr ""
 
-#: spyderlib/spyder.py:1031
-msgid "Python documentation"
+#: spyderlib/plugins/configdialog.py:754
+msgid "Spyder needs to restart to change the following settings:"
 msgstr ""
 
-#: spyderlib/spyder.py:1037 spyderlib/spyder.py:1076
-msgid "IPython documentation"
+#: spyderlib/plugins/configdialog.py:756
+msgid "Do you wish to restart now?"
 msgstr ""
 
-#: spyderlib/spyder.py:1038
-msgid "Intro to IPython"
+#: spyderlib/plugins/configdialog.py:762
+msgid "Information"
 msgstr ""
 
-#: spyderlib/spyder.py:1040
-msgid "Quick reference"
+#: spyderlib/plugins/configdialog.py:777 spyderlib/plugins/configdialog.py:784
+msgid "General"
 msgstr ""
 
-#: spyderlib/spyder.py:1042
-msgid "Console help"
+#: spyderlib/plugins/configdialog.py:787
+msgid "Language"
 msgstr ""
 
-#: spyderlib/spyder.py:1074
-msgid "Python(x,y) documentation folder"
+#: spyderlib/plugins/configdialog.py:790
+msgid "Use a single instance"
 msgstr ""
 
-#: spyderlib/spyder.py:1078
-msgid "guidata documentation"
+#: spyderlib/plugins/configdialog.py:792
+msgid ""
+"Set this to open external<br> Python files in an already running instance "
+"(Requires a restart)"
 msgstr ""
 
-#: spyderlib/spyder.py:1081
-msgid "guiqwt documentation"
+#: spyderlib/plugins/configdialog.py:795
+msgid "Prompt when exiting"
 msgstr ""
 
-#: spyderlib/spyder.py:1087
-msgid "NumPy documentation"
+#: spyderlib/plugins/configdialog.py:796
+msgid "Pop up internal console when internal errors appear"
 msgstr ""
 
-#: spyderlib/spyder.py:1089
-msgid "NumPy reference guide"
+#: spyderlib/plugins/configdialog.py:816 spyderlib/plugins/editor.py:105
+#: spyderlib/plugins/ipythonconsole.py:158
+#: spyderlib/plugins/externalconsole.py:66
+msgid "Interface"
 msgstr ""
 
-#: spyderlib/spyder.py:1091
-msgid "NumPy user guide"
+#: spyderlib/plugins/configdialog.py:824
+msgid "Qt windows style"
 msgstr ""
 
-#: spyderlib/spyder.py:1093
-msgid "SciPy documentation"
+#: spyderlib/plugins/configdialog.py:830
+msgid "Icon theme"
 msgstr ""
 
-#: spyderlib/spyder.py:1100
-msgid "Installed Python modules"
+#: spyderlib/plugins/configdialog.py:834
+msgid "Vertical title bars in panes"
 msgstr ""
 
-#: spyderlib/spyder.py:1104
-msgid "Online documentation"
+#: spyderlib/plugins/configdialog.py:836
+msgid "Vertical tabs in panes"
 msgstr ""
 
-#: spyderlib/spyder.py:1116
-msgid "Qt documentation"
+#: spyderlib/plugins/configdialog.py:838
+msgid "Animated toolbars and panes"
 msgstr ""
 
-#: spyderlib/spyder.py:1122
-msgid "About %s..."
+#: spyderlib/plugins/configdialog.py:840
+msgid "Tear off menus"
 msgstr ""
 
-#: spyderlib/spyder.py:1146
-msgid "Panes"
+#: spyderlib/plugins/configdialog.py:841
+msgid "Set this to detach any<br> menu from the main window"
 msgstr ""
 
-#: spyderlib/spyder.py:1147
-msgid "Toolbars"
+#: spyderlib/plugins/configdialog.py:843
+msgid "Custom margin for panes:"
 msgstr ""
 
-#: spyderlib/spyder.py:1148
-msgid "Window layouts"
+#: spyderlib/plugins/configdialog.py:873
+msgid "Status bar"
 msgstr ""
 
-#: spyderlib/spyder.py:1157 spyderlib/spyder.py:1910 spyderlib/spyder.py:1911
-msgid "Show toolbars"
+#: spyderlib/plugins/configdialog.py:874
+msgid "Show status bar"
 msgstr ""
 
-#: spyderlib/spyder.py:1171
-msgid "Attached console window (debugging)"
+#: spyderlib/plugins/configdialog.py:876
+msgid "Show memory usage every"
 msgstr ""
 
-#: spyderlib/spyder.py:1756
-msgid "Spyder Default Layout"
+#: spyderlib/plugins/configdialog.py:885
+msgid "Show CPU usage every"
 msgstr ""
 
-#: spyderlib/spyder.py:1774 spyderlib/spyder.py:1785
-msgid "Save current layout"
+#: spyderlib/plugins/configdialog.py:920
+msgid "Plain text font"
 msgstr ""
 
-#: spyderlib/spyder.py:1778 spyderlib/spyder.py:1787
-msgid "Layout preferences"
+#: spyderlib/plugins/configdialog.py:926
+msgid "Rich text font"
 msgstr ""
 
-#: spyderlib/spyder.py:1782
-msgid "Reset to spyder default"
+#: spyderlib/plugins/configdialog.py:929
+msgid "Fonts"
 msgstr ""
 
-#: spyderlib/spyder.py:1804
-msgid ""
-"Window layout will be reset to default settings: this affects window position, size and dockwidgets.\n"
-"Do you want to continue?"
+#: spyderlib/plugins/configdialog.py:943
+msgid "Appearance"
 msgstr ""
 
-#: spyderlib/spyder.py:1826
-msgid "Layout <b>%s</b> will be                                                overwritten. Do you want to                                                continue?"
+#: spyderlib/plugins/configdialog.py:945
+#: spyderlib/plugins/ipythonconsole.py:465
+msgid "Advanced Settings"
 msgstr ""
 
-#: spyderlib/spyder.py:1889
-msgid "Quick switch layout #%s has not yet been defined."
+#: spyderlib/plugins/configdialog.py:981
+msgid "Syntax coloring"
 msgstr ""
 
-#: spyderlib/spyder.py:1907 spyderlib/spyder.py:1908
-msgid "Hide toolbars"
+#: spyderlib/plugins/configdialog.py:993
+msgid ""
+"Here you can select the color scheme used in the Editor and all other Spyder "
+"plugins.<br><br>You can also edit the color schemes provided by Spyder or "
+"create your own ones by using the options provided below.<br>"
 msgstr ""
 
-#: spyderlib/spyder.py:2229 spyderlib/spyder.py:2230
-msgid "Maximize current pane"
+#: spyderlib/plugins/configdialog.py:998
+msgid "Edit selected"
 msgstr ""
 
-#: spyderlib/spyder.py:2233
-msgid "Restore current pane"
+#: spyderlib/plugins/configdialog.py:999
+msgid "Create new scheme"
 msgstr ""
 
-#: spyderlib/spyder.py:2234
-msgid "Restore pane to its original size"
+#: spyderlib/plugins/configdialog.py:1003
+msgid "Reset"
 msgstr ""
 
-#: spyderlib/spyder.py:2318
-msgid "About %s"
+#: spyderlib/plugins/configdialog.py:1010
+msgid "Scheme:"
 msgstr ""
 
-#: spyderlib/spyder.py:2502
-msgid "Running an external system terminal is not supported on platform %s."
+#: spyderlib/plugins/configdialog.py:1041
+msgid "Manage color schemes"
 msgstr ""
 
-#: spyderlib/spyder.py:2721
-msgid "Open session"
+#: spyderlib/plugins/configdialog.py:1230
+msgid "Are you sure you want to delete this scheme?"
 msgstr ""
 
-#: spyderlib/spyder.py:2722 spyderlib/spyder.py:2734
-msgid "Spyder sessions"
+#: spyderlib/plugins/configdialog.py:1347
+msgid "Text"
 msgstr ""
 
-#: spyderlib/spyder.py:2733
-msgid "Save session"
+#: spyderlib/plugins/configdialog.py:1349
+msgid "Highlight"
 msgstr ""
 
-#: spyderlib/spyder.py:2775
-msgid "Spyder will restart and reset to default settings: <br><br>Do you want to continue?"
+#: spyderlib/plugins/configdialog.py:1351
+msgid "Background"
 msgstr ""
 
-#: spyderlib/spyder.py:2871 spyderlib/widgets/helperwidgets.py:144
-msgid "Spyder updates"
+#: spyderlib/plugins/configdialog.py:1355
+msgid "Scheme name:"
 msgstr ""
 
-#: spyderlib/spyder.py:2890
-msgid "<b>Spyder %s is available!</b> <br><br>Please use your package manager to update Spyder or go to our <a href=\"%s\">Releases</a> page to download this new version. <br><br>If you are not sure how to proceed to update Spyder please refer to our  <a href=\"%s\">Installation</a> instructions."
+#: spyderlib/plugins/configdialog.py:1362
+msgid "Color scheme editor"
 msgstr ""
 
-#: spyderlib/spyder.py:2902
-msgid "Spyder is up to date."
+#: spyderlib/plugins/editor.py:102
+msgid "Edit template for new modules"
 msgstr ""
 
-#: spyderlib/tour.py:121
-msgid "Welcome to the Introduction tour"
+#: spyderlib/plugins/editor.py:107
+msgid "Sort files according to full path"
 msgstr ""
 
-#: spyderlib/tour.py:122
-msgid "<b>Spyder</b> is a powerful Interactive Development Environment (or IDE) for the Python programming language.<br><br>Here we are going to guide you through its most important features.<br><br>Please use the arrow keys or click on the buttons below to move along the tour."
+#: spyderlib/plugins/editor.py:109
+msgid "Show tab bar"
 msgstr ""
 
-#: spyderlib/tour.py:131
-msgid "The Editor"
+#: spyderlib/plugins/editor.py:116 spyderlib/plugins/editor.py:187
+#: spyderlib/plugins/help.py:161 spyderlib/plugins/ipythonconsole.py:202
+#: spyderlib/plugins/history.py:41 spyderlib/plugins/externalconsole.py:80
+#: spyderlib/plugins/externalconsole.py:123
+msgid "Source code"
 msgstr ""
 
-#: spyderlib/tour.py:132
-msgid "This is the pane where you write Python code before evaluating it. You can get automatic suggestions and completions while writing, by pressing the <b>Tab</b> key next to a given text.<br><br>The Editor comes with a line number area (highlighted here in red), where Spyder shows warnings and syntax errors. They can help you to detect potential problems before running the code.<br><br>You can also set debug breakpoints in the line number area, by doing a double click next to a non-e [...]
+#: spyderlib/plugins/editor.py:117
+msgid "Show line numbers"
 msgstr ""
 
-#: spyderlib/tour.py:147
-msgid "The IPython console"
+#: spyderlib/plugins/editor.py:118 spyderlib/plugins/editor.py:931
+msgid "Show blank spaces"
 msgstr ""
 
-#: spyderlib/tour.py:164
-msgid "The Variable Explorer"
+#: spyderlib/plugins/editor.py:119
+msgid "Show vertical line after"
 msgstr ""
 
-#: spyderlib/tour.py:165
-msgid "In this pane you can view and edit the variables generated during the execution of a program, or those entered directly in one of Spyder consoles.<br><br>As you can see, the Variable Explorer is showing the variables generated during the last step of this tour. By doing a double-click on any of them, a new window will be opened, where you can inspect and modify their contents."
+#: spyderlib/plugins/editor.py:120
+msgid "characters"
 msgstr ""
 
-#: spyderlib/tour.py:177
-msgid "The Python console"
+#: spyderlib/plugins/editor.py:125
+msgid "Highlight current line"
 msgstr ""
 
-#: spyderlib/tour.py:178
-msgid "You can also run your code on a Python console. These consoles are useful because they let you run a file in a console dedicated only to it.To select this behavior, please press the <b>F6</b> key.<br><br>By pressing the button below and then focusing the Variable Explorer, you will notice that Python consoles are also connected to that pane, and that the Variable Explorer only shows the variables of the currently focused console."
+#: spyderlib/plugins/editor.py:127
+msgid "Highlight current cell"
 msgstr ""
 
-#: spyderlib/tour.py:192
-msgid "The Object Inspector"
+#: spyderlib/plugins/editor.py:129
+msgid "Highlight occurrences after"
 msgstr ""
 
-#: spyderlib/tour.py:193
-msgid "This pane displays documentation of the functions, classes, methods or modules you are currently using in the Editor or the Consoles.<br><br>To use it, you need to press <b>Ctrl+I</b> in front of an object. If that object has some documentation associated with it, it will be displayed here."
+#: spyderlib/plugins/editor.py:137 spyderlib/plugins/help.py:162
+#: spyderlib/plugins/help.py:364 spyderlib/plugins/console.py:162
+#: spyderlib/plugins/history.py:42 spyderlib/plugins/history.py:154
+#: spyderlib/plugins/externalconsole.py:85
+msgid "Wrap lines"
 msgstr ""
 
-#: spyderlib/tour.py:203
-msgid "The File Explorer"
+#: spyderlib/plugins/editor.py:157
+msgid "Save all files before running script"
 msgstr ""
 
-#: spyderlib/tour.py:204
-msgid "This pane lets you navigate through the directories and files present in your computer.<br><br>You can also open any of these files with its corresponding application, by doing a double click on it.<br><br>There is one exception to this rule: plain-text files will always be opened in the Spyder Editor."
+#: spyderlib/plugins/editor.py:160
+msgid "Run selection"
 msgstr ""
 
-#: spyderlib/tour.py:214
-msgid "The History Log"
+#: spyderlib/plugins/editor.py:161
+msgid "Maintain focus in the Editor after running cells or selections"
 msgstr ""
 
-#: spyderlib/tour.py:215
-msgid "This pane records all commands introduced in the Python and IPython consoles."
+#: spyderlib/plugins/editor.py:164 spyderlib/plugins/externalconsole.py:329
+msgid "Introspection"
 msgstr ""
 
-#: spyderlib/tour.py:263
-msgid "<b>Spyder</b> is an interactive development environment based on bla"
+#: spyderlib/plugins/editor.py:167 spyderlib/plugins/console.py:169
+#: spyderlib/plugins/externalconsole.py:124
+msgid "Automatic code completion"
 msgstr ""
 
-#: spyderlib/tour.py:267
-msgid "Welcome to Spyder introduction tour"
+#: spyderlib/plugins/editor.py:169 spyderlib/plugins/externalconsole.py:126
+msgid "Case sensitive code completion"
 msgstr ""
 
-#: spyderlib/tour.py:268
-msgid "Spyder is an interactive development environment based on bla"
+#: spyderlib/plugins/editor.py:171 spyderlib/plugins/console.py:173
+#: spyderlib/plugins/externalconsole.py:128
+msgid "Enter key selects completion"
 msgstr ""
 
-#: spyderlib/tour.py:273
-msgid "Introduction tour"
+#: spyderlib/plugins/editor.py:173 spyderlib/plugins/ipythonconsole.py:168
+#: spyderlib/plugins/console.py:165 spyderlib/plugins/externalconsole.py:130
+msgid "Display balloon tips"
 msgstr ""
 
-#: spyderlib/tour.py:274
-msgid "New features in version 3.0"
+#: spyderlib/plugins/editor.py:174
+msgid "Link to object definition"
 msgstr ""
 
-#: spyderlib/tour.py:821
-msgid "Go to step: "
+#: spyderlib/plugins/editor.py:176
+msgid ""
+"If this option is enabled, clicking on an object\n"
+"name (left-click + Ctrl key) will go this object\n"
+"definition (if resolved)."
 msgstr ""
 
-#: spyderlib/utils/codeanalysis.py:92
-msgid "Real-time code analysis on the Editor"
+#: spyderlib/plugins/editor.py:180
+msgid ""
+"<b>Warning:</b><br>The Python module <i>rope</i> is not installed on this "
+"computer: calltips, code completion and go-to-definition features won't be "
+"available."
 msgstr ""
 
-#: spyderlib/utils/codeanalysis.py:96
-msgid "Real-time code style analysis on the Editor"
+#: spyderlib/plugins/editor.py:188
+msgid "Automatic insertion of parentheses, braces and brackets"
 msgstr ""
 
-#: spyderlib/utils/environ.py:96
-msgid "Module <b>pywin32 was not found</b>.<br>Please restart this Windows <i>session</i> (not the computer) for changes to take effect."
+#: spyderlib/plugins/editor.py:191
+msgid "Automatic insertion of closing quotes"
 msgstr ""
 
-#: spyderlib/utils/environ.py:109
-msgid "If you accept changes, this will modify the current user environment variables directly <b>in Windows registry</b>. Use it with precautions, at your own risks.<br><br>Note that for changes to take effect, you will need to restart the parent process of this application (simply restart Spyder if you have executed it from a Windows shortcut, otherwise restart any application from which you may have executed it, like <i>Python(x,y) Home</i> for example)"
+#: spyderlib/plugins/editor.py:193
+msgid "Automatic insertion of colons after 'for', 'if', 'def', etc"
 msgstr ""
 
-#: spyderlib/utils/inspector/sphinxify.py:212
-#: spyderlib/utils/inspector/sphinxify.py:222
-msgid "It was not possible to generate rich text help for this object.</br>Please see it in plain text."
+#: spyderlib/plugins/editor.py:196
+msgid "Automatic indentation after 'else', 'elif', etc."
 msgstr ""
 
-#: spyderlib/utils/introspection/jedi_plugin.py:32
-msgid "(Experimental) Editor's code completion, go-to-definition and help"
+#: spyderlib/plugins/editor.py:198
+msgid "Indentation characters: "
 msgstr ""
 
-#: spyderlib/utils/introspection/rope_plugin.py:37
-msgid "Editor's code completion, go-to-definition and help"
+#: spyderlib/plugins/editor.py:199
+msgid "2 spaces"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:482
-msgid "Supported files"
+#: spyderlib/plugins/editor.py:200
+msgid "3 spaces"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:484
-msgid "All files (*.*)"
+#: spyderlib/plugins/editor.py:201
+msgid "4 spaces"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:494
-msgid "Spyder data files"
+#: spyderlib/plugins/editor.py:202
+msgid "5 spaces"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:496 spyderlib/widgets/dicteditor.py:1056
-msgid "NumPy arrays"
+#: spyderlib/plugins/editor.py:203
+msgid "6 spaces"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:497
-msgid "NumPy zip arrays"
+#: spyderlib/plugins/editor.py:204
+msgid "7 spaces"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:498
-msgid "Matlab files"
+#: spyderlib/plugins/editor.py:205
+msgid "8 spaces"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:499
-msgid "CSV text files"
+#: spyderlib/plugins/editor.py:206
+msgid "Tabulations"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:501
-msgid "JPEG images"
+#: spyderlib/plugins/editor.py:207
+msgid "Tab stop width:"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:502
-msgid "PNG images"
+#: spyderlib/plugins/editor.py:207
+msgid "pixels"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:503
-msgid "GIF images"
+#: spyderlib/plugins/editor.py:209
+msgid "Tab always indent"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:504
-msgid "TIFF images"
+#: spyderlib/plugins/editor.py:211
+msgid ""
+"If enabled, pressing Tab will always indent,\n"
+"even when the cursor is not at the beginning\n"
+"of a line (when this option is enabled, code\n"
+"completion may be triggered using the alternate\n"
+"shortcut: Ctrl+Space)"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:505 spyderlib/utils/iofuncs.py:506
-msgid "Pickle files"
+#: spyderlib/plugins/editor.py:216
+msgid "Intelligent backspace"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:507
-msgid "JSON files"
+#: spyderlib/plugins/editor.py:218
+msgid "Automatically remove trailing spaces when saving files"
 msgstr ""
 
-#: spyderlib/utils/iofuncs.py:526 spyderlib/utils/iofuncs.py:533
-msgid "<b>Unsupported file type '%s'</b>"
+#: spyderlib/plugins/editor.py:222
+msgid "Analysis"
 msgstr ""
 
-#: spyderlib/utils/programs.py:176
-msgid "It was not possible to run this file in an external terminal"
+#: spyderlib/plugins/editor.py:224
+msgid "<i>(Refer to the {} page)</i>"
 msgstr ""
 
-#: spyderlib/widgets/arraybuilder.py:162
-msgid ""
-"\n"
-"           <b>Numpy Array/Matrix Helper</b><br>\n"
-"           Type an array in Matlab    : <code>[1 2;3 4]</code><br>\n"
-"           or Spyder simplified syntax : <code>1 2;3 4</code>\n"
-"           <br><br>\n"
-"           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.\n"
-"           <br><br>\n"
-"           <b>Hint:</b><br>\n"
-"           Use two spaces or two tabs to generate a ';'.\n"
-"           "
+#: spyderlib/plugins/editor.py:228
+msgid "Real-time code analysis"
 msgstr ""
 
-#: spyderlib/widgets/arraybuilder.py:173
+#: spyderlib/plugins/editor.py:230
 msgid ""
-"\n"
-"           <b>Numpy Array/Matrix Helper</b><br>\n"
-"           Enter an array in the table. <br>\n"
-"           Use Tab to move between cells.\n"
-"           <br><br>\n"
-"           Hit 'Enter' for array or 'Ctrl+Enter' for matrix.\n"
-"           <br><br>\n"
-"           <b>Hint:</b><br>\n"
-"           Use two tabs at the end of a row to move to the next row.\n"
-"           "
-msgstr ""
-
-#: spyderlib/widgets/arraybuilder.py:337
-msgid "Array dimensions not valid"
+"<p>If enabled, Python source code will be analyzed using pyflakes, lines "
+"containing errors or warnings will be highlighted.</p><p><u>Note</u>: add "
+"<b>analysis:ignore</b> in a comment to ignore code analysis warnings.</p>"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:453 spyderlib/widgets/arrayeditor.py:486
-#: spyderlib/widgets/dataframeeditor.py:508
-#: spyderlib/widgets/dataframeeditor.py:548
-msgid "Format"
+#: spyderlib/plugins/editor.py:238
+#, python-format
+msgid "Code analysis requires pyflakes %s+"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:458
-#: spyderlib/widgets/dataframeeditor.py:512
-msgid "Resize"
+#: spyderlib/plugins/editor.py:240
+msgid "Real-time code style analysis"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:487
-#: spyderlib/widgets/dataframeeditor.py:549
-msgid "Float formatting"
+#: spyderlib/plugins/editor.py:242
+msgid ""
+"<p>If enabled, Python source code will be analyzedusing pep8, lines that are "
+"not following PEP8 style guide will be highlighted.</p><p><u>Note</u>: add "
+"<b>analysis:ignore</b> in a comment to ignore style analysis warnings.</p>"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:494
-#: spyderlib/widgets/dataframeeditor.py:557 spyderlib/widgets/explorer.py:587
-#: spyderlib/widgets/explorer.py:689
-#: spyderlib/widgets/externalshell/pythonshell.py:553
-#: spyderlib/widgets/externalshell/systemshell.py:99
-msgid "Error"
+#: spyderlib/plugins/editor.py:249
+msgid "Code annotations (TODO, FIXME, XXX, HINT, TIP, @todo)"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:495
-#: spyderlib/widgets/dataframeeditor.py:558
-msgid "Format (%s) is incorrect"
+#: spyderlib/plugins/editor.py:252
+msgid "Perform analysis when saving file and every"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:529
-msgid "Array is empty"
+#: spyderlib/plugins/editor.py:256
+msgid "Perform analysis only when saving file"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:532
-msgid "Arrays with more than 3 dimensions are not supported"
+#: spyderlib/plugins/editor.py:315
+msgid "End-of-line characters"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:535
-msgid "The 'xlabels' argument length do no match array column number"
+#: spyderlib/plugins/editor.py:316
+msgid ""
+"When opening a text file containing mixed end-of-line characters (this may "
+"raise syntax errors in the consoles on Windows platforms), Spyder may fix "
+"the file automatically."
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:539
-msgid "The 'ylabels' argument length do no match array row number"
+#: spyderlib/plugins/editor.py:322
+msgid "Fix automatically and show warning message box"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:546
-msgid "%s arrays"
+#: spyderlib/plugins/editor.py:333 spyderlib/plugins/ipythonconsole.py:459
+#: spyderlib/plugins/variableexplorer.py:41
+#: spyderlib/plugins/externalconsole.py:327
+msgid "Display"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:547
-msgid "%s are currently not supported"
+#: spyderlib/plugins/editor.py:335
+msgid "Code Introspection/Analysis"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:554
-msgid "NumPy array"
+#: spyderlib/plugins/editor.py:338 spyderlib/plugins/externalconsole.py:331
+msgid "Advanced settings"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:556 spyderlib/widgets/arrayeditor.py:710
-msgid "Array editor"
+#: spyderlib/plugins/editor.py:621
+msgid "Show/hide project explorer"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:558
-msgid "read only"
+#: spyderlib/plugins/editor.py:629
+msgid "&New file..."
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:588
-msgid "Record array fields:"
+#: spyderlib/plugins/editor.py:637
+msgid "&Open..."
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:600
-msgid "Data"
+#: spyderlib/plugins/editor.py:638 spyderlib/plugins/editor.py:1683
+#: spyderlib/plugins/workingdirectory.py:69
+msgid "Open file"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:600
-msgid "Mask"
+#: spyderlib/plugins/editor.py:647
+msgid "Fast switch between files"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:600
-msgid "Masked data"
+#: spyderlib/plugins/editor.py:652
+msgid "&Revert"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:611
-msgid "Axis:"
+#: spyderlib/plugins/editor.py:653
+msgid "Revert file from disk"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:616
-msgid "Index:"
+#: spyderlib/plugins/editor.py:656
+msgid "&Save"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:629
-msgid "<u>Warning</u>: changes are applied separately"
+#: spyderlib/plugins/editor.py:664
+msgid "Sav&e all"
 msgstr ""
 
-#: spyderlib/widgets/arrayeditor.py:630
-msgid "For performance reasons, changes applied to masked array won't be reflected in array's data (and vice-versa)."
+#: spyderlib/plugins/editor.py:665
+msgid "Save all files"
 msgstr ""
 
-#: spyderlib/widgets/browser.py:31
-#: spyderlib/widgets/sourcecode/codeeditor.py:2468
-msgid "Zoom out"
+#: spyderlib/plugins/editor.py:673
+msgid "Save &as..."
 msgstr ""
 
-#: spyderlib/widgets/browser.py:34
-#: spyderlib/widgets/sourcecode/codeeditor.py:2465
-msgid "Zoom in"
+#: spyderlib/plugins/editor.py:674
+msgid "Save current file as..."
 msgstr ""
 
-#: spyderlib/widgets/browser.py:131
-msgid "Home"
+#: spyderlib/plugins/editor.py:678 spyderlib/plugins/editor.py:679
+msgid "Print preview..."
 msgstr ""
 
-#: spyderlib/widgets/browser.py:166
-msgid "Find text"
+#: spyderlib/plugins/editor.py:680
+msgid "&Print..."
 msgstr ""
 
-#: spyderlib/widgets/browser.py:184
-msgid "Address:"
+#: spyderlib/plugins/editor.py:681
+msgid "Print current file..."
 msgstr ""
 
-#: spyderlib/widgets/browser.py:220
-msgid "Unable to load page"
+#: spyderlib/plugins/editor.py:684
+msgid "&Close"
 msgstr ""
 
-#: spyderlib/widgets/comboboxes.py:118
-msgid "Press enter to validate this entry"
+#: spyderlib/plugins/editor.py:685
+msgid "Close current file"
 msgstr ""
 
-#: spyderlib/widgets/comboboxes.py:119
-msgid "This entry is incorrect"
+#: spyderlib/plugins/editor.py:688
+msgid "C&lose all"
 msgstr ""
 
-#: spyderlib/widgets/comboboxes.py:174
-msgid "Press enter to validate this path"
+#: spyderlib/plugins/editor.py:689
+msgid "Close all opened files"
 msgstr ""
 
-#: spyderlib/widgets/comboboxes.py:175
-msgid ""
-"This path is incorrect.\n"
-"Enter a correct directory path,\n"
-"then press enter to validate"
+#: spyderlib/plugins/editor.py:696
+msgid "Set/Clear breakpoint"
 msgstr ""
 
-#: spyderlib/widgets/dataframeeditor.py:423
-msgid "To bool"
+#: spyderlib/plugins/editor.py:703
+msgid "Set/Edit conditional breakpoint"
 msgstr ""
 
-#: spyderlib/widgets/dataframeeditor.py:423
-msgid "To complex"
+#: spyderlib/plugins/editor.py:710
+msgid "Clear breakpoints in all files"
 msgstr ""
 
-#: spyderlib/widgets/dataframeeditor.py:424
-msgid "To float"
+#: spyderlib/plugins/editor.py:712
+msgid "Breakpoints"
 msgstr ""
 
-#: spyderlib/widgets/dataframeeditor.py:424
-msgid "To int"
+#: spyderlib/plugins/editor.py:716
+msgid "Debug with winpdb"
 msgstr ""
 
-#: spyderlib/widgets/dataframeeditor.py:425
-msgid "To str"
+#: spyderlib/plugins/editor.py:724
+msgid "Debug file"
 msgstr ""
 
-#: spyderlib/widgets/dataframeeditor.py:490
-msgid "%s editor"
+#: spyderlib/plugins/editor.py:728
+msgid "Step"
 msgstr ""
 
-#: spyderlib/widgets/dataframeeditor.py:522
-msgid "Column min/max"
+#: spyderlib/plugins/editor.py:729
+msgid "Run current line"
 msgstr ""
 
-#: spyderlib/widgets/dependencies.py:59
-msgid " Required "
+#: spyderlib/plugins/editor.py:735
+msgid "Continue"
 msgstr ""
 
-#: spyderlib/widgets/dependencies.py:59
-msgid "Module"
+#: spyderlib/plugins/editor.py:736
+msgid "Continue execution until next breakpoint"
 msgstr ""
 
-#: spyderlib/widgets/dependencies.py:60
-msgid " Installed "
+#: spyderlib/plugins/editor.py:743
+msgid "Step Into"
 msgstr ""
 
-#: spyderlib/widgets/dependencies.py:60
-msgid "Provided features"
+#: spyderlib/plugins/editor.py:744
+msgid "Step into function or method of current line"
 msgstr ""
 
-#: spyderlib/widgets/dependencies.py:130
-msgid "Optional Dependencies"
+#: spyderlib/plugins/editor.py:751
+msgid "Step Return"
 msgstr ""
 
-#: spyderlib/widgets/dependencies.py:137
-msgid "Spyder depends on several Python modules to provide additional functionality for its plugins. The table below shows the required and installed versions (if any) of all of them.<br><br>Although Spyder can work without any of these modules, it's strongly recommended that at least you try to install <b>%s</b> and <b>%s</b> to have a much better experience."
+#: spyderlib/plugins/editor.py:752
+msgid "Run until current function or method returns"
 msgstr ""
 
-#: spyderlib/widgets/dependencies.py:152
-msgid "Copy to clipboard"
+#: spyderlib/plugins/editor.py:759
+msgid "Exit"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:156
-msgid "Index"
+#: spyderlib/plugins/editor.py:760
+msgid "Exit Debug"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:161
-msgid "Tuple"
+#: spyderlib/plugins/editor.py:771
+msgid "Debugging control"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:164
-msgid "List"
+#: spyderlib/plugins/editor.py:776
+msgid "Run file"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:167
-msgid "Dictionary"
+#: spyderlib/plugins/editor.py:781
+msgid "&Configure..."
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:169
-msgid "Key"
+#: spyderlib/plugins/editor.py:791
+msgid "Re-run &last script"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:175
-msgid "Attribute"
+#: spyderlib/plugins/editor.py:793
+msgid "Run again last file"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:177
-msgid "elements"
+#: spyderlib/plugins/editor.py:803
+msgid "Run selection or current line"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:356
-msgid "Size"
+#: spyderlib/plugins/editor.py:819
+#, python-format
+msgid ""
+"Run current cell (Ctrl+Enter)\n"
+"[Use #%% to create cells]"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:356
-msgid "Type"
+#: spyderlib/plugins/editor.py:827
+msgid "Run current cell and go to the next one (Shift+Enter)"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:356
-msgid "Value"
+#: spyderlib/plugins/editor.py:833
+msgid "Show todo list"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:453
-msgid ""
-"Opening this variable can be slow\n"
-"\n"
-"Do you want to continue anyway?"
+#: spyderlib/plugins/editor.py:834
+msgid "Show TODO/FIXME/XXX/HINT/TIP/@todo comments list"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:461 spyderlib/widgets/dicteditor.py:612
-msgid "Edit item"
+#: spyderlib/plugins/editor.py:841
+msgid "Show warning/error list"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:462
-msgid "<b>Unable to retrieve data.</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/editor.py:842
+msgid "Show code analysis warnings/errors"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:613
-msgid "<b>Unable to assign data to item.</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/editor.py:848
+msgid "Previous warning/error"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:675
-msgid "Resize rows to contents"
+#: spyderlib/plugins/editor.py:849
+msgid "Go to previous code analysis warning/error"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:683 spyderlib/widgets/explorer.py:242
-msgid "Edit"
+#: spyderlib/plugins/editor.py:852
+msgid "Next warning/error"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:686 spyderlib/widgets/dicteditor.py:1025
-#: spyderlib/widgets/dicteditor.py:1042
-msgid "Plot"
+#: spyderlib/plugins/editor.py:853
+msgid "Go to next code analysis warning/error"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:690
-msgid "Histogram"
+#: spyderlib/plugins/editor.py:857
+msgid "Last edit location"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:694
-msgid "Show image"
+#: spyderlib/plugins/editor.py:858
+msgid "Go to last edit location"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:698 spyderlib/widgets/dicteditor.py:1050
-msgid "Save array"
+#: spyderlib/plugins/editor.py:864
+msgid "Previous cursor position"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:702 spyderlib/widgets/dicteditor.py:989
-#: spyderlib/widgets/dicteditor.py:997
-msgid "Insert"
+#: spyderlib/plugins/editor.py:865
+msgid "Go to previous cursor position"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:705 spyderlib/widgets/dicteditor.py:939
-msgid "Remove"
+#: spyderlib/plugins/editor.py:871
+msgid "Next cursor position"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:716 spyderlib/widgets/dicteditor.py:956
-#: spyderlib/widgets/explorer.py:532 spyderlib/widgets/explorer.py:540
-#: spyderlib/widgets/explorer.py:551
-msgid "Rename"
+#: spyderlib/plugins/editor.py:872
+msgid "Go to next cursor position"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:719
-msgid "Duplicate"
+#: spyderlib/plugins/editor.py:880
+msgid "Comment current line or selection"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:937
-msgid "Do you want to remove selected item?"
+#: spyderlib/plugins/editor.py:884
+msgid "Add &block comment"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:938
-msgid "Do you want to remove all selected items?"
+#: spyderlib/plugins/editor.py:885
+msgid "Add block comment around current line or selection"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:956 spyderlib/widgets/dicteditor.py:989
-msgid "Key:"
+#: spyderlib/plugins/editor.py:891
+msgid "R&emove block comment"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:997
-msgid "Value:"
+#: spyderlib/plugins/editor.py:892
+msgid "Remove comment block around current line or selection"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1013
-msgid "Import error"
+#: spyderlib/plugins/editor.py:903
+msgid "Indent"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1014
-msgid "Please install <b>matplotlib</b> or <b>guiqwt</b>."
+#: spyderlib/plugins/editor.py:904
+msgid "Indent current line or selection"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1026
-msgid "<b>Unable to plot data.</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/editor.py:907
+msgid "Unindent"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1043
-msgid "<b>Unable to show image.</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/editor.py:908
+msgid "Unindent current line or selection"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1066
-msgid "<b>Unable to save array</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/editor.py:913
+msgid "Carriage return and line feed (Windows)"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1085
-msgid "Clipboard contents"
+#: spyderlib/plugins/editor.py:916
+msgid "Line feed (UNIX)"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1100
-msgid "Import from clipboard"
+#: spyderlib/plugins/editor.py:919
+msgid "Carriage return (Mac)"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1102
-msgid "Empty clipboard"
+#: spyderlib/plugins/editor.py:925
+msgid "Convert end-of-line characters"
 msgstr ""
 
-#: spyderlib/widgets/dicteditor.py:1103
-msgid "Nothing to be imported from clipboard."
+#: spyderlib/plugins/editor.py:929
+msgid "Remove trailing spaces"
 msgstr ""
 
-#: spyderlib/widgets/dicteditorutils.py:60
-msgid "View and edit DataFrames and Series in the Variable Explorer"
+#: spyderlib/plugins/editor.py:933
+msgid "Fix indentation"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:342
-msgid "Copy path to clipboard"
+#: spyderlib/plugins/editor.py:934
+msgid "Replace tab characters by space characters"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:906
-msgid "Temporary file"
+#: spyderlib/plugins/editor.py:937
+msgid "Go to line..."
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1003
-msgid "New window"
+#: spyderlib/plugins/editor.py:945
+msgid "Set console working directory"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1004
-msgid "Create a new editor window"
+#: spyderlib/plugins/editor.py:947
+msgid ""
+"Set current console (and file explorer) working directory to current script "
+"directory"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1007
-msgid "Split vertically"
+#: spyderlib/plugins/editor.py:952
+msgid "Maximum number of recent files..."
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1009
-msgid "Split vertically this editor window"
+#: spyderlib/plugins/editor.py:955
+msgid "Clear this list"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1011
-msgid "Split horizontally"
+#: spyderlib/plugins/editor.py:955
+msgid "Clear recent files list"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1013
-msgid "Split horizontally this editor window"
+#: spyderlib/plugins/editor.py:957
+msgid "Open &recent"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1015
-msgid "Close this panel"
+#: spyderlib/plugins/editor.py:1263
+msgid "?"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1153
-msgid "<b>%s</b> has been modified.<br>Do you want to save changes?"
+#: spyderlib/plugins/editor.py:1490
+msgid "Spyder Editor"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1215
-msgid "Save"
+#: spyderlib/plugins/editor.py:1491
+msgid "This is a temporary script file."
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1216
-msgid "<b>Unable to save script '%s'</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/editor.py:1559
+msgid "untitled"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1238
-msgid "Save Python script"
+#: spyderlib/plugins/editor.py:1637
+msgid "Maximum number of recent files"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1452
-msgid "<b>%s</b> is unavailable (this file may have been removed, moved or renamed outside Spyder).<br>Do you want to close it?"
+#: spyderlib/plugins/editor.py:1768
+msgid "Printing..."
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1472
-msgid "<b>%s</b> has been modified outside Spyder.<br>Do you want to reload it and lose all your changes?"
+#: spyderlib/plugins/help.py:42
+msgid "Show help for objects in the Editor and Consoles in a dedicated pane"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1568
-msgid "All changes to <b>%s</b> will be lost.<br>Do you want to revert file from disk?"
+#: spyderlib/plugins/help.py:115
+msgid "Automatic connections"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1708
-msgid "Loading %s..."
+#: spyderlib/plugins/help.py:116
+msgid ""
+"This pane can automatically show an object's help information after a left "
+"parenthesis is written next to it. Below you can decide to which plugin you "
+"want to connect it to turn on this feature."
 msgstr ""
 
-#: spyderlib/widgets/editor.py:1718
-msgid "<b>%s</b> contains mixed end-of-line characters.<br>Spyder will fix this automatically."
+#: spyderlib/plugins/help.py:128
+msgid ""
+"This feature requires the Rope or Jedi libraries.\n"
+"It seems you don't have either installed."
 msgstr ""
 
-#: spyderlib/widgets/editor.py:2083
-msgid "Close window"
+#: spyderlib/plugins/help.py:131
+msgid "Python Console"
 msgstr ""
 
-#: spyderlib/widgets/editor.py:2085
-msgid "Close this window"
+#: spyderlib/plugins/help.py:133
+msgid "IPython Console"
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:94 spyderlib/widgets/editortools.py:130
-msgid "Line %s"
+#: spyderlib/plugins/help.py:145
+msgid "Additional features"
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:99
-msgid "Class defined at line %s"
+#: spyderlib/plugins/help.py:146
+msgid "Render mathematical equations"
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:107
-msgid "Method defined at line %s"
+#: spyderlib/plugins/help.py:152
+msgid "This feature requires Sphinx 1.1 or superior."
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:117
-msgid "Function defined at line %s"
+#: spyderlib/plugins/help.py:153
+#, python-format
+msgid "Sphinx %s is currently installed."
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:149
-msgid "Cell starts at line %s"
+#: spyderlib/plugins/help.py:351
+msgid "No further documentation available"
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:202 spyderlib/widgets/editortools.py:539
-msgid "Go to cursor position"
+#: spyderlib/plugins/help.py:384
+msgid "Source"
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:205
-msgid "Show absolute path"
+#: spyderlib/plugins/help.py:413
+msgid "Plain Text"
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:208 spyderlib/widgets/explorer.py:179
-msgid "Show all files"
+#: spyderlib/plugins/help.py:417
+msgid "Show Source"
 msgstr ""
 
-#: spyderlib/widgets/editortools.py:211
-msgid "Show special comments"
+#: spyderlib/plugins/help.py:421
+msgid "Rich Text"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:175
-msgid "Edit filename filters..."
+#: spyderlib/plugins/help.py:431
+msgid "Automatic import"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:189
-msgid "Edit filename filters"
+#: spyderlib/plugins/help.py:700
+#, python-format
+msgid ""
+"Here you can get help of any object by pressing %s in front of it, either on "
+"the Editor or the Console.%sHelp can also be shown automatically after "
+"writing a left parenthesis next to an object. You can activate this behavior "
+"in %s."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:190
-msgid "Name filters:"
+#: spyderlib/plugins/help.py:706
+msgid "Preferences > Help"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:209
-msgid "File..."
+#: spyderlib/plugins/help.py:713
+msgid "Usage"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:213
-msgid "Module..."
+#: spyderlib/plugins/help.py:714
+msgid "New to Spyder? Read our"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:217
-msgid "Folder..."
+#: spyderlib/plugins/help.py:715
+msgid "tutorial"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:221
-msgid "Package..."
+#: spyderlib/plugins/help.py:722
+msgid ""
+"Please consider installing Sphinx to get documentation rendered in rich text."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:244
-msgid "Move..."
+#: spyderlib/plugins/help.py:895
+msgid "Unlock"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:247
-msgid "Delete..."
+#: spyderlib/plugins/help.py:895
+msgid "Lock"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:250
-msgid "Rename..."
+#: spyderlib/plugins/help.py:941
+#, python-format
+msgid ""
+"The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible "
+"Sphinx version or doc string decoding failed.<br><br>Error message:<br>%s"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:253
-msgid "Open"
+#: spyderlib/plugins/help.py:985
+msgid "No source code available."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:254
-#: spyderlib/widgets/sourcecode/codeeditor.py:2456
-msgid "Convert to Python script"
+#: spyderlib/plugins/findinfiles.py:135
+msgid "&Find in files"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:277
-msgid "Commit"
+#: spyderlib/plugins/findinfiles.py:138
+msgid "Search text in multiple files"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:281
-msgid "Browse repository"
+#: spyderlib/plugins/ipythonconsole.py:62
+msgid "Symbolic mathematics in the IPython Console"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:293
-msgid "Open command prompt here"
+#: spyderlib/plugins/ipythonconsole.py:111
+#, python-format
+msgid ""
+"The authenticity of host <b>%s</b> can't be established. Are you sure you "
+"want to continue connecting?"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:295
-msgid "Open terminal here"
+#: spyderlib/plugins/ipythonconsole.py:123
+msgid "The authenticity of the host can't be established"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:300
-msgid "Open Python console here"
+#: spyderlib/plugins/ipythonconsole.py:130
+#, python-format
+msgid "Tunnel '%s' failed to start"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:314
-msgid "New"
+#: spyderlib/plugins/ipythonconsole.py:135
+msgid "Could not connect to remote host"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:322
-msgid "Import"
+#: spyderlib/plugins/ipythonconsole.py:151
+#: spyderlib/plugins/ipythonconsole.py:691
+msgid "IPython console"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:471
-msgid "Do you really want to delete <b>%s</b>?"
+#: spyderlib/plugins/ipythonconsole.py:159
+msgid "Display initial banner"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:489
-msgid "delete"
+#: spyderlib/plugins/ipythonconsole.py:160
+msgid ""
+"This option lets you hide the message shown at\n"
+"the top of the console when it's opened."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:490 spyderlib/widgets/projectexplorer.py:823
-#: spyderlib/widgets/projectexplorer.py:830
-#: spyderlib/widgets/projectexplorer.py:1101
-#: spyderlib/widgets/projectexplorer.py:1186
-msgid "Project Explorer"
+#: spyderlib/plugins/ipythonconsole.py:162
+msgid "Use a pager to display additional text inside the console"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:491 spyderlib/widgets/projectexplorer.py:770
-#: spyderlib/widgets/projectexplorer.py:1187
-msgid "<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/ipythonconsole.py:164
+msgid ""
+"Useful if you don't want to fill the console with long help or completion "
+"texts.\n"
+"Note: Use the Q key to get out of the pager."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:514
-#: spyderlib/widgets/sourcecode/codeeditor.py:1987
-msgid "Conversion error"
+#: spyderlib/plugins/ipythonconsole.py:169
+msgid "Ask for confirmation before closing"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:515
-#: spyderlib/widgets/sourcecode/codeeditor.py:1988
-msgid ""
-"It was not possible to convert this notebook. The error is:\n"
-"\n"
+#: spyderlib/plugins/ipythonconsole.py:179
+msgid "Completion Type"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:533
-msgid "New name:"
+#: spyderlib/plugins/ipythonconsole.py:180
+msgid "Decide what type of completion to use"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:541
-msgid "Do you really want to rename <b>%s</b> and overwrite the existing file <b>%s</b>?"
+#: spyderlib/plugins/ipythonconsole.py:183
+msgid "Completion:"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:552
-msgid "<b>Unable to rename file <i>%s</i></b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/ipythonconsole.py:192
+msgid "Light background"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:588
-msgid "<b>Unable to move <i>%s</i></b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/ipythonconsole.py:194
+msgid "Dark background"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:606
-msgid "<b>Unable to create folder <i>%s</i></b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/ipythonconsole.py:204
+msgid "Buffer:  "
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:619 spyderlib/widgets/explorer.py:653
-msgid "<b>Unable to create file <i>%s</i></b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/ipythonconsole.py:204
+#: spyderlib/plugins/externalconsole.py:82
+msgid " lines"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:627
-msgid "New folder"
+#: spyderlib/plugins/ipythonconsole.py:206
+msgid ""
+"Set the maximum number of lines of text shown in the\n"
+"console before truncation. Specifying -1 disables it\n"
+"(not recommended!)"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:628
-msgid "Folder name:"
+#: spyderlib/plugins/ipythonconsole.py:215
+msgid "Support for graphics (Matplotlib)"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:633
-msgid "New package"
+#: spyderlib/plugins/ipythonconsole.py:216
+msgid "Activate support"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:634
-msgid "Package name:"
+#: spyderlib/plugins/ipythonconsole.py:217
+msgid "Automatically load Pylab and NumPy modules"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:674
-msgid "New module"
+#: spyderlib/plugins/ipythonconsole.py:220
+msgid ""
+"This lets you load graphics support without importing \n"
+"the commands to do plots. Useful to work with other\n"
+"plotting libraries different to Matplotlib or to develop \n"
+"GUIs with Spyder."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:686
-msgid "For %s support, please install one of the<br/> following tools:<br/><br/>  %s"
+#: spyderlib/plugins/ipythonconsole.py:238
+msgid ""
+"This feature requires the Matplotlib library.\n"
+"It seems you don't have it installed."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:690
-msgid "<b>Unable to find external program.</b><br><br>%s"
+#: spyderlib/plugins/ipythonconsole.py:243
+msgid "Inline"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:893
-msgid "Show current directory only"
+#: spyderlib/plugins/ipythonconsole.py:244
+msgid "Automatic"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:989
-msgid "You don't have the right permissions to open this directory"
+#: spyderlib/plugins/ipythonconsole.py:245
+msgid "Graphics backend"
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:1018 spyderlib/widgets/importwizard.py:525
-msgid "Previous"
+#: spyderlib/plugins/ipythonconsole.py:246
+#, python-format
+msgid ""
+"Decide how graphics are going to be displayed in the console. If unsure, "
+"please select <b>%s</b> to put graphics inside the console or <b>%s</b> to "
+"interact with them (through zooming and panning) in a separate window."
 msgstr ""
 
-#: spyderlib/widgets/explorer.py:1024
-msgid "Parent"
+#: spyderlib/plugins/ipythonconsole.py:266
+#: spyderlib/plugins/externalconsole.py:290
+msgid "Backend:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/baseshell.py:142
-msgid "Run again this program"
+#: spyderlib/plugins/ipythonconsole.py:268
+#: spyderlib/plugins/externalconsole.py:292
+msgid "This option will be applied the next time a console is opened."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/baseshell.py:145
-msgid "Kill"
+#: spyderlib/plugins/ipythonconsole.py:279
+msgid "Inline backend"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/baseshell.py:147
-msgid "Kills the current process, causing it to exit immediately"
+#: spyderlib/plugins/ipythonconsole.py:280
+msgid "Decide how to render the figures created by this backend"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/baseshell.py:219
-msgid "<span style='color: #44AA44'><b>Running...</b></span>"
+#: spyderlib/plugins/ipythonconsole.py:284
+msgid "Format:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/baseshell.py:226
-msgid "Terminated."
+#: spyderlib/plugins/ipythonconsole.py:287
+msgid "Resolution:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/baseshell.py:251
-#: spyderlib/widgets/ipython.py:351 spyderlib/widgets/ipython.py:368
-#: spyderlib/widgets/mixins.py:656
-msgid "Arguments"
+#: spyderlib/plugins/ipythonconsole.py:287
+msgid "dpi"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/baseshell.py:252
-msgid "Command line arguments:"
+#: spyderlib/plugins/ipythonconsole.py:289
+msgid "Only used when the format is PNG. Default is 72"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:191
-msgid "Refresh"
+#: spyderlib/plugins/ipythonconsole.py:292
+msgid "Width:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:195
-msgid "Refresh periodically"
+#: spyderlib/plugins/ipythonconsole.py:292
+#: spyderlib/plugins/ipythonconsole.py:296
+msgid "inches"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:199
-#: spyderlib/widgets/externalshell/namespacebrowser.py:453
-msgid "Import data"
+#: spyderlib/plugins/ipythonconsole.py:294
+msgid "Default is 6"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:202
-#: spyderlib/widgets/externalshell/namespacebrowser.py:541
-#: spyderlib/widgets/externalshell/namespacebrowser.py:562
-msgid "Save data"
+#: spyderlib/plugins/ipythonconsole.py:296
+msgid "Height:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:207
-msgid "Save data as..."
+#: spyderlib/plugins/ipythonconsole.py:298
+msgid "Default is 4"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:215
-msgid "Exclude references which name starts with an underscore"
+#: spyderlib/plugins/ipythonconsole.py:325
+msgid ""
+"You can run several lines of code when a console is started. Please "
+"introduce each one separated by commas, for example:<br><i>import os, import "
+"sys</i>"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:223
-msgid "Exclude references which name is uppercase"
+#: spyderlib/plugins/ipythonconsole.py:331
+msgid "Lines:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:230
-msgid "Exclude references which name starts with an uppercase character"
+#: spyderlib/plugins/ipythonconsole.py:340
+msgid "Run a file"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:238
-msgid "Exclude references to unsupported data types (i.e. which won't be handled/saved correctly)"
+#: spyderlib/plugins/ipythonconsole.py:341
+msgid ""
+"You can also run a whole file at startup instead of just some lines (This is "
+"similar to have a PYTHONSTARTUP file)."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:347
-msgid "Object <b>%s</b> is not picklable"
+#: spyderlib/plugins/ipythonconsole.py:345
+msgid "Use the following file:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:473
-msgid "<b>Unsupported file extension '%s'</b><br><br>Would you like to import it anyway (by selecting a known file format)?"
+#: spyderlib/plugins/ipythonconsole.py:359
+msgid "Greedy completion"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:481
-msgid "Open file as:"
+#: spyderlib/plugins/ipythonconsole.py:360
+msgid ""
+"Enable <tt>Tab</tt> completion on elements of lists, results of function "
+"calls, etc, <i>without</i> assigning them to a variable.<br>For example, you "
+"can get completions on things like <tt>li[0].<Tab></tt> or <tt>ins."
+"meth().<Tab></tt>"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:529
-msgid "<b>Unable to load '%s'</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/ipythonconsole.py:368
+msgid "Use the greedy completer"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/namespacebrowser.py:563
-msgid "<b>Unable to save current workspace</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/ipythonconsole.py:379
+msgid "Autocall"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:284
-msgid "Variables"
+#: spyderlib/plugins/ipythonconsole.py:380
+msgid ""
+"Autocall makes IPython automatically call any callable object even if you "
+"didn't type explicit parentheses.<br>For example, if you type <i>str 43</i> "
+"it becomes <i>str(43)</i> automatically."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:285
-msgid "Show/hide global variables explorer"
+#: spyderlib/plugins/ipythonconsole.py:387
+msgid "Smart"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:289
-msgid "Terminate"
+#: spyderlib/plugins/ipythonconsole.py:388
+msgid "Full"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:290
-msgid ""
-"Attempts to stop the process. The process\n"
-"may not exit as a result of clicking this\n"
-"button (it is given the chance to prompt\n"
-"the user for any unsaved files, etc)."
+#: spyderlib/plugins/ipythonconsole.py:389
+msgid "Off"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:303
-msgid "Interact"
+#: spyderlib/plugins/ipythonconsole.py:391
+msgid "Autocall:  "
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:305
-msgid "Debug"
+#: spyderlib/plugins/ipythonconsole.py:392
+#, python-format
+msgid ""
+"On <b>%s</b> mode, Autocall is not applied if there are no arguments after "
+"the callable. On <b>%s</b> mode, all callable objects are automatically "
+"called (even if no arguments are present)."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:307
-#: spyderlib/widgets/externalshell/pythonshell.py:373
-msgid "Arguments..."
+#: spyderlib/plugins/ipythonconsole.py:404
+msgid "Symbolic Mathematics"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:309
-msgid "Post Mortem Debug"
+#: spyderlib/plugins/ipythonconsole.py:405
+msgid ""
+"Perfom symbolic operations in the console (e.g. integrals, derivatives, "
+"vector calculus, etc) and get the outputs in a beautifully printed style."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:315
-msgid "Working directory"
+#: spyderlib/plugins/ipythonconsole.py:410
+msgid "Use symbolic math"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:317
-msgid "Set current working directory"
+#: spyderlib/plugins/ipythonconsole.py:411
+msgid ""
+"This option loads the Sympy library to work with.<br>Please refer to its "
+"documentation to learn how to use it."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:319
-msgid "Environment variables"
+#: spyderlib/plugins/ipythonconsole.py:424
+msgid ""
+"This feature requires the Sympy library.\n"
+"It seems you don't have it installed."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:323
-msgid "Show sys.path contents"
+#: spyderlib/plugins/ipythonconsole.py:429
+msgid "Prompts"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:369
-msgid "Arguments: %s"
+#: spyderlib/plugins/ipythonconsole.py:430
+msgid "Modify how Input and Output prompts are shown in the console."
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:371
-msgid "No argument"
+#: spyderlib/plugins/ipythonconsole.py:433
+msgid "Input prompt:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:550
-msgid "The kernel failed to start!! That's all we know... Please close this console and open a new one."
+#: spyderlib/plugins/ipythonconsole.py:435
+#, python-format
+msgid ""
+"Default is<br>In [<span class=\"in-prompt-number\">%i</span>]:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/pythonshell.py:554
-msgid "A Python console failed to start!"
+#: spyderlib/plugins/ipythonconsole.py:439
+msgid "Output prompt:"
 msgstr ""
 
-#: spyderlib/widgets/externalshell/systemshell.py:100
-msgid "Process failed to start"
+#: spyderlib/plugins/ipythonconsole.py:441
+#, python-format
+msgid ""
+"Default is<br>Out[<span class=\"out-prompt-number\">%i</span>]:"
 msgstr ""
 
-#: spyderlib/widgets/file_switcher.py:109
-msgid "unsaved file"
+#: spyderlib/plugins/ipythonconsole.py:461
+#: spyderlib/plugins/externalconsole.py:275
+msgid "Graphics"
 msgstr ""
 
-#: spyderlib/widgets/file_switcher.py:229
-msgid "Press <b>Enter</b> to switch files or <b>Esc</b> to cancel.<br><br>Type to filter filenames.<br><br>Use <b>:number</b> to go to a line, e.g. <b><code>main:42</code></b><br>Use <b>@symbol_text</b> to go to a symbol, e.g. <b><code>@init</code></b><br><br> Press <b>Ctrl+W</b> to close current tab.<br>"
+#: spyderlib/plugins/ipythonconsole.py:463
+#: spyderlib/plugins/workingdirectory.py:44
+msgid "Startup"
 msgstr ""
 
-#: spyderlib/widgets/file_switcher.py:481
-msgid "lines"
+#: spyderlib/plugins/ipythonconsole.py:477
+#: spyderlib/plugins/ipythonconsole.py:751
+msgid "Connect to an existing kernel"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:158
-msgid "Unexpected error: see internal console"
+#: spyderlib/plugins/ipythonconsole.py:479
+msgid ""
+"Please enter the connection info of the kernel you want to connect to. For "
+"that you can either select its JSON connection file using the <tt>Browse</"
+"tt> button, or write directly its id, in case it's a local kernel (for "
+"example <tt>kernel-3764.json</tt> or just <tt>3764</tt>)."
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:210 spyderlib/widgets/findinfiles.py:234
-#: spyderlib/widgets/findinfiles.py:281
-msgid "invalid regular expression"
+#: spyderlib/plugins/ipythonconsole.py:490
+msgid "Connection info:"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:279
-msgid "permission denied errors were encountered"
+#: spyderlib/plugins/ipythonconsole.py:492
+msgid "Path to connection file or kernel id"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:316
-msgid "Search pattern"
+#: spyderlib/plugins/ipythonconsole.py:494
+#: spyderlib/plugins/ipythonconsole.py:511
+msgid "Browse"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:319 spyderlib/widgets/findinfiles.py:353
-#: spyderlib/widgets/findinfiles.py:365 spyderlib/widgets/findreplace.py:77
-msgid "Regular expression"
+#: spyderlib/plugins/ipythonconsole.py:503
+msgid "This is a remote kernel"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:328
-msgid "Search"
+#: spyderlib/plugins/ipythonconsole.py:507
+msgid "username at hostname:port"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:331
-msgid "Start search"
+#: spyderlib/plugins/ipythonconsole.py:510
+msgid "Path to ssh key file"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:334 spyderlib/widgets/ipython.py:555
-msgid "Stop"
+#: spyderlib/plugins/ipythonconsole.py:519
+msgid "Password or ssh key passphrase"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:337
-msgid "Stop search"
+#: spyderlib/plugins/ipythonconsole.py:523
+msgid "Host name"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:347
-msgid "Included filenames pattern"
+#: spyderlib/plugins/ipythonconsole.py:524
+msgid "Ssh key"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:356
-msgid "Include:"
+#: spyderlib/plugins/ipythonconsole.py:525
+msgid "Password"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:359
-msgid "Excluded filenames pattern"
+#: spyderlib/plugins/ipythonconsole.py:554
+msgid "Open IPython connection file"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:368
-msgid "Exclude:"
+#: spyderlib/plugins/ipythonconsole.py:560
+msgid "Select ssh key"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:378
-msgid "PYTHONPATH"
+#: spyderlib/plugins/ipythonconsole.py:739
+msgid "Open an &IPython console"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:380
-msgid "Search in all directories listed in sys.path which are outside the Python installation directory"
+#: spyderlib/plugins/ipythonconsole.py:742
+#, python-format
+msgid "Use %s+T when the console is selected to open a new one"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:383
-msgid "Hg repository"
+#: spyderlib/plugins/ipythonconsole.py:745
+msgid "Open a new console"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:386
-msgid "Search in current directory hg repository"
+#: spyderlib/plugins/ipythonconsole.py:752
+msgid "Open a new IPython console connected to an existing kernel"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:387
-msgid "Here:"
+#: spyderlib/plugins/ipythonconsole.py:835
+#, python-format
+msgid ""
+"No IPython console is currently available to run <b>%s</b>.<br><br>Please "
+"open a new one and try again."
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:391
-msgid "Search recursively in this directory"
+#: spyderlib/plugins/ipythonconsole.py:970
+msgid ""
+"Do you want to close all other consoles connected to the same kernel as this "
+"one?"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:396
-msgid "Browse a search directory"
+#: spyderlib/plugins/ipythonconsole.py:1052
+msgid "Connection error"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:426
-msgid "Hide advanced options"
+#: spyderlib/plugins/ipythonconsole.py:1053
+msgid ""
+"Could not open ssh tunnel. The error was:\n"
+"\n"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:429
-msgid "Show advanced options"
+#: spyderlib/plugins/ipythonconsole.py:1090
+msgid "IPython"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:570
-msgid "Search canceled"
+#: spyderlib/plugins/ipythonconsole.py:1091
+#, python-format
+msgid "Unable to connect to IPython <b>%s"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:574
-msgid "String not found"
+#: spyderlib/plugins/ipythonconsole.py:1142
+msgid "Are you sure you want to restart the kernel?"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:576
-msgid "matches in"
+#: spyderlib/plugins/ipythonconsole.py:1144
+msgid "Restart kernel?"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:577
-msgid "file"
+#: spyderlib/plugins/variableexplorer.py:24
+msgid "Autorefresh"
 msgstr ""
 
-#: spyderlib/widgets/findinfiles.py:585
-msgid "interrupted"
+#: spyderlib/plugins/variableexplorer.py:25
+msgid "Enable autorefresh"
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:59
-msgid "Search string"
+#: spyderlib/plugins/variableexplorer.py:27
+msgid "Refresh interval: "
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:83
-msgid "Case Sensitive"
+#: spyderlib/plugins/variableexplorer.py:28
+msgid " ms"
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:89
-msgid "Whole words"
+#: spyderlib/plugins/variableexplorer.py:31
+msgid "Filter"
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:95
-msgid "Highlight matches"
+#: spyderlib/plugins/variableexplorer.py:46
+msgid "Edit data in the remote process"
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:109
-msgid "Replace with:"
+#: spyderlib/plugins/variableexplorer.py:47
+msgid ""
+"Editors are opened in the remote process for NumPy arrays, PIL images, "
+"lists, tuples and dictionaries.\n"
+"This avoids transfering large amount of data between the remote process and "
+"Spyder (through the socket)."
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:111
-msgid "Replace string"
+#: spyderlib/plugins/variableexplorer.py:183
+msgid "Variable explorer"
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:114
-msgid "Replace/find"
+#: spyderlib/plugins/console.py:108
+msgid "Internal console"
 msgstr ""
 
-#: spyderlib/widgets/findreplace.py:121
-msgid "Replace all"
+#: spyderlib/plugins/console.py:138 spyderlib/plugins/externalconsole.py:1033
+msgid "&Run..."
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:116 spyderlib/widgets/importwizard.py:431
-msgid "Import as"
+#: spyderlib/plugins/console.py:140 spyderlib/plugins/externalconsole.py:1034
+msgid "Run a Python script"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:118
-msgid "data"
+#: spyderlib/plugins/console.py:143
+msgid "Environment variables..."
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:122
-msgid "code"
+#: spyderlib/plugins/console.py:145
+msgid "Show and edit environment variables (for current session)"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:125 spyderlib/widgets/importwizard.py:504
-msgid "text"
+#: spyderlib/plugins/console.py:149
+msgid "Show sys.path contents..."
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:138
-msgid "Column separator:"
+#: spyderlib/plugins/console.py:151
+msgid "Show (read-only) sys.path"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:142
-msgid "Tab"
+#: spyderlib/plugins/console.py:154
+msgid "Buffer..."
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:145 spyderlib/widgets/importwizard.py:163
-msgid "other"
+#: spyderlib/plugins/console.py:155 spyderlib/plugins/history.py:39
+#: spyderlib/plugins/externalconsole.py:84
+msgid "Set maximum line count"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:156
-msgid "Row separator:"
+#: spyderlib/plugins/console.py:158
+msgid "External editor path..."
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:160
-msgid "EOL"
+#: spyderlib/plugins/console.py:159
+msgid "Set external editor executable path"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:175
-msgid "Additional options"
+#: spyderlib/plugins/console.py:178
+msgid "Internal console settings"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:179
-msgid "Skip rows:"
+#: spyderlib/plugins/console.py:231 spyderlib/plugins/externalconsole.py:1210
+msgid "Run Python script"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:190
-msgid "Comments:"
+#: spyderlib/plugins/console.py:277
+msgid "Buffer"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:196
-msgid "Transpose"
+#: spyderlib/plugins/console.py:278
+msgid "Maximum line count"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:434
-msgid "array"
+#: spyderlib/plugins/console.py:288
+msgid "External editor"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:439
-msgid "list"
+#: spyderlib/plugins/console.py:289
+msgid "External editor executable path:"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:444
-msgid "DataFrame"
+#: spyderlib/plugins/projectexplorer.py:68
+msgid "&Font..."
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:487 spyderlib/widgets/importwizard.py:569
-msgid "Import wizard"
+#: spyderlib/plugins/projectexplorer.py:69
+msgid "Set font style"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:492
-msgid "Raw text"
+#: spyderlib/plugins/projectexplorer.py:126
+msgid "Select a new font"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:495
-msgid "variable_name"
+#: spyderlib/plugins/workingdirectory.py:37
+msgid ""
+"The <b>global working directory</b> is the working directory for newly "
+"opened <i>consoles</i> (Python/IPython consoles and terminals), for the "
+"<i>file explorer</i>, for the <i>find in files</i> plugin and for new files "
+"created in the <i>editor</i>."
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:506
-msgid "table"
+#: spyderlib/plugins/workingdirectory.py:46
+msgid "At startup, the global working directory is:"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:507
-msgid "Preview"
+#: spyderlib/plugins/workingdirectory.py:50
+msgid "the same as in last session"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:511
-msgid "Variable Name"
+#: spyderlib/plugins/workingdirectory.py:52
+msgid "At startup, Spyder will restore the global directory from last session"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:519
-msgid "Cancel"
+#: spyderlib/plugins/workingdirectory.py:56 spyderlib/plugins/runconfig.py:480
+msgid "the following directory:"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:532
-msgid "Done"
+#: spyderlib/plugins/workingdirectory.py:58
+msgid "At startup, the global working directory will be the specified path"
 msgstr ""
 
-#: spyderlib/widgets/importwizard.py:570
-msgid "<b>Unable to proceed to next step</b><br><br>Please check your entries.<br><br>Error message:<br>%s"
+#: spyderlib/plugins/workingdirectory.py:70
+msgid "Files are opened from:"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:258
-msgid "Help..."
+#: spyderlib/plugins/workingdirectory.py:74
+#: spyderlib/plugins/workingdirectory.py:87
+msgid "the current file directory"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:266
-msgid "Help"
+#: spyderlib/plugins/workingdirectory.py:78
+#: spyderlib/plugins/workingdirectory.py:91
+msgid "the global working directory"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:275
-msgid "Shell special commands:"
+#: spyderlib/plugins/workingdirectory.py:83
+msgid "Files are created in:"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:276
-msgid "Internal editor:"
+#: spyderlib/plugins/workingdirectory.py:97
+msgid "Change to file base directory"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:277
-msgid "External editor:"
+#: spyderlib/plugins/workingdirectory.py:99
+msgid "When opening a file"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:278
-msgid "Run script:"
+#: spyderlib/plugins/workingdirectory.py:101
+msgid "When saving a file"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:279
-msgid "Remove references:"
+#: spyderlib/plugins/workingdirectory.py:171
+msgid "Back"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:280
-msgid "System commands:"
+#: spyderlib/plugins/workingdirectory.py:190
+msgid ""
+"This is the working directory for newly\n"
+"opened consoles (Python/IPython consoles and\n"
+"terminals), for the file explorer, for the\n"
+"find in files plugin and for new files\n"
+"created in the editor"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:281
-msgid "Python help:"
+#: spyderlib/plugins/workingdirectory.py:218
+msgid "Browse a working directory"
 msgstr ""
 
-#: spyderlib/widgets/internalshell.py:282
-msgid "GUI-based editor:"
+#: spyderlib/plugins/workingdirectory.py:225
+msgid "Change to parent directory"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:506
-msgid "An error ocurred while starting the kernel"
+#: spyderlib/plugins/workingdirectory.py:232
+msgid "Global working directory"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:535
-msgid "Restart kernel"
+#: spyderlib/plugins/explorer.py:50
+msgid "File explorer"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:557
-msgid "Stop the current command"
+#: spyderlib/plugins/shortcuts.py:134
+msgid ""
+"Press the new shortcut and select 'Ok': \n"
+"(Press 'Tab' once to switch focus between the shortcut entry \n"
+"and the buttons below it)"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:581
-msgid "Inspect current object"
+#: spyderlib/plugins/shortcuts.py:137
+msgid "Current shortcut:"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:586
-msgid "Clear line or block"
+#: spyderlib/plugins/shortcuts.py:139
+msgid "New shortcut:"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:590
-msgid "Clear console"
+#: spyderlib/plugins/shortcuts.py:152
+#, python-brace-format
+msgid "Shortcut: {0}"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:640
-msgid "It seems the kernel died unexpectedly. Use 'Restart kernel' to continue using this console."
+#: spyderlib/plugins/shortcuts.py:273
+msgid "Please introduce a different shortcut"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:660
-msgid "Changing backend to Qt for Mayavi"
+#: spyderlib/plugins/shortcuts.py:310
+msgid "The new shorcut conflicts with:"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:669
-msgid "Kernel process is either remote or unspecified. Cannot interrupt"
+#: spyderlib/plugins/shortcuts.py:321
+#, python-brace-format
+msgid ""
+"A compound sequence can have {break} a maximum of 4 subsequences.{break}"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:678
-msgid "Kernel process is either remote or unspecified. Cannot restart."
+#: spyderlib/plugins/shortcuts.py:326
+msgid "Invalid key entered"
 msgstr ""
 
-#: spyderlib/widgets/ipython.py:757
-msgid "Connecting to kernel..."
+#: spyderlib/plugins/shortcuts.py:515
+msgid "Context"
 msgstr ""
 
-#: spyderlib/widgets/onecolumntree.py:60
-msgid "Collapse all"
+#: spyderlib/plugins/shortcuts.py:519
+msgid "Shortcut"
 msgstr ""
 
-#: spyderlib/widgets/onecolumntree.py:64
-msgid "Expand all"
+#: spyderlib/plugins/shortcuts.py:521
+msgid "Score"
 msgstr ""
 
-#: spyderlib/widgets/onecolumntree.py:68
-msgid "Restore"
+#: spyderlib/plugins/shortcuts.py:681
+msgid "Conflicts"
 msgstr ""
 
-#: spyderlib/widgets/onecolumntree.py:69
-msgid "Restore original tree layout"
+#: spyderlib/plugins/shortcuts.py:682
+msgid "The following conflicts have been detected:"
 msgstr ""
 
-#: spyderlib/widgets/onecolumntree.py:73
-msgid "Collapse selection"
+#: spyderlib/plugins/shortcuts.py:767
+msgid "Keyboard shortcuts"
 msgstr ""
 
-#: spyderlib/widgets/onecolumntree.py:77
-msgid "Expand selection"
+#: spyderlib/plugins/shortcuts.py:775
+msgid "Search: "
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:86
-msgid "Move to top"
+#: spyderlib/plugins/shortcuts.py:776
+msgid "Reset to default values"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:92
-msgid "Move up"
+#: spyderlib/plugins/runconfig.py:28
+msgid "Execute in current Python or IPython console"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:98
-msgid "Move down"
+#: spyderlib/plugins/runconfig.py:29
+msgid "Execute in a new dedicated Python console"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:104
-msgid "Move to bottom"
+#: spyderlib/plugins/runconfig.py:30
+msgid "Execute in an external System terminal"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:115 spyderlib/widgets/pathmanager.py:230
-msgid "Add path"
+#: spyderlib/plugins/runconfig.py:40
+#, python-format
+msgid "Always show %s on a first file run"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:120 spyderlib/widgets/pathmanager.py:213
-msgid "Remove path"
+#: spyderlib/plugins/runconfig.py:159
+msgid "General settings"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:130
-msgid "Synchronize..."
+#: spyderlib/plugins/runconfig.py:162 spyderlib/plugins/runconfig.py:208
+msgid "Command line options:"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:132
-msgid "Synchronize Spyder's path list with PYTHONPATH environment variable"
+#: spyderlib/plugins/runconfig.py:168
+msgid "Working directory:"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:144
-msgid "Synchronize"
+#: spyderlib/plugins/runconfig.py:180 spyderlib/plugins/runconfig.py:491
+msgid "Enter debugging mode when errors appear during execution"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:145
-msgid "This will synchronize Spyder's path list with <b>PYTHONPATH</b> environment variable for current user, allowing you to run your Python modules outside Spyder without having to configure sys.path. <br>Do you want to clear contents of PYTHONPATH before adding Spyder's path list?"
+#: spyderlib/plugins/runconfig.py:196 spyderlib/plugins/runconfig.py:501
+msgid "Dedicated Python console"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:214
-msgid "Do you really want to remove selected path?"
+#: spyderlib/plugins/runconfig.py:200 spyderlib/plugins/runconfig.py:503
+msgid "Interact with the Python console after execution"
 msgstr ""
 
-#: spyderlib/widgets/pathmanager.py:231
-msgid "This directory is already included in Spyder path list.<br>Do you want to move it to the top of the list?"
+#: spyderlib/plugins/runconfig.py:204
+msgid "Show warning when killing running process"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:335
-msgid "its own configuration file"
+#: spyderlib/plugins/runconfig.py:213
+msgid "<b>-u</b> is added to the other options you set here"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:337
-msgid " and "
+#: spyderlib/plugins/runconfig.py:223
+msgid "this dialog"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:341
-msgid "the following projects:<br>%s"
+#: spyderlib/plugins/runconfig.py:282
+msgid "Run configuration"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:545
-msgid "Project..."
+#: spyderlib/plugins/runconfig.py:283
+#, python-format
+msgid "The following working directory is not valid:<br><b>%s</b>"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:558
-msgid "Existing directory"
+#: spyderlib/plugins/runconfig.py:361
+#, python-format
+msgid "Run settings for %s"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:562
-msgid "Existing Spyder project"
+#: spyderlib/plugins/runconfig.py:393
+msgid "Select a run configuration:"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:566
-msgid "Existing Pydev project"
+#: spyderlib/plugins/runconfig.py:422 spyderlib/plugins/runconfig.py:447
+msgid "Run Settings"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:583
-msgid "Open project"
+#: spyderlib/plugins/runconfig.py:449
+#, python-format
+msgid ""
+"The following are the default <i>%s</i>. These options may be overriden "
+"using the <b>%s</b> dialog box (see the <b>%s</b> menu)"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:588
-msgid "Close project"
+#: spyderlib/plugins/runconfig.py:475
+msgid "Default working directory is:"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:593
-msgid "Close unrelated projects"
+#: spyderlib/plugins/runconfig.py:477
+msgid "the script directory"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:602
-msgid "Edit related projects"
+#: spyderlib/plugins/runconfig.py:506
+msgid "Show warning when killing running processes"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:610
-msgid "Add to PYTHONPATH"
+#: spyderlib/plugins/runconfig.py:515
+msgid "Run Settings dialog"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:615
-msgid "Remove from PYTHONPATH"
+#: spyderlib/plugins/history.py:35
+msgid "Settings"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:620
-msgid "Properties"
+#: spyderlib/plugins/history.py:37
+msgid "History depth: "
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:655
-msgid "Show horizontal scrollbar"
+#: spyderlib/plugins/history.py:37
+msgid " entries"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:692
-msgid "Workspace"
+#: spyderlib/plugins/history.py:44
+msgid "Scroll automatically to last entry"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:693
-msgid "The workspace was unable to load or save %s<br><br>Please check if you have the permission to write the associated configuration files."
+#: spyderlib/plugins/history.py:123
+msgid "History log"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:752
-msgid "Import directory"
+#: spyderlib/plugins/history.py:150
+msgid "History..."
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:754
-msgid "The following directory is not in workspace:<br><b>%s</b><br><br>Do you want to continue (and copy the directory to workspace)?"
+#: spyderlib/plugins/history.py:152
+msgid "Set history maximum entries"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:772
-#: spyderlib/widgets/projectexplorer.py:1183
-msgid "copy"
+#: spyderlib/plugins/history.py:263
+msgid "History"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:824
-msgid "The project <b>%s</b> is already opened!"
+#: spyderlib/plugins/history.py:264
+msgid "Maximum entries"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:831
-msgid "The project root path directory is inside the workspace but not as the expected tree level. It is not a directory of the workspace:<br><b>%s</b>"
+#: spyderlib/plugins/externalconsole.py:48
+msgid "Interactive data plotting in the consoles"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:842
-msgid "Project name:"
+#: spyderlib/plugins/externalconsole.py:68
+msgid "One tab per script"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:851
-msgid "A project named <b>%s</b> already exists"
+#: spyderlib/plugins/externalconsole.py:82
+msgid "Buffer: "
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:856
-msgid "Invalid project name.<br><br>Name must match the following regular expression:<br><b>%s</b>"
+#: spyderlib/plugins/externalconsole.py:87
+msgid "Merge process standard output/error channels"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:863
-msgid "The following directory is not empty:<br><b>%s</b><br><br>Do you want to continue?"
+#: spyderlib/plugins/externalconsole.py:89
+msgid ""
+"Merging the output channels of the process means that\n"
+"the standard error won't be written in red anymore,\n"
+"but this has the effect of speeding up display."
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:876
-msgid "New project"
+#: spyderlib/plugins/externalconsole.py:93
+msgid "Colorize standard error channel using ANSI escape codes"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:884
+#: spyderlib/plugins/externalconsole.py:95
 msgid ""
-"The current workspace has not been configured yet.\n"
-"Do you want to do this now?"
+"This method is the only way to have colorized standard\n"
+"error channel when the output channels have been merged."
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:922
-msgid "Import existing project"
+#: spyderlib/plugins/externalconsole.py:112
+msgid ""
+"This option will be applied the next time a Python console or a terminal is "
+"opened."
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:935
-msgid "Select projects to import"
+#: spyderlib/plugins/externalconsole.py:115
+msgid "Light background (white color)"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:947
-msgid "The folder <i>%s</i> does not contain a valid %s project"
+#: spyderlib/plugins/externalconsole.py:140
+msgid "User Module Reloader (UMR)"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:977
-msgid "Import existing Pydev project"
+#: spyderlib/plugins/externalconsole.py:141
+msgid ""
+"UMR forces Python to reload modules which were imported when executing a \n"
+"script in the external console with the 'runfile' function."
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:978
-msgid "<b>Unable to read Pydev project <i>%s</i></b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/externalconsole.py:144
+msgid "Enable UMR"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1016
-msgid "Do you really want to delete project <b>%s</b>?<br><br>Note: project files won't be deleted from disk."
+#: spyderlib/plugins/externalconsole.py:146
+msgid ""
+"This option will enable the User Module Reloader (UMR) in Python/IPython "
+"consoles. UMR forces Python to reload deeply modules during import when "
+"running a Python script using the Spyder's builtin function <b>runfile</b>."
+"<br><br><b>1.</b> UMR may require to restart the console in which it will be "
+"called (otherwise only newly imported modules will be reloaded when "
+"executing scripts).<br><br><b>2.</b> If errors occur when re-running a PyQt-"
+"based program, please check that the Qt objects are properly destroyed (e.g. "
+"you may have to use the attribute <b>Qt.WA_DeleteOnClose</b> on your main "
+"window, using the <b>setAttribute</b> method)"
+msgstr ""
+
+#: spyderlib/plugins/externalconsole.py:161
+msgid "Show reloaded modules list"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1069
-msgid "Related projects"
+#: spyderlib/plugins/externalconsole.py:163
+msgid "Please note that these changes will be applied only to new consoles"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1077
-msgid "Select projects which are related to <b>%s</b>"
+#: spyderlib/plugins/externalconsole.py:166
+msgid "Set UMR excluded (not reloaded) modules"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1102
-msgid "Statistics on source files only:<br>(Python, Cython, IPython, Enaml,C/C++, Fortran)<br><br><b>%s</b> files.<br><b>%s</b> lines of code."
+#: spyderlib/plugins/externalconsole.py:177
+msgid "Python executable"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1151
-msgid "File <b>%s</b> already exists.<br>Do you want to overwrite it?"
+#: spyderlib/plugins/externalconsole.py:179
+msgid ""
+"Select the Python interpreter executable binary in which Spyder will run "
+"scripts:"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1165
-msgid "Folder <b>%s</b> already exists."
+#: spyderlib/plugins/externalconsole.py:182
+msgid "Default (i.e. the same as Spyder's)"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1185
-msgid "move"
+#: spyderlib/plugins/externalconsole.py:186
+msgid "Use the following Python interpreter:"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1195
-msgid "Select an existing workspace directory, or create a new one"
+#: spyderlib/plugins/externalconsole.py:190
+msgid "Executables"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1196
-msgid "<u><b>What is the workspace?</b></u><br><br>A <b>Spyder workspace</b> is a directory on your filesystem that contains Spyder projects and <b>.spyderworkspace</b> configuration file.<br><br>A <b>Spyder project</b> is a directory with source code (and other related files) and a configuration file (named <b>.spyderproject</b>) with project settings (PYTHONPATH, linked projects, ...).<br>"
+#: spyderlib/plugins/externalconsole.py:208
+msgid "PYTHONSTARTUP replacement"
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1225
-msgid "This is the current workspace directory"
+#: spyderlib/plugins/externalconsole.py:210
+msgid ""
+"This option will override the PYTHONSTARTUP environment variable which\n"
+"defines the script to be executed during the Python console startup."
 msgstr ""
 
-#: spyderlib/widgets/projectexplorer.py:1255
-msgid "The following directory is not a Spyder workspace:<br>%s<br><br>Do you want to create a new workspace in this directory?"
+#: spyderlib/plugins/externalconsole.py:215
+msgid "Default PYTHONSTARTUP script"
 msgstr ""
 
-#: spyderlib/widgets/pydocgui.py:107
-msgid "Module or package:"
+#: spyderlib/plugins/externalconsole.py:219
+msgid "Use the following startup script:"
 msgstr ""
 
-#: spyderlib/widgets/shell.py:134
-msgid "Save history log..."
+#: spyderlib/plugins/externalconsole.py:236
+msgid "Monitor"
 msgstr ""
 
-#: spyderlib/widgets/shell.py:136
-msgid "Save current history log (i.e. all inputs and outputs) in a text file"
+#: spyderlib/plugins/externalconsole.py:237
+msgid ""
+"The monitor provides introspection features to console: code completion, "
+"calltips and variable explorer. Because it relies on several modules, "
+"disabling the monitor may be useful to accelerate console startup."
 msgstr ""
 
-#: spyderlib/widgets/shell.py:262
-msgid "Save history log"
+#: spyderlib/plugins/externalconsole.py:244
+msgid "Enable monitor"
 msgstr ""
 
-#: spyderlib/widgets/shell.py:265
-msgid "History logs"
+#: spyderlib/plugins/externalconsole.py:257
+msgid "Default library"
 msgstr ""
 
-#: spyderlib/widgets/shell.py:276
-msgid "<b>Unable to save file '%s'</b><br><br>Error message:<br>%s"
+#: spyderlib/plugins/externalconsole.py:262
+msgid "Qt-Python Bindings"
 msgstr ""
 
-#: spyderlib/widgets/shell.py:718
-msgid "Copy without prompts"
+#: spyderlib/plugins/externalconsole.py:264
+msgid "Library:"
 msgstr ""
 
-#: spyderlib/widgets/shell.py:721 spyderlib/widgets/shell.py:725
-msgid "Clear line"
+#: spyderlib/plugins/externalconsole.py:266
+msgid ""
+"This option will act on<br> libraries such as Matplotlib, guidata or ETS"
 msgstr ""
 
-#: spyderlib/widgets/shell.py:727
-msgid "Clear shell"
+#: spyderlib/plugins/externalconsole.py:276
+msgid ""
+"Decide which backend to use to display graphics. If unsure, please select "
+"the <b>Automatic</b> backend.<br><br><b>Note:</b> We support a very limited "
+"number of backends in our Python consoles. If you prefer to work with a "
+"different one, please use an IPython console."
 msgstr ""
 
-#: spyderlib/widgets/shell.py:731
-msgid "Clear shell contents ('cls' command)"
+#: spyderlib/plugins/externalconsole.py:303
+msgid "Enthought Tool Suite"
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:98
-msgid "Go to line:"
+#: spyderlib/plugins/externalconsole.py:304
+msgid ""
+"Enthought Tool Suite (ETS) supports PyQt4 (qt4) and wxPython (wx) graphical "
+"user interfaces."
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:106
-msgid "Line count:"
+#: spyderlib/plugins/externalconsole.py:308
+msgid "ETS_TOOLKIT:"
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:1270
-msgid "Breakpoint"
+#: spyderlib/plugins/externalconsole.py:333
+msgid "External modules"
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:1271
-msgid "Condition:"
+#: spyderlib/plugins/externalconsole.py:369
+#, python-format
+msgid ""
+"You selected a <b>Python %d</b> interpreter for the console but Spyder is "
+"running on <b>Python %d</b>!.<br><br>Although this is possible, we recommend "
+"you to install and run Spyder directly with your selected interpreter, to "
+"avoid seeing false warnings and errors due to the incompatible syntax "
+"between these two Python versions."
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:1679
-msgid "Code analysis"
+#: spyderlib/plugins/externalconsole.py:532
+msgid "Trying to kill a kernel?"
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:1733
-msgid "To do"
+#: spyderlib/plugins/externalconsole.py:533
+msgid ""
+"You can't close this kernel because it has one or more consoles connected to "
+"it.<br><br>You need to close them instead or you can kill the kernel using "
+"the second button from right to left."
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:1974
-msgid "Removal error"
+#: spyderlib/plugins/externalconsole.py:612
+#, python-format
+msgid ""
+"No Python console is currently selected to run <b>%s</b>.<br><br>Please "
+"select or open a new Python console and try again."
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:1975
+#: spyderlib/plugins/externalconsole.py:692
+#, python-format
 msgid ""
-"It was not possible to remove outputs from this notebook. The error is:\n"
-"\n"
+"%s is already running in a separate process.\n"
+"Do you want to kill the process before starting a new one?"
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:2453
-msgid "Clear all ouput"
+#: spyderlib/plugins/externalconsole.py:852
+msgid "Kernel"
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:2459
-msgid "Go to definition"
+#: spyderlib/plugins/externalconsole.py:862
+msgid ""
+"Either:<ol><li>Your IPython frontend and kernel versions are "
+"<b>incompatible</b> or</li><li>You <b>don't have</b> IPython installed in "
+"your external interpreter.</li></ol>In any case, we're sorry but we can't "
+"create a console for you."
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/codeeditor.py:2471
-msgid "Zoom reset"
+#: spyderlib/plugins/externalconsole.py:886
+msgid "Command Window"
 msgstr ""
 
-#: spyderlib/widgets/sourcecode/syntaxhighlighters.py:32
-msgid "Syntax highlighting for Matlab, Julia and other file types"
+#: spyderlib/plugins/externalconsole.py:888
+msgid "Terminal"
 msgstr ""
 
-#: spyderlib/widgets/status.py:23
-msgid "CPU and memory usage info in the status bar"
+#: spyderlib/plugins/externalconsole.py:941
+#, python-format
+msgid "Kernel %s"
 msgstr ""
 
-#: spyderlib/widgets/status.py:92
-msgid "Memory:"
+#: spyderlib/plugins/externalconsole.py:1021
+msgid "Open a &Python console"
 msgstr ""
 
-#: spyderlib/widgets/status.py:93
-msgid "Memory usage status: requires the `psutil` (>=v0.3) library on non-Windows platforms"
+#: spyderlib/plugins/externalconsole.py:1025
+msgid "Open &command prompt"
 msgstr ""
 
-#: spyderlib/widgets/status.py:105
-msgid "CPU:"
+#: spyderlib/plugins/externalconsole.py:1026
+msgid "Open a Windows command prompt"
 msgstr ""
 
-#: spyderlib/widgets/status.py:106
-msgid "CPU usage status: requires the `psutil` (>=v0.3) library"
+#: spyderlib/plugins/externalconsole.py:1028
+msgid "Open a &terminal"
 msgstr ""
 
-#: spyderlib/widgets/status.py:128
-msgid "Permissions:"
+#: spyderlib/plugins/externalconsole.py:1029
+msgid "Open a terminal window"
 msgstr ""
 
-#: spyderlib/widgets/status.py:142
-msgid "End-of-lines:"
+#: spyderlib/plugins/externalconsole.py:1186
+msgid "Open an IPython console"
 msgstr ""
 
-#: spyderlib/widgets/status.py:156
-msgid "Encoding:"
+#: spyderlib/plugins/externalconsole.py:1187
+msgid ""
+"The console monitor was disabled: the IPython kernel will be started as "
+"expected, but an IPython console will have to be connected manually to the "
+"kernel."
 msgstr ""
 
-#: spyderlib/widgets/status.py:169
-msgid "Line:"
+#: spyderlib/plugins/externalconsole.py:1219
+#: spyderlib/plugins/externalconsole.py:1232
+#: spyderlib/plugins/externalconsole.py:1236
+msgid "UMR"
 msgstr ""
 
-#: spyderlib/widgets/status.py:173
-msgid "Column:"
+#: spyderlib/plugins/externalconsole.py:1220
+msgid ""
+"UMR excluded modules:\n"
+"(example: guidata, guiqwt)"
 msgstr ""
 
-#: spyderlib/widgets/tabs.py:142
-msgid "Browse tabs"
+#: spyderlib/plugins/externalconsole.py:1233
+#, python-format
+msgid ""
+"The following modules are not installed on your machine:\n"
+"%s"
 msgstr ""
 
-#: spyderlib/widgets/tabs.py:270
-msgid "Close current tab"
+#: spyderlib/plugins/externalconsole.py:1237
+msgid ""
+"Please note that these changes will be applied only to new Python/IPython "
+"consoles"
 msgstr ""
 
-#: spyderlib/widgets/texteditor.py:72
-msgid "Text editor"
+#: spyderlib/plugins/layoutdialog.py:174
+msgid "Move Up"
 msgstr ""
 
-#: spyderlib/workers/updates.py:79 spyderlib/workers/updates.py:81
-msgid "Unable to retrieve information."
+#: spyderlib/plugins/layoutdialog.py:175
+msgid "Move Down"
 msgstr ""
 
-#: spyderlib/workers/updates.py:83
-msgid "Unable to connect to the internet. <br><br>Make sure the connection is working properly."
+#: spyderlib/plugins/layoutdialog.py:176
+msgid "Delete Layout"
 msgstr ""
 
-#: spyderlib/workers/updates.py:86
-msgid "Unable to check for updates."
+#: spyderlib/plugins/layoutdialog.py:180
+msgid "Layout Display and Order"
 msgstr ""
 
+#: spyderlib/plugins/onlinehelp.py:68
+msgid "Online help"
+msgstr ""
diff --git a/spyderlib/otherplugins.py b/spyderlib/otherplugins.py
index 30ce2d5..a99e35e 100644
--- a/spyderlib/otherplugins.py
+++ b/spyderlib/otherplugins.py
@@ -8,7 +8,6 @@
 Spyder third-party plugins configuration management
 """
 
-import importlib
 import os
 import os.path as osp
 import sys
@@ -16,72 +15,65 @@ import traceback
 
 # Local imports
 from spyderlib.config.base import get_conf_path
-from spyderlib.py3compat import PY2, PY3, PY33
+from spyderlib.py3compat import PY2
 
 if PY2:
     import imp
+else:
+    import importlib
 
 
-def _get_spyderplugins(plugin_path, base_namespace, plugins_namespace,
-                       modnames, modlist):
-    """Scan the directory `plugin_path` for plugins_namespace package and
-    loads its submodules."""
-    namespace_path = osp.join(plugin_path, base_namespace, plugins_namespace)
+PLUGIN_PREFIX = "spyder_"
+IO_PREFIX = PLUGIN_PREFIX + "io_"
 
-    if not osp.exists(namespace_path):
-        return
 
-    dirs = []
-    for d in os.listdir(namespace_path):
-        path = osp.join(namespace_path, d)
-        if osp.isdir(path):
-            dirs.append(path)
-            
-    for dirname in dirs:
-        name = osp.basename(dirname)
-        if name == "__pycache__":
-            continue
-        _import_plugin(name, base_namespace, plugins_namespace,
-                       namespace_path, modnames, modlist)
+def get_spyderplugins_mods(io=False):
+    """Import modules from plugins package and return the list"""
+    # Create user directory
+    user_plugin_path = osp.join(get_conf_path(), "spyplugins")
+    if not osp.isdir(user_plugin_path):
+        os.makedirs(user_plugin_path)
 
+    modlist, modnames = [], []
 
-class _ModuleMock():
-    """This mock module is added to sys.modules on plugin load to add the
-    location of the LOCALEDATA so that the module loads succesfully.
-    Once loaded the module is replaced by the actual loaded module object.
-    """
-    pass
+    # The user plugins directory is given the priority when looking for modules
+    for plugin_path in [user_plugin_path] + sys.path:
+        _get_spyderplugins(plugin_path, io, modnames, modlist)
+    return modlist
+
+
+def _get_spyderplugins(plugin_path, is_io, modnames, modlist):
+    """Scan the directory `plugin_path` for plugin packages and loads them."""
+    if not osp.isdir(plugin_path):
+        return
+
+    for name in os.listdir(plugin_path):
+        if is_io and not name.startswith(IO_PREFIX):
+            continue
+        if not name.startswith(PLUGIN_PREFIX) or name.startswith(IO_PREFIX):
+            continue
 
+        # Import the plugin
+        _import_plugin(name, plugin_path, modnames, modlist)
 
-def _import_plugin(name, base_namespace, plugin_namespace, namespace_path,
-                   modnames, modlist):
-    """Import the plugin `plugins_namsepace`.`name`, add it to `modlist` and
-    adds its name to `modnames`."""
-    module_name = "{0}.{1}.{2}".format(base_namespace, plugin_namespace, name)
 
+def _import_plugin(module_name, plugin_path, modnames, modlist):
+    """Import the plugin `module_name` from `plugin_path`, add it to `modlist`
+    and adds its name to `modnames`.
+    """
     if module_name in modnames:
         return
     try:
         # First add a mock module with the LOCALEPATH attribute so that the
         # helper method can find the locale on import
         mock = _ModuleMock()
-        mock.LOCALEPATH = osp.join(namespace_path, name, 'locale')
+        mock.LOCALEPATH = osp.join(plugin_path, 'locale')
         sys.modules[module_name] = mock
-        module = None
-        if PY33:
-            loader = importlib.machinery.PathFinder.find_module(
-                name, [namespace_path])
-            if loader:
-                module = loader.load_module(name)
-        elif PY3:
-            spec = importlib.machinery.PathFinder.find_spec(name,
-                                                            [namespace_path])
-            if spec:
-                module = spec.loader.load_module(name)
+
+        if osp.isdir(osp.join(plugin_path, module_name)):
+            module = _import_module_from_path(module_name, plugin_path)
         else:
-            info = imp.find_module(name, [namespace_path])
-            if info:
-                module = imp.load_module(module_name, *info)
+            module = None
 
         # Then restore the actual loaded module instead of the mock
         if module:
@@ -94,68 +86,34 @@ def _import_plugin(name, base_namespace, plugin_namespace, namespace_path,
         traceback.print_exc(file=sys.stderr)
 
 
-def create_userplugins_files(path):
-    """
-    Create userplugins namespace dirs and files if not present in .spyder* dir
-    """
-    if not osp.isdir(path):
-        os.makedirs(path)
-
-    init_file = "__init__.py"
-    init_file_content = """# -*- coding: utf-8 -*-
-'''
-'spyplugins' makes uses of namespace packages to keep different plugins
-organized in the sitepackages directory and in the user directory.
+def _import_module_from_path(module_name, plugin_path):
+    """Imports `module_name` from `plugin_path`.
 
-Spyder plugins can be of 'io' type or 'ui' type. Each type also makes use
-of namespace packages.
-
-For more information on namespace packages visit:
-- https://www.python.org/dev/peps/pep-0382/
-- https://www.python.org/dev/peps/pep-0420/
-'''
-
-# Declare as a namespace package
-__import__('pkg_resources').declare_namespace(__name__)
-"""
-    data = ""
-    new_path = osp.join(path, init_file)
-    if osp.isfile(new_path):
-        with open(new_path, "r") as f:
-            data = f.read()
-
-    if not (osp.isfile(new_path) and data == init_file_content):
-        with open(new_path, "w") as f:
-            f.write(init_file_content)
-
-
-def get_spyderplugins_mods(io=False):
-    """Import modules from plugins package and return the list"""
-    base_namespace = "spyplugins"
-
-    if io:
-        plugins_namespace = "io"
-    else:
-        plugins_namespace = "ui"
-
-    namespace = '.'.join([base_namespace, plugins_namespace])
-
-    # Import parent module
-    importlib.import_module(namespace)
-
-    # Create user directory
-    user_conf_path = get_conf_path()
-    user_plugin_basepath = osp.join(user_conf_path, base_namespace)
-    user_plugin_path = osp.join(user_conf_path, base_namespace,
-                                plugins_namespace)
-
-    create_userplugins_files(user_plugin_basepath)
-    create_userplugins_files(user_plugin_path)
+    Return None if no module is found.
+    """
+    module = None
+    if PY2:
+        info = imp.find_module(module_name, [plugin_path])
+        if info:
+            module = imp.load_module(module_name, *info)
+    elif sys.version_info[0:2] <= (3, 3):
+        loader = importlib.machinery.PathFinder.find_module(
+            module_name,
+            [plugin_path])
+        if loader:
+            module = loader.load_module(module_name)
+    else:  # Python 3.4+
+        spec = importlib.machinery.PathFinder.find_spec(
+            module_name,
+            [plugin_path])
+        if spec:
+            module = spec.loader.load_module(module_name)
+    return module
 
-    modlist, modnames = [], []
 
-    # The user plugins directory is given the priority when looking for modules
-    for plugin_path in [user_conf_path] + sys.path:
-        _get_spyderplugins(plugin_path, base_namespace, plugins_namespace,
-                           modnames, modlist)
-    return modlist
+class _ModuleMock():
+    """This mock module is added to sys.modules on plugin load to add the
+    location of the LOCALEDATA so that the module loads succesfully.
+    Once loaded the module is replaced by the actual loaded module object.
+    """
+    pass
diff --git a/spyderlib/plugins/__init__.py b/spyderlib/plugins/__init__.py
index 8602e14..ce0aaf7 100644
--- a/spyderlib/plugins/__init__.py
+++ b/spyderlib/plugins/__init__.py
@@ -23,21 +23,21 @@ import inspect
 import os
 
 # Third party imports
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtCore import Qt, Signal, QObject, QEvent, QPoint
-from spyderlib.qt.QtGui import (QDockWidget, QWidget, QShortcut, QCursor,
-                                QKeySequence, QMainWindow, QApplication,
-                                QTabBar)
+from qtpy import PYQT5
+from qtpy.QtCore import QEvent, QObject, QPoint, Qt, Signal
+from qtpy.QtGui import QCursor, QKeySequence
+from qtpy.QtWidgets import (QApplication, QDockWidget, QMainWindow,
+                            QShortcut, QTabBar, QWidget)
 
 # Local imports
-from spyderlib.utils.qthelpers import create_action, toggle_actions
 from spyderlib.config.base import _
-from spyderlib.config.gui import get_font, set_font
+from spyderlib.config.gui import get_color_scheme, get_font
 from spyderlib.config.main import CONF
 from spyderlib.config.user import NoDefault
 from spyderlib.plugins.configdialog import SpyderConfigPage
 from spyderlib.py3compat import configparser, is_text_string
 from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import create_action, toggle_actions
 
 
 class PluginConfigPage(SpyderConfigPage):
@@ -47,7 +47,6 @@ class PluginConfigPage(SpyderConfigPage):
         self.get_option = plugin.get_option
         self.set_option = plugin.set_option
         self.get_font = plugin.get_plugin_font
-        self.set_font = plugin.set_plugin_font
         self.apply_settings = plugin.apply_plugin_settings
         SpyderConfigPage.__init__(self, parent)
     
@@ -255,6 +254,8 @@ class SpyderPluginMixin(object):
     """
     CONF_SECTION = None
     CONFIGWIDGET_CLASS = None
+    FONT_SIZE_DELTA = 0
+    RICH_FONT_SIZE_DELTA = 0
     IMG_PATH = 'images'
     ALLOWED_AREAS = Qt.AllDockWidgetAreas
     LOCATION = Qt.LeftDockWidgetArea
@@ -397,24 +398,26 @@ class SpyderPluginMixin(object):
     def apply_plugin_settings(self, options):
         """Apply configuration file's plugin settings"""
         raise NotImplementedError
-    
+
     def register_shortcut(self, qaction_or_qshortcut, context, name,
-                          default=NoDefault):
+                          add_sc_to_tip=False):
         """
-        Register QAction or QShortcut to Spyder main application,
-        with shortcut (context, name, default)
+        Register QAction or QShortcut to Spyder main application
+
+        if add_sc_to_tip is True, the shortcut is added to the
+        action's tooltip
         """
-        self.main.register_shortcut(qaction_or_qshortcut,
-                                    context, name, default)
-        
-    def register_widget_shortcuts(self, context, widget):
+        self.main.register_shortcut(qaction_or_qshortcut, context,
+                                    name, add_sc_to_tip)
+
+    def register_widget_shortcuts(self, widget):
         """
         Register widget shortcuts
         widget interface must have a method called 'get_shortcut_data'
         """
-        for qshortcut, name, default in widget.get_shortcut_data():
-            self.register_shortcut(qshortcut, context, name, default)
-    
+        for qshortcut, context, name in widget.get_shortcut_data():
+            self.register_shortcut(qshortcut, context, name)
+
     def switch_to_plugin(self):
         """Switch to plugin
         This method is called when pressing plugin's shortcut key"""
@@ -453,14 +456,41 @@ class SpyderPluginMixin(object):
     def get_option(self, option, default=NoDefault):
         """Get a plugin option from configuration file"""
         return CONF.get(self.CONF_SECTION, option, default)
-    
-    def get_plugin_font(self, option=None):
-        """Return plugin font option"""
-        return get_font(self.CONF_SECTION, option)
-    
-    def set_plugin_font(self, font, option=None):
-        """Set plugin font option"""
-        set_font(font, self.CONF_SECTION, option)
+
+    def get_plugin_font(self, rich_text=False):
+        """
+        Return plugin font option.
+
+        All plugins in Spyder use a global font. This is a convenience method
+        in case some plugins will have a delta size based on the default size.
+        """
+
+        if rich_text:
+            option = 'rich_font'
+            font_size_delta = self.RICH_FONT_SIZE_DELTA
+        else:
+            option = 'font'
+            font_size_delta = self.FONT_SIZE_DELTA
+
+        return get_font(option=option, font_size_delta=font_size_delta)
+
+    def set_plugin_font(self):
+        """
+        Set plugin font option.
+
+        Note: All plugins in Spyder use a global font. To define a different
+        size, the plugin must define a 'FONT_SIZE_DELTA' class variable.
+        """
+        raise Exception("Plugins font is based on the general settings, "
+                        "and cannot be set directly on the plugin."
+                        "This method is deprecated.")
+
+    def update_font(self):
+        """
+        This has to be reimplemented by plugins that need to adjust
+        their fonts
+        """
+        pass
 
     def __show_message(self, message, timeout=0):
         """Show message in main window's status bar"""
@@ -483,16 +513,11 @@ class SpyderPluginMixin(object):
         QApplication.restoreOverrideCursor()
         self.__show_message(message, timeout=2000)
         QApplication.processEvents()
-        
-    def set_default_color_scheme(self, name='Spyder'):
-        """Set default color scheme (only once)"""
-        color_scheme_name = self.get_option('color_scheme_name', None)
-        if color_scheme_name is None:
-            names = CONF.get("color_schemes", "names")
-            if name not in names:
-                name = names[0]
-            self.set_option('color_scheme_name', name)
-    
+
+    def get_color_scheme(self):
+        """Get current color scheme"""
+        return get_color_scheme(CONF.get('color_schemes', 'selected'))
+
     def create_toggle_view_action(self):
         """Associate a toggle view action with each plugin"""
         title = self.get_plugin_title()
@@ -501,8 +526,8 @@ class SpyderPluginMixin(object):
         if self.shortcut is not None:
             action = create_action(self, title,
                              toggled=lambda checked: self.toggle_view(checked),
-                             shortcut=QKeySequence(self.shortcut))
-            action.setShortcutContext(Qt.WidgetWithChildrenShortcut)
+                             shortcut=QKeySequence(self.shortcut),
+                             context=Qt.WidgetShortcut)
         else:
             action = create_action(self, title, toggled=lambda checked:
                                                 self.toggle_view(checked))
diff --git a/spyderlib/plugins/configdialog.py b/spyderlib/plugins/configdialog.py
index a35008a..623309f 100644
--- a/spyderlib/plugins/configdialog.py
+++ b/spyderlib/plugins/configdialog.py
@@ -4,33 +4,39 @@
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
-"""Configuration dialog / Preferences"""
+"""
+Configuration dialog / Preferences.
+"""
 
+# Standard library imports
 import os.path as osp
 
-from spyderlib.qt import API
-from spyderlib.qt.QtGui import (QWidget, QDialog, QListWidget, QListWidgetItem,
-                                QVBoxLayout, QStackedWidget, QListView,
-                                QHBoxLayout, QDialogButtonBox, QCheckBox,
-                                QMessageBox, QLabel, QLineEdit, QSpinBox,
-                                QPushButton, QFontComboBox, QGroupBox,
-                                QComboBox, QColor, QGridLayout, QTabWidget,
-                                QRadioButton, QButtonGroup, QSplitter,
-                                QStyleFactory, QScrollArea, QDoubleSpinBox)
-from spyderlib.qt.QtCore import Qt, QSize, Signal, Slot
-from spyderlib.qt.compat import (to_qvariant, from_qvariant,
-                                 getexistingdirectory, getopenfilename)
-import spyderlib.utils.icon_manager as ima
-
-from spyderlib.config.base import (_, running_in_mac_app, LANGUAGE_CODES,
-                                   save_lang_conf, load_lang_conf)
-from spyderlib.config.main import CONF, is_gtk_desktop
-from spyderlib.config.gui import (CUSTOM_COLOR_SCHEME_NAME,
-                                  set_default_color_scheme)
+# Third party imports
+from qtpy import API
+from qtpy.compat import (getexistingdirectory, getopenfilename, from_qvariant,
+                         to_qvariant)
+from qtpy.QtCore import QSize, Qt, Signal, Slot
+from qtpy.QtGui import QColor
+from qtpy.QtWidgets import (QButtonGroup, QCheckBox, QComboBox, QDialog,
+                            QDialogButtonBox, QDoubleSpinBox, QFontComboBox,
+                            QGridLayout, QGroupBox, QHBoxLayout, QLabel,
+                            QLineEdit, QListView, QListWidget, QListWidgetItem,
+                            QMessageBox, QPushButton, QRadioButton,
+                            QScrollArea, QSpinBox, QSplitter, QStackedWidget,
+                            QStyleFactory, QTabWidget, QVBoxLayout, QWidget)
+
+# Local imports
+from spyderlib.config.base import (_, LANGUAGE_CODES, load_lang_conf,
+                                   running_in_mac_app, save_lang_conf)
+from spyderlib.config.gui import get_font, set_font
+from spyderlib.config.main import CONF
 from spyderlib.config.user import NoDefault
-from spyderlib.utils import syntaxhighlighters as sh
-from spyderlib.widgets.colors import ColorLayout
+from spyderlib.config.utils import is_gtk_desktop
 from spyderlib.py3compat import to_text_string, is_text_string, getcwd
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils import syntaxhighlighters
+from spyderlib.widgets.colors import ColorLayout
+from spyderlib.widgets.sourcecode.codeeditor import CodeEditor
 
 
 class ConfigAccessMixin(object):
@@ -295,8 +301,8 @@ class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
         """Load settings from configuration file"""
         for checkbox, (option, default) in list(self.checkboxes.items()):
             checkbox.setChecked(self.get_option(option, default))
-            # Checkboxes work differently for PySide and PyQt
-            if API == 'pyqt':
+            # QAbstractButton works differently for PySide and PyQt
+            if not API == 'pyside':
                 checkbox.clicked.connect(lambda _foo, opt=option:
                                          self.has_been_modified(opt))
             else:
@@ -318,9 +324,9 @@ class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
             value = self.get_option(option, default)
             for index in range(combobox.count()):
                 data = from_qvariant(combobox.itemData(index), to_text_string)
-                # For PyQt API v2, it is necessary to convert `data` to 
-                # unicode in case the original type was not a string, like an 
-                # integer for example (see spyderlib.qt.compat.from_qvariant):
+                # For PyQt API v2, it is necessary to convert `data` to
+                # unicode in case the original type was not a string, like an
+                # integer for example (see qtpy.compat.from_qvariant):
                 if to_text_string(data) == to_text_string(value):
                     break
             combobox.setCurrentIndex(index)
@@ -346,7 +352,13 @@ class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
             edit = clayout.lineedit
             btn = clayout.colorbtn
             edit.setText(self.get_option(option, default))
-            btn.clicked.connect(lambda opt=option: self.has_been_modified(opt))
+            # QAbstractButton works differently for PySide and PyQt
+            if not API == 'pyside':
+                btn.clicked.connect(lambda _foo, opt=option:
+                                    self.has_been_modified(opt))
+            else:
+                btn.clicked.connect(lambda opt=option:
+                                    self.has_been_modified(opt))
             edit.textChanged.connect(lambda _foo, opt=option:
                                      self.has_been_modified(opt))
         for (clayout, cb_bold, cb_italic
@@ -357,19 +369,21 @@ class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
             edit.setText(color)
             cb_bold.setChecked(bold)
             cb_italic.setChecked(italic)
-            btn.clicked.connect(lambda opt=option: self.has_been_modified(opt))
             edit.textChanged.connect(lambda _foo, opt=option:
                                      self.has_been_modified(opt))
-            if API == 'pyqt':
+            # QAbstractButton works differently for PySide and PyQt
+            if not API == 'pyside':
+                btn.clicked.connect(lambda _foo, opt=option:
+                                    self.has_been_modified(opt))
                 cb_bold.clicked.connect(lambda _foo, opt=option:
                                         self.has_been_modified(opt))
-            else:
-                cb_bold.clicked.connect(lambda opt=option:
-                                        self.has_been_modified(opt))
-            if API == 'pyqt':
                 cb_italic.clicked.connect(lambda _foo, opt=option:
                                           self.has_been_modified(opt))
             else:
+                btn.clicked.connect(lambda opt=option:
+                                    self.has_been_modified(opt))
+                cb_bold.clicked.connect(lambda opt=option:
+                                        self.has_been_modified(opt))
                 cb_italic.clicked.connect(lambda opt=option:
                                           self.has_been_modified(opt))
 
@@ -411,7 +425,7 @@ class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
             checkbox.setToolTip(tip)
         self.checkboxes[checkbox] = (option, default)
         if msg_warning is not None or msg_info is not None:
-            def show_message(is_checked):
+            def show_message(is_checked=False):
                 if is_checked or not msg_if_enabled:
                     if msg_warning is not None:
                         QMessageBox.warning(self, self.get_name(),
@@ -619,7 +633,15 @@ class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
         if tip is not None:
             combobox.setToolTip(tip)
         for name, key in choices:
-            combobox.addItem(name, to_qvariant(key))
+            if not (name is None and key is None):
+                combobox.addItem(name, to_qvariant(key))
+        # Insert separators
+        count = 0
+        for index, item in enumerate(choices):
+            name, key = item
+            if name is None and key is None:
+                combobox.insertSeparator(index + count)
+                count += 1
         self.comboboxes[combobox] = (option, default)
         layout = QHBoxLayout()
         layout.addWidget(label)
@@ -634,33 +656,54 @@ class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
         combobox.label_text = text
         return widget
     
-    def create_fontgroup(self, option=None, text=None,
-                         tip=None, fontfilters=None):
+    def create_fontgroup(self, option=None, text=None, title=None,
+                         tip=None, fontfilters=None, without_group=False):
         """Option=None -> setting plugin font"""
-        fontlabel = QLabel(_("Font: "))
+
+        if title:
+            fontlabel = QLabel(title)
+        else:
+            fontlabel = QLabel(_("Font: "))
         fontbox = QFontComboBox()
+
         if fontfilters is not None:
             fontbox.setFontFilters(fontfilters)
+
         sizelabel = QLabel("  "+_("Size: "))
         sizebox = QSpinBox()
         sizebox.setRange(7, 100)
         self.fontboxes[(fontbox, sizebox)] = option
         layout = QHBoxLayout()
+
         for subwidget in (fontlabel, fontbox, sizelabel, sizebox):
             layout.addWidget(subwidget)
         layout.addStretch(1)
-        if text is None:
-            text = _("Font style")
-        group = QGroupBox(text)
-        group.setLayout(layout)
-        if tip is not None:
-            group.setToolTip(tip)
-        return group
-    
+
+        widget = QWidget(self)
+        widget.fontlabel = fontlabel
+        widget.sizelabel = sizelabel        
+        widget.fontbox = fontbox
+        widget.sizebox = sizebox
+        widget.setLayout(layout)
+
+        if not without_group:
+            if text is None:
+                text = _("Font style")
+
+            group = QGroupBox(text)
+            group.setLayout(layout)
+
+            if tip is not None:
+                group.setToolTip(tip)
+
+            return group
+        else:
+            return widget
+
     def create_button(self, text, callback):
         btn = QPushButton(text)
         btn.clicked.connect(callback)
-        btn.clicked.connect(lambda opt='': self.has_been_modified(opt))
+        btn.clicked.connect(lambda checked=False, opt='': self.has_been_modified(opt))
         return btn
     
     def create_tab(self, *widgets):
@@ -712,12 +755,12 @@ class GeneralConfigPage(SpyderConfigPage):
                           "settings:")
         msg_end = _("Do you wish to restart now?")
 
-        msg_options = ""
+        msg_options = u""
         for option in options:
-            msg_options += "<li>{0}</li>".format(option)
+            msg_options += u"<li>{0}</li>".format(option)
 
         msg_title = _("Information")
-        msg = "{0}<ul>{1}</ul><br>{2}".format(msg_start, msg_options, msg_end)
+        msg = u"{0}<ul>{1}</ul><br>{2}".format(msg_start, msg_options, msg_end)
         answer = QMessageBox.information(self, msg_title, msg,
                                          QMessageBox.Yes | QMessageBox.No)
         if answer == QMessageBox.Yes:
@@ -738,6 +781,38 @@ class MainConfigPage(GeneralConfigPage):
         newcb = self.create_checkbox
 
         # --- Interface
+        general_group = QGroupBox(_("General"))
+        languages = LANGUAGE_CODES.items()
+        language_choices = sorted([(val, key) for key, val in languages])
+        language_combo = self.create_combobox(_('Language'), language_choices,
+                                              'interface_language',
+                                              restart=True)
+        single_instance_box = newcb(_("Use a single instance"),
+                                    'single_instance',
+                                    tip=_("Set this to open external<br> "
+                                          "Python files in an already running "
+                                          "instance (Requires a restart)"))
+        prompt_box = newcb(_("Prompt when exiting"), 'prompt_on_exit')
+        popup_console_box = newcb(_("Pop up internal console when internal "
+                                    "errors appear"),
+                                  'show_internal_console_if_traceback')
+        check_updates = newcb(_("Check for updates on startup"),
+                              'check_updates_on_startup')
+
+        # Decide if it's possible to activate or not single instance mode
+        if running_in_mac_app():
+            self.set_option("single_instance", True)
+            single_instance_box.setEnabled(False)
+
+        general_layout = QVBoxLayout()
+        general_layout.addWidget(language_combo)
+        general_layout.addWidget(single_instance_box)
+        general_layout.addWidget(prompt_box)
+        general_layout.addWidget(popup_console_box)
+        general_layout.addWidget(check_updates)
+        general_group.setLayout(general_layout)
+
+        # --- Theme
         interface_group = QGroupBox(_("Interface"))
         styles = [str(txt) for txt in list(QStyleFactory.keys())]
         # Don't offer users the possibility to change to a different
@@ -755,17 +830,7 @@ class MainConfigPage(GeneralConfigPage):
         icons_combo = self.create_combobox(_('Icon theme'), icon_choices,
                                            'icon_theme', restart=True)
 
-        languages = LANGUAGE_CODES.items()
-        language_choices = sorted([(val, key) for key, val in languages])
-        language_combo = self.create_combobox(_('Language'), language_choices,
-                                              'interface_language',
-                                              restart=True)
 
-        single_instance_box = newcb(_("Use a single instance"),
-                                    'single_instance',
-                                    tip=_("Set this to open external<br> "
-                                          "Python files in an already running "
-                                          "instance (Requires a restart)"))
         vertdock_box = newcb(_("Vertical title bars in panes"),
                              'vertical_dockwidget_titlebars')
         verttabs_box = newcb(_("Vertical tabs in panes"),
@@ -784,12 +849,6 @@ class MainConfigPage(GeneralConfigPage):
         margins_layout = QHBoxLayout()
         margins_layout.addWidget(margin_box)
         margins_layout.addWidget(margin_spin)
-        prompt_box = newcb(_("Prompt when exiting"), 'prompt_on_exit')
-
-        # Decide if it's possible to activate or not single instance mode
-        if running_in_mac_app():
-            self.set_option("single_instance", True)
-            single_instance_box.setEnabled(False)
 
         # Layout interface
         comboboxes_layout = QHBoxLayout()
@@ -798,20 +857,16 @@ class MainConfigPage(GeneralConfigPage):
         cbs_layout.addWidget(style_combo.combobox, 0, 1)
         cbs_layout.addWidget(icons_combo.label, 1, 0)
         cbs_layout.addWidget(icons_combo.combobox, 1, 1)
-        cbs_layout.addWidget(language_combo.label, 2, 0)
-        cbs_layout.addWidget(language_combo.combobox, 2, 1)
         comboboxes_layout.addLayout(cbs_layout)
         comboboxes_layout.addStretch(1)
         
         interface_layout = QVBoxLayout()
         interface_layout.addLayout(comboboxes_layout)
-        interface_layout.addWidget(single_instance_box)
         interface_layout.addWidget(vertdock_box)
         interface_layout.addWidget(verttabs_box)
         interface_layout.addWidget(animated_box)
         interface_layout.addWidget(tear_off_box)
         interface_layout.addLayout(margins_layout)
-        interface_layout.addWidget(prompt_box)
         interface_group.setLayout(interface_layout)
 
         # --- Status bar
@@ -859,32 +914,52 @@ class MainConfigPage(GeneralConfigPage):
         sbar_layout.addLayout(cpu_memory_layout)
         sbar_group.setLayout(sbar_layout)
 
-        # --- Debugging
-        debug_group = QGroupBox(_("Debugging"))
-        popup_console_box = newcb(_("Pop up internal console when internal "
-                                    "errors appear"),
-                                  'show_internal_console_if_traceback')
-        
-        debug_layout = QVBoxLayout()
-        debug_layout.addWidget(popup_console_box)
-        debug_group.setLayout(debug_layout)
+        # --- Theme and fonts
+        plain_text_font = self.create_fontgroup(
+            option='font',
+            title=_("Plain text font"),
+            fontfilters=QFontComboBox.MonospacedFonts,
+            without_group=True)
+
+        rich_text_font = self.create_fontgroup(
+            option='rich_font',
+            title=_("Rich text font"),
+            without_group=True)
+
+        fonts_group = QGroupBox(_("Fonts"))
+        fonts_layout = QGridLayout()
+        fonts_layout.addWidget(plain_text_font.fontlabel, 0, 0)
+        fonts_layout.addWidget(plain_text_font.fontbox, 0, 1)
+        fonts_layout.addWidget(plain_text_font.sizelabel, 0, 2)
+        fonts_layout.addWidget(plain_text_font.sizebox, 0, 3)
+        fonts_layout.addWidget(rich_text_font.fontlabel, 1, 0)
+        fonts_layout.addWidget(rich_text_font.fontbox, 1, 1)
+        fonts_layout.addWidget(rich_text_font.sizelabel, 1, 2)
+        fonts_layout.addWidget(rich_text_font.sizebox, 1, 3)
+        fonts_group.setLayout(fonts_layout)
+
+        tabs = QTabWidget()
+        tabs.addTab(self.create_tab(fonts_group, interface_group),
+                    _("Appearance"))
+        tabs.addTab(self.create_tab(general_group, sbar_group),
+                    _("Advanced Settings"))
 
-        # --- Spyder updates
-        update_group = QGroupBox(_("Updates"))
-        check_updates = newcb(_("Check for updates on startup"),
-                              'check_updates_on_startup')
-        update_layout = QVBoxLayout()
-        update_layout.addWidget(check_updates)
-        update_group.setLayout(update_layout)
-        
         vlayout = QVBoxLayout()
-        vlayout.addWidget(interface_group)
-        vlayout.addWidget(sbar_group)
-        vlayout.addWidget(debug_group)
-        vlayout.addWidget(update_group)
-        vlayout.addStretch(1)
+        vlayout.addWidget(tabs)
         self.setLayout(vlayout)
 
+    def get_font(self, option):
+        """Return global font used in Spyder."""
+        return get_font(option=option)
+
+    def set_font(self, font, option):
+        """Set global font used in Spyder."""
+        # Update fonts in all plugins
+        set_font(font, option=option)
+        plugins = self.main.widgetlist + self.main.thirdparty_plugins
+        for plugin in plugins:
+            plugin.update_font()
+
     def apply_settings(self, options):
         self.main.apply_settings()
 
@@ -903,77 +978,462 @@ class MainConfigPage(GeneralConfigPage):
 
 class ColorSchemeConfigPage(GeneralConfigPage):
     CONF_SECTION = "color_schemes"
-    
+
     NAME = _("Syntax coloring")
     ICON = ima.icon('eyedropper')
-    
+
     def setup_page(self):
-        tabs = QTabWidget()
         names = self.get_option("names")
-        names.pop(names.index(CUSTOM_COLOR_SCHEME_NAME))
-        names.insert(0, CUSTOM_COLOR_SCHEME_NAME)
-        fieldnames = {
-                      "background":     _("Background:"),
-                      "currentline":    _("Current line:"),
-                      "currentcell":    _("Current cell:"),
-                      "occurence":      _("Occurence:"),
-                      "ctrlclick":      _("Link:"),
-                      "sideareas":      _("Side areas:"),
-                      "matched_p":      _("Matched parentheses:"),
-                      "unmatched_p":    _("Unmatched parentheses:"),
-                      "normal":         _("Normal text:"),
-                      "keyword":        _("Keyword:"),
-                      "builtin":        _("Builtin:"),
-                      "definition":     _("Definition:"),
-                      "comment":        _("Comment:"),
-                      "string":         _("String:"),
-                      "number":         _("Number:"),
-                      "instance":       _("Instance:"),
-                      }
-        from spyderlib.utils import syntaxhighlighters
-        assert all([key in fieldnames
-                    for key in syntaxhighlighters.COLOR_SCHEME_KEYS])
-        for tabname in names:
-            cs_group = QGroupBox(_("Color scheme"))
-            cs_layout = QGridLayout()
-            for row, key in enumerate(syntaxhighlighters.COLOR_SCHEME_KEYS):
-                option = "%s/%s" % (tabname, key)
-                value = self.get_option(option)
-                name = fieldnames[key]
-                if is_text_string(value):
-                    label, clayout = self.create_coloredit(name, option,
-                                                           without_layout=True)
-                    label.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
-                    cs_layout.addWidget(label, row+1, 0)
-                    cs_layout.addLayout(clayout, row+1, 1)
-                else:
-                    label, clayout, cb_bold, cb_italic = self.create_scedit(
-                                            name, option, without_layout=True)
-                    label.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
-                    cs_layout.addWidget(label, row+1, 0)
-                    cs_layout.addLayout(clayout, row+1, 1)
-                    cs_layout.addWidget(cb_bold, row+1, 2)
-                    cs_layout.addWidget(cb_italic, row+1, 3)
-            cs_group.setLayout(cs_layout)
-            if tabname in sh.COLOR_SCHEME_NAMES:
-                def_btn = self.create_button(_("Reset to default values"),
-                                         lambda: self.reset_to_default(tabname))
-                tabs.addTab(self.create_tab(cs_group, def_btn), tabname)
-            else:
-                tabs.addTab(self.create_tab(cs_group), tabname)
-        
+        try:
+            names.pop(names.index(u'Custom'))
+        except ValueError:
+            pass
+        custom_names = self.get_option("custom_names", [])
+
+        # Widgets
+        about_label = QLabel(_("Here you can select the color scheme used in "
+                               "the Editor and all other Spyder plugins.<br><br>"
+                               "You can also edit the color schemes provided "
+                               "by Spyder or create your own ones by using "
+                               "the options provided below.<br>"))
+        edit_button = QPushButton(_("Edit selected"))
+        create_button = QPushButton(_("Create new scheme"))
+        self.delete_button = QPushButton(_("Delete"))
+        self.preview_editor = CodeEditor(self)
+        self.stacked_widget = QStackedWidget(self)
+        self.reset_button = QPushButton(_("Reset"))
+        self.scheme_editor_dialog = SchemeEditor(parent=self,
+                                                 stack=self.stacked_widget)
+
+        # Widget setup
+        self.scheme_choices_dict = {}
+        about_label.setWordWrap(True)
+        schemes_combobox_widget = self.create_combobox(_('Scheme:'),
+                                                       [('', '')],
+                                                       'selected')
+        self.schemes_combobox = schemes_combobox_widget.combobox
+
+        # Layouts
         vlayout = QVBoxLayout()
-        vlayout.addWidget(tabs)
+
+        manage_layout = QVBoxLayout()
+        manage_layout.addWidget(about_label)
+
+        combo_layout = QHBoxLayout()
+        combo_layout.addWidget(schemes_combobox_widget.label)
+        combo_layout.addWidget(schemes_combobox_widget.combobox)
+
+        buttons_layout = QVBoxLayout()
+        buttons_layout.addLayout(combo_layout)
+        buttons_layout.addWidget(edit_button)
+        buttons_layout.addWidget(self.reset_button)
+        buttons_layout.addWidget(self.delete_button)
+        buttons_layout.addStretch(1)
+        buttons_layout.addWidget(create_button)
+
+        preview_layout = QVBoxLayout()
+        preview_layout.addWidget(self.preview_editor)
+
+        buttons_preview_layout = QHBoxLayout()
+        buttons_preview_layout.addLayout(buttons_layout)
+        buttons_preview_layout.addLayout(preview_layout)
+
+        manage_layout.addLayout(buttons_preview_layout)
+        manage_group = QGroupBox(_("Manage color schemes"))
+        manage_group.setLayout(manage_layout)
+
+        vlayout.addWidget(manage_group)
         self.setLayout(vlayout)
-        
-    @Slot(str)
-    def reset_to_default(self, name):
-        set_default_color_scheme(name, replace=True)
-        self.load_from_conf()
-            
+
+        # Signals and slots
+        create_button.clicked.connect(self.create_new_scheme)
+        edit_button.clicked.connect(self.edit_scheme)
+        self.reset_button.clicked.connect(self.reset_to_default)
+        self.delete_button.clicked.connect(self.delete_scheme)
+        self.schemes_combobox.currentIndexChanged.connect(self.update_preview)
+        self.schemes_combobox.currentIndexChanged.connect(self.update_buttons)
+
+        # Setup
+        for name in names:
+            self.scheme_editor_dialog.add_color_scheme_stack(name)
+
+        for name in custom_names:
+            self.scheme_editor_dialog.add_color_scheme_stack(name, custom=True)
+
+        self.update_combobox()
+        self.update_preview()
+
     def apply_settings(self, options):
+        self.set_option('selected', self.current_scheme)
         self.main.editor.apply_plugin_settings(['color_scheme_name'])
         if self.main.historylog is not None:
             self.main.historylog.apply_plugin_settings(['color_scheme_name'])
-        if self.main.inspector is not None:
-            self.main.inspector.apply_plugin_settings(['color_scheme_name'])
+        if self.main.help is not None:
+            self.main.help.apply_plugin_settings(['color_scheme_name'])
+        self.update_combobox()
+        self.update_preview()
+
+    # Helpers
+    # -------------------------------------------------------------------------
+    @property
+    def current_scheme_name(self):
+        return self.schemes_combobox.currentText()
+
+    @property
+    def current_scheme(self):
+        return self.scheme_choices_dict[self.current_scheme_name]
+
+    @property
+    def current_scheme_index(self):
+        return self.schemes_combobox.currentIndex()
+
+    def update_combobox(self):
+        """Recreates the combobox contents."""
+        index = self.current_scheme_index
+        self.schemes_combobox.blockSignals(True)
+        names = self.get_option("names")
+        try:
+            names.pop(names.index(u'Custom'))
+        except ValueError:
+            pass
+        custom_names = self.get_option("custom_names", [])
+
+        # Useful for retrieving the actual data
+        for n in names + custom_names:
+            self.scheme_choices_dict[self.get_option('{0}/name'.format(n))] = n
+
+        if custom_names:
+            choices = names + [None] + custom_names
+        else:
+            choices = names
+
+        combobox = self.schemes_combobox
+        combobox.clear()
+
+        for name in choices:
+            if name is None:
+                continue
+            combobox.addItem(self.get_option('{0}/name'.format(name)), name)
+
+        if custom_names:
+            combobox.insertSeparator(len(names))
+
+        self.schemes_combobox.blockSignals(False)
+        self.schemes_combobox.setCurrentIndex(index)
+
+    def update_buttons(self):
+        """Updates the enable status of delete and reset buttons."""
+        current_scheme = self.current_scheme
+        names = self.get_option("names")
+        try:
+            names.pop(names.index(u'Custom'))
+        except ValueError:
+            pass
+        delete_enabled = current_scheme not in names
+        self.delete_button.setEnabled(delete_enabled)
+        self.reset_button.setEnabled(not delete_enabled)
+
+    def update_preview(self, index=None, scheme_name=None):
+        """
+        Update the color scheme of the preview editor and adds text.
+
+        Note
+        ----
+        'index' is needed, because this is triggered by a signal that sends
+        the selected index.
+        """
+        text = ('"""A string"""\n\n'
+                '# A comment\n\n'
+                '# %% A cell\n\n'
+                'class Foo(object):\n'
+                '    def __init__(self):\n'
+                '        bar = 42\n'
+                '        print(bar)\n'
+                )
+        show_blanks = CONF.get('editor', 'blank_spaces')
+        if scheme_name is None:
+            scheme_name = self.current_scheme
+        self.preview_editor.setup_editor(linenumbers=True,
+                                         markers=True,
+                                         tab_mode=False,
+                                         font=get_font(),
+                                         show_blanks=show_blanks,
+                                         color_scheme=scheme_name)
+        self.preview_editor.set_text(text)
+        self.preview_editor.set_language('Python')
+
+    # Actions
+    # -------------------------------------------------------------------------
+    def create_new_scheme(self):
+        """Creates a new color scheme with a custom name."""
+        names = self.get_option('names')
+        custom_names = self.get_option('custom_names', [])
+
+        # Get the available number this new color scheme
+        counter = len(custom_names) - 1
+        custom_index = [int(n.split('-')[-1]) for n in custom_names]
+        for i in range(len(custom_names)):
+            if custom_index[i] != i:
+                counter = i - 1
+                break
+        custom_name = "custom-{0}".format(counter+1)
+
+        # Add the config settings, based on the current one.
+        custom_names.append(custom_name)
+        self.set_option('custom_names', custom_names)
+        for key in syntaxhighlighters.COLOR_SCHEME_KEYS:
+            name = "{0}/{1}".format(custom_name, key)
+            default_name = "{0}/{1}".format(self.current_scheme, key)
+            option = self.get_option(default_name)
+            self.set_option(name, option)
+        self.set_option('{0}/name'.format(custom_name), custom_name)
+
+        # Now they need to be loaded! how to make a partial load_from_conf?
+        dlg = self.scheme_editor_dialog
+        dlg.add_color_scheme_stack(custom_name, custom=True)
+        dlg.set_scheme(custom_name)
+        self.load_from_conf()
+
+        if dlg.exec_():
+            # This is needed to have the custom name updated on the combobox
+            name = dlg.get_scheme_name()
+            self.set_option('{0}/name'.format(custom_name), name)
+
+            # The +1 is needed because of the separator in the combobox
+            index = (names + custom_names).index(custom_name) + 1
+            self.update_combobox()
+            self.schemes_combobox.setCurrentIndex(index)
+        else:
+            # Delete the config ....
+            custom_names.remove(custom_name)
+            self.set_option('custom_names', custom_names)
+            dlg.delete_color_scheme_stack(custom_name)
+
+    def edit_scheme(self):
+        """Edit current scheme."""
+        dlg = self.scheme_editor_dialog
+        dlg.set_scheme(self.current_scheme)
+
+        if dlg.exec_():
+            # Update temp scheme to reflect instant edits on the preview
+            temporal_color_scheme = dlg.get_edited_color_scheme()
+            for key in temporal_color_scheme:
+                option = "temp/{0}".format(key)
+                value = temporal_color_scheme[key]
+                self.set_option(option, value)
+            self.update_preview(scheme_name='temp')
+
+    def delete_scheme(self):
+        """Deletes the currently selected custom color scheme."""
+        scheme_name = self.current_scheme
+
+        answer = QMessageBox.warning(self, _("Warning"),
+                                           _("Are you sure you want to delete "
+                                             "this scheme?"),
+                                           QMessageBox.Yes | QMessageBox.No)
+        if answer == QMessageBox.Yes:
+            # Put the combobox in Spyder by default, when deleting a scheme
+            names = self.get_option('names')
+            self.set_scheme('spyder')
+            self.schemes_combobox.setCurrentIndex(names.index('spyder'))
+            self.set_option('selected', 'spyder')
+    
+            # Delete from custom_names
+            custom_names = self.get_option('custom_names', [])
+            if scheme_name in custom_names:
+                custom_names.remove(scheme_name)
+            self.set_option('custom_names', custom_names)
+    
+            # Delete config options
+            for key in syntaxhighlighters.COLOR_SCHEME_KEYS:
+                option = "{0}/{1}".format(scheme_name, key)
+                CONF.remove_option(self.CONF_SECTION, option)
+            CONF.remove_option(self.CONF_SECTION, "{0}/name".format(scheme_name))
+    
+            self.update_combobox()
+            self.update_preview()
+
+    def set_scheme(self, scheme_name):
+        """
+        Set the current stack in the dialog to the scheme with 'scheme_name'.
+        """
+        dlg = self.scheme_editor_dialog
+        dlg.set_scheme(scheme_name)
+
+    @Slot()
+    def reset_to_default(self):
+        """Restore initial values for default color schemes."""
+        # Checks that this is indeed a default scheme
+        scheme = self.current_scheme
+        names = self.get_option('names')
+        if scheme in names:
+            for key in syntaxhighlighters.COLOR_SCHEME_KEYS:
+                option = "{0}/{1}".format(scheme, key)
+                value = CONF.get_default(self.CONF_SECTION, option)
+                self.set_option(option, value)
+
+            self.load_from_conf()
+
+
+class SchemeEditor(QDialog):
+    """A color scheme editor dialog."""
+    def __init__(self, parent=None, stack=None):
+        super(SchemeEditor, self).__init__(parent)
+        self.parent = parent
+        self.stack = stack
+        self.order = []    # Uses scheme names
+
+        # Needed for self.get_edited_color_scheme()
+        self.widgets = {}
+        self.scheme_name_textbox = {}
+        self.last_edited_color_scheme = None
+        self.last_used_scheme = None
+
+        # Widgets
+        bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+
+        # Layout
+        layout = QVBoxLayout()
+        layout.addWidget(self.stack)
+        layout.addWidget(bbox)
+        self.setLayout(layout)
+
+        # Signals
+        bbox.accepted.connect(self.accept)
+        bbox.accepted.connect(self.get_edited_color_scheme)
+        bbox.rejected.connect(self.reject)
+
+    # Helpers
+    # -------------------------------------------------------------------------
+    def set_scheme(self, scheme_name):
+        """Set the current stack by 'scheme_name'."""
+        self.stack.setCurrentIndex(self.order.index(scheme_name))
+        self.last_used_scheme = scheme_name
+
+    def get_scheme_name(self):
+        """
+        Returns the edited scheme name, needed to update the combobox on
+        scheme creation.
+        """
+        return self.scheme_name_textbox[self.last_used_scheme].text()
+
+    def get_edited_color_scheme(self):
+        """
+        Get the values of the last edited color scheme to be used in an instant
+        preview in the preview editor, without using `apply`.
+        """
+        color_scheme = {}
+        scheme_name = self.last_used_scheme
+
+        for key in self.widgets[scheme_name]:
+            items = self.widgets[scheme_name][key]
+
+            if len(items) == 1:
+                # ColorLayout
+                value = items[0].text()
+            else:
+                # ColorLayout + checkboxes
+                value = (items[0].text(), items[1].isChecked(),
+                         items[2].isChecked())
+
+            color_scheme[key] = value
+
+        return color_scheme
+
+    # Actions
+    # -------------------------------------------------------------------------
+    def add_color_scheme_stack(self, scheme_name, custom=False):
+        """Add a stack for a given scheme and connects the CONF values."""
+        color_scheme_groups = [
+            (_('Text'), ["normal", "comment", "string", "number", "keyword",
+                         "builtin", "definition", "instance", ]),
+            (_('Highlight'), ["currentcell", "currentline", "occurrence",
+                              "matched_p", "unmatched_p", "ctrlclick"]),
+            (_('Background'), ["background", "sideareas"])
+            ]
+
+        parent = self.parent
+        line_edit = parent.create_lineedit(_("Scheme name:"),
+                                           '{0}/name'.format(scheme_name))
+
+        self.widgets[scheme_name] = {}
+
+        # Widget setup
+        line_edit.label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+        self.setWindowTitle(_('Color scheme editor'))
+
+        # Layout
+        name_layout = QHBoxLayout()
+        name_layout.addWidget(line_edit.label)
+        name_layout.addWidget(line_edit.textbox)
+        self.scheme_name_textbox[scheme_name] = line_edit.textbox
+
+        if not custom:
+            line_edit.textbox.setDisabled(True)
+
+        cs_layout = QVBoxLayout()
+        cs_layout.addLayout(name_layout)
+
+        h_layout = QHBoxLayout()
+        v_layout = QVBoxLayout()
+
+        for index, item in enumerate(color_scheme_groups):
+            group_name, keys = item
+            group_layout = QGridLayout()
+
+            for row, key in enumerate(keys):
+                option = "{0}/{1}".format(scheme_name, key)
+                value = self.parent.get_option(option)
+                name = syntaxhighlighters.COLOR_SCHEME_KEYS[key]
+
+                if is_text_string(value):
+                    label, clayout = parent.create_coloredit(
+                        name,
+                        option,
+                        without_layout=True,
+                        )
+                    label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+                    group_layout.addWidget(label, row+1, 0)
+                    group_layout.addLayout(clayout, row+1, 1)
+
+                    # Needed to update temp scheme to obtain instant preview
+                    self.widgets[scheme_name][key] = [clayout]
+                else:
+                    label, clayout, cb_bold, cb_italic = parent.create_scedit(
+                        name,
+                        option,
+                        without_layout=True,
+                        )
+                    label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+                    group_layout.addWidget(label, row+1, 0)
+                    group_layout.addLayout(clayout, row+1, 1)
+                    group_layout.addWidget(cb_bold, row+1, 2)
+                    group_layout.addWidget(cb_italic, row+1, 3)
+
+                    # Needed to update temp scheme to obtain instant preview
+                    self.widgets[scheme_name][key] = [clayout, cb_bold,
+                                                      cb_italic]
+
+            group_box = QGroupBox(group_name)
+            group_box.setLayout(group_layout)
+
+            if index == 0:
+                h_layout.addWidget(group_box)
+            else:
+                v_layout.addWidget(group_box)
+
+        h_layout.addLayout(v_layout)
+        cs_layout.addLayout(h_layout)
+
+        stackitem = QWidget()
+        stackitem.setLayout(cs_layout)
+        self.stack.addWidget(stackitem)
+        self.order.append(scheme_name)
+
+    def delete_color_scheme_stack(self, scheme_name):
+        """Remove stack widget by 'scheme_name'."""
+        self.set_scheme(scheme_name)
+        widget = self.stack.currentWidget()
+        self.stack.removeWidget(widget)
+        index = self.order.index(scheme_name)
+        self.order.pop(index)
diff --git a/spyderlib/plugins/console.py b/spyderlib/plugins/console.py
index cf5ed9e..d7475f6 100644
--- a/spyderlib/plugins/console.py
+++ b/spyderlib/plugins/console.py
@@ -11,30 +11,30 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QVBoxLayout, QFontDialog, QInputDialog,
-                                QLineEdit, QMenu)
-from spyderlib.qt.QtCore import Signal, Slot
-from spyderlib.qt.compat import getopenfilename
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import os
-import sys
 import os.path as osp
+import sys
 
+# Third party imports
+from qtpy import PYQT5
+from qtpy.compat import getopenfilename
+from qtpy.QtCore import Signal, Slot
+from qtpy.QtWidgets import QInputDialog, QLineEdit, QMenu, QVBoxLayout
 
 # Local imports
 from spyderlib.config.base import _, debug_print
 from spyderlib.config.main import CONF
-from spyderlib.utils.misc import get_error_match, remove_backslashes
-from spyderlib.utils.qthelpers import (create_action, add_actions,
-                                       mimedata2url, DialogManager)
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.environ import EnvDialog
+from spyderlib.utils.misc import get_error_match, remove_backslashes
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       DialogManager, mimedata2url)
 from spyderlib.widgets.internalshell import InternalShell
 from spyderlib.widgets.findreplace import FindReplace
 from spyderlib.widgets.variableexplorer.collectionseditor import CollectionsEditor
 from spyderlib.plugins import SpyderPluginWidget
-from spyderlib.py3compat import to_text_string, getcwd
+from spyderlib.py3compat import getcwd, to_text_string
 
 
 class Console(SpyderPluginWidget):
@@ -78,7 +78,7 @@ class Console(SpyderPluginWidget):
         self.find_widget = FindReplace(self)
         self.find_widget.set_editor(self.shell)
         self.find_widget.hide()
-        self.register_widget_shortcuts("Editor", self.find_widget)
+        self.register_widget_shortcuts(self.find_widget)
 
         # Main layout
         layout = QVBoxLayout()
@@ -98,10 +98,10 @@ class Console(SpyderPluginWidget):
         Not used anymore since v2.0"""
         historylog.add_history(self.shell.history_filename)
         self.shell.append_to_history.connect(historylog.append_to_history)
-        
-    def set_inspector(self, inspector):
-        """Bind inspector instance to this console"""
-        self.shell.inspector = inspector
+
+    def set_help(self, help_plugin):
+        """Bind help instance to this console"""
+        self.shell.help = help_plugin
 
     #------ SpyderPluginWidget API ---------------------------------------------
     def get_plugin_title(self):
@@ -114,7 +114,12 @@ class Console(SpyderPluginWidget):
         this plugin's dockwidget is raised on top-level
         """
         return self.shell
-        
+
+    def update_font(self):
+        """Update font from Preferences"""
+        font = self.get_plugin_font()
+        self.shell.set_font(font)
+
     def closing_plugin(self, cancelable=False):
         """Perform actions before parent main window is closed"""
         self.dialog_manager.close_all()
@@ -150,10 +155,6 @@ class Console(SpyderPluginWidget):
                             _("Buffer..."), None,
                             tip=_("Set maximum line count"),
                             triggered=self.change_max_line_count)
-        font_action = create_action(self,
-                            _("&Font..."), None,
-                            ima.icon('font'), _("Set shell font style"),
-                            triggered=self.change_font)
         exteditor_action = create_action(self,
                             _("External editor path..."), None, None,
                             _("Set external editor executable path"),
@@ -177,7 +178,7 @@ class Console(SpyderPluginWidget):
         
         option_menu = QMenu(_('Internal console settings'), self)
         option_menu.setIcon(ima.icon('tooloptions'))
-        add_actions(option_menu, (buffer_action, font_action, wrap_action,
+        add_actions(option_menu, (buffer_action, wrap_action,
                                   calltips_action, codecompletion_action,
                                   codecompenter_action, exteditor_action))
                     
@@ -270,16 +271,7 @@ class Console(SpyderPluginWidget):
         """Execute lines and give focus to shell"""
         self.shell.execute_lines(to_text_string(lines))
         self.shell.setFocus()
-    
-    @Slot()
-    def change_font(self):
-        """Change console font"""
-        font, valid = QFontDialog.getFont(self.get_plugin_font(),
-                       self, _("Select a new font"))
-        if valid:
-            self.shell.set_font(font)
-            self.set_plugin_font(font)
-    
+
     @Slot()
     def change_max_line_count(self):
         "Change maximum line count"""
diff --git a/spyderlib/plugins/editor.py b/spyderlib/plugins/editor.py
index 8b5f802..e6d7d51 100644
--- a/spyderlib/plugins/editor.py
+++ b/spyderlib/plugins/editor.py
@@ -11,43 +11,47 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QVBoxLayout, QPrintDialog, QSplitter, QToolBar,
-                                QAction, QApplication, QDialog, QWidget,
-                                QPrinter, QActionGroup, QInputDialog, QMenu,
-                                QAbstractPrintDialog, QGroupBox, QTabWidget,
-                                QLabel, QFontComboBox, QHBoxLayout,
-                                QKeySequence, QGridLayout)
-from spyderlib.qt.QtCore import Signal, QByteArray, Qt, Slot
-from spyderlib.qt.compat import to_qvariant, from_qvariant, getopenfilenames
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import os
+import os.path as osp
 import re
 import sys
 import time
-import os.path as osp
+
+# Third party imports
+from qtpy import API, PYQT5
+from qtpy.compat import from_qvariant, getopenfilenames, to_qvariant
+from qtpy.QtCore import QByteArray, Qt, Signal, Slot
+from qtpy.QtGui import QKeySequence
+from qtpy.QtPrintSupport import QAbstractPrintDialog, QPrintDialog, QPrinter
+from qtpy.QtWidgets import (QAction, QActionGroup, QApplication, QDialog,
+                            QFileDialog, QGridLayout, QGroupBox, QHBoxLayout,
+                            QInputDialog, QLabel, QMenu, QSplitter, QTabWidget,
+                            QToolBar, QVBoxLayout, QWidget)
 
 # Local imports
-from spyderlib.utils import encoding, sourcecode, codeanalysis
-from spyderlib.config.base import get_conf_path, _
-from spyderlib.config.main import CONF, EDIT_FILTERS, get_filter, EDIT_FILETYPES
-from spyderlib.config.gui import get_color_scheme
-from spyderlib.utils import programs
-from spyderlib.utils.qthelpers import (create_action, add_actions,
-                                       get_filetype_icon, add_shortcut_to_tooltip)
+from spyderlib.config.base import _, get_conf_path
+from spyderlib.config.gui import (RUN_CELL_SHORTCUT,
+                                  RUN_CELL_AND_ADVANCE_SHORTCUT)
+from spyderlib.config.main import CONF
+from spyderlib.config.utils import (get_edit_filetypes, get_edit_filters,
+                                    get_filter)
+from spyderlib.py3compat import getcwd, PY2, qbytearray_to_str, to_text_string
+from spyderlib.utils import codeanalysis, encoding, programs, sourcecode
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.introspection.manager import IntrospectionManager
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       get_filetype_icon)
 from spyderlib.widgets.findreplace import FindReplace
-from spyderlib.widgets.status import (ReadWriteStatus, EOLStatus,
-                                      EncodingStatus, CursorPositionStatus)
-from spyderlib.widgets.editor import (EditorSplitter, EditorStack, Printer,
-                                      EditorMainWindow)
+from spyderlib.widgets.editor import (EditorMainWindow, EditorSplitter,
+                                      EditorStack, Printer)
 from spyderlib.widgets.sourcecode.codeeditor import CodeEditor
-from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
-from spyderlib.plugins.runconfig import (RunConfigDialog, RunConfigOneDialog,
+from spyderlib.widgets.status import (CursorPositionStatus, EncodingStatus,
+                                      EOLStatus, ReadWriteStatus)
+from spyderlib.plugins import PluginConfigPage, SpyderPluginWidget
+from spyderlib.plugins.runconfig import (ALWAYS_OPEN_FIRST_RUN_OPTION,
                                          get_run_configuration,
-                                         ALWAYS_OPEN_FIRST_RUN_OPTION)
-from spyderlib.py3compat import PY2, to_text_string, getcwd, qbytearray_to_str
-
+                                         RunConfigDialog, RunConfigOneDialog)
 
 
 def _load_all_breakpoints():
@@ -102,9 +106,6 @@ class EditorConfigPage(PluginConfigPage):
                                     self.plugin.edit_template)
         
         interface_group = QGroupBox(_("Interface"))
-        font_group = self.create_fontgroup(option=None,
-                                    text=_("Text and margin font style"),
-                                    fontfilters=QFontComboBox.MonospacedFonts)
         newcb = self.create_checkbox
         fpsorting_box = newcb(_("Sort files according to full path"),
                               'fullpath_sorting')
@@ -128,20 +129,16 @@ class EditorConfigPage(PluginConfigPage):
                                 'highlight_current_line')
         currentcell_box = newcb(_("Highlight current cell"),
                                 'highlight_current_cell')
-        occurence_box = newcb(_("Highlight occurences after"),
-                              'occurence_highlighting')
-        occurence_spin = self.create_spinbox("", " ms",
-                                             'occurence_highlighting/timeout',
+        occurrence_box = newcb(_("Highlight occurrences after"),
+                              'occurrence_highlighting')
+        occurrence_spin = self.create_spinbox("", " ms",
+                                             'occurrence_highlighting/timeout',
                                              min_=100, max_=1000000, step=100)
-        occurence_box.toggled.connect(occurence_spin.setEnabled)
-        occurence_spin.setEnabled(self.get_option('occurence_highlighting'))
+        occurrence_box.toggled.connect(occurrence_spin.setEnabled)
+        occurrence_spin.setEnabled(self.get_option('occurrence_highlighting'))
 
         wrap_mode_box = newcb(_("Wrap lines"), 'wrap')
-        names = CONF.get('color_schemes', 'names')
-        choices = list(zip(names, names))
-        cs_combo = self.create_combobox(_("Syntax color scheme: "),
-                                        choices, 'color_scheme_name')
-        
+
         display_layout = QGridLayout()
         display_layout.addWidget(linenumbers_box, 0, 0)
         display_layout.addWidget(blanks_box, 1, 0)
@@ -150,12 +147,10 @@ class EditorConfigPage(PluginConfigPage):
         display_layout.addWidget(edgeline_spin.slabel, 2, 2)
         display_layout.addWidget(currentline_box, 3, 0)
         display_layout.addWidget(currentcell_box, 4, 0)
-        display_layout.addWidget(occurence_box, 5, 0)
-        display_layout.addWidget(occurence_spin.spinbox, 5, 1)
-        display_layout.addWidget(occurence_spin.slabel, 5, 2)
+        display_layout.addWidget(occurrence_box, 5, 0)
+        display_layout.addWidget(occurrence_spin.spinbox, 5, 1)
+        display_layout.addWidget(occurrence_spin.slabel, 5, 2)
         display_layout.addWidget(wrap_mode_box, 6, 0)
-        display_layout.addWidget(cs_combo.label, 7, 0)
-        display_layout.addWidget(cs_combo.combobox, 7, 1)
         display_h_layout = QHBoxLayout()
         display_h_layout.addLayout(display_layout)
         display_h_layout.addStretch(1)
@@ -204,9 +199,14 @@ class EditorConfigPage(PluginConfigPage):
         autounindent_box = newcb(_("Automatic indentation after 'else', "
                                    "'elif', etc."), 'auto_unindent')
         indent_chars_box = self.create_combobox(_("Indentation characters: "),
-                                        ((_("4 spaces"), '*    *'),
-                                         (_("2 spaces"), '*  *'),
-                                         (_("tab"), '*\t*')), 'indent_chars')
+                                        ((_("2 spaces"), '*  *'),
+                                         (_("3 spaces"), '*   *'),
+                                         (_("4 spaces"), '*    *'),
+                                         (_("5 spaces"), '*     *'),
+                                         (_("6 spaces"), '*      *'),
+                                         (_("7 spaces"), '*       *'),
+                                         (_("8 spaces"), '*        *'),
+                                         (_("Tabulations"), '*\t*')), 'indent_chars')
         tabwidth_spin = self.create_spinbox(_("Tab stop width:"), _("pixels"),
                                             'tab_stop_width', 40, 10, 1000, 10)
         tab_mode_box = newcb(_("Tab always indent"),
@@ -332,7 +332,7 @@ class EditorConfigPage(PluginConfigPage):
         eol_group.setLayout(eol_layout)
         
         tabs = QTabWidget()
-        tabs.addTab(self.create_tab(font_group, interface_group, display_group),
+        tabs.addTab(self.create_tab(interface_group, display_group),
                     _("Display"))
         tabs.addTab(self.create_tab(introspection_group, analysis_group),
                     _("Code Introspection/Analysis"))
@@ -368,25 +368,29 @@ class Editor(SpyderPluginWidget):
             SpyderPluginWidget.__init__(self, parent, main=parent)
         else:
             SpyderPluginWidget.__init__(self, parent)
-        
+
         self.__set_eol_chars = True
-        
-        self.set_default_color_scheme()
-        
+
         # Creating template if it doesn't already exist
         if not osp.isfile(self.TEMPLATE_PATH):
-            header = ['# -*- coding: utf-8 -*-', '"""', 'Created on %(date)s',
-                      '', '@author: %(username)s', '"""', '']
+            if os.name == "nt":
+                shebang = []
+            else:
+                shebang = ['#!/usr/bin/env python' + ('2' if PY2 else '3')]
+            header = shebang + [
+                '# -*- coding: utf-8 -*-',
+                '"""', 'Created on %(date)s', '',
+                '@author: %(username)s', '"""', '']
             encoding.write(os.linesep.join(header), self.TEMPLATE_PATH, 'utf-8')
 
         self.projectexplorer = None
         self.outlineexplorer = None
-        self.inspector = None
+        self.help = None
 
         self.editorstacks = None
         self.editorwindows = None
         self.editorwindows_to_be_created = None
-        
+
         self.file_dependent_actions = []
         self.pythonfile_dependent_actions = []
         self.dock_toolbar_actions = None
@@ -423,7 +427,9 @@ class Editor(SpyderPluginWidget):
         self.editorwindows_to_be_created = []
         self.toolbar_list = None
         self.menu_list = None
-        
+
+        self.introspector = IntrospectionManager()
+
         # Setup new windows:
         self.main.all_actions_defined.connect(self.setup_other_windows)
 
@@ -435,7 +441,7 @@ class Editor(SpyderPluginWidget):
         self.find_widget.hide()
         self.find_widget.visibility_changed.connect(
                                           lambda vs: self.rehighlight_cells())
-        self.register_widget_shortcuts("Editor", self.find_widget)
+        self.register_widget_shortcuts(self.find_widget)
 
         # Tabbed editor widget + Find/Replace widget
         editor_widgets = QWidget(self)
@@ -483,7 +489,11 @@ class Editor(SpyderPluginWidget):
         # Parameters of last file execution:
         self.__last_ic_exec = None # internal console
         self.__last_ec_exec = None # external console
-            
+
+        # File types and filters used by the Open dialog
+        self.edit_filetypes = None
+        self.edit_filters = None
+
         self.__ignore_cursor_position = False
         current_editor = self.get_current_editor()
         if current_editor is not None:
@@ -530,12 +540,12 @@ class Editor(SpyderPluginWidget):
                 dw.show()
                 dw.raise_()
             self.switch_to_plugin()
-        
-    def set_inspector(self, inspector):
-        self.inspector = inspector
+
+    def set_help(self, help_plugin):
+        self.help = help_plugin
         for editorstack in self.editorstacks:
-            editorstack.set_inspector(self.inspector)
-        
+            editorstack.set_help(self.help)
+
     #------ Private API --------------------------------------------------------
     def restore_scrollbar_position(self):
         """Restoring scrollbar position after main window is visible"""
@@ -623,51 +633,48 @@ class Editor(SpyderPluginWidget):
         # ---- File menu and toolbar ----
         self.new_action = create_action(self, _("&New file..."),
                 icon=ima.icon('filenew'), tip=_("New file"),
-                triggered=self.new)
+                triggered=self.new,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.new_action, context="Editor",
-                               name="New file")
-        add_shortcut_to_tooltip(self.new_action, context="Editor",
-                                name="New file")
-        
+                               name="New file", add_sc_to_tip=True)
+
         self.open_action = create_action(self, _("&Open..."),
                 icon=ima.icon('fileopen'), tip=_("Open file"),
-                triggered=self.load)
+                triggered=self.load,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.open_action, context="Editor",
-                               name="Open file")
-        add_shortcut_to_tooltip(self.open_action, context="Editor",
-                                name="Open file")
+                               name="Open file", add_sc_to_tip=True)
 
         self.file_switcher_action = create_action(self, _('File switcher...'),
                                             icon=ima.icon('filelist'),
                                             tip=_('Fast switch between files'),
                                             triggered=self.call_file_switcher,
                                             context=Qt.ApplicationShortcut)
-        self.register_shortcut(self.file_switcher_action, "_", "file switcher")
+        self.register_shortcut(self.file_switcher_action, context="_",
+                               name="File switcher", add_sc_to_tip=True)
 
         self.revert_action = create_action(self, _("&Revert"),
                 icon=ima.icon('revert'), tip=_("Revert file from disk"),
                 triggered=self.revert)
-        
+
         self.save_action = create_action(self, _("&Save"),
                 icon=ima.icon('filesave'), tip=_("Save file"),
-                triggered=self.save)
+                triggered=self.save,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.save_action, context="Editor",
-                               name="Save file")
-        add_shortcut_to_tooltip(self.save_action, context="Editor",
-                                name="Save file")
-        
+                               name="Save file", add_sc_to_tip=True)
+
         self.save_all_action = create_action(self, _("Sav&e all"),
                 icon=ima.icon('save_all'), tip=_("Save all files"),
-                                             
-                triggered=self.save_all)
+                triggered=self.save_all,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.save_all_action, context="Editor",
-                               name="Save all")
-        add_shortcut_to_tooltip(self.save_all_action, context="Editor",
-                                name="Save all")
-        
+                               name="Save all", add_sc_to_tip=True)
+
         save_as_action = create_action(self, _("Save &as..."), None,
                 ima.icon('filesaveas'), tip=_("Save current file as..."),
-                triggered=self.save_as)
+                triggered=self.save_as,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(save_as_action, "Editor", "Save As")
 
         print_preview_action = create_action(self, _("Print preview..."),
@@ -682,11 +689,38 @@ class Editor(SpyderPluginWidget):
 
         self.close_all_action = create_action(self, _("C&lose all"),
                 icon=ima.icon('filecloseall'), tip=_("Close all opened files"),
-                triggered=self.close_all_files)
+                triggered=self.close_all_files,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.close_all_action, context="Editor",
                                name="Close all")
 
-        # ---- Debug menu ----
+        # ---- Find menu and toolbar ----
+        _text = _("&Find text")
+        find_action = create_action(self, _text, icon=ima.icon('find'),
+                                    tip=_text, triggered=self.find,
+                                    context=Qt.WidgetShortcut)
+        self.register_shortcut(find_action, context="_",
+                               name="Find text", add_sc_to_tip=True)
+        find_next_action = create_action(self, _("Find &next"),
+                                         icon=ima.icon('findnext'),
+                                         triggered=self.find_next,
+                                         context=Qt.WidgetShortcut)
+        self.register_shortcut(find_next_action, context="_",
+                               name="Find next")
+        find_previous_action = create_action(self, _("Find &previous"),
+                                             icon=ima.icon('findprevious'),
+                                             triggered=self.find_previous,
+                                             context=Qt.WidgetShortcut)
+        self.register_shortcut(find_previous_action, context="_",
+                               name="Find previous")
+        _text = _("&Replace text")
+        replace_action = create_action(self, _text, icon=ima.icon('replace'),
+                                       tip=_text, triggered=self.replace,
+                                       context=Qt.WidgetShortcut)
+        self.register_shortcut(replace_action, context="_",
+                               name="Replace text")
+
+        # ---- Debug menu and toolbar ----
         set_clear_breakpoint_action = create_action(self,
                                     _("Set/Clear breakpoint"),
                                     icon=ima.icon('breakpoint_big'),
@@ -704,125 +738,102 @@ class Editor(SpyderPluginWidget):
         clear_all_breakpoints_action = create_action(self,
                                     _('Clear breakpoints in all files'),
                                     triggered=self.clear_all_breakpoints)
-        breakpoints_menu = QMenu(_("Breakpoints"), self)
-        add_actions(breakpoints_menu, (set_clear_breakpoint_action,
-                                       set_cond_breakpoint_action, None,
-                                       clear_all_breakpoints_action))
         self.winpdb_action = create_action(self, _("Debug with winpdb"),
                                            triggered=self.run_winpdb)
         self.winpdb_action.setEnabled(WINPDB_PATH is not None and PY2)
-        self.register_shortcut(self.winpdb_action, context="Editor",
-                               name="Debug with winpdb")
-        
+
         # --- Debug toolbar ---
-        debug_action = create_action(self, _("&Debug"), icon=ima.icon('debug'),
-                                     tip=_("Debug file"), triggered=self.debug_file)
-        self.register_shortcut(debug_action, context="Editor", name="Debug")
-        add_shortcut_to_tooltip(debug_action, context="Editor", name="Debug")
-        
-        debug_next_action = create_action(self, _("Step"), 
-               icon=ima.icon('arrow-step-over'), tip=_("Run current line"), 
-               triggered=lambda: self.debug_command("next")) 
-        self.register_shortcut(debug_next_action, "_", "Debug Step Over")
-        add_shortcut_to_tooltip(debug_next_action, context="_",
-                                name="Debug Step Over")
+        debug_action = create_action(self, _("&Debug"),
+                                     icon=ima.icon('debug'),
+                                     tip=_("Debug file"),
+                                     triggered=self.debug_file)
+        self.register_shortcut(debug_action, context="_", name="Debug",
+                               add_sc_to_tip=True)
+
+        debug_next_action = create_action(self, _("Step"),
+               icon=ima.icon('arrow-step-over'), tip=_("Run current line"),
+               triggered=lambda: self.debug_command("next"))
+        self.register_shortcut(debug_next_action, "_", "Debug Step Over",
+                               add_sc_to_tip=True)
 
         debug_continue_action = create_action(self, _("Continue"),
-               icon=ima.icon('arrow-continue'), tip=_("Continue execution until "
-                                                      "next breakpoint"), 
-               triggered=lambda: self.debug_command("continue"))                                                 
-        self.register_shortcut(debug_continue_action, "_", "Debug Continue")
-        add_shortcut_to_tooltip(debug_continue_action, context="_",
-                                name="Debug Continue")
-
-        debug_step_action = create_action(self, _("Step Into"), 
-               icon=ima.icon('arrow-step-in'), tip=_("Step into function or method "
-                                                     "of current line"), 
-               triggered=lambda: self.debug_command("step"))                
-        self.register_shortcut(debug_step_action, "_", "Debug Step Into")
-        add_shortcut_to_tooltip(debug_step_action, context="_",
-                                name="Debug Step Into")
-
-        debug_return_action = create_action(self, _("Step Return"), 
-               icon=ima.icon('arrow-step-out'), tip=_("Run until current function "
-                                                      "or method returns"), 
-               triggered=lambda: self.debug_command("return"))               
-        self.register_shortcut(debug_return_action, "_", "Debug Step Return")
-        add_shortcut_to_tooltip(debug_return_action, context="_",
-                                name="Debug Step Return")
+               icon=ima.icon('arrow-continue'),
+               tip=_("Continue execution until next breakpoint"),
+               triggered=lambda: self.debug_command("continue"))
+        self.register_shortcut(debug_continue_action, "_", "Debug Continue",
+                               add_sc_to_tip=True)
+
+        debug_step_action = create_action(self, _("Step Into"),
+               icon=ima.icon('arrow-step-in'),
+               tip=_("Step into function or method of current line"),
+               triggered=lambda: self.debug_command("step"))
+        self.register_shortcut(debug_step_action, "_", "Debug Step Into",
+                               add_sc_to_tip=True)
+
+        debug_return_action = create_action(self, _("Step Return"),
+               icon=ima.icon('arrow-step-out'),
+               tip=_("Run until current function or method returns"),
+               triggered=lambda: self.debug_command("return"))
+        self.register_shortcut(debug_return_action, "_", "Debug Step Return",
+                               add_sc_to_tip=True)
 
         debug_exit_action = create_action(self, _("Exit"),
-               icon=ima.icon('stop_debug'), tip=_("Exit Debug"), 
-               triggered=lambda: self.debug_command("exit"))                                       
-        self.register_shortcut(debug_exit_action, "_", "Debug Exit")
-        add_shortcut_to_tooltip(debug_exit_action, context="_",
-                                name="Debug Exit")
-
-        debug_control_menu_actions = [debug_next_action,
-                                      debug_step_action,
-                                      debug_return_action,
-                                      debug_continue_action,
-                                      debug_exit_action]
-        debug_control_menu = QMenu(_("Debugging control"))
-        add_actions(debug_control_menu, debug_control_menu_actions)   
-        
+               icon=ima.icon('stop_debug'), tip=_("Exit Debug"),
+               triggered=lambda: self.debug_command("exit"))
+        self.register_shortcut(debug_exit_action, "_", "Debug Exit",
+                               add_sc_to_tip=True)
+
         # --- Run toolbar ---
         run_action = create_action(self, _("&Run"), icon=ima.icon('run'),
                                    tip=_("Run file"),
                                    triggered=self.run_file)
-        self.register_shortcut(run_action, context="Editor", name="Run")
-        add_shortcut_to_tooltip(run_action, context="Editor", name="Run")
+        self.register_shortcut(run_action, context="_", name="Run",
+                               add_sc_to_tip=True)
 
-        configure_action = create_action(self, _("&Configure..."), 
+        configure_action = create_action(self, _("&Configure..."),
                                          icon=ima.icon('run_settings'),
                                tip=_("Run settings"),
                                menurole=QAction.NoRole,
                                triggered=self.edit_run_configurations)
-        self.register_shortcut(configure_action, context="Editor",
-                               name="Configure")
-        add_shortcut_to_tooltip(configure_action, context="Editor",
-                                name="Configure")
-        
-        re_run_action = create_action(self, _("Re-run &last script"), 
+        self.register_shortcut(configure_action, context="_",
+                               name="Configure", add_sc_to_tip=True)
+
+        re_run_action = create_action(self, _("Re-run &last script"),
                                       icon=ima.icon('run_again'),
                             tip=_("Run again last file"),
                             triggered=self.re_run_file)
-        self.register_shortcut(re_run_action, context="Editor",
-                               name="Re-run last script")
-        add_shortcut_to_tooltip(re_run_action, context="Editor",
-                                name="Re-run last script")
+        self.register_shortcut(re_run_action, context="_",
+                               name="Re-run last script",
+                               add_sc_to_tip=True)
 
         run_selected_action = create_action(self, _("Run &selection or "
                                                     "current line"),
                                             icon=ima.icon('run_selection'),
                                             tip=_("Run selection or "
                                                   "current line"),
-                                            triggered=self.run_selection)
+                                            triggered=self.run_selection,
+                                            context=Qt.WidgetShortcut)
         self.register_shortcut(run_selected_action, context="Editor",
                                name="Run selection")
 
-        if sys.platform == 'darwin':
-            run_cell_sc = Qt.META + Qt.Key_Enter
-        else:
-            run_cell_sc = Qt.CTRL + Qt.Key_Enter
-        run_cell_advance_sc = Qt.SHIFT + Qt.Key_Enter
-
         run_cell_action = create_action(self,
                             _("Run cell"),
                             icon=ima.icon('run_cell'),
-                            shortcut=QKeySequence(run_cell_sc),
+                            shortcut=QKeySequence(RUN_CELL_SHORTCUT),
                             tip=_("Run current cell (Ctrl+Enter)\n"
                                   "[Use #%% to create cells]"),
-                            triggered=self.run_cell)
+                            triggered=self.run_cell,
+                            context=Qt.WidgetShortcut)
 
         run_cell_advance_action = create_action(self,
-                            _("Run cell and advance"),
-                            icon=ima.icon('run_cell_advance'),
-                            shortcut=QKeySequence(run_cell_advance_sc),
-                            tip=_("Run current cell and go to "
-                                  "the next one (Shift+Enter)"),
-                            triggered=self.run_cell_and_advance)
-        
+                   _("Run cell and advance"),
+                   icon=ima.icon('run_cell_advance'),
+                   shortcut=QKeySequence(RUN_CELL_AND_ADVANCE_SHORTCUT),
+                   tip=_("Run current cell and go to the next one "
+                         "(Shift+Enter)"),
+                   triggered=self.run_cell_and_advance,
+                   context=Qt.WidgetShortcut)
+
         # --- Source code Toolbar ---
         self.todo_list_action = create_action(self,
                 _("Show todo list"), icon=ima.icon('todo_list'),
@@ -851,24 +862,31 @@ class Editor(SpyderPluginWidget):
         self.previous_edit_cursor_action = create_action(self,
                 _("Last edit location"), icon=ima.icon('last_edit_location'),
                 tip=_("Go to last edit location"),
-                triggered=self.go_to_last_edit_location)
+                triggered=self.go_to_last_edit_location,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.previous_edit_cursor_action,
                                context="Editor",
-                               name="Last edit location")
+                               name="Last edit location",
+                               add_sc_to_tip=True)
         self.previous_cursor_action = create_action(self,
                 _("Previous cursor position"), icon=ima.icon('prev_cursor'),
                 tip=_("Go to previous cursor position"),
-                triggered=self.go_to_previous_cursor_position)
+                triggered=self.go_to_previous_cursor_position,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.previous_cursor_action,
-                               context="Editor",
-                               name="Previous cursor position")
+                               context="Editor", 
+                               name="Previous cursor position",
+                               add_sc_to_tip=True)
         self.next_cursor_action = create_action(self,
                 _("Next cursor position"), icon=ima.icon('next_cursor'),
                 tip=_("Go to next cursor position"),
-                triggered=self.go_to_next_cursor_position)
+                triggered=self.go_to_next_cursor_position,
+                context=Qt.WidgetShortcut)
         self.register_shortcut(self.next_cursor_action,
-                               context="Editor", name="Next cursor position")
-        
+                               context="Editor",
+                               name="Next cursor position",
+                               add_sc_to_tip=True)
+
         # --- Edit Toolbar ---
         self.toggle_comment_action = create_action(self,
                 _("Comment")+"/"+_("Uncomment"), icon=ima.icon('comment'),
@@ -949,6 +967,8 @@ class Editor(SpyderPluginWidget):
         self.clear_recent_action = create_action(self,
             _("Clear this list"), tip=_("Clear recent files list"),
             triggered=self.clear_recent_files)
+
+        # ---- File menu/toolbar construction ----
         self.recent_file_menu = QMenu(_("Open &recent"), self)
         self.recent_file_menu.aboutToShow.connect(self.update_recent_file_menu)
 
@@ -965,6 +985,16 @@ class Editor(SpyderPluginWidget):
                                 self.file_switcher_action]
         self.main.file_toolbar_actions += file_toolbar_actions
 
+        # ---- Find menu/toolbar construction ----
+        self.main.search_menu_actions = [find_action,
+                                         find_next_action,
+                                         find_previous_action,
+                                         replace_action]
+        self.main.search_toolbar_actions = [find_action,
+                                            find_next_action,
+                                            replace_action]
+
+        # ---- Edit menu/toolbar construction ----
         self.edit_menu_actions = [self.toggle_comment_action,
                                   blockcomment_action, unblockcomment_action,
                                   self.indent_action, self.unindent_action]
@@ -972,7 +1002,8 @@ class Editor(SpyderPluginWidget):
         edit_toolbar_actions = [self.toggle_comment_action,
                                 self.unindent_action, self.indent_action]
         self.main.edit_toolbar_actions += edit_toolbar_actions
-        
+
+        # ---- Search menu/toolbar construction ----
         self.search_menu_actions = [gotoline_action]
         self.main.search_menu_actions += self.search_menu_actions
         self.main.search_toolbar_actions += [gotoline_action]
@@ -986,31 +1017,57 @@ class Editor(SpyderPluginWidget):
                                run_cell_advance_action, re_run_action,
                                configure_action]
         self.main.run_toolbar_actions += run_toolbar_actions
-        
+
         # ---- Debug menu/toolbar construction ----
-        # The breakpoints plugin is expecting that
-        # breakpoints_menu will be the first QMenu in debug_menu_actions
-        # If breakpoints_menu must be moved below another QMenu in the list 
-        # please update the breakpoints plugin accordingly.  
-        debug_menu_actions = [debug_action, breakpoints_menu,
-                              debug_control_menu, None, self.winpdb_action]
+        # NOTE: 'list_breakpoints' is used by the breakpoints 
+        # plugin to add its "List breakpoints" action to this
+        # menu
+        debug_menu_actions = [debug_action,
+                              debug_next_action,
+                              debug_step_action,
+                              debug_return_action,
+                              debug_continue_action,
+                              debug_exit_action,
+                              None,
+                              set_clear_breakpoint_action,
+                              set_cond_breakpoint_action,
+                              clear_all_breakpoints_action,
+                              'list_breakpoints',
+                              None,
+                              self.winpdb_action]
         self.main.debug_menu_actions += debug_menu_actions
         debug_toolbar_actions = [debug_action, debug_next_action,
                                  debug_step_action, debug_return_action,
                                  debug_continue_action, debug_exit_action]
         self.main.debug_toolbar_actions += debug_toolbar_actions
-        
-        source_menu_actions = [eol_menu, self.showblanks_action,
-                               trailingspaces_action, fixindentation_action]
+
+        # ---- Source menu/toolbar construction ----
+        source_menu_actions = [eol_menu,
+                               self.showblanks_action,
+                               trailingspaces_action,
+                               fixindentation_action,
+                               None,
+                               self.todo_list_action,
+                               self.warning_list_action,
+                               self.previous_warning_action,
+                               self.next_warning_action,
+                               None,
+                               self.previous_edit_cursor_action,
+                               self.previous_cursor_action,
+                               self.next_cursor_action]
         self.main.source_menu_actions += source_menu_actions
-        
+
         source_toolbar_actions = [self.todo_list_action,
-                self.warning_list_action, self.previous_warning_action,
-                self.next_warning_action, None,
-                self.previous_edit_cursor_action,
-                self.previous_cursor_action, self.next_cursor_action]
+                                  self.warning_list_action,
+                                  self.previous_warning_action,
+                                  self.next_warning_action,
+                                  None,
+                                  self.previous_edit_cursor_action,
+                                  self.previous_cursor_action,
+                                  self.next_cursor_action]
         self.main.source_toolbar_actions += source_toolbar_actions
-        
+
+        # ---- Dock widget and file dependent actions ----
         self.dock_toolbar_actions = file_toolbar_actions + [None] + \
                                     source_toolbar_actions + [None] + \
                                     run_toolbar_actions + [None] + \
@@ -1039,14 +1096,24 @@ class Editor(SpyderPluginWidget):
         self.exec_in_extconsole.connect(self.main.execute_in_external_console)
         self.redirect_stdio.connect(self.main.redirect_internalshell_stdio)
         self.open_dir.connect(self.main.workingdirectory.chdir)
-        self.set_inspector(self.main.inspector)
+        self.set_help(self.main.help)
         if self.main.outlineexplorer is not None:
             self.set_outlineexplorer(self.main.outlineexplorer)
         editorstack = self.get_current_editorstack()
         if not editorstack.data:
             self.__load_temp_file()
         self.main.add_dockwidget(self)
-    
+
+    def update_font(self):
+        """Update font from Preferences"""
+        font = self.get_plugin_font()
+        color_scheme = self.get_color_scheme()
+        for editorstack in self.editorstacks:
+            editorstack.set_default_font(font, color_scheme)
+            completion_size = CONF.get('main', 'completion/size')
+            for finfo in editorstack.data:
+                comp_widget = finfo.editor.completion_widget
+                comp_widget.setup_appearance(completion_size, font)
         
     #------ Focus tabwidget
     def __get_focus_editorstack(self):
@@ -1076,12 +1143,11 @@ class Editor(SpyderPluginWidget):
             for win in [self]+self.editorwindows:
                 if win.isAncestorOf(editorstack):
                     self.set_last_focus_editorstack(win, editorstack)
-    
-        
+
     #------ Handling editorstacks
     def register_editorstack(self, editorstack):
         self.editorstacks.append(editorstack)
-        self.register_widget_shortcuts("Editor", editorstack)
+        self.register_widget_shortcuts(editorstack)
 
         if self.isAncestorOf(editorstack):
             # editorstack is a child of the Editor plugin
@@ -1100,11 +1166,13 @@ class Editor(SpyderPluginWidget):
             editorstack.sig_editor_cursor_position_changed.connect(
                                  self.cursorpos_status.cursor_position_changed)
             editorstack.refresh_eol_chars.connect(self.eol_status.eol_changed)
-            
-        editorstack.set_inspector(self.inspector)
+
+        editorstack.set_help(self.help)
         editorstack.set_io_actions(self.new_action, self.open_action,
                                    self.save_action, self.revert_action)
         editorstack.set_tempfile_path(self.TEMPFILE_PATH)
+        editorstack.set_introspector(self.introspector)
+
         settings = (
             ('set_pyflakes_enabled',                'code_analysis/pyflakes'),
             ('set_pep8_enabled',                    'code_analysis/pep8'),
@@ -1132,8 +1200,8 @@ class Editor(SpyderPluginWidget):
             ('set_intelligent_backspace_enabled',   'intelligent_backspace'),
             ('set_highlight_current_line_enabled',  'highlight_current_line'),
             ('set_highlight_current_cell_enabled',  'highlight_current_cell'),
-            ('set_occurence_highlighting_enabled',  'occurence_highlighting'),
-            ('set_occurence_highlighting_timeout',  'occurence_highlighting/timeout'),
+            ('set_occurrence_highlighting_enabled',  'occurrence_highlighting'),
+            ('set_occurrence_highlighting_timeout',  'occurrence_highlighting/timeout'),
             ('set_checkeolchars_enabled',           'check_eol_chars'),
             ('set_fullpath_sorting_enabled',        'fullpath_sorting'),
             ('set_tabbar_visible',                  'show_tab_bar'),
@@ -1141,14 +1209,13 @@ class Editor(SpyderPluginWidget):
                     )
         for method, setting in settings:
             getattr(editorstack, method)(self.get_option(setting))
-        editorstack.set_inspector_enabled(CONF.get('inspector',
-                                                   'connect/editor'))
-        color_scheme = get_color_scheme(self.get_option('color_scheme_name'))
+        editorstack.set_help_enabled(CONF.get('help', 'connect/editor'))
+        color_scheme = self.get_color_scheme()
         editorstack.set_default_font(self.get_plugin_font(), color_scheme)
-        
+
         editorstack.starting_long_process.connect(self.starting_long_process)
         editorstack.ending_long_process.connect(self.ending_long_process)
-        
+
         # Redirect signals
         editorstack.redirect_stdio.connect(
                                  lambda state: self.redirect_stdio.emit(state))
@@ -1158,6 +1225,7 @@ class Editor(SpyderPluginWidget):
         editorstack.update_plugin_title.connect(
                                        lambda: self.update_plugin_title.emit())
         editorstack.editor_focus_changed.connect(self.save_focus_editorstack)
+        editorstack.editor_focus_changed.connect(self.set_editorstack_for_introspection)
         editorstack.editor_focus_changed.connect(self.main.plugin_focus_changed)
         editorstack.zoom_in.connect(lambda: self.zoom(1))
         editorstack.zoom_out.connect(lambda: self.zoom(-1))
@@ -1185,9 +1253,13 @@ class Editor(SpyderPluginWidget):
         editorstack.save_breakpoints.connect(self.save_breakpoints)
         editorstack.text_changed_at.connect(self.text_changed_at)
         editorstack.current_file_changed.connect(self.current_file_changed)
-        editorstack.plugin_load.connect(self.load)
+        editorstack.plugin_load[()].connect(self.load)
         editorstack.edit_goto.connect(self.load)
-        
+        editorstack.sig_save_as.connect(self.save_as)
+        editorstack.sig_prev_edit_pos.connect(self.go_to_last_edit_location)
+        editorstack.sig_prev_cursor.connect(self.go_to_previous_cursor_position)
+        editorstack.sig_next_cursor.connect(self.go_to_next_cursor_position)
+
     def unregister_editorstack(self, editorstack):
         """Removing editorstack only if it's not the last remaining"""
         self.remove_last_focus_editorstack(editorstack)
@@ -1202,24 +1274,24 @@ class Editor(SpyderPluginWidget):
     def clone_editorstack(self, editorstack):
         editorstack.clone_from(self.editorstacks[0])
         for finfo in editorstack.data:
-            self.register_widget_shortcuts("Editor", finfo.editor)
-        
-    @Slot(int, int)
+            self.register_widget_shortcuts(finfo.editor)
+
+    @Slot(str, int)
     def close_file_in_all_editorstacks(self, editorstack_id_str, index):
         for editorstack in self.editorstacks:
             if str(id(editorstack)) != editorstack_id_str:
                 editorstack.blockSignals(True)
                 editorstack.close_file(index, force=True)
                 editorstack.blockSignals(False)
-                
-    @Slot(int, int)
+
+    @Slot(str, int, str)
     def file_saved_in_editorstack(self, editorstack_id_str, index, filename):
         """A file was saved in editorstack, this notifies others"""
         for editorstack in self.editorstacks:
             if str(id(editorstack)) != editorstack_id_str:
                 editorstack.file_saved_in_other_editorstack(index, filename)
 
-    @Slot(int, int)
+    @Slot(str, int, str)
     def file_renamed_in_data_in_editorstack(self, editorstack_id_str,
                                             index, filename):
         """A file was renamed in data in editorstack, this notifies others"""
@@ -1227,8 +1299,29 @@ class Editor(SpyderPluginWidget):
             if str(id(editorstack)) != editorstack_id_str:
                 editorstack.rename_in_data(index, filename)
 
+    def set_editorstack_for_introspection(self):
+        """
+        Set the current editorstack to be used by the IntrospectionManager
+        instance
+        """
+        editorstack = self.__get_focus_editorstack()
+        if editorstack is not None:
+            self.introspector.set_editor_widget(editorstack)
+
+            # Disconnect active signals
+            try:
+                self.introspector.send_to_help.disconnect()
+                self.introspector.edit_goto.disconnect()
+            except TypeError:
+                pass
+
+            # Reconnect signals again
+            self.introspector.send_to_help.connect(editorstack.send_to_help)
+            self.introspector.edit_goto.connect(
+                lambda fname, lineno, name:
+                editorstack.edit_goto.emit(fname, lineno, name))
 
-    #------ Handling editor windows    
+    #------ Handling editor windows
     def setup_other_windows(self):
         """Setup toolbars and menus for 'New window' instances"""
         self.toolbar_list = (
@@ -1330,11 +1423,10 @@ class Editor(SpyderPluginWidget):
                 action.setEnabled(enable)
                 
     def refresh_save_all_action(self):
-        state = False
-        editorstack = self.editorstacks[0]
-        if editorstack.get_stack_count() > 1:
-            state = state or any([finfo.editor.document().isModified()
-                                  for finfo in editorstack.data])
+        """Enable 'Save All' if there are files to be saved"""
+        editorstack = self.get_current_editorstack()
+        state = any(finfo.editor.document().isModified()
+                    for finfo in editorstack.data)
         self.save_all_action.setEnabled(state)
             
     def update_warning_menu(self):
@@ -1347,7 +1439,11 @@ class Editor(SpyderPluginWidget):
             error = 'syntax' in message
             text = message[:1].upper()+message[1:]
             icon = ima.icon('error') if error else ima.icon('warning')
-            slot = lambda _l=line_number: self.load(filename, goto=_l)
+            # QAction.triggered works differently for PySide and PyQt
+            if not API == 'pyside':
+                slot = lambda _checked, _l=line_number: self.load(filename, goto=_l)
+            else:
+                slot = lambda _l=line_number: self.load(filename, goto=_l)
             action = create_action(self, text=text, icon=icon, triggered=slot)
             self.warning_menu.addAction(action)
             
@@ -1373,7 +1469,11 @@ class Editor(SpyderPluginWidget):
         filename = self.get_current_filename()
         for text, line0 in results:
             icon = ima.icon('todo')
-            slot = lambda _l=line0: self.load(filename, goto=_l)
+            # QAction.triggered works differently for PySide and PyQt
+            if not API == 'pyside':
+                slot = lambda _checked, _l=line0: self.load(filename, goto=_l)
+            else:
+                slot = lambda _l=line0: self.load(filename, goto=_l)
             action = create_action(self, text=text, icon=icon, triggered=slot)
             self.todo_menu.addAction(action)
         self.update_todo_actions()
@@ -1498,9 +1598,10 @@ class Editor(SpyderPluginWidget):
         is created (when loading or creating a new file)"""
         for editorstack in self.editorstacks[1:]:
             editor = editorstack.clone_editor_from(finfo, set_current=False)
-            self.register_widget_shortcuts("Editor", editor)
-    
+            self.register_widget_shortcuts(editor)
+
     @Slot()
+    @Slot(str)
     def new(self, fname=None, editorstack=None, text=None):
         """
         Create a new file - Untitled
@@ -1568,7 +1669,7 @@ class Editor(SpyderPluginWidget):
         finfo.path = self.main.get_spyder_pythonpath()
         self._clone_file_everywhere(finfo)
         current_editor = current_es.set_current_filename(finfo.filename)
-        self.register_widget_shortcuts("Editor", current_editor)
+        self.register_widget_shortcuts(current_editor)
         if not created_from_here:
             self.save(force=True)
 
@@ -1576,6 +1677,7 @@ class Editor(SpyderPluginWidget):
         """Edit new file template"""
         self.load(self.TEMPLATE_PATH)
 
+    @Slot()
     def call_file_switcher(self):
         if self.editorstacks:
             self.get_current_editorstack().open_fileswitcher_dlg()
@@ -1616,8 +1718,10 @@ class Editor(SpyderPluginWidget):
                                self.get_option('max_recent_files'), 1, 35)
         if valid:
             self.set_option('max_recent_files', mrf)
-    
 
+    @Slot()
+    @Slot(str)
+    @Slot(str, int, str)
     @Slot(str, int, str, object)
     def load(self, filenames=None, goto=None, word='', editorwindow=None,
              processevents=True):
@@ -1642,6 +1746,10 @@ class Editor(SpyderPluginWidget):
                 filenames = from_qvariant(action.data(), to_text_string)
         if not filenames:
             basedir = getcwd()
+            if self.edit_filetypes is None:
+                self.edit_filetypes = get_edit_filetypes()
+            if self.edit_filters is None:
+                self.edit_filters = get_edit_filters()
             if CONF.get('workingdir', 'editor/open/browse_scriptdir'):
                 c_fname = self.get_current_filename()
                 if c_fname is not None and c_fname != self.TEMPFILE_PATH:
@@ -1649,13 +1757,15 @@ class Editor(SpyderPluginWidget):
             self.redirect_stdio.emit(False)
             parent_widget = self.get_current_editorstack()
             if filename0 is not None:
-                selectedfilter = get_filter(EDIT_FILETYPES,
+                selectedfilter = get_filter(self.edit_filetypes,
                                             osp.splitext(filename0)[1])
             else:
                 selectedfilter = ''
-            filenames, _selfilter = getopenfilenames(parent_widget,
-                                         _("Open file"), basedir, EDIT_FILTERS,
-                                         selectedfilter=selectedfilter)
+            filenames, _sf = getopenfilenames(parent_widget,
+                                     _("Open file"), basedir,
+                                     self.edit_filters,
+                                     selectedfilter=selectedfilter,
+                                     options=QFileDialog.HideNameFilterDetails)
             self.redirect_stdio.emit(True)
             if filenames:
                 filenames = [osp.normpath(fname) for fname in filenames]
@@ -1709,8 +1819,8 @@ class Editor(SpyderPluginWidget):
                 self._clone_file_everywhere(finfo)
                 current_editor = current_es.set_current_filename(filename)
                 current_editor.set_breakpoints(load_breakpoints(filename))
-                self.register_widget_shortcuts("Editor", current_editor)
-                
+                self.register_widget_shortcuts(current_editor)
+
                 current_es.analyze_script()
                 self.__add_recent_file(filename)
             if goto is not None: # 'word' is assumed to be None as well
@@ -1745,7 +1855,8 @@ class Editor(SpyderPluginWidget):
     @Slot()
     def print_preview(self):
         """Print preview for current file"""
-        from spyderlib.qt.QtGui import QPrintPreviewDialog
+        from qtpy.QtPrintSupport import QPrintPreviewDialog
+
         editor = self.get_current_editor()
         printer = Printer(mode=QPrinter.HighResolution,
                           header_font=self.get_plugin_font('printer_header'))
@@ -1793,8 +1904,32 @@ class Editor(SpyderPluginWidget):
         """Revert the currently edited file from disk"""
         editorstack = self.get_current_editorstack()
         editorstack.revert()
-    
-    
+
+    @Slot()
+    def find(self):
+        """Find slot"""
+        editorstack = self.get_current_editorstack()
+        editorstack.find_widget.show()
+        editorstack.find_widget.search_text.setFocus()
+
+    @Slot()
+    def find_next(self):
+        """Fnd next slot"""
+        editorstack = self.get_current_editorstack()
+        editorstack.find_widget.find_next()
+
+    @Slot()
+    def find_previous(self):
+        """Find previous slot"""
+        editorstack = self.get_current_editorstack()
+        editorstack.find_widget.find_previous()
+
+    @Slot()
+    def replace(self):
+        """Replace slot"""
+        editorstack = self.get_current_editorstack()
+        editorstack.find_widget.show_replace()
+
     #------ Explorer widget
     def close_file_from_name(self, filename):
         """Close file from its name"""
@@ -1812,7 +1947,7 @@ class Editor(SpyderPluginWidget):
         dirname = osp.abspath(to_text_string(dirname))
         for fname in self.get_filenames():
             if osp.abspath(fname).startswith(dirname):
-                self.__close(fname)
+                self.close_file_from_name(fname)
     
     def renamed(self, source, dest):
         """File was renamed in file explorer widget or in project explorer"""
@@ -1893,11 +2028,11 @@ class Editor(SpyderPluginWidget):
             else:
                 args = runconf.get_arguments().split()
                 wdir = runconf.get_working_directory()
-                # Handle the case where wdir comes back as an empty string
-                # when the working directory dialog checkbox is unchecked.
-                if not wdir:
-                    wdir = None
-            programs.run_program(WINPDB_PATH, [fname]+args, wdir)
+            # Handle the case where wdir comes back as an empty string
+            # when the working directory dialog checkbox is unchecked.
+            # (subprocess "cwd" default is None, so empty str
+            # must be changed to None in this case.)
+            programs.run_program(WINPDB_PATH, [fname] + args, cwd=wdir or None)
         
     def toggle_eol_chars(self, os_name):
         editor = self.get_current_editor()
@@ -2210,30 +2345,20 @@ class Editor(SpyderPluginWidget):
         if self.editorstacks is not None:
             # --- syntax highlight and text rendering settings
             color_scheme_n = 'color_scheme_name'
-            color_scheme_o = get_color_scheme(self.get_option(color_scheme_n))
-            font_n = 'plugin_font'
-            font_o = self.get_plugin_font()
+            color_scheme_o = self.get_color_scheme()
             currentline_n = 'highlight_current_line'
             currentline_o = self.get_option(currentline_n)
             currentcell_n = 'highlight_current_cell'
             currentcell_o = self.get_option(currentcell_n)            
-            occurence_n = 'occurence_highlighting'
-            occurence_o = self.get_option(occurence_n)
-            occurence_timeout_n = 'occurence_highlighting/timeout'
-            occurence_timeout_o = self.get_option(occurence_timeout_n)
+            occurrence_n = 'occurrence_highlighting'
+            occurrence_o = self.get_option(occurrence_n)
+            occurrence_timeout_n = 'occurrence_highlighting/timeout'
+            occurrence_timeout_o = self.get_option(occurrence_timeout_n)
             focus_to_editor_n = 'focus_to_editor'
             focus_to_editor_o = self.get_option(focus_to_editor_n)
             
             for editorstack in self.editorstacks:
-                if font_n in options:
-                    scs = color_scheme_o if color_scheme_n in options else None
-                    editorstack.set_default_font(font_o, scs)
-                    completion_size = CONF.get('editor_appearance',
-                                               'completion/size')
-                    for finfo in editorstack.data:
-                        comp_widget = finfo.editor.completion_widget
-                        comp_widget.setup_appearance(completion_size, font_o)
-                elif color_scheme_n in options:
+                if color_scheme_n in options:
                     editorstack.set_color_scheme(color_scheme_o)
                 if currentline_n in options:
                     editorstack.set_highlight_current_line_enabled(
@@ -2241,11 +2366,11 @@ class Editor(SpyderPluginWidget):
                 if currentcell_n in options:
                     editorstack.set_highlight_current_cell_enabled(
                                                                 currentcell_o)              
-                if occurence_n in options:
-                    editorstack.set_occurence_highlighting_enabled(occurence_o)
-                if occurence_timeout_n in options:
-                    editorstack.set_occurence_highlighting_timeout(
-                                                           occurence_timeout_o)
+                if occurrence_n in options:
+                    editorstack.set_occurrence_highlighting_enabled(occurrence_o)
+                if occurrence_timeout_n in options:
+                    editorstack.set_occurrence_highlighting_timeout(
+                                                           occurrence_timeout_o)
                 if focus_to_editor_n in options:
                     editorstack.set_focus_to_editor(focus_to_editor_o)
 
@@ -2292,8 +2417,8 @@ class Editor(SpyderPluginWidget):
             indent_chars_o = self.get_option(indent_chars_n)
             tab_stop_width_n = 'tab_stop_width'
             tab_stop_width_o = self.get_option(tab_stop_width_n)
-            inspector_n = 'connect_to_oi'
-            inspector_o = CONF.get('inspector', 'connect/editor')
+            help_n = 'connect_to_oi'
+            help_o = CONF.get('help', 'connect/editor')
             todo_n = 'todo_list'
             todo_o = self.get_option(todo_n)
             pyflakes_n = 'code_analysis/pyflakes'
@@ -2356,8 +2481,8 @@ class Editor(SpyderPluginWidget):
                     editorstack.set_indent_chars(indent_chars_o)
                 if tab_stop_width_n in options:
                     editorstack.set_tab_stop_width(tab_stop_width_o)
-                if inspector_n in options:
-                    editorstack.set_inspector_enabled(inspector_o)
+                if help_n in options:
+                    editorstack.set_help_enabled(help_o)
                 if todo_n in options:
                     editorstack.set_todolist_enabled(todo_o,
                                                      current_finfo=finfo)
diff --git a/spyderlib/plugins/explorer.py b/spyderlib/plugins/explorer.py
index 4a92f1b..81e8cd2 100644
--- a/spyderlib/plugins/explorer.py
+++ b/spyderlib/plugins/explorer.py
@@ -11,18 +11,17 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt.QtGui import QFontDialog
-from spyderlib.qt.QtCore import Signal, Slot
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import os.path as osp
 
+# Third party imports
+from qtpy.QtCore import Signal
+
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.utils.qthelpers import create_action
-from spyderlib.widgets.explorer import ExplorerWidget
 from spyderlib.plugins import SpyderPluginMixin
 from spyderlib.py3compat import to_text_string
+from spyderlib.widgets.explorer import ExplorerWidget
 
 
 class Explorer(ExplorerWidget, SpyderPluginMixin):
@@ -32,6 +31,7 @@ class Explorer(ExplorerWidget, SpyderPluginMixin):
     open_interpreter = Signal(str)
     edit = Signal(str)
     removed = Signal(str)
+    removed_tree = Signal(str)
     renamed = Signal(str, str)
     create_module = Signal(str)
     run = Signal(str)
@@ -46,10 +46,8 @@ class Explorer(ExplorerWidget, SpyderPluginMixin):
 
         # Initialize plugin
         self.initialize_plugin()
-        
-        self.set_font(self.get_plugin_font())
-        
-    #------ SpyderPluginWidget API ---------------------------------------------    
+
+    #------ SpyderPluginWidget API ---------------------------------------------
     def get_plugin_title(self):
         """Return widget title"""
         return _("File explorer")
@@ -63,11 +61,6 @@ class Explorer(ExplorerWidget, SpyderPluginMixin):
     
     def get_plugin_actions(self):
         """Return a list of actions related to plugin"""
-        # Font
-        font_action = create_action(self, _("&Font..."), None, ima.icon('font'),
-                                    _("Set font style"),
-                                    triggered=self.change_font)
-        self.treewidget.common_actions.append(font_action)
         return []
     
     def register_plugin(self):
@@ -75,6 +68,7 @@ class Explorer(ExplorerWidget, SpyderPluginMixin):
         self.main.add_dockwidget(self)
         self.edit.connect(self.main.editor.load)
         self.removed.connect(self.main.editor.removed)
+        self.removed_tree.connect(self.main.editor.removed_tree)
         self.renamed.connect(self.main.editor.renamed)
         self.main.editor.open_dir.connect(self.chdir)
         self.create_module.connect(self.main.editor.new)
@@ -104,22 +98,8 @@ class Explorer(ExplorerWidget, SpyderPluginMixin):
     def closing_plugin(self, cancelable=False):
         """Perform actions before parent main window is closed"""
         return True
-        
-    #------ Public API ---------------------------------------------------------        
+
+    #------ Public API ---------------------------------------------------------
     def chdir(self, directory):
         """Set working directory"""
         self.treewidget.chdir(directory)
-    
-    @Slot()
-    def change_font(self):
-        """Change font"""
-        font, valid = QFontDialog.getFont(self.get_plugin_font(), self,
-                                          _("Select a new font"))
-        if valid:
-            self.set_font(font)
-            self.set_plugin_font(font)
-            
-    def set_font(self, font):
-        """Set explorer widget font"""
-        self.setFont(font)
-        self.treewidget.setFont(font)
diff --git a/spyderlib/plugins/externalconsole.py b/spyderlib/plugins/externalconsole.py
index b0b5c24..d1285f1 100644
--- a/spyderlib/plugins/externalconsole.py
+++ b/spyderlib/plugins/externalconsole.py
@@ -11,43 +11,41 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-# Qt imports
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QVBoxLayout, QMessageBox, QInputDialog,
-                                QLineEdit, QPushButton, QGroupBox, QLabel,
-                                QTabWidget, QFontComboBox, QHBoxLayout,
-                                QButtonGroup, QWidget)
-from spyderlib.qt.QtCore import Signal, Slot, Qt
-from spyderlib.qt.compat import getopenfilename
-import spyderlib.utils.icon_manager as ima
-
-# Stdlib imports
+# Standard library imports
 import atexit
 import os
 import os.path as osp
 import sys
-import subprocess
+
+# Third party imports
+from qtpy import PYQT5
+from qtpy.compat import getopenfilename
+from qtpy.QtCore import Qt, Signal, Slot
+from qtpy.QtWidgets import (QButtonGroup, QGroupBox, QHBoxLayout, QInputDialog,
+                            QLabel, QLineEdit, QMessageBox, QPushButton,
+                            QTabWidget, QVBoxLayout, QWidget)
 
 # Local imports
-from spyderlib.config.base import SCIENTIFIC_STARTUP, running_in_mac_app, _
+from spyderlib import dependencies
+from spyderlib.config.base import _, running_in_mac_app, SCIENTIFIC_STARTUP
 from spyderlib.config.main import CONF
 from spyderlib.utils import encoding, programs
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.misc import (get_error_match, get_python_executable,
-                                  remove_backslashes, is_python_script)
+                                  is_python_script, remove_backslashes)
 from spyderlib.utils.qthelpers import create_action, mimedata2url
-from spyderlib.widgets.tabs import Tabs
+from spyderlib.plugins import PluginConfigPage, SpyderPluginWidget
+from spyderlib.plugins.runconfig import get_run_configuration
+from spyderlib.py3compat import to_text_string, is_text_string, getcwd
 from spyderlib.widgets.externalshell.pythonshell import ExternalPythonShell
 from spyderlib.widgets.externalshell.systemshell import ExternalSystemShell
 from spyderlib.widgets.findreplace import FindReplace
-from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
-from spyderlib.plugins.runconfig import get_run_configuration
-from spyderlib.py3compat import to_text_string, is_text_string, getcwd
-from spyderlib import dependencies
+from spyderlib.widgets.tabs import Tabs
 
 
 MPL_REQVER = '>=1.0'
 dependencies.add("matplotlib", _("Interactive data plotting in the consoles"),
-                 required_version=MPL_REQVER)
+                 required_version=MPL_REQVER, optional=True)
 
 
 class ExternalConsoleConfigPage(PluginConfigPage):
@@ -65,8 +63,6 @@ class ExternalConsoleConfigPage(PluginConfigPage):
 
     def setup_page(self):
         interface_group = QGroupBox(_("Interface"))
-        font_group = self.create_fontgroup(option=None, text=None,
-                                    fontfilters=QFontComboBox.MonospacedFonts)
         newcb = self.create_checkbox
         singletab_box = newcb(_("One tab per script"), 'single_tab')
         showtime_box = newcb(_("Show elapsed time"), 'show_elapsed_time')
@@ -325,7 +321,7 @@ class ExternalConsoleConfigPage(PluginConfigPage):
                                                     interpreter=interpreter))
 
         tabs = QTabWidget()
-        tabs.addTab(self.create_tab(font_group, interface_group, display_group,
+        tabs.addTab(self.create_tab(interface_group, display_group,
                                     bg_group),
                     _("Display"))
         tabs.addTab(self.create_tab(monitor_group, source_group),
@@ -362,10 +358,9 @@ class ExternalConsoleConfigPage(PluginConfigPage):
             return
         spyder_version = sys.version_info[0]
         try:
-            cmd = [pyexec, "-c", "import sys; print(sys.version_info[0])"]
-            # subprocess.check_output is not present in python2.6 and 3.0
-            process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-            console_version = int(process.communicate()[0])
+            args = ["-c", "import sys; print(sys.version_info[0])"]
+            proc = programs.run_program(pyexec, args)
+            console_version = int(proc.communicate()[0])
         except IOError:
             console_version = spyder_version
         if spyder_version != console_version:
@@ -399,8 +394,8 @@ class ExternalConsole(SpyderPluginWidget):
         self.light_mode = light_mode
         self.tabwidget = None
         self.menu_actions = None
-        
-        self.inspector = None # Object inspector plugin
+
+        self.help = None # Help plugin
         self.historylog = None # History log plugin
         self.variableexplorer = None # Variable explorer plugin
 
@@ -468,15 +463,15 @@ class ExternalConsole(SpyderPluginWidget):
         # Find/replace widget
         self.find_widget = FindReplace(self)
         self.find_widget.hide()
-        self.register_widget_shortcuts("Editor", self.find_widget)
-        
+        self.register_widget_shortcuts(self.find_widget)
+
         layout.addWidget(self.find_widget)
-        
+
         self.setLayout(layout)
-            
+
         # Accepting drops
         self.setAcceptDrops(True)
-        
+
     def move_tab(self, index_from, index_to):
         """
         Move tab (tabs themselves have already been moved by the tabwidget)
@@ -569,17 +564,17 @@ class ExternalConsole(SpyderPluginWidget):
                 else:
                     self.tabwidget.setCurrentIndex(index)
                     return shellwidget
-    
+
     def get_current_shell(self):
         """
-        Called by object inspector to retrieve the current shell instance
+        Called by Help to retrieve the current shell instance
         """
         shellwidget = self.__find_python_shell()
         return shellwidget.shell
-                
+
     def get_running_python_shell(self):
         """
-        Called by object inspector to retrieve a running Python shell instance
+        Called by Help to retrieve a running Python shell instance
         """
         current_index = self.tabwidget.currentIndex()
         if current_index == -1:
@@ -777,7 +772,7 @@ class ExternalConsole(SpyderPluginWidget):
             shellwidget.sig_pdb.connect(
                               lambda fname, lineno, shellwidget=shellwidget:
                               self.pdb_has_stopped(fname, lineno, shellwidget))
-            self.register_widget_shortcuts("Console", shellwidget.shell)
+            self.register_widget_shortcuts(shellwidget.shell)
         else:
             if os.name == 'posix':
                 cmd = 'gnome-terminal'
@@ -811,10 +806,10 @@ class ExternalConsole(SpyderPluginWidget):
                             self.get_option('codecompletion/case_sensitive') )
         shellwidget.shell.set_codecompletion_enter(
                             self.get_option('codecompletion/enter_key') )
-        if python and self.inspector is not None:
-            shellwidget.shell.set_inspector(self.inspector)
-            shellwidget.shell.set_inspector_enabled(
-                               CONF.get('inspector', 'connect/python_console'))
+        if python and self.help is not None:
+            shellwidget.shell.set_help(self.help)
+            shellwidget.shell.set_help_enabled(
+                               CONF.get('help', 'connect/python_console'))
         if self.historylog is not None:
             self.historylog.add_history(shellwidget.shell.history_filename)
             shellwidget.shell.append_to_history.connect(
@@ -981,11 +976,11 @@ class ExternalConsole(SpyderPluginWidget):
         shell = self.shellwidgets[index]
         icon, _icon = self.icons[index]
         self.tabwidget.setTabIcon(index, icon)
-        if self.inspector is not None:
-            self.inspector.set_shell(shell.shell)
+        if self.help is not None:
+            self.help.set_shell(shell.shell)
         if self.variableexplorer is not None:
             self.variableexplorer.add_shellwidget(shell)
-        
+
     def process_finished(self, shell_id):
         index = self.get_shell_index_from_id(shell_id)
         if index is not None:
@@ -1041,49 +1036,45 @@ class ExternalConsole(SpyderPluginWidget):
         consoles_menu_actions = [interpreter_action]
         tools_menu_actions = [terminal_action]
         self.menu_actions = [interpreter_action, terminal_action, run_action]
-        
+
         self.main.consoles_menu_actions += consoles_menu_actions
         self.main.tools_menu_actions += tools_menu_actions
-        
+
         return self.menu_actions+consoles_menu_actions+tools_menu_actions
-    
+
     def register_plugin(self):
         """Register plugin in Spyder's main window"""
-        if self.main.light:
-            self.main.setCentralWidget(self)
-            self.main.widgetlist.append(self)
-        else:
-            self.main.add_dockwidget(self)
-            self.inspector = self.main.inspector
-            if self.inspector is not None:
-                self.inspector.set_external_console(self)
-            self.historylog = self.main.historylog
-            self.edit_goto.connect(self.main.editor.load)
-            self.edit_goto[str, int, str, bool].connect(
-                         lambda fname, lineno, word, processevents:
-                         self.main.editor.load(fname, lineno, word,
-                                               processevents=processevents))
-            self.main.editor.run_in_current_extconsole.connect(
-                         self.run_script_in_current_shell)
-            self.main.editor.breakpoints_saved.connect(
-                         self.set_spyder_breakpoints)
-            self.main.editor.open_dir.connect(
-                         self.set_current_shell_working_directory)
-            self.main.workingdirectory.set_current_console_wd.connect(
-                         self.set_current_shell_working_directory)
-            self.focus_changed.connect(
-                         self.main.plugin_focus_changed)
-            self.redirect_stdio.connect(
-                         self.main.redirect_internalshell_stdio)
-            expl = self.main.explorer
-            if expl is not None:
-                expl.open_terminal.connect(self.open_terminal)
-                expl.open_interpreter.connect(self.open_interpreter)
-            pexpl = self.main.projectexplorer
-            if pexpl is not None:
-                pexpl.open_terminal.connect(self.open_terminal)
-                pexpl.open_interpreter.connect(self.open_interpreter)
-        
+        self.main.add_dockwidget(self)
+        self.help = self.main.help
+        if self.help is not None:
+            self.help.set_external_console(self)
+        self.historylog = self.main.historylog
+        self.edit_goto.connect(self.main.editor.load)
+        self.edit_goto[str, int, str, bool].connect(
+                        lambda fname, lineno, word, processevents:
+                        self.main.editor.load(fname, lineno, word,
+                                            processevents=processevents))
+        self.main.editor.run_in_current_extconsole.connect(
+                        self.run_script_in_current_shell)
+        self.main.editor.breakpoints_saved.connect(
+                        self.set_spyder_breakpoints)
+        self.main.editor.open_dir.connect(
+                        self.set_current_shell_working_directory)
+        self.main.workingdirectory.set_current_console_wd.connect(
+                        self.set_current_shell_working_directory)
+        self.focus_changed.connect(
+                        self.main.plugin_focus_changed)
+        self.redirect_stdio.connect(
+                        self.main.redirect_internalshell_stdio)
+        expl = self.main.explorer
+        if expl is not None:
+            expl.open_terminal.connect(self.open_terminal)
+            expl.open_interpreter.connect(self.open_interpreter)
+        pexpl = self.main.projectexplorer
+        if pexpl is not None:
+            pexpl.open_terminal.connect(self.open_terminal)
+            pexpl.open_interpreter.connect(self.open_interpreter)
+
     def closing_plugin(self, cancelable=False):
         """Perform actions before parent main window is closed"""
         for shellwidget in self.shellwidgets:
@@ -1108,19 +1099,26 @@ class ExternalConsole(SpyderPluginWidget):
             shellwidget.update_time_label_visibility()
         self.main.last_console_plugin_focus_was_python = True
         self.update_plugin_title.emit()
-    
+
+    def update_font(self):
+        """Update font from Preferences"""
+        font = self.get_plugin_font()
+        for shellwidget in self.shellwidgets:
+            shellwidget.shell.set_font(font)
+            completion_size = CONF.get('main', 'completion/size')
+            comp_widget = shellwidget.shell.completion_widget
+            comp_widget.setup_appearance(completion_size, font)
+
     def apply_plugin_settings(self, options):
         """Apply configuration file's plugin settings"""
-        font_n = 'plugin_font'
-        font_o = self.get_plugin_font()
         showtime_n = 'show_elapsed_time'
         showtime_o = self.get_option(showtime_n)
         icontext_n = 'show_icontext'
         icontext_o = self.get_option(icontext_n)
         calltips_n = 'calltips'
         calltips_o = self.get_option(calltips_n)
-        inspector_n = 'connect_to_oi'
-        inspector_o = CONF.get('inspector', 'connect/python_console')
+        help_n = 'connect_to_oi'
+        help_o = CONF.get('help', 'connect/python_console')
         wrap_n = 'wrap'
         wrap_o = self.get_option(wrap_n)
         compauto_n = 'codecompletion/auto'
@@ -1132,21 +1130,15 @@ class ExternalConsole(SpyderPluginWidget):
         mlc_n = 'max_line_count'
         mlc_o = self.get_option(mlc_n)
         for shellwidget in self.shellwidgets:
-            if font_n in options:
-                shellwidget.shell.set_font(font_o)
-                completion_size = CONF.get('shell_appearance',
-                                           'completion/size')
-                comp_widget = shellwidget.shell.completion_widget
-                comp_widget.setup_appearance(completion_size, font_o)
             if showtime_n in options:
                 shellwidget.set_elapsed_time_visible(showtime_o)
             if icontext_n in options:
                 shellwidget.set_icontext_visible(icontext_o)
             if calltips_n in options:
                 shellwidget.shell.set_calltips(calltips_o)
-            if inspector_n in options:
+            if help_n in options:
                 if isinstance(shellwidget, ExternalPythonShell):
-                    shellwidget.shell.set_inspector_enabled(inspector_o)
+                    shellwidget.shell.set_help_enabled(help_o)
             if wrap_n in options:
                 shellwidget.shell.toggle_wrap_mode(wrap_o)
             if compauto_n in options:
@@ -1176,18 +1168,18 @@ class ExternalConsole(SpyderPluginWidget):
                 self.open_interpreter()
         else:
             self.dockwidget.hide()
-    
+
     #------ Public API ---------------------------------------------------------
+    @Slot(bool)
     @Slot(str)
     def open_interpreter(self, wdir=None):
         """Open interpreter"""
-        if wdir is None:
+        if not wdir:
             wdir = getcwd()
-        if not self.main.light:
-            self.visibility_changed(True)
+        self.visibility_changed(True)
         self.start(fname=None, wdir=to_text_string(wdir), args='',
                    interact=True, debug=False, python=True)
-    
+
     def start_ipykernel(self, client, wdir=None, give_focus=True):
         """Start new IPython kernel"""
         if not self.get_option('monitor/enabled'):
@@ -1196,17 +1188,18 @@ class ExternalConsole(SpyderPluginWidget):
                   "be started as expected, but an IPython console will have "
                   "to be connected manually to the kernel."), QMessageBox.Ok)
         
-        if wdir is None:
+        if not wdir:
             wdir = getcwd()
         self.main.ipyconsole.visibility_changed(True)
         self.start(fname=None, wdir=to_text_string(wdir), args='',
                    interact=True, debug=False, python=True, ipykernel=True,
                    ipyclient=client, give_ipyclient_focus=give_focus)
 
+    @Slot(bool)
     @Slot(str)
     def open_terminal(self, wdir=None):
         """Open terminal"""
-        if wdir is None:
+        if not wdir:
             wdir = getcwd()
         self.start(fname=None, wdir=to_text_string(wdir), args='',
                    interact=True, debug=False, python=False)
diff --git a/spyderlib/plugins/findinfiles.py b/spyderlib/plugins/findinfiles.py
index 5e4f1aa..abb3cc5 100644
--- a/spyderlib/plugins/findinfiles.py
+++ b/spyderlib/plugins/findinfiles.py
@@ -11,16 +11,18 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt.QtGui import QApplication
-from spyderlib.qt.QtCore import Signal, Slot
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.QtWidgets import QApplication
+from qtpy.QtCore import Signal, Slot
 
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.utils.qthelpers import create_action
-from spyderlib.widgets.findinfiles import FindInFilesWidget
+from spyderlib.config.utils import get_edit_extensions
 from spyderlib.plugins import SpyderPluginMixin
 from spyderlib.py3compat import getcwd
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import create_action
+from spyderlib.widgets.findinfiles import FindInFilesWidget
 
 
 class FindInFiles(FindInFilesWidget, SpyderPluginMixin):
@@ -40,9 +42,11 @@ class FindInFiles(FindInFilesWidget, SpyderPluginMixin):
         search_text = [txt for txt in search_text \
                        if txt not in self.search_text_samples]
         search_text += self.search_text_samples
-        
+
         search_text_regexp = self.get_option('search_text_regexp')
         include = self.get_option('include')
+        if not include:
+            include = self.include_patterns()
         include_idx = self.get_option('include_idx', None)
         include_regexp = self.get_option('include_regexp')
         exclude = self.get_option('exclude')
@@ -89,15 +93,23 @@ class FindInFiles(FindInFilesWidget, SpyderPluginMixin):
         self.set_search_text(text)
         if text:
             self.find()
-        
-    #------ SpyderPluginMixin API ---------------------------------------------    
+
+    def include_patterns(self):
+        edit_ext = get_edit_extensions()
+        patterns = [r'|'.join(['\\'+_ext+r'$' for _ext in edit_ext if _ext])+\
+                    r'|README|INSTALL',
+                    r'\.pyw?$|\.ipy$|\.txt$|\.rst$',
+                    '.']
+        return patterns
+    
+    #------ SpyderPluginMixin API ---------------------------------------------
     def switch_to_plugin(self):
         """Switch to plugin
         This method is called when pressing plugin's shortcut key"""
         self.findinfiles_callback()  # Necessary at least with PyQt5 on Windows
         SpyderPluginMixin.switch_to_plugin(self)
 
-    #------ SpyderPluginWidget API --------------------------------------------    
+    #------ SpyderPluginWidget API --------------------------------------------
     def get_plugin_title(self):
         """Return widget title"""
         return _("Find in files")
diff --git a/spyderlib/plugins/inspector.py b/spyderlib/plugins/help.py
similarity index 81%
rename from spyderlib/plugins/inspector.py
rename to spyderlib/plugins/help.py
index d859558..4dc630d 100644
--- a/spyderlib/plugins/inspector.py
+++ b/spyderlib/plugins/help.py
@@ -4,60 +4,55 @@
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
-"""Object Inspector Plugin"""
-
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QHBoxLayout, QVBoxLayout, QLabel, QSizePolicy,
-                                QMenu, QToolButton, QGroupBox, QFontComboBox,
-                                QActionGroup, QFontDialog, QWidget, QComboBox,
-                                QLineEdit, QMessageBox)
-from spyderlib.qt.QtCore import Signal, Slot, QUrl, QThread
-from spyderlib.qt.QtWebKit import QWebPage
-import spyderlib.utils.icon_manager as ima
+"""Help Plugin"""
 
+# Standard library imports
 import re
 import os.path as osp
 import socket
 import sys
 
+# Third party imports
+from qtpy import PYQT5
+from qtpy.QtCore import QThread, QUrl, Signal, Slot
+from qtpy.QtWidgets import (QActionGroup, QComboBox, QGroupBox, QHBoxLayout,
+                            QLabel, QLineEdit, QMenu, QMessageBox, QSizePolicy,
+                            QToolButton, QVBoxLayout, QWidget)
+from qtpy.QtWebEngineWidgets import QWebEnginePage, WEBENGINE
+
 # Local imports
 from spyderlib import dependencies
-from spyderlib.config.base import get_conf_path, get_module_source_path, _
-from spyderlib.config.ipython import IPYTHON_QT_INSTALLED
-from spyderlib.config.main import CONF
-from spyderlib.config.gui import get_color_scheme, get_font, set_font
+from spyderlib.config.base import _, get_conf_path, get_module_source_path
+from spyderlib.config.fonts import DEFAULT_SMALL_DELTA
+from spyderlib.config.ipython import QTCONSOLE_INSTALLED
+from spyderlib.plugins import PluginConfigPage, SpyderPluginWidget
+from spyderlib.py3compat import get_meth_class_inst, to_text_string
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils import programs
-from spyderlib.utils.qthelpers import (create_toolbutton, add_actions,
-                                       create_action)
-from spyderlib.widgets.comboboxes import EditableComboBox
-from spyderlib.widgets.sourcecode import codeeditor
-from spyderlib.widgets.findreplace import FindReplace
+from spyderlib.utils.help.sphinxify import (CSS_PATH, generate_context,
+                                            sphinxify, usage, warning)
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton)
 from spyderlib.widgets.browser import FrameWebView
+from spyderlib.widgets.comboboxes import EditableComboBox
 from spyderlib.widgets.externalshell.pythonshell import ExtPythonShellWidget
-from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
-from spyderlib.py3compat import to_text_string, get_meth_class_inst
+from spyderlib.widgets.findreplace import FindReplace
+from spyderlib.widgets.sourcecode import codeeditor
+
+
+# Sphinx dependency
+dependencies.add("sphinx", _("Show help for objects in the Editor and "
+                             "Consoles in a dedicated pane"),
+                 required_version='>=0.6.6')
+
 
 #XXX: Hardcoded dependency on optional IPython plugin component
 #     that requires the hack to make this work without IPython
-if IPYTHON_QT_INSTALLED:
+if QTCONSOLE_INSTALLED:
     from spyderlib.widgets.ipython import IPythonControlWidget
 else:
     IPythonControlWidget = None  # analysis:ignore
 
-# Check if we can import Sphinx to activate rich text mode
-try:
-    from spyderlib.utils.inspector.sphinxify import (CSS_PATH, sphinxify,
-                                                     warning, generate_context,
-                                                     usage)
-    sphinx_version = programs.get_module_version('sphinx')
-except (ImportError, TypeError):
-    sphinxify = sphinx_version = None  # analysis:ignore
-
-# To add sphinx dependency to the Dependencies dialog
-SPHINX_REQVER = '>=0.6.6'
-dependencies.add("sphinx", _("Rich text help on the Object Inspector"),
-                 required_version=SPHINX_REQVER)
-
 
 class ObjectComboBox(EditableComboBox):
     """
@@ -68,29 +63,29 @@ class ObjectComboBox(EditableComboBox):
 
     def __init__(self, parent):
         EditableComboBox.__init__(self, parent)
-        self.object_inspector = parent
+        self.help = parent
         self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
         self.tips = {True: '', False: ''}
 
     def is_valid(self, qstr=None):
         """Return True if string is valid"""
-        if not self.object_inspector.source_is_console():
+        if not self.help.source_is_console():
             return True
         if qstr is None:
             qstr = self.currentText()
         if not re.search('^[a-zA-Z0-9_\.]*$', str(qstr), 0):
             return False
         objtxt = to_text_string(qstr)
-        if self.object_inspector.get_option('automatic_import'):
-            shell = self.object_inspector.internal_shell
+        if self.help.get_option('automatic_import'):
+            shell = self.help.internal_shell
             if shell is not None:
                 return shell.is_defined(objtxt, force_import=True)
-        shell = self.object_inspector.get_shell()
+        shell = self.help.get_shell()
         if shell is not None:
             try:
                 return shell.is_defined(objtxt)
             except socket.error:
-                shell = self.object_inspector.get_shell()
+                shell = self.help.get_shell()
                 try:
                     return shell.is_defined(objtxt)
                 except socket.error:
@@ -116,18 +111,11 @@ class ObjectComboBox(EditableComboBox):
                     self.valid.emit(False, False)
 
 
-class ObjectInspectorConfigPage(PluginConfigPage):
+class HelpConfigPage(PluginConfigPage):
     def setup_page(self):
-        # Fonts group
-        plain_text_font_group = self.create_fontgroup(option=None,
-                                    text=_("Plain text font style"),
-                                    fontfilters=QFontComboBox.MonospacedFonts)
-        rich_text_font_group = self.create_fontgroup(option='rich_text',
-                                text=_("Rich text font style"))
-
         # Connections group
         connections_group = QGroupBox(_("Automatic connections"))
-        connections_label = QLabel(_("The Object Inspector can automatically "
+        connections_label = QLabel(_("This pane can automatically "
                                      "show an object's help information after "
                                      "a left parenthesis is written next to it. "
                                      "Below you can decide to which plugin "
@@ -146,7 +134,7 @@ class ObjectInspectorConfigPage(PluginConfigPage):
                                           'connect/python_console')
         ipython_box = self.create_checkbox(_("IPython Console"),
                                            'connect/ipython_console')
-        ipython_box.setEnabled(IPYTHON_QT_INSTALLED)
+        ipython_box.setEnabled(QTCONSOLE_INSTALLED)
 
         connections_layout = QVBoxLayout()
         connections_layout.addWidget(connections_label)
@@ -159,14 +147,12 @@ class ObjectInspectorConfigPage(PluginConfigPage):
         features_group = QGroupBox(_("Additional features"))
         math_box = self.create_checkbox(_("Render mathematical equations"),
                                         'math')
-        req_sphinx = sphinx_version is not None and \
-                     programs.is_module_installed('sphinx', '>=1.1')
+        req_sphinx = programs.is_module_installed('sphinx', '>=1.1')
         math_box.setEnabled(req_sphinx)
         if not req_sphinx:
+            sphinx_ver = programs.get_module_version('sphinx')
             sphinx_tip = _("This feature requires Sphinx 1.1 or superior.")
-            if sphinx_version is not None:
-                sphinx_tip += "\n" + _("Sphinx %s is currently installed."
-                                       ) % sphinx_version
+            sphinx_tip += "\n" + _("Sphinx %s is currently installed.") % sphinx_ver
             math_box.setToolTip(sphinx_tip)
 
         features_layout = QVBoxLayout()
@@ -176,20 +162,13 @@ class ObjectInspectorConfigPage(PluginConfigPage):
         # Source code group
         sourcecode_group = QGroupBox(_("Source code"))
         wrap_mode_box = self.create_checkbox(_("Wrap lines"), 'wrap')
-        names = CONF.get('color_schemes', 'names')
-        choices = list(zip(names, names))
-        cs_combo = self.create_combobox(_("Syntax color scheme: "),
-                                        choices, 'color_scheme_name')
 
         sourcecode_layout = QVBoxLayout()
         sourcecode_layout.addWidget(wrap_mode_box)
-        sourcecode_layout.addWidget(cs_combo)
         sourcecode_group.setLayout(sourcecode_layout)
 
         # Final layout
         vlayout = QVBoxLayout()
-        vlayout.addWidget(rich_text_font_group)
-        vlayout.addWidget(plain_text_font_group)
         vlayout.addWidget(connections_group)
         vlayout.addWidget(features_group)
         vlayout.addWidget(sourcecode_group)
@@ -206,7 +185,7 @@ class RichText(QWidget):
 
         self.webview = FrameWebView(self)
         self.find_widget = FindReplace(self)
-        self.find_widget.set_editor(self.webview)
+        self.find_widget.set_editor(self.webview.web_widget)
         self.find_widget.hide()
 
         layout = QVBoxLayout()
@@ -266,7 +245,7 @@ class PlainText(QWidget):
 
     def set_text(self, text, is_code):
         self.editor.set_highlight_current_line(is_code)
-        self.editor.set_occurence_highlighting(is_code)
+        self.editor.set_occurrence_highlighting(is_code)
         if is_code:
             self.editor.set_language('py')
         else:
@@ -348,13 +327,16 @@ class SphinxThread(QThread):
         self.html_ready.emit(html_text)
 
 
-class ObjectInspector(SpyderPluginWidget):
+class Help(SpyderPluginWidget):
     """
     Docstrings viewer widget
     """
-    CONF_SECTION = 'inspector'
-    CONFIGWIDGET_CLASS = ObjectInspectorConfigPage
+    CONF_SECTION = 'help'
+    CONFIGWIDGET_CLASS = HelpConfigPage
     LOG_PATH = get_conf_path(CONF_SECTION)
+    FONT_SIZE_DELTA = DEFAULT_SMALL_DELTA
+
+    # Signals
     focus_changed = Signal()
 
     def __init__(self, parent):
@@ -373,25 +355,19 @@ class ObjectInspector(SpyderPluginWidget):
         self._last_console_cb = None
         self._last_editor_cb = None
 
-        self.set_default_color_scheme()
-
         self.plain_text = PlainText(self)
         self.rich_text = RichText(self)
 
-        color_scheme = get_color_scheme(self.get_option('color_scheme_name'))
+        color_scheme = self.get_color_scheme()
         self.set_plain_text_font(self.get_plugin_font(), color_scheme)
         self.plain_text.editor.toggle_wrap_mode(self.get_option('wrap'))
 
         # Add entries to read-only editor context-menu
-        font_action = create_action(self, _("&Font..."), None,
-                                    ima.icon('font'), _("Set font style"),
-                                    triggered=self.change_font)
         self.wrap_action = create_action(self, _("Wrap lines"),
                                          toggled=self.toggle_wrap_mode)
         self.wrap_action.setChecked(self.get_option('wrap'))
         self.plain_text.editor.readonly_menu.addSeparator()
-        add_actions(self.plain_text.editor.readonly_menu,
-                    (font_action, self.wrap_action))
+        add_actions(self.plain_text.editor.readonly_menu, (self.wrap_action,))
 
         self.set_rich_text_font(self.get_plugin_font('rich_text'))
 
@@ -435,8 +411,7 @@ class ObjectInspector(SpyderPluginWidget):
 
         # Plain text docstring option
         self.docstring = True
-        self.rich_help = sphinxify is not None \
-                         and self.get_option('rich_mode', True)
+        self.rich_help = self.get_option('rich_mode', True)
         self.plain_text_action = create_action(self, _("Plain Text"),
                                                toggled=self.toggle_plain_text)
 
@@ -483,7 +458,6 @@ class ObjectInspector(SpyderPluginWidget):
             self.switch_to_plain_text()
         self.plain_text_action.setChecked(not self.rich_help)
         self.rich_text_action.setChecked(self.rich_help)
-        self.rich_text_action.setEnabled(sphinxify is not None)
         self.source_changed()
 
         # Main layout
@@ -495,31 +469,32 @@ class ObjectInspector(SpyderPluginWidget):
         self.setLayout(layout)
 
         # Add worker thread for handling rich text rendering
-        if sphinxify is None:
-            self._sphinx_thread = None
-        else:
-            self._sphinx_thread = SphinxThread(
+        self._sphinx_thread = SphinxThread(
                                   html_text_no_doc=warning(self.no_doc_string))
-            self._sphinx_thread.html_ready.connect(
+        self._sphinx_thread.html_ready.connect(
                                              self._on_sphinx_thread_html_ready)
-            self._sphinx_thread.error_msg.connect(
-                                              self._on_sphinx_thread_error_msg)
+        self._sphinx_thread.error_msg.connect(self._on_sphinx_thread_error_msg)
 
-        # Render internal links
+        # Handle internal and external links
         view = self.rich_text.webview
-        view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
+        if not WEBENGINE:
+            view.page().setLinkDelegationPolicy(QWebEnginePage.DelegateAllLinks)
         view.linkClicked.connect(self.handle_link_clicks)
 
         self._starting_up = True
 
     #------ SpyderPluginWidget API ---------------------------------------------
+    def on_first_registration(self):
+        """Action to be performed on first plugin registration"""
+        self.main.tabify_plugins(self.main.variableexplorer, self)
+
     def get_plugin_title(self):
         """Return widget title"""
-        return _('Object inspector')
+        return _('Help')
 
     def get_plugin_icon(self):
         """Return widget icon"""
-        return ima.icon('inspector')
+        return ima.icon('help')
 
     def get_focus_widget(self):
         """
@@ -537,7 +512,7 @@ class ObjectInspector(SpyderPluginWidget):
         """Register plugin in Spyder's main window"""
         self.focus_changed.connect(self.main.plugin_focus_changed)
         self.main.add_dockwidget(self)
-        self.main.console.set_inspector(self)
+        self.main.console.set_help(self)
         self.internal_shell = self.main.console.shell
 
     def closing_plugin(self, cancelable=False):
@@ -548,31 +523,30 @@ class ObjectInspector(SpyderPluginWidget):
         """Refresh widget"""
         if self._starting_up:
             self._starting_up = False
-            if sphinxify is not None:
-                self.switch_to_rich_text()
+            self.switch_to_rich_text()
             self.show_intro_message()
 
+    def update_font(self):
+        """Update font from Preferences"""
+        color_scheme = self.get_color_scheme()
+        font = self.get_plugin_font()
+        rich_font = self.get_plugin_font(rich_text=True)
+
+        self.set_plain_text_font(font, color_scheme=color_scheme)
+        self.set_rich_text_font(rich_font)
+
     def apply_plugin_settings(self, options):
         """Apply configuration file's plugin settings"""
         color_scheme_n = 'color_scheme_name'
-        color_scheme_o = get_color_scheme(self.get_option(color_scheme_n))
-        font_n = 'plugin_font'
-        font_o = self.get_plugin_font()
+        color_scheme_o = self.get_color_scheme()
         connect_n = 'connect_to_oi'
-        rich_font_n = 'rich_text'
-        rich_font_o = self.get_plugin_font('rich_text')
         wrap_n = 'wrap'
         wrap_o = self.get_option(wrap_n)
         self.wrap_action.setChecked(wrap_o)
         math_n = 'math'
         math_o = self.get_option(math_n)
 
-        if font_n in options:
-            scs = color_scheme_o if color_scheme_n in options else None
-            self.set_plain_text_font(font_o, color_scheme=scs)
-        if rich_font_n in options:
-            self.set_rich_text_font(rich_font_o)
-        elif color_scheme_n in options:
+        if color_scheme_n in options:
             self.set_plain_text_color_scheme(color_scheme_o)
         if wrap_n in options:
             self.toggle_wrap_mode(wrap_o)
@@ -585,7 +559,7 @@ class ObjectInspector(SpyderPluginWidget):
         if self.main.ipyconsole is not None:
             self.main.ipyconsole.apply_plugin_settings(options=[connect_n])
 
-    #------ Public API (related to inspector's source) -------------------------
+    #------ Public API (related to Help's source) -------------------------
     def source_is_console(self):
         """Return True if source is Console"""
         return self.source_combo.currentIndex() == 0
@@ -656,15 +630,6 @@ class ObjectInspector(SpyderPluginWidget):
         """Set plain text mode color scheme"""
         self.plain_text.set_color_scheme(color_scheme)
 
-    @Slot()
-    def change_font(self):
-        """Change console font"""
-        font, valid = QFontDialog.getFont(get_font(self.CONF_SECTION), self,
-                                      _("Select a new font"))
-        if valid:
-            self.set_plain_text_font(font)
-            set_font(font, self.CONF_SECTION)
-
     @Slot(bool)
     def toggle_wrap_mode(self, checked):
         """Toggle wrap mode"""
@@ -741,7 +706,7 @@ class ObjectInspector(SpyderPluginWidget):
                           "Help can also be shown automatically after writing "
                           "a left parenthesis next to an object. You can "
                           "activate this behavior in %s.")
-        prefs = _("Preferences > Object Inspector")
+        prefs = _("Preferences > Help")
         if sys.platform == 'darwin':
             shortcut = "Cmd+I"
         else:
@@ -781,14 +746,10 @@ class ObjectInspector(SpyderPluginWidget):
 
     @Slot()
     def show_tutorial(self):
-        tutorial_path = get_module_source_path('spyderlib.utils.inspector')
-        img_path = osp.join(tutorial_path, 'static', 'images')
+        tutorial_path = get_module_source_path('spyderlib.utils.help')
         tutorial = osp.join(tutorial_path, 'tutorial.rst')
         text = open(tutorial).read()
-        if sphinxify is not None:
-            self.show_rich_text(text, collapse=True, img_path=img_path)
-        else:
-            self.show_plain_text(text)
+        self.show_rich_text(text, collapse=True)
 
     def handle_link_clicks(self, url):
         url = to_text_string(url.toString())
@@ -810,7 +771,7 @@ class ObjectInspector(SpyderPluginWidget):
             self.set_editor_doc(self._last_editor_doc, force_refresh=True)
 
     def set_object_text(self, text, force_refresh=False, ignore_unknown=False):
-        """Set object analyzed by Object Inspector"""
+        """Set object analyzed by Help"""
         if (self.locked and not force_refresh):
             return
         self.switch_to_console_source()
@@ -831,13 +792,13 @@ class ObjectInspector(SpyderPluginWidget):
 
         if self.dockwidget is not None:
             self.dockwidget.blockSignals(True)
-        self.__eventually_raise_inspector(text, force=force_refresh)
+        self.__eventually_raise_help(text, force=force_refresh)
         if self.dockwidget is not None:
             self.dockwidget.blockSignals(False)
 
     def set_editor_doc(self, doc, force_refresh=False):
         """
-        Use the object inspector to show docstring dictionary computed
+        Use the help plugin to show docstring dictionary computed
         with introspection plugin from the Editor plugin
         """
         if (self.locked and not force_refresh):
@@ -853,12 +814,11 @@ class ObjectInspector(SpyderPluginWidget):
 
         if self.dockwidget is not None:
             self.dockwidget.blockSignals(True)
-        self.__eventually_raise_inspector(doc['docstring'],
-                                          force=force_refresh)
+        self.__eventually_raise_help(doc['docstring'], force=force_refresh)
         if self.dockwidget is not None:
             self.dockwidget.blockSignals(False)
 
-    def __eventually_raise_inspector(self, text, force=False):
+    def __eventually_raise_help(self, text, force=False):
         index = self.source_combo.currentIndex()
         if hasattr(self.main, 'tabifiedDockWidgets'):
             # 'QMainWindow.tabifiedDockWidgets' was introduced in PyQt 4.5
@@ -949,7 +909,7 @@ class ObjectInspector(SpyderPluginWidget):
             self.shell = shell
 
     def get_shell(self):
-        """Return shell which is currently bound to object inspector,
+        """Return shell which is currently bound to Help,
         or another running shell if it has been terminated"""
         if not isinstance(self.shell, ExtPythonShellWidget) \
            or not self.shell.externalshell.is_running():
@@ -977,13 +937,14 @@ class ObjectInspector(SpyderPluginWidget):
         """ Display error message on Sphinx rich text failure"""
         self._sphinx_thread.wait()
         self.plain_text_action.setChecked(True)
+        sphinx_ver = programs.get_module_version('sphinx')
         QMessageBox.critical(self,
-                    _('Object inspector'),
+                    _('Help'),
                     _("The following error occured when calling "
                       "<b>Sphinx %s</b>. <br>Incompatible Sphinx "
                       "version or doc string decoding failed."
                       "<br><br>Error message:<br>%s"
-                      ) % (sphinx_version, error_msg))
+                      ) % (sphinx_ver, error_msg))
 
     def show_help(self, obj_text, ignore_unknown=False):
         """Show help"""
diff --git a/spyderlib/plugins/history.py b/spyderlib/plugins/history.py
index 9422d4f..800d5c3 100644
--- a/spyderlib/plugins/history.py
+++ b/spyderlib/plugins/history.py
@@ -6,27 +6,28 @@
 
 """Console History Plugin"""
 
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QVBoxLayout, QFontDialog, QInputDialog,
-                                QToolButton, QMenu, QFontComboBox, QGroupBox,
-                                QHBoxLayout, QWidget)
-from spyderlib.qt.QtCore import Signal, Slot
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import os.path as osp
 import sys
 
+# Third party imports
+from qtpy import PYQT5
+from qtpy.QtCore import Signal, Slot
+from qtpy.QtWidgets import (QFontDialog, QGroupBox, QHBoxLayout, QInputDialog,
+                            QMenu, QToolButton, QVBoxLayout, QWidget)
+
+
 # Local imports
 from spyderlib.utils import encoding
 from spyderlib.config.base import _
-from spyderlib.config.main import CONF
-from spyderlib.config.gui import get_color_scheme
-from spyderlib.utils.qthelpers import (create_action, create_toolbutton, add_actions)
+from spyderlib.plugins import PluginConfigPage, SpyderPluginWidget
+from spyderlib.py3compat import is_text_string, to_text_string
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton)
 from spyderlib.widgets.tabs import Tabs
 from spyderlib.widgets.sourcecode import codeeditor
 from spyderlib.widgets.findreplace import FindReplace
-from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
-from spyderlib.py3compat import to_text_string, is_text_string
 
 
 class HistoryConfigPage(PluginConfigPage):
@@ -44,13 +45,6 @@ class HistoryConfigPage(PluginConfigPage):
         wrap_mode_box = self.create_checkbox(_("Wrap lines"), 'wrap')
         go_to_eof_box = self.create_checkbox(
                         _("Scroll automatically to last entry"), 'go_to_eof')
-        font_group = self.create_fontgroup(option=None,
-                                    text=_("Font style"),
-                                    fontfilters=QFontComboBox.MonospacedFonts)
-        names = CONF.get('color_schemes', 'names')
-        choices = list(zip(names, names))
-        cs_combo = self.create_combobox(_("Syntax color scheme: "),
-                                        choices, 'color_scheme_name')
 
         settings_layout = QVBoxLayout()
         settings_layout.addWidget(hist_spin)
@@ -59,11 +53,9 @@ class HistoryConfigPage(PluginConfigPage):
         sourcecode_layout = QVBoxLayout()
         sourcecode_layout.addWidget(wrap_mode_box)
         sourcecode_layout.addWidget(go_to_eof_box)
-        sourcecode_layout.addWidget(cs_combo)
         sourcecode_group.setLayout(sourcecode_layout)
-        
+
         vlayout = QVBoxLayout()
-        vlayout.addWidget(font_group)
         vlayout.addWidget(settings_group)
         vlayout.addWidget(sourcecode_group)
         vlayout.addStretch(1)
@@ -94,9 +86,7 @@ class HistoryLog(SpyderPluginWidget):
 
         # Initialize plugin
         self.initialize_plugin()
-        
-        self.set_default_color_scheme()
-        
+
         layout = QVBoxLayout()
         self.tabwidget = Tabs(self, self.menu_actions)
         self.tabwidget.currentChanged.connect(self.refresh_plugin)
@@ -112,8 +102,6 @@ class HistoryLog(SpyderPluginWidget):
         else:
             layout.addWidget(self.tabwidget)
 
-        self.tabwidget.setStyleSheet("QTabWidget::pane {border: 0;}")
-
         # Menu as corner widget
         options_button = create_toolbutton(self, text=_('Options'),
                                            icon=ima.icon('tooloptions'))
@@ -126,13 +114,13 @@ class HistoryLog(SpyderPluginWidget):
         # Find/replace widget
         self.find_widget = FindReplace(self)
         self.find_widget.hide()
-        self.register_widget_shortcuts("Editor", self.find_widget)
-        
+        self.register_widget_shortcuts(self.find_widget)
+
         layout.addWidget(self.find_widget)
-        
+
         self.setLayout(layout)
-            
-    #------ SpyderPluginWidget API ---------------------------------------------    
+
+    #------ SpyderPluginWidget API ---------------------------------------------
     def get_plugin_title(self):
         """Return widget title"""
         return _('History log')
@@ -166,13 +154,10 @@ class HistoryLog(SpyderPluginWidget):
                                        None, ima.icon('history'),
                                        _("Set history maximum entries"),
                                        triggered=self.change_history_depth)
-        font_action = create_action(self, _("&Font..."), None,
-                                    ima.icon('font'), _("Set shell font style"),
-                                    triggered=self.change_font)
         self.wrap_action = create_action(self, _("Wrap lines"),
                                     toggled=self.toggle_wrap_mode)
         self.wrap_action.setChecked( self.get_option('wrap') )
-        self.menu_actions = [history_action, font_action, self.wrap_action]
+        self.menu_actions = [history_action, self.wrap_action]
         return self.menu_actions
 
     def on_first_registration(self):
@@ -186,10 +171,17 @@ class HistoryLog(SpyderPluginWidget):
 #        self.main.console.set_historylog(self)
         self.main.console.shell.refresh.connect(self.refresh_plugin)
 
+    def update_font(self):
+        """Update font from Preferences"""
+        color_scheme = self.get_color_scheme()
+        font = self.get_plugin_font()
+        for editor in self.editors:
+            editor.set_font(font, color_scheme)
+
     def apply_plugin_settings(self, options):
         """Apply configuration file's plugin settings"""
         color_scheme_n = 'color_scheme_name'
-        color_scheme_o = get_color_scheme(self.get_option(color_scheme_n))
+        color_scheme_o = self.get_color_scheme()
         font_n = 'plugin_font'
         font_o = self.get_plugin_font()
         wrap_n = 'wrap'
@@ -237,7 +229,7 @@ class HistoryLog(SpyderPluginWidget):
                             scrollflagarea=False)
         editor.focus_changed.connect(lambda: self.focus_changed.emit())
         editor.setReadOnly(True)
-        color_scheme = get_color_scheme(self.get_option('color_scheme_name'))
+        color_scheme = self.get_color_scheme()
         editor.set_font( self.get_plugin_font(), color_scheme )
         editor.toggle_wrap_mode( self.get_option('wrap') )
 
@@ -277,17 +269,7 @@ class HistoryLog(SpyderPluginWidget):
                                        10, 10000)
         if valid:
             self.set_option('max_entries', depth)
-    
-    @Slot()
-    def change_font(self):
-        """Change console font"""
-        font, valid = QFontDialog.getFont(self.get_plugin_font(),
-                       self, _("Select a new font"))
-        if valid:
-            for editor in self.editors:
-                editor.set_font(font)
-            self.set_plugin_font(font)
-    
+
     @Slot(bool)
     def toggle_wrap_mode(self, checked):
         """Toggle wrap mode"""
diff --git a/spyderlib/plugins/ipythonconsole.py b/spyderlib/plugins/ipythonconsole.py
index f6997d1..88cc8c5 100644
--- a/spyderlib/plugins/ipythonconsole.py
+++ b/spyderlib/plugins/ipythonconsole.py
@@ -14,30 +14,24 @@ Handles IPython clients (and in the future, will handle IPython kernels too
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-# Stdlib imports
+# Standard library imports
 import atexit
 import os
 import os.path as osp
 import sys
 
-# Qt imports
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QVBoxLayout, QHBoxLayout, QFormLayout, 
-                                QMessageBox, QGroupBox, QDialogButtonBox,
-                                QDialog, QTabWidget, QFontComboBox, 
-                                QCheckBox, QApplication, QLabel,QLineEdit,
-                                QPushButton, QKeySequence, QWidget,
-                                QGridLayout)
-from spyderlib.qt.compat import getopenfilename
-from spyderlib.qt.QtCore import Signal, Slot, Qt
-import spyderlib.utils.icon_manager as ima
-
-# IPython imports
+# Third party imports
 from IPython.core.application import get_ipython_dir
-from IPython.kernel.connect import find_connection_file
-from IPython.qt.manager import QtKernelManager
-
-# Ssh imports
+from jupyter_client.connect import find_connection_file
+from qtconsole.manager import QtKernelManager
+from qtpy import PYQT5
+from qtpy.compat import getopenfilename
+from qtpy.QtCore import Qt, Signal, Slot
+from qtpy.QtGui import QKeySequence
+from qtpy.QtWidgets import (QApplication, QCheckBox, QDialog, QDialogButtonBox,
+                            QFormLayout, QGridLayout, QGroupBox, QHBoxLayout,
+                            QLabel, QLineEdit, QMessageBox, QPushButton,
+                            QTabWidget, QVBoxLayout, QWidget)
 from zmq.ssh import tunnel as zmqtunnel
 try:
     import pexpect
@@ -48,19 +42,20 @@ except ImportError:
 from spyderlib import dependencies
 from spyderlib.config.base import _
 from spyderlib.config.main import CONF
-from spyderlib.utils.misc import get_error_match, remove_backslashes
+from spyderlib.plugins import PluginConfigPage, SpyderPluginWidget
+from spyderlib.py3compat import to_text_string
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils import programs
+from spyderlib.utils.misc import get_error_match, remove_backslashes
 from spyderlib.utils.qthelpers import create_action
-from spyderlib.widgets.tabs import Tabs
-from spyderlib.widgets.ipython import IPythonClient
 from spyderlib.widgets.findreplace import FindReplace
-from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
-from spyderlib.py3compat import to_text_string
+from spyderlib.widgets.ipython import IPythonClient
+from spyderlib.widgets.tabs import Tabs
 
 
 SYMPY_REQVER = '>=0.7.3'
 dependencies.add("sympy", _("Symbolic mathematics in the IPython Console"),
-                 required_version=SYMPY_REQVER)
+                 required_version=SYMPY_REQVER, optional=True)
 
 
 # Replacing pyzmq openssh_tunnel method to work around the issue
@@ -154,10 +149,6 @@ class IPythonConsoleConfigPage(PluginConfigPage):
         newcb = self.create_checkbox
         mpl_present = programs.is_module_installed("matplotlib")
         
-        # --- Display ---
-        font_group = self.create_fontgroup(option=None, text=None,
-                                    fontfilters=QFontComboBox.MonospacedFonts)
-
         # Interface Group
         interface_group = QGroupBox(_("Interface"))
         banner_box = newcb(_("Display initial banner"), 'show_banner',
@@ -459,7 +450,7 @@ class IPythonConsoleConfigPage(PluginConfigPage):
 
         # --- Tabs organization ---
         tabs = QTabWidget()
-        tabs.addTab(self.create_tab(font_group, interface_group, comp_group,
+        tabs.addTab(self.create_tab(interface_group, comp_group,
                                     bg_group, source_code_group), _("Display"))
         tabs.addTab(self.create_tab(pylab_group, backend_group, inline_group),
                                     _("Graphics"))
@@ -606,7 +597,7 @@ class IPythonConsole(SpyderPluginWidget):
         self.menu_actions = None
 
         self.extconsole = None         # External console plugin
-        self.inspector = None          # Object inspector plugin
+        self.help = None               # Help plugin
         self.historylog = None         # History log plugin
         self.variableexplorer = None   # Variable explorer plugin
         self.editor = None             # Editor plugin
@@ -643,31 +634,37 @@ class IPythonConsole(SpyderPluginWidget):
         # Find/replace widget
         self.find_widget = FindReplace(self)
         self.find_widget.hide()
-        self.register_widget_shortcuts("Editor", self.find_widget)
+        self.register_widget_shortcuts(self.find_widget)
         layout.addWidget(self.find_widget)
-        
+
         self.setLayout(layout)
-            
+
         # Accepting drops
         self.setAcceptDrops(True)
-    
+
     #------ SpyderPluginMixin API ---------------------------------------------
     def on_first_registration(self):
         """Action to be performed on first plugin registration"""
         self.main.tabify_plugins(self.main.extconsole, self)
 
+    def update_font(self):
+        """Update font from Preferences"""
+        font = self.get_plugin_font()
+        for client in self.clients:
+            client.set_font(font)
+
     def apply_plugin_settings(self, options):
         """Apply configuration file's plugin settings"""
         font_n = 'plugin_font'
         font_o = self.get_plugin_font()
-        inspector_n = 'connect_to_oi'
-        inspector_o = CONF.get('inspector', 'connect/ipython_console')
+        help_n = 'connect_to_oi'
+        help_o = CONF.get('help', 'connect/ipython_console')
         for client in self.clients:
             control = client.get_control()
             if font_n in options:
                 client.set_font(font_o)
-            if inspector_n in options and control is not None:
-                control.set_inspector_enabled(inspector_o)
+            if help_n in options and control is not None:
+                control.set_help_enabled(help_o)
 
     def toggle_view(self, checked):
         """Toggle view"""
@@ -741,9 +738,10 @@ class IPythonConsole(SpyderPluginWidget):
                                       "to open a new one") % ctrl)
         create_client_action = create_action(self,
                                 _("Open a new console"),
-                                QKeySequence("Ctrl+T"), ima.icon('ipython_console'),
-                                triggered=self.create_new_client)
-        create_client_action.setShortcutContext(Qt.WidgetWithChildrenShortcut)
+                                QKeySequence("Ctrl+T"),
+                                ima.icon('ipython_console'),
+                                triggered=self.create_new_client,
+                                context=Qt.WidgetWithChildrenShortcut)
 
         connect_to_kernel_action = create_action(self,
                _("Connect to an existing kernel"), None, None,
@@ -765,7 +763,7 @@ class IPythonConsole(SpyderPluginWidget):
         self.main.add_dockwidget(self)
 
         self.extconsole = self.main.extconsole
-        self.inspector = self.main.inspector
+        self.help = self.main.help
         self.historylog = self.main.historylog
         self.variableexplorer = self.main.variableexplorer
         self.editor = self.main.editor
@@ -918,12 +916,12 @@ class IPythonConsole(SpyderPluginWidget):
         # Print a message if kernel dies unexpectedly
         shellwidget.custom_restart_kernel_died.connect(
                                             lambda t: client.if_kernel_dies(t))
-        
-        # Connect text widget to our inspector
-        if kernel_widget is not None and self.inspector is not None:
-            control.set_inspector(self.inspector)
-            control.set_inspector_enabled(CONF.get('inspector',
-                                                   'connect/ipython_console'))
+
+        # Connect text widget to Help
+        if kernel_widget is not None and self.help is not None:
+            control.set_help(self.help)
+            control.set_help_enabled(CONF.get('help',
+                                              'connect/ipython_console'))
 
         # Connect client to our history log
         if self.historylog is not None:
@@ -1191,20 +1189,20 @@ class IPythonConsole(SpyderPluginWidget):
     def show_intro(self):
         """Show intro to IPython help"""
         from IPython.core.usage import interactive_usage
-        self.inspector.show_rich_text(interactive_usage)
+        self.help.show_rich_text(interactive_usage)
 
     @Slot()
     def show_guiref(self):
         """Show qtconsole help"""
-        from IPython.core.usage import gui_reference
-        self.inspector.show_rich_text(gui_reference, collapse=True)
+        from qtconsole.usage import gui_reference
+        self.help.show_rich_text(gui_reference, collapse=True)
 
     @Slot()
     def show_quickref(self):
         """Show IPython Cheat Sheet"""
         from IPython.core.usage import quick_reference
-        self.inspector.show_plain_text(quick_reference)
-        
+        self.help.show_plain_text(quick_reference)
+
     #----Drag and drop
     #TODO: try and reimplement this block
     # (this is still the original code block copied from externalconsole.py)
diff --git a/spyderlib/plugins/layoutdialog.py b/spyderlib/plugins/layoutdialog.py
index 1e06d2e..09bf734 100644
--- a/spyderlib/plugins/layoutdialog.py
+++ b/spyderlib/plugins/layoutdialog.py
@@ -6,15 +6,18 @@
 
 """Layout dialogs"""
 
+# Standard library imports
 import sys
 
-from spyderlib.config.base import _
+# Third party imports
+from qtpy.QtCore import QAbstractTableModel, QModelIndex, QSize, Qt
+from qtpy.compat import from_qvariant, to_qvariant
+from qtpy.QtWidgets import (QAbstractItemView, QComboBox, QDialog,
+                            QDialogButtonBox, QGroupBox, QHBoxLayout,
+                            QPushButton, QTableView, QVBoxLayout)
 
-from spyderlib.qt.QtGui import (QVBoxLayout, QHBoxLayout, QDialogButtonBox,
-                                QGroupBox, QComboBox, QPushButton, QDialog,
-                                QAbstractItemView, QTableView)
-from spyderlib.qt.QtCore import Qt, QSize, QAbstractTableModel, QModelIndex
-from spyderlib.qt.compat import to_qvariant, from_qvariant
+# Local imports
+from spyderlib.config.base import _
 from spyderlib.py3compat import to_text_string
 
 
diff --git a/spyderlib/plugins/onlinehelp.py b/spyderlib/plugins/onlinehelp.py
index 5f9bd05..150b9ca 100644
--- a/spyderlib/plugins/onlinehelp.py
+++ b/spyderlib/plugins/onlinehelp.py
@@ -6,15 +6,17 @@
 
 """Online Help Plugin"""
 
-from spyderlib.qt.QtCore import Signal
-
+# Standard library imports
 import os.path as osp
 
+# Third party imports
+from qtpy.QtCore import Signal
+
 # Local imports
-from spyderlib.config.base import get_conf_path, _
-from spyderlib.widgets.pydocgui import PydocBrowser
+from spyderlib.config.base import _, get_conf_path
 from spyderlib.plugins import SpyderPluginMixin
 from spyderlib.py3compat import to_text_string
+from spyderlib.widgets.pydocgui import PydocBrowser
 
 
 class OnlineHelp(PydocBrowser, SpyderPluginMixin):
@@ -33,8 +35,8 @@ class OnlineHelp(PydocBrowser, SpyderPluginMixin):
         # Initialize plugin
         self.initialize_plugin()
 
-        self.register_widget_shortcuts("Editor", self.find_widget)
-        
+        self.register_widget_shortcuts(self.find_widget)
+
         self.webview.set_zoom_factor(self.get_option('zoom_factor'))
         self.url_combo.setMaxCount(self.get_option('max_history_entries'))
         self.url_combo.addItems( self.load_history() )
diff --git a/spyderlib/plugins/outlineexplorer.py b/spyderlib/plugins/outlineexplorer.py
index 2af6b69..b07f813 100644
--- a/spyderlib/plugins/outlineexplorer.py
+++ b/spyderlib/plugins/outlineexplorer.py
@@ -11,14 +11,15 @@ highlighter of assigned editor. For example, for Python files code editor uses
 highlighter spyderlib.utils.syntaxhighlighters.PythonSH
 """
 
-from spyderlib.qt.QtCore import Signal
+# Third party imports
+from qtpy.QtCore import Signal
 
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.widgets.editortools import OutlineExplorerWidget
 from spyderlib.plugins import SpyderPluginMixin
 from spyderlib.py3compat import is_text_string
-import spyderlib.utils.icon_manager as ima
+from spyderlib.utils import icon_manager as ima
+from spyderlib.widgets.editortools import OutlineExplorerWidget
 
 
 class OutlineExplorer(OutlineExplorerWidget, SpyderPluginMixin):
diff --git a/spyderlib/plugins/projectexplorer.py b/spyderlib/plugins/projectexplorer.py
index 83b93da..6b7c419 100644
--- a/spyderlib/plugins/projectexplorer.py
+++ b/spyderlib/plugins/projectexplorer.py
@@ -6,16 +6,17 @@
 
 """Project Explorer Plugin"""
 
-from spyderlib.qt.QtGui import QFontDialog
-from spyderlib.qt.QtCore import Signal, Slot
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.QtCore import Signal, Slot
+from qtpy.QtWidgets import QFontDialog
 
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.utils.qthelpers import create_action
-from spyderlib.widgets.projectexplorer import ProjectExplorerWidget
 from spyderlib.plugins import SpyderPluginMixin
 from spyderlib.py3compat import is_text_string
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import create_action
+from spyderlib.widgets.projectexplorer import ProjectExplorerWidget
 
 
 class ProjectExplorer(ProjectExplorerWidget, SpyderPluginMixin):
diff --git a/spyderlib/plugins/runconfig.py b/spyderlib/plugins/runconfig.py
index 568bef0..ddab854 100644
--- a/spyderlib/plugins/runconfig.py
+++ b/spyderlib/plugins/runconfig.py
@@ -6,23 +6,24 @@
 
 """Run configurations related dialogs and widgets and data models"""
 
-from spyderlib.qt.QtGui import (QVBoxLayout, QDialog, QWidget, QGroupBox,
-                                QLabel, QPushButton, QCheckBox, QLineEdit,
-                                QComboBox, QHBoxLayout, QDialogButtonBox,
-                                QStackedWidget, QGridLayout, QSizePolicy,
-                                QRadioButton, QMessageBox, QFrame,
-                                QButtonGroup)
-from spyderlib.qt.QtCore import Signal, Slot, Qt, QSize
-from spyderlib.qt.compat import getexistingdirectory
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import os.path as osp
 
+# Third party imports
+from qtpy.compat import getexistingdirectory
+from qtpy.QtCore import QSize, Qt, Signal, Slot
+from qtpy.QtWidgets import (QButtonGroup, QCheckBox, QComboBox, QDialog,
+                            QDialogButtonBox, QFrame, QGridLayout, QGroupBox,
+                            QHBoxLayout, QLabel, QLineEdit, QMessageBox,
+                            QPushButton, QRadioButton, QSizePolicy,
+                            QStackedWidget, QVBoxLayout, QWidget)
+
 # Local imports
 from spyderlib.config.base import _
 from spyderlib.config.main import CONF
 from spyderlib.plugins.configdialog import GeneralConfigPage
-from spyderlib.py3compat import to_text_string, getcwd
+from spyderlib.py3compat import getcwd, to_text_string
+from spyderlib.utils import icon_manager as ima
 
 
 CURRENT_INTERPRETER = _("Execute in current Python or IPython console")
diff --git a/spyderlib/plugins/shortcuts.py b/spyderlib/plugins/shortcuts.py
index 0621a0b..012f4a2 100644
--- a/spyderlib/plugins/shortcuts.py
+++ b/spyderlib/plugins/shortcuts.py
@@ -6,28 +6,31 @@
 
 """Shortcut management"""
 
+# Standard library imports
 from __future__ import print_function
 import os
 import re
 import sys
 
-from spyderlib.qt.QtGui import (QVBoxLayout, QTableView, QMessageBox,
-                                QPushButton, QKeySequence, QDialog,
-                                QDialogButtonBox, QLabel, QGridLayout,
-                                QLineEdit, QAbstractItemView,
-                                QSortFilterProxyModel, QApplication,
-                                QSpacerItem, QRegExpValidator, QHBoxLayout)
-from spyderlib.qt.QtCore import Qt, QAbstractTableModel, QModelIndex, QRegExp
-from spyderlib.qt.compat import to_qvariant, from_qvariant
+# Third party imports
+from qtpy import PYQT5
+from qtpy.compat import from_qvariant, to_qvariant
+from qtpy.QtCore import (QAbstractTableModel, QModelIndex, QRegExp,
+                         QSortFilterProxyModel, Qt)
+from qtpy.QtGui import (QKeySequence, QRegExpValidator)
+from qtpy.QtWidgets import (QAbstractItemView, QApplication, QDialog,
+                            QDialogButtonBox, QGridLayout, QHBoxLayout, QLabel,
+                            QLineEdit, QMessageBox, QPushButton, QSpacerItem,
+                            QTableView, QVBoxLayout)
 
 # Local imports
 from spyderlib.config.base import _, debug_print
-from spyderlib.config.gui import (get_shortcut, set_shortcut,
-                                  iter_shortcuts, reset_shortcuts)
+from spyderlib.config.gui import (get_shortcut, iter_shortcuts,
+                                  reset_shortcuts, set_shortcut)
 from spyderlib.plugins.configdialog import GeneralConfigPage
 from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.qthelpers import get_std_icon
-from spyderlib.utils.stringmatching import get_search_regex, get_search_scores
+from spyderlib.utils.stringmatching import get_search_scores, get_search_regex
 from spyderlib.widgets.helperwidgets import HTMLDelegate
 from spyderlib.widgets.helperwidgets import HelperToolButton
 
@@ -345,7 +348,20 @@ class ShortcutEditor(QDialog):
             self.button_ok.setEnabled(True)
             different_sequence = True
 
-        self.text_new_sequence.setText(sequence)
+        if sys.platform == 'darwin':
+            if 'Meta+Ctrl' in sequence:
+                shown_sequence = sequence.replace('Meta+Ctrl', 'Ctrl+Cmd')
+            elif 'Ctrl+Meta' in sequence:
+                shown_sequence = sequence.replace('Ctrl+Meta', 'Cmd+Ctrl')
+            elif 'Ctrl' in sequence:
+                shown_sequence = sequence.replace('Ctrl', 'Cmd')
+            elif 'Meta' in sequence:
+                shown_sequence = sequence.replace('Meta', 'Ctrl')
+            else:
+                shown_sequence = sequence
+        else:
+            shown_sequence = sequence
+        self.text_new_sequence.setText(shown_sequence)
         self.new_sequence = sequence
 
         conflicts = self.check_conflicts()
@@ -789,8 +805,13 @@ class ShortcutsConfigPage(GeneralConfigPage):
         self.setTabOrder(self.finder, self.reset_btn)
 
         # Signals and slots
-        self.table.proxy_model.dataChanged.connect(
-                     lambda i1, i2, opt='': self.has_been_modified(opt))
+        if PYQT5:
+            # Qt5 'dataChanged' has 3 parameters
+            self.table.proxy_model.dataChanged.connect(
+                lambda i1, i2, roles, opt='': self.has_been_modified(opt))
+        else:
+            self.table.proxy_model.dataChanged.connect(
+                lambda i1, i2, opt='': self.has_been_modified(opt))
         self.reset_btn.clicked.connect(self.reset_to_default)
 
     def check_settings(self):
diff --git a/spyderlib/plugins/variableexplorer.py b/spyderlib/plugins/variableexplorer.py
index b11f815..03f52fb 100644
--- a/spyderlib/plugins/variableexplorer.py
+++ b/spyderlib/plugins/variableexplorer.py
@@ -6,15 +6,16 @@
 
 """Variable Explorer Plugin"""
 
-from spyderlib.qt.QtGui import QGroupBox, QStackedWidget, QVBoxLayout, QWidget
-from spyderlib.qt.QtCore import Signal
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.QtCore import Signal
+from qtpy.QtWidgets import QGroupBox, QStackedWidget, QVBoxLayout, QWidget
 
 # Local imports
 from spyderlib.config.base import _
 from spyderlib.config.main import CONF
+from spyderlib.plugins import PluginConfigPage, SpyderPluginMixin
 from spyderlib.utils import programs
-from spyderlib.plugins import SpyderPluginMixin, PluginConfigPage
+from spyderlib.utils import icon_manager as ima
 from spyderlib.widgets.externalshell.monitor import REMOTE_SETTINGS
 from spyderlib.widgets.variableexplorer.namespacebrowser import NamespaceBrowser
 
@@ -165,7 +166,7 @@ class VariableExplorer(QWidget, SpyderPluginMixin):
         if self.count():
             nsb = self.current_widget()
             nsb.refresh_table()
-            nsb.import_data(filename=fname)
+            nsb.import_data(filenames=fname)
             if self.dockwidget and not self.ismaximized:
                 self.dockwidget.setVisible(True)
                 self.dockwidget.raise_()
diff --git a/spyderlib/plugins/workingdirectory.py b/spyderlib/plugins/workingdirectory.py
index e8ef4b2..12426ea 100644
--- a/spyderlib/plugins/workingdirectory.py
+++ b/spyderlib/plugins/workingdirectory.py
@@ -11,25 +11,25 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QToolBar, QLabel, QGroupBox, QVBoxLayout,
-                                QHBoxLayout, QButtonGroup)
-from spyderlib.qt.QtCore import Signal, Slot, QSize
-from spyderlib.qt.compat import getexistingdirectory
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import os
 import os.path as osp
 
+# Third party imports
+from qtpy import PYQT5
+from qtpy.compat import getexistingdirectory
+from qtpy.QtCore import QSize, Signal, Slot
+from qtpy.QtWidgets import (QButtonGroup, QGroupBox, QHBoxLayout, QLabel,
+                            QToolBar, QVBoxLayout)
+
 # Local imports
+from spyderlib.config.base import _, get_conf_path, get_home_dir
+from spyderlib.plugins import PluginConfigPage, SpyderPluginMixin
+from spyderlib.py3compat import to_text_string, getcwd
 from spyderlib.utils import encoding
-from spyderlib.config.base import get_conf_path, _
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.qthelpers import create_action
-
-# Package local imports
 from spyderlib.widgets.comboboxes import PathComboBox
-from spyderlib.plugins import SpyderPluginMixin, PluginConfigPage
-from spyderlib.py3compat import to_text_string, getcwd
 
 
 class WorkingDirectoryConfigPage(PluginConfigPage):
@@ -193,8 +193,9 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
                                "find in files plugin and for new files\n"
                                "created in the editor"))
         self.pathedit.open_dir.connect(self.chdir)
+        self.pathedit.activated[str].connect(self.chdir)
         self.pathedit.setMaxCount(self.get_option('working_dir_history'))
-        wdhistory = self.load_wdhistory( workdir )
+        wdhistory = self.load_wdhistory(workdir)
         if workdir is None:
             if self.get_option('startup/use_last_directory'):
                 if wdhistory:
@@ -206,7 +207,7 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
                 if not osp.isdir(workdir):
                     workdir = "."
         self.chdir(workdir)
-        self.pathedit.addItems( wdhistory )
+        self.pathedit.addItems(wdhistory)
         self.pathedit.selected_text = self.pathedit.currentText()
         self.refresh_plugin()
         self.addWidget(self.pathedit)
@@ -217,14 +218,7 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
                                       _('Browse a working directory'),
                                       triggered=self.select_directory)
         self.addAction(browse_action)
-        
-        # Set current console working directory action
-        setwd_action = create_action(self, icon=ima.icon('set_workdir'),
-                                     text=_("Set as current console's "
-                                                  "working directory"),
-                                     triggered=self.set_as_current_console_wd)
-        self.addAction(setwd_action)
-        
+
         # Parent dir action
         parent_action = create_action(self, "parent", None,
                                       ima.icon('up'),
@@ -279,10 +273,10 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
             wdhistory = [name for name in wdhistory if os.path.isdir(name)]
         else:
             if workdir is None:
-                workdir = getcwd()
+                workdir = get_home_dir()
             wdhistory = [ workdir ]
         return wdhistory
-    
+
     def save_wdhistory(self):
         """Save history to a text file in user home directory"""
         text = [ to_text_string( self.pathedit.itemText(index) ) \
@@ -315,13 +309,15 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
     def parent_directory(self):
         """Change working directory to parent directory"""
         self.chdir(os.path.join(getcwd(), os.path.pardir))
-        
-    def chdir(self, directory=None, browsing_history=False,
+
+    @Slot(str)
+    @Slot(str, bool)
+    @Slot(str, bool, bool)
+    def chdir(self, directory, browsing_history=False,
               refresh_explorer=True):
         """Set directory as working directory"""
         # Working directory history management
-        if directory is not None:
-            directory = osp.abspath(to_text_string(directory))
+        directory = osp.abspath(to_text_string(directory))
         if browsing_history:
             directory = self.history[self.histindex]
         elif directory in self.history:
@@ -339,6 +335,7 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
         self.refresh_plugin()
         if refresh_explorer:
             self.set_explorer_cwd.emit(directory)
+            self.set_as_current_console_wd()
         self.refresh_findinfiles.emit()
     
     @Slot()
diff --git a/spyderlib/py3compat.py b/spyderlib/py3compat.py
index ba5b918..1fbea85 100644
--- a/spyderlib/py3compat.py
+++ b/spyderlib/py3compat.py
@@ -8,7 +8,7 @@
 spyderlib.py3compat
 -------------------
 
-Transitional module providing compatibility functions intended to help 
+Transitional module providing compatibility functions intended to help
 migrating from Python 2 to Python 3.
 
 This module should be fully compatible with:
@@ -24,7 +24,6 @@ import sys
 
 PY2 = sys.version[0] == '2'
 PY3 = sys.version[0] == '3'
-PY33 = sys.version_info[0:2] >= (3, 3)
 
 #==============================================================================
 # Data types
@@ -63,6 +62,7 @@ if PY2:
     from UserDict import DictMixin as MutableMapping
     import thread as _thread
     import repr as reprlib
+    import Queue
 else:
     # Python 3
     import builtins
@@ -77,7 +77,7 @@ else:
     from collections import MutableMapping
     import _thread
     import reprlib
-
+    import queue as Queue
 
 #==============================================================================
 # Strings
diff --git a/spyderlib/qt/QtCore.py b/spyderlib/qt/QtCore.py
deleted file mode 100644
index c1989af..0000000
--- a/spyderlib/qt/QtCore.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-import os
-
-if os.environ['QT_API'] == 'pyqt5':
-    from PyQt5.QtCore import *                                # analysis:ignore
-    from PyQt5.QtCore import QCoreApplication
-    from PyQt5.QtCore import pyqtSignal as Signal
-    from PyQt5.QtCore import pyqtSlot as Slot
-    from PyQt5.QtCore import pyqtProperty as Property
-    from PyQt5.QtCore import QT_VERSION_STR as __version__
-elif os.environ['QT_API'] == 'pyqt':
-    from PyQt4.QtCore import *                                # analysis:ignore
-    from PyQt4.QtCore import QCoreApplication                 # analysis:ignore
-    from PyQt4.QtCore import Qt                               # analysis:ignore
-    from PyQt4.QtCore import pyqtSignal as Signal             # analysis:ignore
-    from PyQt4.QtCore import pyqtSlot as Slot                 # analysis:ignore
-    from PyQt4.QtCore import pyqtProperty as Property         # analysis:ignore
-    from PyQt4.QtCore import QT_VERSION_STR as __version__    # analysis:ignore
-
-    from PyQt4.QtGui import QItemSelection, QItemSelectionRange  # analysis:ignore
-else:
-    import PySide.QtCore
-    __version__ = PySide.QtCore.__version__                   # analysis:ignore
-    from PySide.QtCore import *                               # analysis:ignore
-
-    from PySide.QtGui import QItemSelection, QItemSelectionRange  # analysis:ignore
diff --git a/spyderlib/qt/QtGui.py b/spyderlib/qt/QtGui.py
deleted file mode 100644
index 17dd18d..0000000
--- a/spyderlib/qt/QtGui.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-import os
-
-if os.environ['QT_API'] == 'pyqt5':
-    from PyQt5.QtCore import QSortFilterProxyModel            # analysis:ignore
-    from PyQt5.QtPrintSupport import (QPrinter, QPrintDialog, # analysis:ignore
-                                      QAbstractPrintDialog)
-    from PyQt5.QtPrintSupport import QPrintPreviewDialog      # analysis:ignore
-    from PyQt5.QtGui import *                                 # analysis:ignore
-    from PyQt5.QtWidgets import *                             # analysis:ignore
-elif os.environ['QT_API'] == 'pyqt':
-    from PyQt4.Qt import QKeySequence, QTextCursor            # analysis:ignore
-    from PyQt4.QtGui import *                                 # analysis:ignore
-    QStyleOptionViewItem = QStyleOptionViewItemV4             # analysis:ignore
-    del QItemSelection, QItemSelectionRange                   # analysis:ignore
-else:
-    from PySide.QtGui import *                                # analysis:ignore
-    QStyleOptionViewItem = QStyleOptionViewItemV4             # analysis:ignore
-    del QItemSelection, QItemSelectionRange                   # analysis:ignore
diff --git a/spyderlib/qt/QtNetwork.py b/spyderlib/qt/QtNetwork.py
deleted file mode 100644
index 763c8f6..0000000
--- a/spyderlib/qt/QtNetwork.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-import os
-
-if os.environ['QT_API'] == 'pyqt5':
-    from PyQt5.QtNetwork import *  # analysis:ignore
-elif os.environ['QT_API'] == 'pyqt':
-    from PyQt4.QtNetwork import *  # analysis:ignore
-else:
-    from PySide.QtNetwork import *  # analysis:ignore
diff --git a/spyderlib/qt/QtSvg.py b/spyderlib/qt/QtSvg.py
deleted file mode 100644
index f4443b6..0000000
--- a/spyderlib/qt/QtSvg.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2012 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-import os
-
-if os.environ['QT_API'] == 'pyqt5':
-    from PyQt5.QtSvg import *                                 # analysis:ignore
-elif os.environ['QT_API'] == 'pyqt':
-    from PyQt4.QtSvg import *                                 # analysis:ignore
-else:
-    from PySide.QtSvg import *                                # analysis:ignore
diff --git a/spyderlib/qt/QtWebKit.py b/spyderlib/qt/QtWebKit.py
deleted file mode 100644
index 60c6dca..0000000
--- a/spyderlib/qt/QtWebKit.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-import os
-
-if os.environ['QT_API'] == 'pyqt5':
-    from PyQt5.QtWebKitWidgets import QWebPage, QWebView      # analysis:ignore
-    from PyQt5.QtWebKit import QWebSettings                   # analysis:ignore
-elif os.environ['QT_API'] == 'pyqt':
-    from PyQt4.QtWebKit import (QWebPage, QWebView,           # analysis:ignore
-                                QWebSettings)
-else:
-    from PySide.QtWebKit import *                             # analysis:ignore
diff --git a/spyderlib/qt/__init__.py b/spyderlib/qt/__init__.py
deleted file mode 100644
index c1ec94a..0000000
--- a/spyderlib/qt/__init__.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011-2012 Pierre Raybaut
-#           © 2012-2014 anatoly techtonik
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""Transitional package (PyQt4 --> PySide)"""
-
-import os
-
-os.environ.setdefault('QT_API', 'pyqt')
-assert os.environ['QT_API'] in ('pyqt5', 'pyqt', 'pyside')
-
-API = os.environ['QT_API']
-API_NAME = {'pyqt5': 'PyQt5', 'pyqt': 'PyQt4', 'pyside': 'PySide'}[API]
-
-if API == 'pyqt':
-    # Spyder 2.3 is compatible with both #1 and #2 PyQt API,
-    # but to avoid issues with IPython and other Qt plugins
-    # we choose to support only API #2 for 2.4+
-    try:
-        import sip
-        try:
-            sip.setapi('QString', 2)
-            sip.setapi('QVariant', 2)
-            sip.setapi('QDate', 2)
-            sip.setapi('QDateTime', 2)
-            sip.setapi('QTextStream', 2)
-            sip.setapi('QTime', 2)
-            sip.setapi('QUrl', 2)
-        except AttributeError:
-            # PyQt < v4.6. The actual check is done by requirements.check_qt()
-            # call from spyder.py
-            pass
-
-        from PyQt4.QtCore import PYQT_VERSION_STR as __version__ # analysis:ignore
-    except ImportError:
-        # Trying PyQt5 before switching to PySide (at this point, PyQt4 may 
-        # not be installed but PyQt5 or Pyside could still be if the QT_API 
-        # environment variable hasn't been set-up)
-        try:
-            import PyQt5  # analysis:ignore
-            API = os.environ['QT_API'] = 'pyqt5'
-            API_NAME = 'PyQt5'
-        except ImportError:
-            API = os.environ['QT_API'] = 'pyside'
-            API_NAME = 'PySide'
-    else:
-        is_old_pyqt = __version__.startswith(('4.4', '4.5', '4.6', '4.7'))
-        is_pyqt46 = __version__.startswith('4.6')
-        import sip
-        try:
-            API_NAME += (" (API v%d)" % sip.getapi('QString'))
-        except AttributeError:
-            pass
-        from PyQt4 import uic  # analysis:ignore
-
-PYQT5 = False
-if API == 'pyqt5':
-    try:
-        from PyQt5.QtCore import PYQT_VERSION_STR as __version__
-        from PyQt5 import uic  # analysis:ignore
-        PYQT5 = True
-        is_old_pyqt = is_pyqt46 = False
-    except ImportError:
-        pass
-
-if API == 'pyside':
-    try:
-        from PySide import __version__  # analysis:ignore
-    except ImportError:
-        raise ImportError("Spyder requires PySide or PyQt to be installed")
-    else:
-        is_old_pyqt = is_pyqt46 = False
diff --git a/spyderlib/qt/compat.py b/spyderlib/qt/compat.py
deleted file mode 100644
index 5c9c01c..0000000
--- a/spyderlib/qt/compat.py
+++ /dev/null
@@ -1,210 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011-2012 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""
-spyderlib.qt.compat
--------------------
-
-Transitional module providing compatibility functions intended to help 
-migrating from PyQt to PySide.
-
-This module should be fully compatible with:
-    * PyQt >=v4.4
-    * both PyQt API #1 and API #2
-    * PySide
-"""
-
-from __future__ import print_function
-
-import os
-import sys
-import collections
-
-from spyderlib.qt.QtGui import QFileDialog
-
-from spyderlib.py3compat import is_text_string, to_text_string, TEXT_TYPES
-
-#==============================================================================
-# QVariant conversion utilities
-#==============================================================================
-
-PYQT_API_1 = False
-if os.environ['QT_API'] == 'pyqt':
-    import sip
-    try:
-        PYQT_API_1 = sip.getapi('QVariant') == 1 # PyQt API #1
-    except AttributeError:
-        # PyQt <v4.6
-        PYQT_API_1 = True
-    def to_qvariant(pyobj=None):
-        """Convert Python object to QVariant
-        This is a transitional function from PyQt API #1 (QVariant exist) 
-        to PyQt API #2 and Pyside (QVariant does not exist)"""
-        if PYQT_API_1:
-            # PyQt API #1
-            from PyQt4.QtCore import QVariant
-            return QVariant(pyobj)
-        else:
-            # PyQt API #2
-            return pyobj
-    def from_qvariant(qobj=None, convfunc=None):
-        """Convert QVariant object to Python object
-        This is a transitional function from PyQt API #1 (QVariant exist) 
-        to PyQt API #2 and Pyside (QVariant does not exist)"""
-        if PYQT_API_1:
-            # PyQt API #1
-            assert isinstance(convfunc, collections.Callable)
-            if convfunc in TEXT_TYPES or convfunc is to_text_string:
-                return convfunc(qobj.toString())
-            elif convfunc is bool:
-                return qobj.toBool()
-            elif convfunc is int:
-                return qobj.toInt()[0]
-            elif convfunc is float:
-                return qobj.toDouble()[0]
-            else:
-                return convfunc(qobj)
-        else:
-            # PyQt API #2
-            return qobj
-else:
-    def to_qvariant(obj=None):  # analysis:ignore
-        """Convert Python object to QVariant
-        This is a transitional function from PyQt API#1 (QVariant exist) 
-        to PyQt API#2 and Pyside (QVariant does not exist)"""
-        return obj
-    def from_qvariant(qobj=None, pytype=None):  # analysis:ignore
-        """Convert QVariant object to Python object
-        This is a transitional function from PyQt API #1 (QVariant exist) 
-        to PyQt API #2 and Pyside (QVariant does not exist)"""
-        return qobj
-
-#==============================================================================
-# Wrappers around QFileDialog static methods
-#==============================================================================
-
-def getexistingdirectory(parent=None, caption='', basedir='',
-                         options=QFileDialog.ShowDirsOnly):
-    """Wrapper around QtGui.QFileDialog.getExistingDirectory static method
-    Compatible with PyQt >=v4.4 (API #1 and #2) and PySide >=v1.0"""
-    # Calling QFileDialog static method
-    if sys.platform == "win32":
-        # On Windows platforms: redirect standard outputs
-        _temp1, _temp2 = sys.stdout, sys.stderr
-        sys.stdout, sys.stderr = None, None
-    try:
-        result = QFileDialog.getExistingDirectory(parent, caption, basedir,
-                                                  options)
-    finally:
-        if sys.platform == "win32":
-            # On Windows platforms: restore standard outputs
-            sys.stdout, sys.stderr = _temp1, _temp2
-    if not is_text_string(result):
-        # PyQt API #1
-        result = to_text_string(result)
-    return result
-
-def _qfiledialog_wrapper(attr, parent=None, caption='', basedir='',
-                         filters='', selectedfilter='', options=None):
-    if options is None:
-        options = QFileDialog.Options(0)
-    try:
-        # PyQt <v4.6 (API #1)
-        from spyderlib.qt.QtCore import QString
-    except ImportError:
-        # PySide or PyQt >=v4.6
-        QString = None  # analysis:ignore
-    tuple_returned = True
-    try:
-        # PyQt >=v4.6
-        func = getattr(QFileDialog, attr+'AndFilter')
-    except AttributeError:
-        # PySide or PyQt <v4.6
-        func = getattr(QFileDialog, attr)
-        if QString is not None:
-            selectedfilter = QString()
-            tuple_returned = False
-    
-    # Calling QFileDialog static method
-    if sys.platform == "win32":
-        # On Windows platforms: redirect standard outputs
-        _temp1, _temp2 = sys.stdout, sys.stderr
-        sys.stdout, sys.stderr = None, None
-    try:
-        result = func(parent, caption, basedir,
-                      filters, selectedfilter, options)
-    except TypeError:
-        # The selectedfilter option (`initialFilter` in Qt) has only been 
-        # introduced in Jan. 2010 for PyQt v4.7, that's why we handle here 
-        # the TypeError exception which will be raised with PyQt v4.6
-        # (see Issue 960 for more details)
-        result = func(parent, caption, basedir, filters, options)
-    finally:
-        if sys.platform == "win32":
-            # On Windows platforms: restore standard outputs
-            sys.stdout, sys.stderr = _temp1, _temp2
-            
-    # Processing output
-    if tuple_returned:
-        # PySide or PyQt >=v4.6
-        output, selectedfilter = result
-    else:
-        # PyQt <v4.6 (API #1)
-        output = result
-    if QString is not None:
-        # PyQt API #1: conversions needed from QString/QStringList
-        selectedfilter = to_text_string(selectedfilter)
-        if isinstance(output, QString):
-            # Single filename
-            output = to_text_string(output)
-        else:
-            # List of filenames
-            output = [to_text_string(fname) for fname in output]
-            
-    # Always returns the tuple (output, selectedfilter)
-    return output, selectedfilter
-
-def getopenfilename(parent=None, caption='', basedir='', filters='',
-                    selectedfilter='', options=None):
-    """Wrapper around QtGui.QFileDialog.getOpenFileName static method
-    Returns a tuple (filename, selectedfilter) -- when dialog box is canceled,
-    returns a tuple of empty strings
-    Compatible with PyQt >=v4.4 (API #1 and #2) and PySide >=v1.0"""
-    return _qfiledialog_wrapper('getOpenFileName', parent=parent,
-                                caption=caption, basedir=basedir,
-                                filters=filters, selectedfilter=selectedfilter,
-                                options=options)
-
-def getopenfilenames(parent=None, caption='', basedir='', filters='',
-                     selectedfilter='', options=None):
-    """Wrapper around QtGui.QFileDialog.getOpenFileNames static method
-    Returns a tuple (filenames, selectedfilter) -- when dialog box is canceled,
-    returns a tuple (empty list, empty string)
-    Compatible with PyQt >=v4.4 (API #1 and #2) and PySide >=v1.0"""
-    return _qfiledialog_wrapper('getOpenFileNames', parent=parent,
-                                caption=caption, basedir=basedir,
-                                filters=filters, selectedfilter=selectedfilter,
-                                options=options)
-
-def getsavefilename(parent=None, caption='', basedir='', filters='',
-                    selectedfilter='', options=None):
-    """Wrapper around QtGui.QFileDialog.getSaveFileName static method
-    Returns a tuple (filename, selectedfilter) -- when dialog box is canceled,
-    returns a tuple of empty strings
-    Compatible with PyQt >=v4.4 (API #1 and #2) and PySide >=v1.0"""
-    return _qfiledialog_wrapper('getSaveFileName', parent=parent,
-                                caption=caption, basedir=basedir,
-                                filters=filters, selectedfilter=selectedfilter,
-                                options=options)
-
-if __name__ == '__main__':
-    from spyderlib.utils.qthelpers import qapplication
-    _app = qapplication()
-    print(repr(getexistingdirectory()))
-    print(repr(getopenfilename(filters='*.py;;*.txt')))
-    print(repr(getopenfilenames(filters='*.py;;*.txt')))
-    print(repr(getsavefilename(filters='*.py;;*.txt')))
-    sys.exit()
diff --git a/spyderlib/requirements.py b/spyderlib/requirements.py
index 6ab9e6b..24d393e 100644
--- a/spyderlib/requirements.py
+++ b/spyderlib/requirements.py
@@ -35,21 +35,20 @@ def check_path():
 
 def check_qt():
     """Check Qt binding requirements"""
-    qt_infos = dict(pyqt5=("PyQt5", "5.2"), pyqt=("PyQt4", "4.6"),
-                    pyside=("PySide", "1.2.0"))
+    qt_infos = dict(pyqt5=("PyQt5", "5.2"), pyqt=("PyQt4", "4.6"))
     try:
-        from spyderlib import qt
-        package_name, required_ver = qt_infos[qt.API]
-        actual_ver = qt.__version__
+        import qtpy
+        package_name, required_ver = qt_infos[qtpy.API]
+        actual_ver = qtpy.PYQT_VERSION
         if LooseVersion(actual_ver) < LooseVersion(required_ver):
             show_warning("Please check Spyder installation requirements:\n"
                          "%s %s+ is required (found v%s)."
                          % (package_name, required_ver, actual_ver))
     except ImportError:
-        show_warning("Please check Spyder installation requirements:\n\n"
-                     "%s %s+ or\n"
+        show_warning("Failed to import qtpy.\n"
+                     "Please check Spyder installation requirements:\n\n"
+                     "qtpy 1.1.0+ and either\n"
                      "%s %s+ or\n"
                      "%s %s+\n\n"
-                     "is required to run Spyder"
-                     % (qt_infos['pyqt'] + qt_infos['pyside'] + \
-                        qt_infos['pyqt5']))
+                     "are required to run Spyder."
+                     % (qt_infos['pyqt5'] + qt_infos['pyqt']))
diff --git a/spyderlib/rope_patch.py b/spyderlib/rope_patch.py
index f6c31db..769482d 100644
--- a/spyderlib/rope_patch.py
+++ b/spyderlib/rope_patch.py
@@ -20,7 +20,7 @@ Patching rope:
     http://groups.google.com/group/rope-dev/browse_thread/thread/924c4b5a6268e618
 
 [4] To avoid rope adding a 2 spaces indent to every docstring it gets, because
-    it breaks the work of Sphinx on the Object Inspector. Also, to better
+    it breaks the work of Sphinx on the Help plugin. Also, to better
     control how to get calltips and docstrings of forced builtin objects.
 
 [5] To make matplotlib return its docstrings in proper rst, instead of a mix
@@ -203,9 +203,9 @@ def apply():
     codeassist.PyDocExtractor = PatchedPyDocExtractor
 
 
-    # [5] Get the right matplotlib docstrings for our Object Inspector
+    # [5] Get the right matplotlib docstrings for Help
     try:
         import matplotlib as mpl
         mpl.rcParams['docstring.hardcopy'] = True
-    except ImportError:
+    except:
         pass
diff --git a/spyderlib/utils/codeanalysis.py b/spyderlib/utils/codeanalysis.py
index 9742085..57bd21a 100644
--- a/spyderlib/utils/codeanalysis.py
+++ b/spyderlib/utils/codeanalysis.py
@@ -11,7 +11,6 @@ Source code analysis utilities
 import sys
 import re
 import os
-from subprocess import Popen, PIPE
 import tempfile
 import traceback
 
@@ -144,8 +143,10 @@ def check(args, source_code, filename=None, options=None):
         args.append(tempfd.name)
     else:
         args.append(filename)
-    output = Popen(args, stdout=PIPE, stderr=PIPE
-                   ).communicate()[0].strip().decode().splitlines()
+    cmd = args[0]
+    cmdargs = args[1:]
+    proc = programs.run_program(cmd, cmdargs)
+    output = proc.communicate()[0].strip().decode().splitlines()
     if filename is None:
         os.unlink(tempfd.name)
     results = []
diff --git a/spyderlib/utils/encoding.py b/spyderlib/utils/encoding.py
index e41f3e3..2d5058c 100644
--- a/spyderlib/utils/encoding.py
+++ b/spyderlib/utils/encoding.py
@@ -15,7 +15,7 @@ import re
 import os
 import locale
 import sys
-from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF32
+from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF32, getincrementaldecoder
 
 # Local imports
 from spyderlib.py3compat import (is_string, to_text_string, is_binary_string,
@@ -91,10 +91,10 @@ def to_fs_from_unicode(unic):
 
 # Codecs for working with files and text.
 CODING_RE = re.compile(r"coding[:=]\s*([-\w_.]+)")
-CODECS = ['utf-8', 'iso8859-1',  'iso8859-15', 'koi8-r',
-          'koi8-u', 'iso8859-2', 'iso8859-3', 'iso8859-4', 'iso8859-5', 
-          'iso8859-6', 'iso8859-7', 'iso8859-8', 'iso8859-9', 
-          'iso8859-10', 'iso8859-13', 'iso8859-14', 'latin-1', 
+CODECS = ['utf-8', 'iso8859-1',  'iso8859-15', 'ascii', 'koi8-r',
+          'koi8-u', 'iso8859-2', 'iso8859-3', 'iso8859-4', 'iso8859-5',
+          'iso8859-6', 'iso8859-7', 'iso8859-8', 'iso8859-9',
+          'iso8859-10', 'iso8859-13', 'iso8859-14', 'latin-1',
           'utf-16']
 
 def get_coding(text):
@@ -106,7 +106,10 @@ def get_coding(text):
     for line in text.splitlines()[:2]:
         result = CODING_RE.search(to_text_string(line))
         if result:
-            return result.group(1)
+            codec = result.group(1)
+            # sometimes we find a false encoding that can result in errors
+            if codec in CODECS:
+                return codec
     return None
 
 def decode(text):
@@ -243,13 +246,16 @@ def is_text_file(filename):
             for bom in [BOM_UTF8, BOM_UTF16, BOM_UTF32]:
                 if chunk.startswith(bom):
                     return True
-            chunk = chunk.decode('utf-8')
+
+            decoder = getincrementaldecoder('utf-8')()
             while 1:
+                is_final = len(chunk) < CHUNKSIZE
+                chunk = decoder.decode(chunk, final=is_final)
                 if '\0' in chunk: # found null byte
                     return False
-                if len(chunk) < CHUNKSIZE:
+                if is_final:
                     break # done
-                chunk = fid.read(CHUNKSIZE).decode('utf-8')
+                chunk = fid.read(CHUNKSIZE)
         except UnicodeDecodeError:
             return False
         except Exception:
diff --git a/spyderlib/utils/environ.py b/spyderlib/utils/environ.py
index 6f0b633..0e45244 100644
--- a/spyderlib/utils/environ.py
+++ b/spyderlib/utils/environ.py
@@ -8,15 +8,18 @@
 Environment variable utilities
 """
 
+# Standard library imports
 import os
 
-from spyderlib.qt.QtGui import QDialog, QMessageBox
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.QtWidgets import QDialog, QMessageBox
 
 # Local imports
 from spyderlib.config.base import _
+from spyderlib.utils import icon_manager as ima
 from spyderlib.widgets.variableexplorer.collectionseditor import CollectionsEditor
 
+
 def envdict2listdict(envdict):
     """Dict --> Dict of lists"""
     sep = os.path.pathsep
diff --git a/spyderlib/utils/fixtures.py b/spyderlib/utils/fixtures.py
new file mode 100644
index 0000000..380d651
--- /dev/null
+++ b/spyderlib/utils/fixtures.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009- The Spyder Development Team
+# Licensed under the terms of the MIT License
+#
+
+"""
+Testing utilities to be used with pytest.
+"""
+
+# Standard library imports
+import shutil
+import tempfile
+
+# Third party imports
+import pytest
+
+# Local imports
+from spyderlib.config.user import UserConfig
+from spyderlib.config.main import CONF_VERSION, DEFAULTS
+
+
+ at pytest.fixture
+def tmpconfig(request):
+    """
+    Fixtures that returns a temporary CONF element.
+    """
+    SUBFOLDER = tempfile.mkdtemp()
+    CONF = UserConfig('spyder-test',
+                      defaults=DEFAULTS,
+                      version=CONF_VERSION,
+                      subfolder=SUBFOLDER,
+                      raw_mode=True,
+                      )
+
+    def fin():
+        """
+        Fixture finalizer to delete the temporary CONF element.
+        """
+        shutil.rmtree(SUBFOLDER)
+
+    request.addfinalizer(fin)
+    return CONF
diff --git a/spyderlib/utils/help/__init__.py b/spyderlib/utils/help/__init__.py
new file mode 100644
index 0000000..a87a85c
--- /dev/null
+++ b/spyderlib/utils/help/__init__.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009- Spyder Development team
+# Licensed under the terms of the MIT or BSD Licenses
+# (See every file for its license)
+
+"""
+spyderlib.utils.help
+====================
+
+Configuration files for the Help plugin rich text mode
+"""
+
+import sys
+from spyderlib.config.base import get_module_source_path
+sys.path.insert(0, get_module_source_path(__name__))
diff --git a/spyderlib/utils/inspector/conf.py b/spyderlib/utils/help/conf.py
similarity index 95%
rename from spyderlib/utils/inspector/conf.py
rename to spyderlib/utils/help/conf.py
index 02d0961..f06a2ff 100644
--- a/spyderlib/utils/inspector/conf.py
+++ b/spyderlib/utils/help/conf.py
@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
 #
 # Copyright (C) 2009 Tim Dumol <tim at timdumol.com>
-# Copyright (C) 2013 The Spyder Development Team
+# Copyright (C) 2009- The Spyder Development Team
 # Distributed under the terms of the BSD License
 
-"""Sphinx conf file for the object inspector rich text mode"""
+"""Sphinx conf file for the Help plugin rich text mode"""
 
 # 3rd party imports
 from sphinx import __version__ as sphinx_version
@@ -26,7 +26,7 @@ from spyderlib.py3compat import u
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
 
 # We need jsmath to get pretty plain-text latex in docstrings
-math = CONF.get('inspector', 'math', '')
+math = CONF.get('help', 'math', '')
 
 if sphinx_version < "1.1" or not math:
     extensions = ['sphinx.ext.jsmath']
@@ -53,7 +53,7 @@ source_suffix = '.rst'
 master_doc = 'docstring'
 
 # General information about the project.
-project = u("Object Inspector")
+project = u("Spyder Help plugin")
 copyright = u('2009--2013, The Spyder Development Team')
 
 # List of directories, relative to source directory, that shouldn't be searched
diff --git a/spyderlib/utils/inspector/js/collapse_sections.js b/spyderlib/utils/help/js/collapse_sections.js
similarity index 100%
rename from spyderlib/utils/inspector/js/collapse_sections.js
rename to spyderlib/utils/help/js/collapse_sections.js
diff --git a/spyderlib/utils/inspector/js/copy_button.js b/spyderlib/utils/help/js/copy_button.js
similarity index 100%
rename from spyderlib/utils/inspector/js/copy_button.js
rename to spyderlib/utils/help/js/copy_button.js
diff --git a/spyderlib/utils/inspector/js/fix_image_paths.js b/spyderlib/utils/help/js/fix_image_paths.js
similarity index 100%
rename from spyderlib/utils/inspector/js/fix_image_paths.js
rename to spyderlib/utils/help/js/fix_image_paths.js
diff --git a/spyderlib/utils/inspector/js/math_config.js b/spyderlib/utils/help/js/math_config.js
similarity index 100%
rename from spyderlib/utils/inspector/js/math_config.js
rename to spyderlib/utils/help/js/math_config.js
diff --git a/spyderlib/utils/inspector/js/move_outline.js b/spyderlib/utils/help/js/move_outline.js
similarity index 100%
rename from spyderlib/utils/inspector/js/move_outline.js
rename to spyderlib/utils/help/js/move_outline.js
diff --git a/spyderlib/utils/inspector/js/utils.js b/spyderlib/utils/help/js/utils.js
similarity index 100%
rename from spyderlib/utils/inspector/js/utils.js
rename to spyderlib/utils/help/js/utils.js
diff --git a/spyderlib/utils/inspector/sphinxify.py b/spyderlib/utils/help/sphinxify.py
similarity index 95%
rename from spyderlib/utils/inspector/sphinxify.py
rename to spyderlib/utils/help/sphinxify.py
index 19f985a..250d4ab 100644
--- a/spyderlib/utils/inspector/sphinxify.py
+++ b/spyderlib/utils/help/sphinxify.py
@@ -8,7 +8,7 @@ AUTHORS:
 - The Spyder Development Team: Several changes to make it work with Spyder
 
 Copyright (C) 2009 Tim Dumol <tim at timdumol.com>
-Copyright (C) 2013 The Spyder Development Team
+Copyright (C) 2009- The Spyder Development Team
 Distributed under the terms of the BSD License
 
 Taken from the Sage project (www.sagemath.org).
@@ -43,19 +43,19 @@ from spyderlib.utils import encoding
 
 # Note: we do not use __file__ because it won't be working in the stand-alone
 # version of Spyder (i.e. the py2exe or cx_Freeze build)
-CONFDIR_PATH = get_module_source_path('spyderlib.utils.inspector')
+CONFDIR_PATH = get_module_source_path('spyderlib.utils.help')
 CSS_PATH = osp.join(CONFDIR_PATH, 'static', 'css')
 JS_PATH = osp.join(CONFDIR_PATH, 'js')
 
 # To let Debian packagers redefine the MathJax and JQuery locations so they can
 # use their own packages for them. See Issue 1230, comment #7.
 MATHJAX_PATH = get_module_data_path('spyderlib',
-                                    relpath=osp.join('utils', 'inspector',
+                                    relpath=osp.join('utils', 'help',
                                                      JS_PATH, 'mathjax'),
                                     attr_name='MATHJAXPATH')
 
 JQUERY_PATH = get_module_data_path('spyderlib',
-                                   relpath=osp.join('utils', 'inspector',
+                                   relpath=osp.join('utils', 'help',
                                                     JS_PATH),
                                    attr_name='JQUERYPATH')
 
@@ -197,7 +197,7 @@ def sphinxify(docstring, context, buildername='html'):
         confdir = encoding.to_unicode_from_fs(confdir)
         generate_configuration(confdir)
     else:
-        confdir = osp.join(get_module_source_path('spyderlib.utils.inspector'))
+        confdir = osp.join(get_module_source_path('spyderlib.utils.help'))
 
     confoverrides = {'html_context': context}
 
@@ -242,7 +242,7 @@ def generate_configuration(directory):
     """
     
     # conf.py file for Sphinx
-    conf = osp.join(get_module_source_path('spyderlib.utils.inspector'),
+    conf = osp.join(get_module_source_path('spyderlib.utils.help'),
                     'conf.py')
 
     # Docstring layout page (in Jinja):
diff --git a/spyderlib/utils/inspector/static/css/default.css b/spyderlib/utils/help/static/css/default.css
similarity index 100%
rename from spyderlib/utils/inspector/static/css/default.css
rename to spyderlib/utils/help/static/css/default.css
diff --git a/spyderlib/utils/inspector/static/css/pygments.css b/spyderlib/utils/help/static/css/pygments.css
similarity index 100%
rename from spyderlib/utils/inspector/static/css/pygments.css
rename to spyderlib/utils/help/static/css/pygments.css
diff --git a/spyderlib/utils/inspector/static/images/collapse_expand.png b/spyderlib/utils/help/static/images/collapse_expand.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/collapse_expand.png
rename to spyderlib/utils/help/static/images/collapse_expand.png
diff --git a/spyderlib/utils/inspector/static/images/debug-continue.png b/spyderlib/utils/help/static/images/debug-continue.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/debug-continue.png
rename to spyderlib/utils/help/static/images/debug-continue.png
diff --git a/spyderlib/utils/inspector/static/images/debug-step-in.png b/spyderlib/utils/help/static/images/debug-step-in.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/debug-step-in.png
rename to spyderlib/utils/help/static/images/debug-step-in.png
diff --git a/spyderlib/utils/inspector/static/images/debug-step-out.png b/spyderlib/utils/help/static/images/debug-step-out.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/debug-step-out.png
rename to spyderlib/utils/help/static/images/debug-step-out.png
diff --git a/spyderlib/utils/inspector/static/images/debug-step-over.png b/spyderlib/utils/help/static/images/debug-step-over.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/debug-step-over.png
rename to spyderlib/utils/help/static/images/debug-step-over.png
diff --git a/spyderlib/utils/inspector/static/images/spyder-hello-docstring.png b/spyderlib/utils/help/static/images/spyder-hello-docstring.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/spyder-hello-docstring.png
rename to spyderlib/utils/help/static/images/spyder-hello-docstring.png
diff --git a/spyderlib/utils/inspector/static/images/spyder-nice-docstring-rendering.png b/spyderlib/utils/help/static/images/spyder-nice-docstring-rendering.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/spyder-nice-docstring-rendering.png
rename to spyderlib/utils/help/static/images/spyder-nice-docstring-rendering.png
diff --git a/spyderlib/utils/inspector/static/images/spyder-sympy-example.png b/spyderlib/utils/help/static/images/spyder-sympy-example.png
similarity index 100%
rename from spyderlib/utils/inspector/static/images/spyder-sympy-example.png
rename to spyderlib/utils/help/static/images/spyder-sympy-example.png
diff --git a/spyderlib/utils/inspector/templates/layout.html b/spyderlib/utils/help/templates/layout.html
similarity index 95%
rename from spyderlib/utils/inspector/templates/layout.html
rename to spyderlib/utils/help/templates/layout.html
index fa12762..93f7265 100644
--- a/spyderlib/utils/inspector/templates/layout.html
+++ b/spyderlib/utils/help/templates/layout.html
@@ -2,9 +2,9 @@
     layout.html
     ~~~~~~~~~~~
 
-    Layout template for the object inspector
+    Layout template for the Help plugin
 
-    :copyright: Copyright 2013 by the Spyder Development Team.
+    :copyright: Copyright 2009- by the Spyder Development Team.
     :copyright: Copyright 2009 by Tim Dumol <tim at timdumol.com>
     :license: BSD license
 #}
diff --git a/spyderlib/utils/inspector/templates/usage.html b/spyderlib/utils/help/templates/usage.html
similarity index 85%
rename from spyderlib/utils/inspector/templates/usage.html
rename to spyderlib/utils/help/templates/usage.html
index ffad1a1..d94231f 100644
--- a/spyderlib/utils/inspector/templates/usage.html
+++ b/spyderlib/utils/help/templates/usage.html
@@ -2,9 +2,9 @@
     usage.html
     ~~~~~~~~~~
 
-    A simple page to inform users how to get help on the Object Inspector
+    A simple page to inform users how to get help on the Help plugin
 
-    :copyright: Copyright 2013 by the Spyder Development Team.
+    :copyright: Copyright 2009- by the Spyder Development Team.
     :license: MIT license
 #}
 
diff --git a/spyderlib/utils/inspector/templates/warning.html b/spyderlib/utils/help/templates/warning.html
similarity index 100%
rename from spyderlib/utils/inspector/templates/warning.html
rename to spyderlib/utils/help/templates/warning.html
diff --git a/spyderlib/utils/inspector/tutorial.rst b/spyderlib/utils/help/tutorial.rst
similarity index 97%
rename from spyderlib/utils/inspector/tutorial.rst
rename to spyderlib/utils/help/tutorial.rst
index c8edb5a..5fb280d 100644
--- a/spyderlib/utils/inspector/tutorial.rst
+++ b/spyderlib/utils/help/tutorial.rst
@@ -191,15 +191,15 @@ Inspecting objects defined in the console
   are enclosed by triple single quotes (``'''``) or triple double quotes
   (``"""``).
 
-* The Spyder environment also provides the ``Object Inspector`` which
+* The Spyder environment also provides a ``Help`` pane which
   by default is located in the top right corner.
 
   While the cursor is on the name of an object,
   press ``CTRL+i`` (or ``CMD+i`` on Mac), and you should find that
   the same information as we obtained from ``help(hello)`` is provided
-  automatically in the object inspector:
+  automatically in the Help:
 
-  .. image:: static/images/spyder-hello-docstring.png
+  .. image:: images/spyder-hello-docstring.png
        :align: center
 
   This works in the console and in the editor.
@@ -415,7 +415,7 @@ reports what it has done.
 
 We can then use the variables ``x``, ``y``, for example like this:
 
-.. image:: static/images/spyder-sympy-example.png
+.. image:: images/spyder-sympy-example.png
      :align: center
 
 
@@ -478,8 +478,8 @@ Shortcuts for useful functions
   size in the Editor, whereas ``Cmd + -`` (``Ctrl + -``) will decrease it.
   Also works in the IPython Console.
 
-  The font size for the Object Inspector, the Python console etc. can be set
-  individually via ``Preferences > Object inspector`` etc.
+  The font size for the Help, the Python console etc. can be set
+  individually via ``Preferences > Help`` etc.
 
   I couldn't find a way of changing the font size in the variable explorer.
 
@@ -500,7 +500,7 @@ Shortcuts for useful functions
 
 - ``Cmd+I`` (on Mac OS X) and ``Ctrl+I`` (otherwise) when pressed
   while the cursor is on an object, opens documentation for that
-  object in the object inspector.
+  object in the help pane.
 
 
 
@@ -700,7 +700,7 @@ Documentation string formatting
 
 If you want to add documentation for the code you are developing, we recommend
 you to write documentation strings (or *docstrings*) for it, using a special 
-format called restructured text (`quick reference
+format called reStructuredText (`quick reference
 <http://docutils.sourceforge.net/docs/user/rst/quickref.html>`__). This format
 also needs to follow a set of conventions called the `Numpydoc standard
 <https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt#id5>`__
@@ -709,9 +709,9 @@ If you follow those guidelines, you can obtain beautifully formatted docstrings
 in Spyder.
 
 For example, to get an ``average()`` function look like this in the
-Spyder Object inspector:
+Spyder Help pane:
 
-.. image:: static/images/spyder-nice-docstring-rendering.png
+.. image:: images/spyder-nice-docstring-rendering.png
      :align: center
 
 you need to format the documentation string as follows
@@ -772,19 +772,19 @@ i.e. not function or class objects)
 After entering debug mode, you can execute the code line by line using the
 ``Step`` button of the Debug toolbar:
 
-.. image:: static/images/debug-step-over.png
+.. image:: images/debug-step-over.png
      :align: center
 
 or the shortcut Ctrl+F10. You can also inspect how a particular function is
 working by stepping into it with the ``Step into`` button
 
-.. image:: static/images/debug-step-in.png
+.. image:: images/debug-step-in.png
      :align: center
 
 or the shortcut Ctrl+F11. Finally, to get out of a function and continue with
 the next line you need to use the ``Step return`` button 
 
-.. image:: static/images/debug-step-out.png
+.. image:: images/debug-step-out.png
      :align: center
 
 or the shortcut Ctrl+F12.
@@ -794,7 +794,7 @@ If you prefer to inspect your program at a specific point, you need to insert a
 that a red dot will be placed next to the line and you can press the ``Continue``
 button
 
-.. image:: static/images/debug-continue.png
+.. image:: images/debug-continue.png
      :align: center
 
 (after entering debug mode) to stop the execution at that line.
diff --git a/spyderlib/utils/icon_manager.py b/spyderlib/utils/icon_manager.py
index d54498b..9b49b05 100644
--- a/spyderlib/utils/icon_manager.py
+++ b/spyderlib/utils/icon_manager.py
@@ -4,19 +4,21 @@
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
-import os
+# Standard library imports
+import os.path as osp
 
-from spyderlib.qt.QtGui import QIcon, QWidget, QStyle
+# Third party imports
+from qtpy.QtGui import QIcon
+from qtpy.QtWidgets import QStyle, QWidget
 
+# Local imports
 from spyderlib.config.base import get_image_path
 from spyderlib.config.main import CONF
-
-from path import Path
 import qtawesome as qta
 
 
 _resource = {
-    'directory': os.path.join(os.path.dirname(os.path.realpath(__file__)), '../fonts'),
+    'directory': osp.join(osp.dirname(osp.realpath(__file__)), '../fonts'),
     'loaded': False,
 }
 
@@ -27,16 +29,16 @@ _qtaargs = {
     'italic':                  [('fa.italic',), {}],
     'genprefs':                [('fa.cogs',), {}],
     'exit':                    [('fa.power-off',), {}],
-    'run_small':               [('fa.play',), {'color':'green'}],
-    'stop':                    [('fa.stop',), {}],
+    'run_small':               [('fa.play',), {'color': 'green'}],
+    'stop':                    [('fa.stop',), {'color': 'darkred'}],
     'syspath':                 [('fa.cogs',), {}],
     'font':                    [('fa.font',), {}],
     'keyboard':                [('fa.keyboard-o',), {}],
     'eyedropper':              [('fa.eyedropper',), {}],
-    'tooloptions':             [('fa.cog',), {}],
+    'tooloptions':             [('fa.cog',), {'color': '#333333'}],
     'edit24':                  [('fa.edit',), {}],
     'edit':                    [('fa.edit',), {}],
-    'filenew':                 [('fa.file-o', 'fa.plus'), {'options': [{}, {'scale_factor': 0.5, 'offset': (0.0, 0.1)}]}],
+    'filenew':                 [('fa.file-o',), {}],
     'fileopen':                [('fa.folder-open',), {}],
     'revert':                  [('fa.undo',), {}],
     'filesave':                [('fa.save',), {}],
@@ -46,7 +48,7 @@ _qtaargs = {
     'fileclose':               [('fa.close',), {}],
     'filecloseall':            [('fa.close', 'fa.close', 'fa.close'), {'options': [{'scale_factor': 0.6, 'offset': (0.3, -0.3)},  {'scale_factor': 0.6, 'offset': (-0.3, -0.3)}, {'scale_factor': 0.6, 'offset': (0.3, 0.3)}]}],
     'breakpoint_big':          [('fa.circle',), {'color': 'darkred'} ],
-    'breakpoint_cond_big':     [('fa.question-circle',), {'color':  'darkred'},],
+    'breakpoint_cond_big':     [('fa.question-circle',), {'color': 'darkred'},],
     'debug':                   [('spyder.debug',), {'color': '#3775a9'}],
     'arrow-step-over':         [('spyder.step-forward',), {'color': '#3775a9'}],
     'arrow-continue':          [('spyder.continue',), {'color': '#3775a9'}],
@@ -57,14 +59,14 @@ _qtaargs = {
     'run_settings':            [('fa.wrench', 'fa.play'), {'options': [{'offset':(0.0, -0.1)}, {'offset': (0.2, 0.125), 'color': 'green', 'scale_factor': 0.8}]}],
     'run_again':               [('fa.repeat', 'fa.play'), {'options': [{'offset':(0.0, -0.1)}, {'offset': (0.2, 0.125), 'color': 'green', 'scale_factor': 0.8}]}],
     'run_selection':           [('spyder.run-selection',), {}],
-    'run_cell':                [('spyder.cell-page', 'spyder.cell-border', 'spyder.cell-code', 'spyder.cell-page-shadow', 'spyder.cell-play'),
-                                {'options': [{'color': 'white'}, {'color': 'gray'}, {'color': '#fff683'}, {}, {'color': 'green'}]}],
-    'run_cell_advance':        [('spyder.cell-page', 'spyder.cell-border', 'spyder.cell-code', 'spyder.cell-page-shadow', 'spyder.cell-play', 'spyder.cell-next'),
-                                {'options': [{'color': 'white'}, {'color': 'gray'}, {'color': '#fff683'}, {}, {'color': 'green'}, {'color': 'red'}]}],
-    'todo_list':               [('fa.th-list', 'fa.check'), {'options': [{'color': '#3775a9'}, {'offset': (0.0, 0.2), 'color': 'orange', 'color_disabled': '#face7e'}]}],
-    'wng_list':                [('fa.th-list', 'fa.warning'), {'options': [{'color': '#3775a9'}, {'offset': (0.0, 0.2), 'scale_factor': 0.75, 'color': 'orange', 'color_disabled': '#face7e'}]}],
-    'prev_wng':                [('fa.arrow-left', 'fa.warning'), {'options': [{'color': '#3775a9'}, {'offset': (0.0, 0.2), 'scale_factor': 0.75, 'color': 'orange', 'color_disabled': '#face7e'}]}],
-    'next_wng':                [('fa.arrow-right', 'fa.warning'), {'options': [{'color': '#3775a9'}, {'offset': (0.0, 0.2), 'scale_factor': 0.75, 'color': 'orange', 'color_disabled': '#face7e'}]}],
+    'run_cell':                [('spyder.cell-code', 'spyder.cell-border', 'spyder.cell-play'),
+                                {'options': [{'color': '#fff683'}, {}, {'color': 'green'}]}],
+    'run_cell_advance':        [('spyder.cell-code', 'spyder.cell-border', 'spyder.cell-play', 'spyder.cell-next'),
+                                {'options': [{'color': '#fff683'}, {}, {'color': 'green'}, {'color': 'red'}]}],
+    'todo_list':               [('fa.th-list', 'fa.check'), {'options': [{'color': '#999999'}, {'offset': (0.0, 0.2), 'color': '#3775a9', 'color_disabled': '#748fa6'}]}],
+    'wng_list':                [('fa.th-list', 'fa.warning'), {'options': [{'color': '#999999'}, {'offset': (0.0, 0.2), 'scale_factor': 0.75, 'color': 'orange', 'color_disabled': '#face7e'}]}],
+    'prev_wng':                [('fa.arrow-left', 'fa.warning'), {'options': [{'color': '#999999'}, {'offset': (0.0, 0.2), 'scale_factor': 0.75, 'color': 'orange', 'color_disabled': '#face7e'}]}],
+    'next_wng':                [('fa.arrow-right', 'fa.warning'), {'options': [{'color': '999999'}, {'offset': (0.0, 0.2), 'scale_factor': 0.75, 'color': 'orange', 'color_disabled': '#face7e'}]}],
     'last_edit_location':      [('fa.caret-up',), {}],
     'prev_cursor':             [('fa.hand-o-left',), {}],
     'next_cursor':             [('fa.hand-o-right',), {}],
@@ -72,9 +74,9 @@ _qtaargs = {
     'indent':                  [('fa.indent',), {}],
     'unindent':                [('fa.outdent',), {}],
     'gotoline':                [('fa.sort-numeric-asc',), {}],
-    'error':                   [('fa.times-circle',), {}],
+    'error':                   [('fa.times-circle',), {'color': 'darkred'}],
     'warning':                 [('fa.warning',), {'color': 'orange'}],
-    'todo':                    [('fa.check',), {'color': 'orange'}],
+    'todo':                    [('fa.check',), {'color': '#3775a9'}],
     'ipython_console':         [('spyder.ipython-logo-alt',), {}],
     'ipython_console_t':       [('spyder.ipython-logo-alt',), {'color':'gray'}],
     'python':                  [('spyder.python-logo-up', 'spyder.python-logo-down'), {'options': [{'color': '#3775a9'}, {'color': '#ffd444'}]}],
@@ -87,7 +89,7 @@ _qtaargs = {
     'findf':                   [('fa.file-o', 'fa.search'), {'options': [{'scale_factor': 1.0}, {'scale_factor': 0.6}]}],
     'history24':               [('fa.history',), {}],
     'history':                 [('fa.history',), {}],
-    'inspector':               [('fa.question-circle',), {}],
+    'help':                    [('fa.question-circle',), {}],
     'lock':                    [('fa.lock',), {}],
     'lock_open':               [('fa.unlock-alt',), {}],
     'outline_explorer':        [('spyder.treeview',), {}],
@@ -99,7 +101,6 @@ _qtaargs = {
     'up':                      [('fa.arrow-up',), {}],
     'down':                    [('fa.arrow-down',), {}],
     'filesaveas2':             [('fa.save', 'fa.close'), {'options': [{'scale_factor': 0.8, 'offset': (-0.1, -0.1)}, {'offset': (0.2, 0.2)}]}],   # save_session_action
-    'spyder_light':            [('spyder.spyder-logo-background', 'spyder.spyder-logo-web'), {'options': [{'color': '#414141'}, {'color': '#fafafa'}]}],
     'spyder':                  [('spyder.spyder-logo-background', 'spyder.spyder-logo-web', 'spyder.spyder-logo-snake'),  {'options': [{'color': '#414141'}, {'color': '#fafafa'}, {'color': '#ee0000'}]}],
     'find':                    [('fa.search',), {}],
     'findnext':                [('fa.search', 'fa.long-arrow-down'), {'options':[{'scale_factor': 0.6, 'offset': (0.3, 0.0)}, {'offset': (-0.3, 0.0)}]}],
@@ -107,7 +108,7 @@ _qtaargs = {
     'replace':                 [('fa.exchange',), {}],
     'undo':                    [('fa.undo',), {}],
     'redo':                    [('fa.repeat',), {}],
-    'restart':                 [('fa.repeat',), {}],
+    'restart':                 [('fa.repeat',), {'çolor': '#3775a9'}],
     'editcopy':                [('fa.copy',), {}],
     'editcut':                 [('fa.scissors',), {}],
     'editpaste':               [('fa.clipboard',), {}],
@@ -115,7 +116,7 @@ _qtaargs = {
     'editclear':               [('fa.times',), {}],
     'selectall':               [('spyder.text-select-all',), {}],
     'pythonpath_mgr':          [('spyder.python-logo-up', 'spyder.python-logo-down'), {'options': [{'color': '#3775a9'}, {'color': '#ffd444'}]}],
-    'exit':                    [('fa.power-off',), {}],
+    'exit':                    [('fa.power-off',), {'color': 'darkred'}],
     'advanced':                [('fa.gear',), {}],
     'bug':                     [('fa.bug',), {}],
     'maximize':                [('spyder.maximize-pane',), {}],
@@ -142,9 +143,9 @@ _qtaargs = {
     'horsplit':                [('fa.columns',), {}],
     'close_panel':             [('fa.close',), {}],
     'class':                   [('spyder.circle-letter-c',), {'color':'#3775a9'}],
-    'private2':                [('fa.minus-circle',), {'color':'#7ea67e'}],
-    'private1':                [('fa.minus-circle',), {'color':'#7ea67e'}],
-    'method':                  [('spyder.circle-letter-m',), {'color':'green'}],
+    'private2':                [('spyder.circle-underscore',), {'color':'#e69c9c'}],
+    'private1':                [('spyder.circle-underscore',), {'color':'#e69c9c'}],
+    'method':                  [('spyder.circle-letter-m',), {'color':'#7ea67e'}],
     'function':                [('spyder.circle-letter-f',), {'color':'orange'}],
     'blockcomment':            [('spyder.circle-hash',), {'color':'grey'}],
     'cell':                    [('spyder.circle-percent',), {'color':'red'}],
@@ -167,10 +168,9 @@ _qtaargs = {
     'ArrowForward':            [('fa.arrow-circle-right',), {}],
     'DialogApplyButton':       [('fa.check',), {}],
     'DialogCloseButton':       [('fa.close',), {}],
-    'DialogHelpButton':        [('fa.question',), {}],
     'DirClosedIcon':           [('fa.folder-o',), {}],
-    'DialogHelpButton':        [('fa.life-ring',), {}],
-    'MessageBoxInformation':   [('fa.info',), {}],
+    'DialogHelpButton':        [('fa.life-ring',), {'color': 'darkred'}],
+    'MessageBoxInformation':   [('fa.info',), {'color': '3775a9'}],
     'DirOpenIcon':             [('fa.folder-open',), {}],
     'FileIcon':                [('fa.file-o',), {}],
     'DriveHDIcon':             [('fa.hdd-o',), {}],
@@ -189,7 +189,7 @@ _qtaargs = {
     '2uparrow':                [('fa.angle-double-up',), {}],
     '1uparrow':                [('fa.angle-up',), {}],
     '2downarrow':              [('fa.angle-double-down',), {}],
-    '1downarrow':              [('fa.angle-down',), {}],    
+    '1downarrow':              [('fa.angle-down',), {}],
     'attribute':               [('spyder.circle-letter-a',), {'color': 'magenta'}],
     'module':                  [('spyder.circle-letter-m',), {'color': '#daa520'}],
     'no_match':                [('fa.circle',), {'color': 'gray'}],
@@ -218,12 +218,14 @@ def get_std_icon(name, size=None):
 
 
 def get_icon(name, default=None, resample=False):
-    """Return image inside a QIcon object
+    """Return image inside a QIcon object.
+
     default: default image name or icon
     resample: if True, manually resample icon pixmaps for usual sizes
-    (16, 24, 32, 48, 96, 128, 256). This is recommended for QMainWindow icons 
-    created from SVG images on non-Windows platforms due to a Qt bug (see 
-    Issue 1314)."""
+    (16, 24, 32, 48, 96, 128, 256). This is recommended for QMainWindow icons
+    created from SVG images on non-Windows platforms due to a Qt bug (see
+    Issue 1314).
+    """
 
     icon_path = get_image_path(name, default=None)
     if icon_path is not None:
@@ -258,7 +260,7 @@ def icon(name, resample=False, icon_path=None):
     elif theme == 'spyder 2':
         icon = get_icon(name + '.png', resample=resample)
         if icon_path:
-            icon_path = Path(icon_path) / (name + '.png')
-            if icon_path.isfile():
+            icon_path = osp.join(icon_path, name + '.png')
+            if osp.isfile(icon_path):
                 icon = QIcon(icon_path)
         return icon if icon is not None else QIcon()
diff --git a/spyderlib/utils/inspector/__init__.py b/spyderlib/utils/inspector/__init__.py
deleted file mode 100644
index f83a57d..0000000
--- a/spyderlib/utils/inspector/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2012 Spyder Development team
-# Licensed under the terms of the MIT or BSD Licenses 
-# (See every file for its license)
-
-"""
-spyderlib.utils.inspector
-========================
-
-Configuration files for the object inspector rich text mode
-"""
-
-import sys
-from spyderlib.config.base import get_module_source_path
-sys.path.insert(0, get_module_source_path(__name__))
\ No newline at end of file
diff --git a/spyderlib/utils/introspection/__init__.py b/spyderlib/utils/introspection/__init__.py
index f1835da..76f4784 100644
--- a/spyderlib/utils/introspection/__init__.py
+++ b/spyderlib/utils/introspection/__init__.py
@@ -7,6 +7,3 @@
 """
 Introspection utilities used by Spyder
 """
-from . import module_completion
-from .plugin_manager import PluginManager
-
diff --git a/spyderlib/utils/introspection/fallback_plugin.py b/spyderlib/utils/introspection/fallback_plugin.py
index 741dfe6..1e6cc2d 100644
--- a/spyderlib/utils/introspection/fallback_plugin.py
+++ b/spyderlib/utils/introspection/fallback_plugin.py
@@ -15,11 +15,14 @@ import os.path as osp
 import re
 import time
 
+from pygments.token import Token
+
 from spyderlib.utils.debug import log_dt
 from spyderlib.utils import sourcecode, encoding
-from spyderlib.utils.introspection.module_completion import module_completion
-from spyderlib.utils.introspection.plugin_manager import (
-    DEBUG_EDITOR, LOG_FILENAME, IntrospectionPlugin, memoize)
+from spyderlib.utils.introspection.manager import (
+    DEBUG_EDITOR, LOG_FILENAME, IntrospectionPlugin)
+from spyderlib.utils.introspection.utils import (
+    get_parent_until, memoize, find_lexer_for_filename, get_keywords)
 
 
 class FallbackPlugin(IntrospectionPlugin):
@@ -33,34 +36,44 @@ class FallbackPlugin(IntrospectionPlugin):
 
         Simple completion based on python-like identifiers and whitespace
         """
+        if not info['obj']:
+            return
         items = []
-        line = info.line.strip()
-        is_from = line.startswith('from')
-        if ((line.startswith('import') or is_from and ' import' not in line)
-                and info.is_python_like):
-            items += module_completion(info.line, [info.filename])
-            return [(i, 'module') for i in sorted(items)]
-        elif is_from and info.is_python_like:
-            items += module_completion(info.line, [info.filename])
-            return [(i, '') for i in sorted(items)]
-        elif info.obj:
-            base = info.obj
-            tokens = set(info.split_words(-1))
+        obj = info['obj']
+        if info['context']:
+            lexer = find_lexer_for_filename(info['filename'])
+            # get a list of token matches for the current object
+            tokens = lexer.get_tokens(info['source_code'])
+            for (context, token) in tokens:
+                token = token.strip()
+                if (context in info['context'] and
+                        token.startswith(obj) and
+                        obj != token):
+                    items.append(token)
+            # add in keywords if not in a string
+            if context not in Token.Literal.String:
+                try:
+                    keywords = get_keywords(lexer)
+                    items.extend(k for k in keywords if k.startswith(obj))
+                except Exception:
+                    pass
+        else:
+            tokens = set(re.findall(info['id_regex'], info['source_code']))
             items = [item for item in tokens if
-                     item.startswith(base) and len(item) > len(base)]
-            if '.' in base:
-                start = base.rfind('.') + 1
+                 item.startswith(obj) and len(item) > len(obj)]
+            if '.' in obj:
+                start = obj.rfind('.') + 1
             else:
                 start = 0
 
-            items = [i[start:len(base)] + i[len(base):].split('.')[0]
-                     for i in items]
-            # get path completions
-            # get last word back to a space or a quote character
-            match = re.search('''[ "\']([\w\.\\\\/]+)\Z''', info.line)
-            if match:
-                items += _complete_path(match.groups()[0])
-            return [(i, '') for i in sorted(items)]
+            items = [i[start:len(obj)] + i[len(obj):].split('.')[0]
+                 for i in items]
+        # get path completions
+        # get last word back to a space or a quote character
+        match = re.search('''[ "\']([\w\.\\\\/]+)\Z''', info['line'])
+        if match:
+            items += _complete_path(match.groups()[0])
+        return [(i, '') for i in sorted(items)]
 
     def get_definition(self, info):
         """
@@ -69,10 +82,12 @@ class FallbackPlugin(IntrospectionPlugin):
         This is used to find the path of python-like modules
         (e.g. cython and enaml) for a goto definition
         """
-        token = info.obj
-        lines = info.lines
-        source_code = info.source_code
-        filename = info.filename
+        if not info['is_python_like']:
+            return
+        token = info['obj']
+        lines = info['lines']
+        source_code = info['source_code']
+        filename = info['filename']
 
         line_nr = None
         if token is None:
@@ -84,7 +99,7 @@ class FallbackPlugin(IntrospectionPlugin):
                                             len(lines))
         if line_nr is None:
             return
-        line = info.line
+        line = info['line']
         exts = python_like_exts()
         if not osp.splitext(filename)[-1] in exts:
             return filename, line_nr
@@ -95,7 +110,7 @@ class FallbackPlugin(IntrospectionPlugin):
             if (not source_file or
                     not osp.splitext(source_file)[-1] in exts):
                 line_nr = get_definition_with_regex(source_code, token,
-                                                         line_nr)
+                                                    line_nr)
                 return filename, line_nr
             mod_name = osp.basename(source_file).split('.')[0]
             if mod_name == token or mod_name == '__init__':
@@ -110,13 +125,13 @@ class FallbackPlugin(IntrospectionPlugin):
 
     def get_info(self, info):
         """Get a formatted calltip and docstring from Fallback"""
-        if info.docstring:
-            if info.filename:
-                filename = os.path.basename(info.filename)
+        if info['docstring']:
+            if info['filename']:
+                filename = os.path.basename(info['filename'])
                 filename = os.path.splitext(filename)[0]
             else:
                 filename = '<module>'
-            resp = dict(docstring=info.docstring,
+            resp = dict(docstring=info['docstring'],
                         name=filename,
                         note='',
                         argspec='',
@@ -207,7 +222,6 @@ def get_definition_with_regex(source, token, start_line=-1):
                     'self.{0}{1}[^=!<>]*=[^=]',
                     '{0}{1}[^=!<>]*=[^=]']
         matches = get_matches(patterns, source, token, start_line)
-
     # find the one closest to the start line (prefer before the start line)
     if matches:
         min_dist = len(source.splitlines())
@@ -294,7 +308,7 @@ def _complete_path(path=None):
 
 
 if __name__ == '__main__':
-    from spyderlib.utils.introspection.plugin_manager import CodeInfo
+    from spyderlib.utils.introspection.manager import CodeInfo
 
     p = FallbackPlugin()
 
@@ -303,25 +317,25 @@ if __name__ == '__main__':
     code += '\nlog_dt'
 
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        __file__))
+        __file__, is_python_like=True))
     assert path.endswith('fallback_plugin.py')
 
     code += '\np.get_completions'
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
-    assert path == 'dummy.txt'
+        'dummy.py', is_python_like=True))
+    assert path == 'dummy.py'
     assert 'def get_completions(' in code.splitlines()[line - 1]
 
     code += '\npython_like_mod_finder'
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
-    assert path == 'dummy.txt'
+        'dummy.py', is_python_like=True))
+    assert path == 'dummy.py'
     # FIXME: we need to prioritize def over =
     assert 'def python_like_mod_finder' in code.splitlines()[line - 1]
 
     code += 'python_like_mod_finder'
     resp = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
+        'dummy.py'))
     assert resp is None
 
     code = """
@@ -332,7 +346,7 @@ if __name__ == '__main__':
     t = Test()
     t.foo"""
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
+        'dummy.py', is_python_like=True))
     assert line == 4
 
     ext = python_like_exts()
@@ -341,7 +355,7 @@ if __name__ == '__main__':
     ext = all_editable_exts()
     assert '.cpp' in ext and '.html' in ext
 
-    path = p.get_parent_until(os.path.abspath(__file__))
+    path = get_parent_until(os.path.abspath(__file__))
     assert path == 'spyderlib.utils.introspection.fallback_plugin'
 
     line = 'from spyderlib.widgets.sourcecode.codeeditor import CodeEditor'
@@ -352,42 +366,34 @@ if __name__ == '__main__':
 
     path = osp.expanduser(r'~/.spyder2/temp.py')
     if os.path.exists(path):
-        path = p.get_parent_until(path)
+        path = get_parent_until(path)
         assert path == '.spyder2.temp', path
 
     code = 'import re\n\nre'
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
-    assert path == 'dummy.txt' and line == 1
+        'dummy.py', is_python_like=True))
+    assert path == 'dummy.py' and line == 1
 
     code = 'self.proxy.widget; self.p'
-    comp = p.get_completions(CodeInfo('completions', code, len(code)))
-    assert comp[0] == ('proxy', '')
+    comp = p.get_completions(CodeInfo('completions', code, len(code), 'dummy.py'))
+    assert ('proxy', '') in comp, comp
 
     code = 'self.sigMessageReady.emit; self.s'
-    comp = p.get_completions(CodeInfo('completions', code, len(code)))
-    assert comp == [('sigMessageReady', '')]
-
-    code = encoding.to_unicode('álfa;á')
-    comp = p.get_completions(CodeInfo('completions', code, len(code)))
-    assert comp == [(encoding.to_unicode('álfa'), '')]
-
-    code = 'from numpy import one'
-    comp = p.get_completions(CodeInfo('completions', code, len(code)))
-    assert ('ones', '') in comp
+    comp = p.get_completions(CodeInfo('completions', code, len(code), 'dummy.py'))
+    assert ('sigMessageReady', '') in comp
 
-    comp = p.get_completions(CodeInfo('completions', code, len(code),
-        is_python_like=False))
-    assert not comp
+    code = 'bob = 1; bo'
+    comp = p.get_completions(CodeInfo('completions', code, len(code), 'dummy.m'))
+    assert ('bob', '') in comp
 
-    code = 'from numpy.testing import (asse'
-    comp = p.get_completions(CodeInfo('completions', code, len(code)))
-    assert ('assert_equal', '') in comp
+    code = 'functi'    
+    comp = p.get_completions(CodeInfo('completions', code, len(code), 'dummy.sh'))
+    assert ('function', '') in comp, comp
 
     code = '''
 def test(a, b):
     pass
 test(1,'''
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
+        'dummy.py', is_python_like=True))
     assert line == 2
diff --git a/spyderlib/utils/introspection/jedi_plugin.py b/spyderlib/utils/introspection/jedi_plugin.py
index 90fc2fb..34caeea 100644
--- a/spyderlib/utils/introspection/jedi_plugin.py
+++ b/spyderlib/utils/introspection/jedi_plugin.py
@@ -11,15 +11,15 @@ import re
 import os.path as osp
 import sys
 import time
-import threading
 
-from spyderlib import dependencies
-from spyderlib.config.base import _, debug_print
+from spyderlib.config.base import debug_print
 from spyderlib.utils import programs
 from spyderlib.utils.debug import log_last_error, log_dt
 from spyderlib.utils.dochelpers import getsignaturefromtext
-from spyderlib.utils.introspection.plugin_manager import (
+from spyderlib.utils.introspection.manager import (
     DEBUG_EDITOR, LOG_FILENAME, IntrospectionPlugin)
+from spyderlib.utils.introspection.utils import get_parent_until
+from spyderlib.utils.introspection.manager import JEDI_REQVER
 
 try:
     import jedi
@@ -27,13 +27,6 @@ except ImportError:
     jedi = None
 
 
-JEDI_REQVER = '>=0.8.1;<0.9.0'
-dependencies.add('jedi',
-                 _("(Experimental) Editor's code completion,"
-                   " go-to-definition and help"),
-                 required_version=JEDI_REQVER)
-
-
 class JediPlugin(IntrospectionPlugin):
     """
     Jedi based introspection plugin for jedi
@@ -49,9 +42,8 @@ class JediPlugin(IntrospectionPlugin):
         if not programs.is_module_installed('jedi', JEDI_REQVER):
             raise ImportError('Requires Jedi %s' % JEDI_REQVER)
         jedi.settings.case_insensitive_completion = False
-        self.busy = True
-        self._warmup_thread = threading.Thread(target=self.preload)
-        self._warmup_thread.start()
+        for lib in ['numpy', 'matplotlib']:
+            jedi.preload_module(lib)
 
     def get_completions(self, info):
         """Return a list of (completion, type) tuples"""
@@ -82,7 +74,7 @@ class JediPlugin(IntrospectionPlugin):
         if name is None:
             return
         if call_def.module_path:
-            mod_name = self.get_parent_until(call_def.module_path)
+            mod_name = get_parent_until(call_def.module_path)
         else:
             mod_name = None
         if not mod_name:
@@ -129,9 +121,10 @@ class JediPlugin(IntrospectionPlugin):
         module.  Falls back on token lookup if it is in an enaml file or does
         not find a match
         """
-        line, filename = info.line_num, info.filename
+        line, filename = info['line_num'], info['filename']
         def_info, module_path, line_nr = None, None, None
         gotos = self.get_jedi_object('goto_assignments', info)
+
         if gotos:
             def_info = self.get_definition_info(gotos[0])
         if def_info and def_info['goto_next']:
@@ -152,10 +145,6 @@ class JediPlugin(IntrospectionPlugin):
             return
         return module_path, line_nr
 
-    def set_pref(self, name, value):
-        """Set a plugin preference to a value"""
-        pass
-
     # ---- Private API -------------------------------------------------------
 
     def get_jedi_object(self, func_name, info, use_filename=True):
@@ -172,13 +161,13 @@ class JediPlugin(IntrospectionPlugin):
                 sys.meta_path.remove(meta)
 
         if use_filename:
-            filename = info.filename
+            filename = info['filename']
         else:
             filename = None
 
         try:
-            script = jedi.Script(info.source_code, info.line_num,
-                                 info.column, filename)
+            script = jedi.Script(info['source_code'], info['line_num'],
+                                 info['column'], filename)
             func = getattr(script, func_name)
             val = func()
         except Exception as e:
@@ -200,7 +189,10 @@ class JediPlugin(IntrospectionPlugin):
         try:
             module_path = defn.module_path
             name = defn.name
-            line_nr = defn.line_nr
+            if hasattr(defn, 'line_nr'):
+                line_nr = defn.line_nr
+            else:
+                line_nr = defn.line
             description = defn.description
             in_builtin = defn.in_builtin_module()
         except Exception as e:
@@ -241,25 +233,13 @@ class JediPlugin(IntrospectionPlugin):
             line_nr = None
         return module_path, line_nr
 
-    def preload(self):
-        """Preload a list of libraries"""
-        for lib in ['numpy']:
-            jedi.preload_module(lib)
-        self.busy = False
-
 if __name__ == '__main__':
 
-    from spyderlib.utils.introspection.plugin_manager import CodeInfo
+    from spyderlib.utils.introspection.manager import CodeInfo
 
     p = JediPlugin()
     p.load_plugin()
 
-    print('Warming up Jedi')
-    t0 = time.time()
-    while p.busy:
-        time.sleep(0.1)
-    print('Warmed up in %0.1f s' % (time.time() - t0))
-
     source_code = "import numpy; numpy.ones("
     docs = p.get_info(CodeInfo('info', source_code, len(source_code)))
 
@@ -275,10 +255,10 @@ if __name__ == '__main__':
         len(source_code)))
     assert 'frame.py' in path
 
-    source_code = 'from .plugin_manager import memoize'
+    source_code = 'from .utils import CodeInfo'
     path, line_nr = p.get_definition(CodeInfo('definition', source_code,
         len(source_code), __file__))
-    assert 'plugin_manager.py' in path and 'introspection' in path
+    assert 'utils.py' in path and 'introspection' in path
 
     code = '''
 def test(a, b):
@@ -286,7 +266,7 @@ def test(a, b):
     pass
 test(1,'''
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
+        'dummy.txt', is_python_like=True))
     assert line == 2
 
     docs = p.get_info(CodeInfo('info', code, len(code), __file__))
diff --git a/spyderlib/utils/introspection/manager.py b/spyderlib/utils/introspection/manager.py
new file mode 100644
index 0000000..9c68728
--- /dev/null
+++ b/spyderlib/utils/introspection/manager.py
@@ -0,0 +1,354 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2015 The Spyder development team
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+# Standard library imports
+from __future__ import print_function
+from collections import OrderedDict
+import time
+
+# Third party imports
+from qtpy.QtCore import QObject, QTimer, Signal
+from qtpy.QtWidgets import QApplication
+
+# Local imports
+from spyderlib import dependencies
+from spyderlib.config.base import _, DEBUG, debug_print, get_conf_path
+from spyderlib.utils import sourcecode
+from spyderlib.utils.introspection.plugin_client import PluginClient
+from spyderlib.utils.introspection.utils import CodeInfo
+
+
+PLUGINS = ['rope', 'jedi', 'fallback']
+
+LOG_FILENAME = get_conf_path('introspection.log')
+DEBUG_EDITOR = DEBUG >= 3
+LEAD_TIME_SEC = 0.25
+
+
+ROPE_REQVER = '>=0.9.4'
+dependencies.add('rope',
+                 _("Editor's code completion, go-to-definition and help"),
+                 required_version=ROPE_REQVER)
+
+JEDI_REQVER = '>=0.8.1'
+dependencies.add('jedi',
+                 _("Editor's code completion, go-to-definition and help"),
+                 required_version=JEDI_REQVER)
+
+
+class PluginManager(QObject):
+
+    introspection_complete = Signal(object)
+
+    def __init__(self, executable):
+        super(PluginManager, self).__init__()
+        plugins = OrderedDict()
+        for name in PLUGINS:
+            try:
+                plugin = PluginClient(name, executable)
+                plugin.run()
+            except Exception as e:
+                debug_print('Introspection Plugin Failed: %s' % name)
+                debug_print(str(e))
+                continue
+            debug_print('Introspection Plugin Loaded: %s' % name)
+            plugins[name] = plugin
+            plugin.received.connect(self.handle_response)
+        self.plugins = plugins
+        self.timer = QTimer()
+        self.desired = []
+        self.ids = dict()
+        self.info = None
+        self.request = None
+        self.pending = None
+        self.pending_request = None
+        self.waiting = False
+
+    def send_request(self, info):
+        """Handle an incoming request from the user."""
+        if self.waiting:
+            if info.serialize() != self.info.serialize():
+                self.pending_request = info
+            else:
+                debug_print('skipping duplicate request')
+            return
+        debug_print('%s request' % info.name)
+        desired = None
+        self.info = info
+        editor = info.editor
+        if (info.name == 'completion' and 'jedi' not in self.plugins and
+                info.line.lstrip().startswith(('import ', 'from '))):
+            desired = 'fallback'
+
+        if ((not editor.is_python_like()) or
+                sourcecode.is_keyword(info.obj) or
+                (editor.in_comment_or_string() and info.name != 'info')):
+            desired = 'fallback'
+
+        plugins = self.plugins.values()
+        if desired:
+            plugins = [self.plugins[desired]]
+            self.desired = [desired]
+        elif (info.name == 'definition' and not info.editor.is_python() or
+              info.name == 'info'):
+            self.desired = list(self.plugins.keys())
+        else:
+            # Use all but the fallback
+            plugins = list(self.plugins.values())[:-1]
+            self.desired = list(self.plugins.keys())[:-1]
+
+        self._start_time = time.time()
+        self.waiting = True
+        method = 'get_%s' % info.name
+        value = info.serialize()
+        self.ids = dict()
+        for plugin in plugins:
+            request_id = plugin.request(method, value)
+            self.ids[request_id] = plugin.name
+        self.timer.stop()
+        self.timer.singleShot(LEAD_TIME_SEC * 1000, self._handle_timeout)
+
+    def validate(self):
+        for plugin in self.plugins.values():
+            plugin.request('validate')
+
+    def handle_response(self, response):
+        name = self.ids.get(response['request_id'], None)
+        if not name:
+            return
+        if response.get('error', None):
+            debug_print('Response error:', response['error'])
+            return
+        if name == self.desired[0] or not self.waiting:
+            if response.get('result', None):
+                self._finalize(response)
+        else:
+            self.pending = response
+
+    def close(self):
+        [plugin.close() for plugin in self.plugins]
+
+    def _finalize(self, response):
+        self.waiting = False
+        self.pending = None
+        if self.info:
+            delta = time.time() - self._start_time
+            debug_print('%s request from %s finished: "%s" in %.1f sec'
+                % (self.info.name, response['name'],
+                   str(response['result'])[:100], delta))
+            response['info'] = self.info
+            self.introspection_complete.emit(response)
+            self.info = None
+        if self.pending_request:
+            info = self.pending_request
+            self.pending_request = None
+            self.send_request(info)
+
+    def _handle_timeout(self):
+        self.waiting = False
+        if self.pending:
+            self._finalize(self.pending)
+        else:
+            debug_print('No valid responses acquired')
+
+
+class IntrospectionManager(QObject):
+
+    send_to_help = Signal(str, str, str, str, bool)
+    edit_goto = Signal(str, int, str)
+
+    def __init__(self, executable=None):
+        super(IntrospectionManager, self).__init__()
+        self.editor_widget = None
+        self.pending = None
+        self.plugin_manager = PluginManager(executable)
+        self.plugin_manager.introspection_complete.connect(
+            self._introspection_complete)
+
+    def change_executable(self, executable):
+        self.plugin_manager.close()
+        self.plugin_manager = PluginManager(executable)
+        self.plugin_manager.introspection_complete.connect(
+            self._introspection_complete)
+
+    def set_editor_widget(self, editor_widget):
+        self.editor_widget = editor_widget
+
+    def _get_code_info(self, name, position=None, **kwargs):
+
+        editor = self.editor_widget.get_current_editor()
+        finfo = self.editor_widget.get_current_finfo()
+        in_comment_or_string = editor.in_comment_or_string()
+
+        if position is None:
+            position = editor.get_position('cursor')
+
+        kwargs['editor'] = editor
+        kwargs['finfo'] = finfo
+        kwargs['editor_widget'] = self.editor_widget
+
+        return CodeInfo(name, finfo.get_source_code(), position,
+            finfo.filename, editor.is_python_like, in_comment_or_string,
+            **kwargs)
+
+    def get_completions(self, automatic):
+        """Get code completion"""
+        info = self._get_code_info('completions', automatic=automatic)
+        self.plugin_manager.send_request(info)
+
+    def go_to_definition(self, position):
+        """Go to definition"""
+        info = self._get_code_info('definition', position)
+        self.plugin_manager.send_request(info)
+
+    def show_object_info(self, position, auto=True):
+        """Show signature calltip and/or docstring in the Help plugin"""
+        # auto is True means that this method was called automatically,
+        # i.e. the user has just entered an opening parenthesis -- in that
+        # case, we don't want to force Help to be visible, to avoid polluting
+        # the window layout
+        info = self._get_code_info('info', position, auto=auto)
+        self.plugin_manager.send_request(info)
+
+    def validate(self):
+        """Validate the plugins"""
+        self.plugin_manager.validate()
+
+    def is_editor_ready(self):
+        """Check if the main app is starting up"""
+        if self.editor_widget:
+            window = self.editor_widget.window()
+            if hasattr(window, 'is_starting_up') and not window.is_starting_up:
+                return True
+
+    def _introspection_complete(self, response):
+        """
+        Handle an introspection response completion.
+
+        Route the response to the correct handler.
+        """
+        result = response.get('result', None)
+        if result is None:
+            return
+        info = response['info']
+        current = self._get_code_info(response['info']['name'])
+
+        if result and current.filename == info.filename:
+            func = getattr(self, '_handle_%s_result' % info.name)
+            try:
+                func(result, current, info)
+            except Exception as e:
+                debug_print(e)
+
+    def _handle_completions_result(self, comp_list, info, prev_info):
+        """
+        Handle a `completions` result.
+
+        Only handle the response if we are on the same line of text and
+        on the same `obj` as the original request.
+        """
+        if info.line_num != prev_info.line_num:
+            return
+        completion_text = info.obj
+        prev_text = prev_info.obj
+
+        if prev_info.obj is None:
+            completion_text = ''
+            prev_text = ''
+
+        if not completion_text.startswith(prev_text):
+            return
+
+        if info.full_obj and len(info.full_obj) > len(info.obj):
+            new_list = [(c, t) for (c, t) in comp_list
+                        if c.startswith(info.full_obj)]
+            if new_list:
+                pos = info.editor.get_position('cursor')
+                new_pos = pos + len(info.full_obj) - len(info.obj)
+                info.editor.set_cursor_position(new_pos)
+                completion_text = info.full_obj
+                comp_list = new_list
+
+        if '.' in completion_text:
+            completion_text = completion_text.split('.')[-1]
+
+        comp_list = [(c.split('.')[-1], t) for (c, t) in comp_list]
+        comp_list = [(c, t) for (c, t) in comp_list
+                     if c.startswith(completion_text)]
+
+        info.editor.show_completion_list(comp_list, completion_text,
+                                         prev_info.automatic)
+
+    def _handle_info_result(self, resp, info, prev_info):
+        """
+        Handle an `info` result, triggering a calltip and/or docstring.
+
+        Only handle the response if we are on the same line of text as
+        when the request was initiated.
+        """
+        if info.line_num != prev_info.line_num:
+            return
+
+        if resp['calltip']:
+            info.editor.show_calltip('Arguments', resp['calltip'],
+                                     signature=True,
+                                     at_position=prev_info.position)
+
+        if resp['name']:
+            self.send_to_help.emit(
+                resp['name'], resp['argspec'],
+                resp['note'], resp['docstring'],
+                not prev_info.auto)
+
+    def _handle_definition_result(self, resp, info, prev_info):
+        """Handle a `definition` result"""
+        fname, lineno = resp
+        self.edit_goto.emit(fname, lineno, "")
+
+    def _post_message(self, message, timeout=60000):
+        """
+        Post a message to the main window status bar with a timeout in ms
+        """
+        if self.editor_widget:
+            try:
+                statusbar = self.editor_widget.window().statusBar()
+                statusbar.showMessage(message, timeout)
+                QApplication.processEvents()
+            except AttributeError:
+                pass
+
+
+class IntrospectionPlugin(object):
+
+    def load_plugin(self):
+        """Initialize the plugin"""
+        pass
+
+    def get_completions(self, info):
+        """Get a list of completions"""
+        pass
+
+    def get_info(self, info):
+        """
+        Find the calltip and docs
+
+        Returns a dict like the following:
+           {'note': 'Function of numpy.core.numeric...',
+            'argspec': "(shape, dtype=None, order='C')'
+            'docstring': 'Return an array of given...'
+            'name': 'ones',
+            'calltip': 'ones(shape, dtype=None, order='C')'}
+        """
+        pass
+
+    def get_definition(self, info):
+        """Get a (filename, line_num) location for a definition"""
+        pass
+
+    def validate(self):
+        """Validate the plugin"""
+        pass
+
diff --git a/spyderlib/utils/introspection/module_completion.py b/spyderlib/utils/introspection/module_completion.py
index c75f114..b87c6fc 100644
--- a/spyderlib/utils/introspection/module_completion.py
+++ b/spyderlib/utils/introspection/module_completion.py
@@ -286,6 +286,7 @@ def get_preferred_submodules():
             'PyQt4', 'PySide', 'os.path']
 
     submodules = []
+
     for m in mods:
         submods = get_submodules(m)
         submodules += submods
@@ -329,3 +330,5 @@ if __name__ == "__main__":
     assert module_completion(s + '(dum') == ['dump']
 
     assert module_completion(s + '(dump, Su') == ['SubElement']
+
+    assert 'os.path' in get_preferred_submodules()
diff --git a/spyderlib/utils/introspection/plugin_client.py b/spyderlib/utils/introspection/plugin_client.py
new file mode 100644
index 0000000..b191fb5
--- /dev/null
+++ b/spyderlib/utils/introspection/plugin_client.py
@@ -0,0 +1,227 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2016 The Spyder development team
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+# Local imports
+import imp
+import os
+import os.path as osp
+import sys
+import uuid
+
+# Third party imports
+from qtpy.QtCore import (QObject, QProcess, QProcessEnvironment,
+                         QSocketNotifier, QTimer, Signal)
+from qtpy.QtWidgets import QApplication
+import zmq
+
+# Local imports
+from spyderlib.config.base import debug_print, DEV, get_module_path
+
+
+# Heartbeat timer in milliseconds
+HEARTBEAT = 1000
+
+
+class AsyncClient(QObject):
+
+    """
+    A class which handles a connection to a client through a QProcess.
+    """
+
+    # Emitted when the client has initialized.
+    initialized = Signal()
+
+    # Emitted when the client errors.
+    errored = Signal()
+
+    # Emitted when a request response is received.
+    received = Signal(object)
+
+    def __init__(self, target, executable=None, name=None,
+                 extra_args=None, libs=None, cwd=None, env=None):
+        super(AsyncClient, self).__init__()
+        self.executable = executable or sys.executable
+        self.extra_args = extra_args
+        self.target = target
+        self.name = name or self
+        self.libs = libs
+        self.cwd = cwd
+        self.env = env
+        self.is_initialized = False
+        self.closing = False
+        self.context = zmq.Context()
+        QApplication.instance().aboutToQuit.connect(self.close)
+
+        # Set up the heartbeat timer.
+        self.timer = QTimer(self)
+        self.timer.timeout.connect(self._heartbeat)
+
+    def run(self):
+        """Handle the connection with the server.
+        """
+        # Set up the zmq port.
+        self.socket = self.context.socket(zmq.PAIR)
+        self.port = self.socket.bind_to_random_port('tcp://*')
+
+        # Set up the process.
+        self.process = QProcess(self)
+        if self.cwd:
+            self.process.setWorkingDirectory(self.cwd)
+        p_args = ['-u', self.target, str(self.port)]
+        if self.extra_args is not None:
+            p_args += self.extra_args
+
+        # Set up environment variables.
+        processEnvironment = QProcessEnvironment()
+        env = self.process.systemEnvironment()
+        if (self.env and 'PYTHONPATH' not in self.env) or DEV:
+            python_path = osp.dirname(get_module_path('spyderlib'))
+            # Add the libs to the python path.
+            for lib in self.libs:
+                try:
+                    path = osp.dirname(imp.find_module(lib)[1])
+                    python_path = osp.pathsep.join([python_path, path])
+                except ImportError:
+                    pass
+            env.append("PYTHONPATH=%s" % python_path)
+        if self.env:
+            env.update(self.env)
+        for envItem in env:
+            envName, separator, envValue = envItem.partition('=')
+            processEnvironment.insert(envName, envValue)
+        self.process.setProcessEnvironment(processEnvironment)
+
+        # Start the process and wait for started.
+        self.process.start(self.executable, p_args)
+        self.process.finished.connect(self._on_finished)
+        running = self.process.waitForStarted()
+        if not running:
+            raise IOError('Could not start %s' % self)
+
+        # Set up the socket notifer.
+        fid = self.socket.getsockopt(zmq.FD)
+        self.notifier = QSocketNotifier(fid, QSocketNotifier.Read, self)
+        self.notifier.activated.connect(self._on_msg_received)
+
+    def request(self, func_name, *args, **kwargs):
+        """Send a request to the server.
+
+        The response will be a dictionary the 'request_id' and the
+        'func_name' as well as a 'result' field with the object returned by
+        the function call or or an 'error' field with a traceback.
+        """
+        if not self.is_initialized:
+            return
+        request_id = uuid.uuid4().hex
+        request = dict(func_name=func_name,
+                       args=args,
+                       kwargs=kwargs,
+                       request_id=request_id)
+        self._send(request)
+        return request_id
+
+    def close(self):
+        """Cleanly close the connection to the server.
+        """
+        self.closing = True
+        self.is_initialized = False
+        self.timer.stop()
+        self.notifier.activated.disconnect(self._on_msg_received)
+        self.notifier.setEnabled(False)
+        del self.notifier
+        self.request('server_quit')
+        self.process.waitForFinished(1000)
+        self.process.close()
+        self.context.destroy()
+
+    def _on_finished(self):
+        """Handle a finished signal from the process.
+        """
+        if self.closing:
+            return
+        if self.is_initialized:
+            debug_print('Restarting %s' % self.name)
+            debug_print(self.process.readAllStandardOutput())
+            debug_print(self.process.readAllStandardError())
+            self.is_initialized = False
+            self.notifier.setEnabled(False)
+            self.run()
+        else:
+            debug_print('Errored %s' % self.name)
+            debug_print(self.process.readAllStandardOutput())
+            debug_print(self.process.readAllStandardError())
+            self.errored.emit()
+
+    def _on_msg_received(self):
+        """Handle a message trigger from the socket.
+        """
+        self.notifier.setEnabled(False)
+        while 1:
+            try:
+                resp = self.socket.recv_pyobj(flags=zmq.NOBLOCK)
+            except zmq.ZMQError:
+                self.notifier.setEnabled(True)
+                return
+            if not self.is_initialized:
+                self.is_initialized = True
+                debug_print('Initialized %s' % self.name)
+                self.initialized.emit()
+                self.timer.start(HEARTBEAT)
+                continue
+            resp['name'] = self.name
+            self.received.emit(resp)
+
+    def _heartbeat(self):
+        """Send a heartbeat to keep the server alive.
+        """
+        self._send(dict(func_name='server_heartbeat'))
+
+    def _send(self, obj):
+        """Send an object to the server.
+        """
+        try:
+            self.socket.send_pyobj(obj)
+        except Exception as e:
+            debug_print(e)
+            self.is_initialized = False
+            self._on_finished()
+
+
+class PluginClient(AsyncClient):
+
+    def __init__(self, plugin_name, executable=None, env=None):
+        cwd = os.path.dirname(__file__)
+        super(PluginClient, self).__init__('plugin_server.py',
+            executable=executable, cwd=cwd, env=env,
+            extra_args=[plugin_name], libs=[plugin_name])
+        self.name = plugin_name
+
+
+if __name__ == '__main__':
+    app = QApplication(sys.argv)
+    plugin = PluginClient('jedi')
+    plugin.run()
+
+    def handle_return(value):
+        print(value)
+        if value['func_name'] == 'foo':
+            app.quit()
+        else:
+            plugin.request('foo')
+
+    def handle_errored():
+        print('errored')
+        sys.exit(1)
+
+    def start():
+        print('start')
+        plugin.request('validate')
+
+    plugin.errored.connect(handle_errored)
+    plugin.received.connect(handle_return)
+    plugin.initialized.connect(start)
+
+    app.exec_()
diff --git a/spyderlib/utils/introspection/plugin_manager.py b/spyderlib/utils/introspection/plugin_manager.py
deleted file mode 100644
index 258a684..0000000
--- a/spyderlib/utils/introspection/plugin_manager.py
+++ /dev/null
@@ -1,584 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2015 The Spyder development team
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-from __future__ import print_function
-
-import re
-from collections import OrderedDict
-import functools
-import os.path as osp
-import os
-import imp
-import time
-
-from spyderlib.config.base import DEBUG, get_conf_path, debug_print
-from spyderlib.utils.introspection.module_completion import (
-    get_preferred_submodules)
-from spyderlib.utils import sourcecode
-from spyderlib.utils.debug import log_last_error
-
-from spyderlib.qt.QtGui import QApplication
-from spyderlib.qt.QtCore import Signal, QThread, QObject, QTimer
-
-
-PLUGINS = ['rope', 'jedi', 'fallback']
-
-LOG_FILENAME = get_conf_path('introspection.log')
-DEBUG_EDITOR = DEBUG >= 3
-LEAD_TIME_SEC = 0.25
-
-
-class RequestHandler(QObject):
-
-    """Handle introspection request.
-    """
-
-    introspection_complete = Signal()
-
-    def __init__(self, code_info, plugins):
-        super(RequestHandler, self).__init__()
-        self.info = code_info
-        self.timer = QTimer()
-        self.timer.singleShot(LEAD_TIME_SEC * 1000, self._handle_timeout)
-        self.waiting = True
-        self.pending = {}
-        self.result = None
-        self.plugins = plugins
-        self._start_time = time.time()
-        self._threads = {}
-        for plugin in plugins:
-            self._make_async_call(plugin, code_info)
-
-    def _handle_timeout(self):
-        debug_print('got timeout: %s' % self.plugins)
-        if self.pending:
-            for plugin in self.plugins:
-                if plugin.name in self.pending:
-                    self._finalize(plugin.name, self.pending[plugin.name])
-                    return
-        self.waiting = False
-
-    def _handle_incoming(self, name):
-        # coerce to a str in case it is a QString
-        name = str(name)
-        try:
-            self._threads[name].wait()
-        except AttributeError:
-            return
-        if self.result:
-            return
-        result = self._threads[name].result
-        if name == self.plugins[0].name or not self.waiting:
-            if result:
-                self._finalize(name, result)
-            else:
-                debug_print('No valid responses acquired')
-                self.introspection_complete.emit()
-        else:
-            self.pending[name] = result
-
-    def _make_async_call(self, plugin, info):
-        """Trigger an introspection job in a thread"""
-        self._threads[str(plugin.name)] = thread = IntrospectionThread(plugin, info)
-        thread.request_handled.connect(self._handle_incoming)
-        thread.start()
-
-    def _finalize(self, name, result):
-        self.result = result
-        self.waiting = False
-        self.pending = None
-        delta = time.time() - self._start_time
-        debug_print('%s request from %s finished: "%s" in %.1f sec'
-            % (self.info.name, name, str(result)[:100], delta))
-        self.introspection_complete.emit()
-
-
-class GetSubmodulesThread(QThread):
-
-    """
-    A thread to generate a list of submodules to be passed to
-    introspection plugins
-    """
-
-    def __init__(self):
-        super(GetSubmodulesThread, self).__init__()
-        self.submods = []
-
-    def run(self):
-        self.submods = get_preferred_submodules()
-
-
-class IntrospectionThread(QThread):
-
-    """
-    A thread to perform an introspection task
-    """
-
-    request_handled = Signal(str)
-
-    def __init__(self, plugin, info):
-        super(IntrospectionThread, self).__init__()
-        self.plugin = plugin
-        self.info = info
-        self.result = None
-
-    def run(self):
-        func = getattr(self.plugin, 'get_%s' % self.info.name)
-        self.plugin.busy = True
-        try:
-            self.result = func(self.info)
-        except Exception as e:
-            debug_print(e)
-        self.plugin.busy = False
-        self.request_handled.emit(self.plugin.name)
-
-
-class CodeInfo(object):
-
-    id_regex = re.compile(r'[^\d\W][\w\.]*', re.UNICODE)
-    func_call_regex = re.compile(r'([^\d\W][\w\.]*)\([^\)\()]*\Z',
-                                 re.UNICODE)
-
-    def __init__(self, name, source_code, position, filename=None,
-            is_python_like=True, in_comment_or_string=False, **kwargs):
-        self.__dict__.update(kwargs)
-        self.name = name
-        self.filename = filename
-        self.source_code = source_code
-        self.is_python_like = is_python_like
-        self.in_comment_or_string = in_comment_or_string
-        self.position = position
-
-        # if in a comment, look for the previous definition
-        if in_comment_or_string:
-            # if this is a docstring, find it, set as our
-            self.docstring = self._get_docstring()
-            # backtrack and look for a line that starts with def or class
-            while position:
-                base = self.source_code[position: position + 6]
-                if base.startswith('def ') or base.startswith('class '):
-                    position += base.index(' ') + 1
-                    break
-                position -= 1
-        else:
-            self.docstring = ''
-
-        self.position = position
-
-        if position == 0:
-            self.lines = []
-            self.column = 0
-            self.line_num = 0
-            self.line = ''
-            self.obj = ''
-            self.full_obj = ''
-        else:
-            self._get_info()
-
-    def _get_info(self):
-
-        self.lines = self.source_code[:self.position].splitlines()
-        self.line_num = len(self.lines)
-
-        self.line = self.lines[-1]
-        self.column = len(self.lines[-1])
-
-        tokens = re.findall(self.id_regex, self.line)
-        if tokens and self.line.endswith(tokens[-1]):
-            self.obj = tokens[-1]
-        else:
-            self.obj = None
-
-        self.full_obj = self.obj
-
-        if self.obj:
-            full_line = self.source_code.splitlines()[self.line_num - 1]
-            rest = full_line[self.column:]
-            match = re.match(self.id_regex, rest)
-            if match:
-                self.full_obj = self.obj + match.group()
-
-        if (self.name in ['info', 'definition'] and (not self.obj)
-                and self.is_python_like):
-            func_call = re.findall(self.func_call_regex, self.line)
-            if func_call:
-                self.obj = func_call[-1]
-                self.column = self.line.index(self.obj) + len(self.obj)
-                self.position = self.position - len(self.line) + self.column
-
-    def split_words(self, position=None):
-        """
-        Split our source code into valid identifiers.
-
-        """
-        if position is None:
-            position = self.offset
-        text = self.source_code[:position]
-        return re.findall(self.id_regex, text)
-
-    def _get_docstring(self):
-        """Find the docstring we are currently in"""
-        left = self.position
-        while left:
-            if self.source_code[left: left + 3] in ['"""', "'''"]:
-                left += 3
-                break
-            left -= 1
-        right = self.position
-        while right < len(self.source_code):
-            if self.source_code[right - 3: right] in ['"""', "'''"]:
-                right -= 3
-                break
-            right += 1
-        if left and right < len(self.source_code):
-            return self.source_code[left: right]
-        return ''
-
-    def __eq__(self, other):
-        try:
-            return self.__dict__ == other.__dict__
-        except Exception:
-            return False
-
-
-class PluginManager(QObject):
-
-    send_to_inspector = Signal(str, str, str, str, bool)
-    edit_goto = Signal(str, int, str)
-
-    def __init__(self, editor_widget):
-        super(PluginManager, self).__init__()
-        self.editor_widget = editor_widget
-        self.pending = None
-        self.busy = False
-        self.load_plugins()
-        self._submods_thread = GetSubmodulesThread()
-        self._submods_thread.finished.connect(self._update_extension_modules)
-        self._submods_thread.start()
-
-    def load_plugins(self):
-        """Get and load a plugin, checking in order of PLUGINS"""
-        plugins = OrderedDict()
-        for plugin_name in PLUGINS:
-            mod_name = plugin_name + '_plugin'
-            try:
-                mod = __import__('spyderlib.utils.introspection.' + mod_name,
-                                 fromlist=[mod_name])
-                cls = getattr(mod, '%sPlugin' % plugin_name.capitalize())
-                plugin = cls()
-                plugin.load_plugin()
-            except Exception as e:
-                debug_print(e)
-                if DEBUG_EDITOR:
-                    log_last_error(LOG_FILENAME)
-            else:
-                plugins[plugin_name] = plugin
-                debug_print('Instropection Plugin Loaded: %s' % plugin.name)
-        self.plugins = plugins
-        debug_print('Plugins loaded: %s' % self.plugins.keys())
-        return plugins
-
-    def _get_code_info(self, name, position=None, **kwargs):
-
-        editor = self.editor_widget.get_current_editor()
-        finfo = self.editor_widget.get_current_finfo()
-        in_comment_or_string = editor.in_comment_or_string()
-
-        if position is None:
-            position = editor.get_position('cursor')
-
-        kwargs['editor'] = editor
-        kwargs['finfo'] = finfo
-        kwargs['editor_widget'] = self.editor_widget
-
-        return CodeInfo(name, finfo.get_source_code(), position,
-            finfo.filename, editor.is_python_like, in_comment_or_string,
-            **kwargs)
-
-    def get_completions(self, automatic):
-        """Get code completion"""
-        info = self._get_code_info('completions', automatic=automatic)
-
-        if 'jedi' in self.plugins and not self.plugins['jedi'].busy:
-            self._handle_request(info)
-
-        elif info.line.lstrip().startswith(('import ', 'from ')):
-            self._handle_request(info, 'fallback')
-
-        else:
-            self._handle_request(info)
-
-    def go_to_definition(self, position):
-        """Go to definition"""
-        info = self._get_code_info('definition', position)
-
-        self._handle_request(info)
-
-    def show_object_info(self, position, auto=True):
-        """Show signature calltip and/or docstring in the Object Inspector"""
-        # auto is True means that this method was called automatically,
-        # i.e. the user has just entered an opening parenthesis -- in that
-        # case, we don't want to force the object inspector to be visible,
-        # to avoid polluting the window layout
-        info = self._get_code_info('info', position, auto=auto)
-        self._handle_request(info)
-
-    def validate(self):
-        """Validate the plugins"""
-        if not self.busy:
-            for plugin in self.plugins.values():
-                plugin.validate()
-
-    def is_editor_ready(self):
-        """Check if the main app is starting up"""
-        if self.editor_widget:
-            window = self.editor_widget.window()
-            if hasattr(window, 'is_starting_up') and not window.is_starting_up:
-                return True
-
-    def _handle_request(self, info, desired=None):
-        """Handle an incoming request from the user."""
-        debug_print('%s request' % info.name)
-
-        editor = info.editor
-        if ((not editor.is_python_like())
-                or sourcecode.is_keyword(info.obj)
-                or (editor.in_comment_or_string() and info.name != 'info')):
-            desired = 'fallback'
-
-        self.pending = (info, desired)
-        if not self.busy:
-            self._handle_pending()
-
-    def _handle_pending(self):
-        """Handle any pending requests, sending them to the correct plugin."""
-        if not self.pending:
-            self._post_message('')
-            return
-        info, desired = self.pending
-        if desired and self.plugins[desired].busy:
-            return
-        self.busy = True
-
-        if desired:
-            plugins = [self.plugins[desired]]
-        elif (info.name == 'definition' and not info.editor.is_python()
-              or info.name == 'info'):
-            plugins = [p for p in self.plugins.values() if not p.busy]
-        else:
-            # use all but the fallback
-            plugins = [p for p in list(self.plugins.values())[:-1]
-                       if not p. busy]
-
-        self.request = RequestHandler(info, plugins)
-        self.request.introspection_complete.connect(
-            self._introspection_complete)
-        self.pending = None
-
-    def _introspection_complete(self):
-        """
-        Handle an introspection response from the thread.
-
-        Route the response to the correct handler, and then handle
-        any pending requests.
-        """
-        self.busy = False
-        result = self.request.result
-        info = self.request.info
-        current = self._get_code_info('current')
-
-        if result and current.filename == info.filename:
-            func = getattr(self, '_handle_%s_response' % info.name)
-            try:
-                func(result, current, info)
-            except Exception as e:
-                debug_print(e)
-        elif current.filename == info.filename and info.name == 'definition':
-            result = self.plugins['fallback'].get_definition(info)
-
-        if info == self.pending:
-            self.pending = None
-
-        self._handle_pending()
-
-    def _handle_completions_response(self, comp_list, info, prev_info):
-        """
-        Handle a `completions` response.
-
-        Only handle the response if we are on the same line of text and
-        on the same `obj` as the original request.
-        """
-        if info.line_num != prev_info.line_num:
-            return
-        completion_text = info.obj
-        prev_text = prev_info.obj
-
-        if prev_info.obj is None:
-            completion_text = ''
-            prev_text = ''
-
-        if not completion_text.startswith(prev_text):
-            return
-
-        if info.full_obj and len(info.full_obj) > len(info.obj):
-            new_list = [(c, t) for (c, t) in comp_list
-                        if c.startswith(info.full_obj)]
-            if new_list:
-                pos = info.editor.get_position('cursor')
-                new_pos = pos + len(info.full_obj) - len(info.obj)
-                info.editor.set_cursor_position(new_pos)
-                completion_text = info.full_obj
-                comp_list = new_list
-
-        if '.' in completion_text:
-            completion_text = completion_text.split('.')[-1]
-
-        comp_list = [(c.split('.')[-1], t) for (c, t) in comp_list]
-        comp_list = [(c, t) for (c, t) in comp_list
-                     if c.startswith(completion_text)]
-
-        info.editor.show_completion_list(comp_list, completion_text,
-                                         prev_info.automatic)
-
-    def _handle_info_response(self, resp, info, prev_info):
-        """
-        Handle an `info` response, triggering a calltip and/or docstring.
-
-        Only handle the response if we are on the same line of text as
-        when the request was initiated.
-        """
-        if info.line_num != prev_info.line_num:
-            return
-
-        if resp['calltip']:
-            info.editor.show_calltip('Arguments', resp['calltip'],
-                                     signature=True,
-                                     at_position=prev_info.position)
-
-        if resp['name']:
-            self.send_to_inspector.emit(
-                resp['name'], resp['argspec'],
-                resp['note'], resp['docstring'],
-                not prev_info.auto)
-
-    def _handle_definition_response(self, resp, info, prev_info):
-        """Handle a `definition` response"""
-        fname, lineno = resp
-        self.edit_goto.emit(fname, lineno, "")
-
-    def _update_extension_modules(self):
-        """Set the extension_modules after submods thread finishes"""
-        for plugin in self.plugins.values():
-            plugin.set_pref('extension_modules',
-                            self._submods_thread.submods)
-
-    def _post_message(self, message, timeout=60000):
-        """
-        Post a message to the main window status bar with a timeout in ms
-        """
-        if self.editor_widget:
-            try:
-                statusbar = self.editor_widget.window().statusBar()
-                statusbar.showMessage(message, timeout)
-                QApplication.processEvents()
-            except AttributeError:
-                pass
-
-
-def memoize(obj):
-    """
-    Memoize objects to trade memory for execution speed
-
-    Use a limited size cache to store the value, which takes into account
-    The calling args and kwargs
-
-    See https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
-    """
-    cache = obj.cache = {}
-
-    @functools.wraps(obj)
-    def memoizer(*args, **kwargs):
-        key = str(args) + str(kwargs)
-        if key not in cache:
-            cache[key] = obj(*args, **kwargs)
-        # only keep the most recent 100 entries
-        if len(cache) > 100:
-            cache.popitem(last=False)
-        return cache[key]
-    return memoizer
-
-
-class IntrospectionPlugin(object):
-
-    busy = False
-
-    def load_plugin(self):
-        """Initialize the plugin"""
-        pass
-
-    def get_completions(self, info):
-        """Get a list of completions"""
-        pass
-
-    def get_info(self, info):
-        """
-        Find the calltip and docs
-
-        Returns a dict like the following:
-           {'note': 'Function of numpy.core.numeric...',
-            'argspec': "(shape, dtype=None, order='C')'
-            'docstring': 'Return an array of given...'
-            'name': 'ones',
-            'calltip': 'ones(shape, dtype=None, order='C')'}
-        """
-        pass
-
-    def get_definition(self, info):
-        """Get a (filename, line_num) location for a definition"""
-        pass
-
-    def set_pref(self, name, value):
-        """Set a plugin preference to a value"""
-        pass
-
-    def validate(self):
-        """Validate the plugin"""
-        pass
-
-    @staticmethod
-    @memoize
-    def get_parent_until(path):
-        """
-        Given a file path, determine the full module path
-
-        e.g. '/usr/lib/python2.7/dist-packages/numpy/core/__init__.pyc' yields
-        'numpy.core'
-        """
-        dirname = osp.dirname(path)
-        try:
-            mod = osp.basename(path)
-            mod = osp.splitext(mod)[0]
-            imp.find_module(mod, [dirname])
-        except ImportError:
-            return
-        items = [mod]
-        while 1:
-            items.append(osp.basename(dirname))
-            try:
-                dirname = osp.dirname(dirname)
-                imp.find_module('__init__', [dirname + os.sep])
-            except ImportError:
-                break
-        return '.'.join(reversed(items))
-
-
-if __name__ == '__main__':
-    code = 'import numpy'
-    test = CodeInfo('test', code, len(code) - 2)
-    assert test.obj == 'num'
-    assert test.full_obj == 'numpy'
-    test2 = CodeInfo('test', code, len(code) - 2)
-    assert test == test2
diff --git a/spyderlib/utils/introspection/plugin_server.py b/spyderlib/utils/introspection/plugin_server.py
new file mode 100644
index 0000000..fb2f595
--- /dev/null
+++ b/spyderlib/utils/introspection/plugin_server.py
@@ -0,0 +1,129 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2016 The Spyder development team
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+import sys
+import time
+import traceback
+
+import zmq
+
+
+# Timeout in milliseconds
+TIMEOUT = 10000
+
+
+class AsyncServer(object):
+
+    """
+    Introspection server, provides a separate process
+    for interacting with an object.
+    """
+
+    def __init__(self, port, *args):
+        self.port = port
+        self.object = self.initialize(*args)
+        self.context = zmq.Context()
+        self.socket = self.context.socket(zmq.PAIR)
+        self.socket.connect("tcp://localhost:%s" % port)
+        self.socket.send_pyobj(port)
+
+    def initialize(self, plugin_name):
+        """Initialize the object and return it.
+        """
+        return object()
+
+    def run(self):
+        """Handle requests from the client.
+        """
+        t0 = time.time()
+        initialized = False
+        timed_out = False
+        while 1:
+            # Poll for events, handling a timeout.
+            try:
+                events = self.socket.poll(TIMEOUT)
+            except KeyboardInterrupt:
+                time.sleep(0.1)
+                continue
+            if events == 0 and initialized:
+                if timed_out:
+                    delta = int(time.time() - t0)
+                    print('Timed out after %s sec' % delta)
+                    return
+                timed_out = True
+                continue
+            timed_out = False
+            initialized = True
+            # Drain all exising requests, handling quit and heartbeat.
+            requests = []
+            while 1:
+                try:
+                    request = self.socket.recv_pyobj()
+                except KeyboardInterrupt:
+                    time.sleep(0.1)
+                    continue
+                if request['func_name'] == 'server_quit':
+                    print('Quitting')
+                    sys.stdout.flush()
+                    return
+                elif request['func_name'] != 'server_heartbeat':
+                    requests.append(request)
+                else:
+                    print('Got heartbeat')
+                try:
+                    events = self.socket.poll(0)
+                except KeyboardInterrupt:
+                    time.sleep(0.1)
+                    continue
+                if events == 0:
+                    break
+            # Select the most recent request.
+            if not requests:
+                continue
+            request = requests[-1]
+
+            # Gather the response
+            response = dict(func_name=request['func_name'],
+                            request_id=request['request_id'])
+            try:
+                func = getattr(self.object, request['func_name'])
+                args = request.get('args', [])
+                kwargs = request.get('kwargs', {})
+                response['result'] = func(*args, **kwargs)
+            except Exception:
+                response['error'] = traceback.format_exc()
+
+            # Send the response to the client.
+            self.socket.send_pyobj(response)
+
+
+class PluginServer(AsyncServer):
+
+    """
+    Introspection plugin server, provides a separate process
+    for interacting with a plugin.
+    """
+
+    def initialize(self, plugin_name):
+        """Initialize the object and return it.
+        """
+        mod_name = plugin_name + '_plugin'
+        mod = __import__('spyderlib.utils.introspection.' + mod_name,
+                         fromlist=[mod_name])
+        cls = getattr(mod, '%sPlugin' % plugin_name.capitalize())
+        plugin = cls()
+        plugin.load_plugin()
+        return plugin
+
+
+if __name__ == '__main__':
+    args = sys.argv[1:]
+    if not len(args) == 2:
+        print('Usage: plugin_server.py client_port plugin_name')
+        sys.exit(0)
+    plugin = PluginServer(*args)
+    print('Started')
+    plugin.run()
diff --git a/spyderlib/utils/introspection/rope_plugin.py b/spyderlib/utils/introspection/rope_plugin.py
index 659d1ee..3b10539 100644
--- a/spyderlib/utils/introspection/rope_plugin.py
+++ b/spyderlib/utils/introspection/rope_plugin.py
@@ -9,16 +9,20 @@ Rope introspection plugin
 """
 
 import time
+import imp
 
-from spyderlib import dependencies
-from spyderlib.config.base import get_conf_path, _, STDERR
+from spyderlib.config.base import get_conf_path, STDERR
 from spyderlib.utils import encoding, programs
 from spyderlib.py3compat import PY2
 from spyderlib.utils.dochelpers import getsignaturefromtext
 from spyderlib.utils import sourcecode
 from spyderlib.utils.debug import log_last_error, log_dt
-from spyderlib.utils.introspection.plugin_manager import (
+from spyderlib.utils.introspection.manager import (
     DEBUG_EDITOR, LOG_FILENAME, IntrospectionPlugin)
+from spyderlib.utils.introspection.module_completion import (
+    get_preferred_submodules)
+from spyderlib.utils.introspection.manager import ROPE_REQVER
+
 try:
     try:
         from spyderlib import rope_patch
@@ -32,11 +36,6 @@ except ImportError:
     pass
 
 
-ROPE_REQVER = '>=0.9.4'
-dependencies.add('rope',
-                 _("Editor's code completion, go-to-definition and help"),
-                 required_version=ROPE_REQVER)
-
 #TODO: The following preferences should be customizable in the future
 ROPE_PREFS = {'ignore_syntax_errors': True,
               'ignore_bad_imports': True,
@@ -63,14 +62,32 @@ class RopePlugin(IntrospectionPlugin):
             raise ImportError('Requires Rope %s' % ROPE_REQVER)
         self.project = None
         self.create_rope_project(root_path=get_conf_path())
+        submods = get_preferred_submodules()
+        actual = []
+        for submod in submods:
+            try:
+                imp.find_module(submod)
+                actual.append(submod)
+            except ImportError:
+                pass
+        if self.project is not None:
+            self.project.prefs.set('extension_modules', actual)
 
     def get_completions(self, info):
         """Get a list of (completion, type) tuples using Rope"""
         if self.project is None:
             return []
-        filename = info.filename
-        source_code = info.source_code
-        offset = info.position
+        filename = info['filename']
+        source_code = info['source_code']
+        offset = info['position']
+
+        # Prevent Rope from returning import completions because
+        # it can't handle them. Only Jedi can do it!
+        lines = sourcecode.split_source(source_code[:offset])
+        last_line = lines[-1].lstrip()
+        if (last_line.startswith('import ') or last_line.startswith('from ')) \
+          and not ';' in last_line:
+            return []
 
         if PY2:
             filename = filename.encode('utf-8')
@@ -103,9 +120,9 @@ class RopePlugin(IntrospectionPlugin):
         """Get a formatted calltip and docstring from Rope"""
         if self.project is None:
             return
-        filename = info.filename
-        source_code = info.source_code
-        offset = info.position
+        filename = info['filename']
+        source_code = info['source_code']
+        offset = info['position']
 
         if PY2:
             filename = filename.encode('utf-8')
@@ -194,9 +211,9 @@ class RopePlugin(IntrospectionPlugin):
         if self.project is None:
             return
 
-        filename = info.filename
-        source_code = info.source_code
-        offset = info.position
+        filename = info['filename']
+        source_code = info['source_code']
+        offset = info['position']
 
         if PY2:
             filename = filename.encode('utf-8')
@@ -234,11 +251,6 @@ class RopePlugin(IntrospectionPlugin):
             except RuntimeError:
                 pass
 
-    def set_pref(self, key, value):
-        """Set a Rope preference"""
-        if self.project is not None:
-            self.project.prefs.set(key, value)
-
     # ---- Private API -------------------------------------------------------
 
     def create_rope_project(self, root_path):
@@ -273,7 +285,7 @@ class RopePlugin(IntrospectionPlugin):
 
 if __name__ == '__main__':
 
-    from spyderlib.utils.introspection.plugin_manager import CodeInfo
+    from spyderlib.utils.introspection.manager import CodeInfo
 
     p = RopePlugin()
     p.load_plugin()
@@ -288,10 +300,10 @@ if __name__ == '__main__':
         len(source_code), __file__))
     assert ('numpy', 'module') in completions
 
-    source_code = "import pandas as pd; pd.DataFrame"
-    path, line_nr = p.get_definition(CodeInfo('definition', source_code,
+    source_code = "import a"
+    completions = p.get_completions(CodeInfo('completions', source_code,
         len(source_code), __file__))
-    assert 'frame.py' in path
+    assert not completions
 
     code = '''
 def test(a, b):
@@ -299,8 +311,9 @@ def test(a, b):
     pass
 test(1,'''
     path, line = p.get_definition(CodeInfo('definition', code, len(code),
-        'dummy.txt'))
+        'dummy.txt', is_python_like=True))
     assert line == 2
 
-    docs = p.get_info(CodeInfo('info', code, len(code), __file__))
+    docs = p.get_info(CodeInfo('info', code, len(code), __file__,
+        is_python_like=True))
     assert 'Test docstring' in docs['docstring']
diff --git a/spyderlib/utils/introspection/utils.py b/spyderlib/utils/introspection/utils.py
new file mode 100644
index 0000000..a4e049b
--- /dev/null
+++ b/spyderlib/utils/introspection/utils.py
@@ -0,0 +1,248 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2013 The Spyder Development Team
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""
+Introspection utilities used by Spyder
+"""
+
+import imp
+import os
+import pickle
+import os.path as osp
+import re
+
+from spyderlib.utils.misc import memoize
+
+from spyderlib.utils.syntaxhighlighters import (
+    custom_extension_lexer_mapping
+)
+
+from pygments.lexer import words
+from pygments.lexers import (
+    get_lexer_for_filename, get_lexer_by_name, TextLexer
+)
+from pygments.util import ClassNotFound
+from pygments.token import Token
+
+
+class CodeInfo(object):
+
+    id_regex = re.compile(r'[^\d\W][\w\.]*', re.UNICODE)
+    func_call_regex = re.compile(r'([^\d\W][\w\.]*)\([^\)\()]*\Z',
+                                 re.UNICODE)
+
+    def __init__(self, name, source_code, position, filename=None,
+            is_python_like=False, in_comment_or_string=False, **kwargs):
+        self.__dict__.update(kwargs)
+        self.name = name
+        self.filename = filename
+        self.source_code = source_code
+        self.is_python_like = is_python_like
+        self.in_comment_or_string = in_comment_or_string
+
+        self.position = position
+
+        # if in a comment, look for the previous definition
+        if in_comment_or_string:
+            # if this is a docstring, find it, set as our
+            self.docstring = self._get_docstring()
+            # backtrack and look for a line that starts with def or class
+            if name != 'completions':
+                while position:
+                    base = self.source_code[position: position + 6]
+                    if base.startswith('def ') or base.startswith('class '):
+                        position += base.index(' ') + 1
+                        break
+                    position -= 1
+        else:
+            self.docstring = ''
+
+        self.position = position
+
+        if position == 0:
+            self.lines = []
+            self.column = 0
+            self.line_num = 0
+            self.line = ''
+            self.obj = ''
+            self.full_obj = ''
+        else:
+            self._get_info()
+
+    def _get_info(self):
+
+        self.lines = self.source_code[:self.position].splitlines()
+        self.line_num = len(self.lines)
+
+        self.line = self.lines[-1]
+        self.column = len(self.lines[-1])
+
+        full_line = self.source_code.splitlines()[self.line_num - 1]
+
+        lexer = find_lexer_for_filename(self.filename)
+
+        # check for a text-based lexer that doesn't split tokens
+        if len(list(lexer.get_tokens('a b'))) == 1:
+            # Use regex to get the information
+            tokens = re.findall(self.id_regex, self.line)
+            if tokens and self.line.endswith(tokens[-1]):
+                self.obj = tokens[-1]
+            else:
+                self.obj = None
+
+            self.full_obj = self.obj
+
+            if self.obj:
+                full_line = self.source_code.splitlines()[self.line_num - 1]
+                rest = full_line[self.column:]
+                match = re.match(self.id_regex, rest)
+                if match:
+                    self.full_obj = self.obj + match.group()
+
+            self.context = None
+        else:
+            # Use lexer to get the information
+            pos = 0
+            line_tokens = lexer.get_tokens(full_line)
+            for (context, token) in line_tokens:
+                pos += len(token)
+                if pos >= self.column:
+                    self.obj = token[:len(token) - (pos - self.column)]
+                    self.full_obj = token
+                    if context in Token.Literal.String:
+                        context = Token.Literal.String
+                    self.context = context
+                    break
+
+        if (self.name in ['info', 'definition'] and (not self.context in Token.Name)
+                and self.is_python_like):
+            func_call = re.findall(self.func_call_regex, self.line)
+            if func_call:
+                self.obj = func_call[-1]
+                self.column = self.line.index(self.obj) + len(self.obj)
+                self.position = self.position - len(self.line) + self.column
+
+    def _get_docstring(self):
+        """Find the docstring we are currently in"""
+        left = self.position
+        while left:
+            if self.source_code[left: left + 3] in ['"""', "'''"]:
+                left += 3
+                break
+            left -= 1
+        right = self.position
+        while right < len(self.source_code):
+            if self.source_code[right - 3: right] in ['"""', "'''"]:
+                right -= 3
+                break
+            right += 1
+        if left and right < len(self.source_code):
+            return self.source_code[left: right]
+        return ''
+
+    def __eq__(self, other):
+        try:
+            return self.serialize() == other.serialize()
+        except Exception:
+            return False
+
+    def __getitem__(self, item):
+        """Allow dictionary-like access"""
+        return getattr(self, item)
+
+    def serialize(self):
+        state = {}
+        for (key, value) in self.__dict__.items():
+            try:
+                pickle.dumps(value)
+                state[key] = value
+            except Exception:
+                pass
+        state['id_regex'] = self.id_regex
+        state['func_call_regex'] = self.func_call_regex
+        return state
+
+
+def find_lexer_for_filename(filename):
+    """Get a Pygments Lexer given a filename.
+    """
+    filename = filename or ''
+    root, ext = os.path.splitext(filename)
+    if ext in custom_extension_lexer_mapping:
+        lexer = get_lexer_by_name(custom_extension_lexer_mapping[ext])
+    else:
+        try:
+            lexer = get_lexer_for_filename(filename)
+        except ClassNotFound:
+            return TextLexer()
+    return lexer
+
+
+def get_keywords(lexer):
+    """Get the keywords for a given lexer.
+    """
+    if not hasattr(lexer, 'tokens'):
+        return []
+    if 'keywords' in lexer.tokens:
+        try:
+            return lexer.tokens['keywords'][0][0].words
+        except:
+            pass
+    keywords = []
+    for vals in lexer.tokens.values():
+        for val in vals:
+            try:
+                if isinstance(val[0], words):
+                    keywords.extend(val[0].words)
+                else:
+                    ini_val = val[0]
+                    if ')\\b' in val[0] or ')(\\s+)' in val[0]:
+                        val = re.sub(r'\\.', '', val[0])
+                        val = re.sub('[^0-9a-zA-Z|]+', '', val)
+                        if '|' in ini_val:
+                            keywords.extend(val.split('|'))
+                        else:
+                            keywords.append(val)
+            except Exception:
+                continue
+    return keywords
+
+
+ at memoize
+def get_parent_until(path):
+    """
+    Given a file path, determine the full module path
+
+    e.g. '/usr/lib/python2.7/dist-packages/numpy/core/__init__.pyc' yields
+    'numpy.core'
+    """
+    dirname = osp.dirname(path)
+    try:
+        mod = osp.basename(path)
+        mod = osp.splitext(mod)[0]
+        imp.find_module(mod, [dirname])
+    except ImportError:
+        return
+    items = [mod]
+    while 1:
+        items.append(osp.basename(dirname))
+        try:
+            dirname = osp.dirname(dirname)
+            imp.find_module('__init__', [dirname + os.sep])
+        except ImportError:
+            break
+    return '.'.join(reversed(items))
+
+
+if __name__ == '__main__':
+    code = 'import numpy'
+    test = CodeInfo('test', code, len(code) - 2)
+    assert test.obj == 'num'
+    assert test.full_obj == 'numpy'
+    test2 = CodeInfo('test', code, len(code) - 2)
+    assert test == test2
+    test3 = pickle.loads(pickle.dumps(test2.__dict__))
+    assert test3['full_obj'] == 'numpy'
diff --git a/spyderlib/utils/iofuncs.py b/spyderlib/utils/iofuncs.py
index fcdd256..7260631 100644
--- a/spyderlib/utils/iofuncs.py
+++ b/spyderlib/utils/iofuncs.py
@@ -373,7 +373,7 @@ def load_dictionary(filename):
 
 from spyderlib.config.base import get_conf_path, STDERR
 
-SAVED_CONFIG_FILES = ('inspector', 'onlinehelp', 'path', 'pylint.results',
+SAVED_CONFIG_FILES = ('help', 'onlinehelp', 'path', 'pylint.results',
                       'spyder.ini', 'temp.py', 'temp.spydata', 'template.py',
                       'history.py', 'history_internal.py', 'workingdir',
                       '.projects', '.spyderproject', '.ropeproject',
diff --git a/spyderlib/utils/misc.py b/spyderlib/utils/misc.py
index fe4c819..e11fc98 100644
--- a/spyderlib/utils/misc.py
+++ b/spyderlib/utils/misc.py
@@ -6,6 +6,7 @@
 
 """Miscellaneous utilities"""
 
+import functools
 import os
 import os.path as osp
 import sys
@@ -47,11 +48,11 @@ def move_file(source, dest):
 
 def onerror(function, path, excinfo):
     """Error handler for `shutil.rmtree`.
-    
-    If the error is due to an access error (read-only file), it 
+
+    If the error is due to an access error (read-only file), it
     attempts to add write permission and then retries.
     If the error is for another reason, it re-raises the error.
-    
+
     Usage: `shutil.rmtree(path, onerror=onerror)"""
     if not os.access(path, os.W_OK):
         # Is the error an access error?
@@ -86,8 +87,8 @@ def count_lines(path, extensions=None, excluded_dirnames=None):
     of *path* with names ending with *extensions*
     Directory names *excluded_dirnames* will be ignored"""
     if extensions is None:
-        extensions = ['.py', '.pyw', '.ipy', '.enaml', '.c', '.h', '.cpp', 
-                      '.hpp', '.inc', '.', '.hh', '.hxx', '.cc', '.cxx', 
+        extensions = ['.py', '.pyw', '.ipy', '.enaml', '.c', '.h', '.cpp',
+                      '.hpp', '.inc', '.', '.hh', '.hxx', '.cc', '.cxx',
                       '.cl', '.f', '.for', '.f77', '.f90', '.f95', '.f2k']
     if excluded_dirnames is None:
         excluded_dirnames = ['build', 'dist', '.hg', '.svn']
@@ -142,10 +143,10 @@ def remove_backslashes(path):
     """Remove backslashes in *path*
 
     For Windows platforms only.
-    Returns the path unchanged on other platforms.    
-    
-    This is especially useful when formatting path strings on 
-    Windows platforms for which folder paths may contain backslashes 
+    Returns the path unchanged on other platforms.
+
+    This is especially useful when formatting path strings on
+    Windows platforms for which folder paths may contain backslashes
     and provoke unicode decoding errors in Python 3 (or in Python 2
     when future 'unicode_literals' symbol has been imported)."""
     if os.name == 'nt':
@@ -179,10 +180,10 @@ def monkeypatch_method(cls, patch_name):
     # (Tue Jan 15 19:13:25 CET 2008)
     """
     Add the decorated method to the given class; replace as needed.
-    
+
     If the named method already exists on the given class, it will
-    be replaced, and a reference to the old method is created as 
-    cls._old<patch_name><name>. If the "_old_<patch_name>_<name>" attribute 
+    be replaced, and a reference to the old method is created as
+    cls._old<patch_name><name>. If the "_old_<patch_name>_<name>" attribute
     already exists, KeyError is raised.
     """
     def decorator(func):
@@ -227,6 +228,29 @@ def get_common_path(pathlist):
             else:
                 return osp.abspath(common)
 
+
+def memoize(obj):
+    """
+    Memoize objects to trade memory for execution speed
+
+    Use a limited size cache to store the value, which takes into account
+    The calling args and kwargs
+
+    See https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
+    """
+    cache = obj.cache = {}
+
+    @functools.wraps(obj)
+    def memoizer(*args, **kwargs):
+        key = str(args) + str(kwargs)
+        if key not in cache:
+            cache[key] = obj(*args, **kwargs)
+        # only keep the most recent 100 entries
+        if len(cache) > 100:
+            cache.popitem(last=False)
+        return cache[key]
+    return memoizer
+
 if __name__ == '__main__':
     if os.name == 'nt':
         assert get_common_path([
diff --git a/spyderlib/utils/programs.py b/spyderlib/utils/programs.py
index 12e593b..02e669a 100644
--- a/spyderlib/utils/programs.py
+++ b/spyderlib/utils/programs.py
@@ -23,6 +23,10 @@ from spyderlib.utils import encoding
 from spyderlib.py3compat import PY2, is_text_string
 
 
+class ProgramError(Exception):
+    pass
+
+
 if os.name == 'nt':
     TEMPDIR = tempfile.gettempdir() + osp.sep + 'spyder'
 else:
@@ -31,8 +35,11 @@ else:
 
 
 def is_program_installed(basename):
-    """Return program absolute path if installed in PATH
-    Otherwise, return None"""
+    """
+    Return program absolute path if installed in PATH.
+
+    Otherwise, return None
+    """
     for path in os.environ["PATH"].split(os.pathsep):
         abspath = osp.join(path, basename)
         if osp.isfile(abspath):
@@ -40,9 +47,12 @@ def is_program_installed(basename):
 
 
 def find_program(basename):
-    """Find program in PATH and return absolute path
+    """
+    Find program in PATH and return absolute path
+
     Try adding .exe or .bat to basename on Windows platforms
-    (return None if not found)"""
+    (return None if not found)
+    """
     names = [basename]
     if os.name == 'nt':
         # Windows platforms
@@ -55,21 +65,111 @@ def find_program(basename):
             return path
 
 
-def run_program(name, args=[], cwd=None):
-    """Run program in a separate process"""
-    assert isinstance(args, (tuple, list))
-    path = find_program(name)
-    if not path:
-        raise RuntimeError("Program %s was not found" % name)
-    subprocess.Popen([path]+args, cwd=cwd)
+def alter_subprocess_kwargs_by_platform(**kwargs):
+    """
+    Given a dict, populate kwargs to create a generally
+    useful default setup for running subprocess processes
+    on different platforms. For example, `close_fds` is
+    set on posix and creation of a new console window is
+    disabled on Windows.
+
+    This function will alter the given kwargs and return
+    the modified dict.
+    """
+    kwargs.setdefault('close_fds', os.name == 'posix')
+    if os.name == 'nt':
+        CONSOLE_CREATION_FLAGS = 0  # Default value
+        # See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863%28v=vs.85%29.aspx
+        CREATE_NO_WINDOW = 0x08000000
+        # We "or" them together
+        CONSOLE_CREATION_FLAGS |= CREATE_NO_WINDOW
+        kwargs.setdefault('creationflags', CONSOLE_CREATION_FLAGS)
+    return kwargs
+
+
+def run_shell_command(cmdstr, **subprocess_kwargs):
+    """
+    Execute the given shell command.
+    
+    Note that *args and **kwargs will be passed to the subprocess call.
+
+    If 'shell' is given in subprocess_kwargs it must be True,
+    otherwise ProgramError will be raised.
+    .
+    If 'executable' is not given in subprocess_kwargs, it will
+    be set to the value of the SHELL environment variable.
+
+    Note that stdin, stdout and stderr will be set by default
+    to PIPE unless specified in subprocess_kwargs.
+
+    :str cmdstr: The string run as a shell command.
+    :subprocess_kwargs: These will be passed to subprocess.Popen.
+    """
+    if 'shell' in subprocess_kwargs and not subprocess_kwargs['shell']:
+        raise ProgramError(
+                'The "shell" kwarg may be omitted, but if '
+                'provided it must be True.')
+    else:
+        subprocess_kwargs['shell'] = True
+
+    if 'executable' not in subprocess_kwargs:
+        subprocess_kwargs['executable'] = os.getenv('SHELL')
+
+    for stream in ['stdin', 'stdout', 'stderr']:
+        subprocess_kwargs.setdefault(stream, subprocess.PIPE)
+    subprocess_kwargs = alter_subprocess_kwargs_by_platform(
+            **subprocess_kwargs)
+    return subprocess.Popen(cmdstr, **subprocess_kwargs)
+
+
+def run_program(program, args=None, **subprocess_kwargs):
+    """
+    Run program in a separate process.
+
+    NOTE: returns the process object created by
+    `subprocess.Popen()`. This can be used with
+    `proc.communicate()` for example.
+
+    If 'shell' appears in the kwargs, it must be False,
+    otherwise ProgramError will be raised.
+
+    If only the program name is given and not the full path,
+    a lookup will be performed to find the program. If the
+    lookup fails, ProgramError will be raised.
+
+    Note that stdin, stdout and stderr will be set by default
+    to PIPE unless specified in subprocess_kwargs.
+
+    :str program: The name of the program to run.
+    :list args: The program arguments.
+    :subprocess_kwargs: These will be passed to subprocess.Popen.
+    """
+    if 'shell' in subprocess_kwargs and subprocess_kwargs['shell']:
+        raise ProgramError(
+                "This function is only for non-shell programs, "
+                "use run_shell_command() instead.")
+    fullcmd = find_program(program)
+    if not fullcmd:
+        raise ProgramError("Program %s was not found" % program)
+    # As per subprocess, we make a complete list of prog+args
+    fullcmd = [fullcmd] + (args or [])
+    for stream in ['stdin', 'stdout', 'stderr']:
+        subprocess_kwargs.setdefault(stream, subprocess.PIPE)
+    subprocess_kwargs = alter_subprocess_kwargs_by_platform(
+            **subprocess_kwargs)
+    return subprocess.Popen(fullcmd, **subprocess_kwargs)
 
 
 def start_file(filename):
-    """Generalized os.startfile for all platforms supported by Qt
-    (this function is simply wrapping QDesktopServices.openUrl)
-    Returns True if successfull, otherwise returns False."""
-    from spyderlib.qt.QtGui import QDesktopServices
-    from spyderlib.qt.QtCore import QUrl
+    """
+    Generalized os.startfile for all platforms supported by Qt
+
+    This function is simply wrapping QDesktopServices.openUrl
+
+    Returns True if successfull, otherwise returns False.
+    """
+    from qtpy.QtCore import QUrl
+    from qtpy.QtGui import QDesktopServices
 
     # We need to use setUrl instead of setPath because this is the only
     # cross-platform way to open external files. setPath fails completely on
@@ -81,8 +181,10 @@ def start_file(filename):
 
 
 def python_script_exists(package=None, module=None):
-    """Return absolute path if Python script exists (otherwise, return None)
-    package=None -> module is in sys.path (standard library modules)"""
+    """
+    Return absolute path if Python script exists (otherwise, return None)
+    package=None -> module is in sys.path (standard library modules)
+    """
     assert module is not None
     try:
         if package is None:
@@ -98,21 +200,25 @@ def python_script_exists(package=None, module=None):
 
 
 def run_python_script(package=None, module=None, args=[], p_args=[]):
-    """Run Python script in a separate process
-    package=None -> module is in sys.path (standard library modules)"""
+    """
+    Run Python script in a separate process
+    package=None -> module is in sys.path (standard library modules)
+    """
     assert module is not None
     assert isinstance(args, (tuple, list)) and isinstance(p_args, (tuple, list))
     path = python_script_exists(package, module)
-    subprocess.Popen([sys.executable]+p_args+[path]+args)
+    run_program(sys.executable, p_args + [path] + args)
 
 
 def shell_split(text):
-    """Split the string `text` using shell-like syntax
-    
-    This avoids breaking single/double-quoted strings (e.g. containing 
+    """
+    Split the string `text` using shell-like syntax
+
+    This avoids breaking single/double-quoted strings (e.g. containing
     strings with spaces). This function is almost equivalent to the shlex.split
-    function (see standard library `shlex`) except that it is supporting 
-    unicode strings (shlex does not support unicode until Python 2.7.3)."""
+    function (see standard library `shlex`) except that it is supporting
+    unicode strings (shlex does not support unicode until Python 2.7.3).
+    """
     assert is_text_string(text)  # in case a QString is passed...
     pattern = r'(\s+|(?<!\\)".*?(?<!\\)"|(?<!\\)\'.*?(?<!\\)\')'
     out = []
@@ -146,7 +252,11 @@ def get_python_args(fname, python_args, interact, debug, end_args):
 
 def run_python_script_in_terminal(fname, wdir, args, interact,
                                   debug, python_args):
-    """Run Python script in an external system terminal"""
+    """
+    Run Python script in an external system terminal.
+
+    :str wdir: working directory, may be empty.
+    """
     
     # If fname has spaces on it it can't be ran on Windows, so we have to
     # enclose it in quotes. Also wdir can come with / as os.sep, so we
@@ -168,34 +278,41 @@ def run_python_script_in_terminal(fname, wdir, args, interact,
             cmd = encoding.to_fs_from_unicode(cmd)
             wdir = encoding.to_fs_from_unicode(wdir)
         try:
-            subprocess.Popen(cmd, shell=True, cwd=wdir)
+            run_shell_command(cmd, cwd=wdir)
         except WindowsError:
-            from spyderlib.qt.QtGui import QMessageBox
+            from qtpy.QtWidgets import QMessageBox
+
             from spyderlib.config.base import _
+
             QMessageBox.critical(None, _('Run'),
                                  _("It was not possible to run this file in "
                                    "an external terminal"),
                                  QMessageBox.Ok)
     elif os.name == 'posix':
-        cmd = 'gnome-terminal'
-        if is_program_installed(cmd):
-            run_program(cmd, ['--working-directory', wdir, '-x'] + p_args,
-                        cwd=wdir)
-            return
-        cmd = 'konsole'
-        if is_program_installed(cmd):
-            run_program(cmd, ['--workdir', wdir, '-e'] + p_args,
-                        cwd=wdir)
-            return
-        cmd = 'xfce4-terminal'
-        if is_program_installed(cmd):
-            run_program(cmd, ['--working-directory', wdir, '-x'] + p_args,
-                        cwd=wdir)
-            return
-        cmd = 'xterm'
-        if is_program_installed(cmd):
-            run_program(cmd, ['-e'] + p_args + [wdir])
-            return		
+        programs = [{'cmd': 'gnome-terminal',
+                     'wdir-option': '--working-directory',
+                     'execute-option': '-x'},
+                    {'cmd': 'konsole',
+                     'wdir-option': '--workdir',
+                     'execute-option': '-e'},
+                    {'cmd': 'xfce4-terminal',
+                     'wdir-option': '--working-directory',
+                     'execute-option': '-x'},
+                    {'cmd': 'xterm',
+                     'wdir-option': None,
+                     'execute-option': '-e'},]
+        for program in programs:
+            if is_program_installed(program['cmd']):
+                arglist = []
+                if program['wdir-option'] and wdir:
+                    arglist += [program['wdir-option'], wdir]
+                arglist.append(program['execute-option'])
+                arglist += p_args
+                if wdir:
+                    run_program(program['cmd'], arglist, cwd=wdir)
+                else:
+                    run_program(program['cmd'], arglist)
+                return
         # TODO: Add a fallback to OSX
     else:
         raise NotImplementedError
@@ -268,16 +385,18 @@ def get_module_version(module_name):
 
 def is_module_installed(module_name, version=None, installed_version=None,
                         interpreter=None):
-    """Return True if module *module_name* is installed
-    
-    If version is not None, checking module version 
+    """
+    Return True if module *module_name* is installed
+
+    If version is not None, checking module version
     (module must have an attribute named '__version__')
-    
+
     version may starts with =, >=, > or < to specify the exact requirement ;
     multiple conditions may be separated by ';' (e.g. '>=0.13;<1.0')
-    
-    interpreter: check if a module is installed with a given version 
-    in a determined interpreter"""
+
+    interpreter: check if a module is installed with a given version
+    in a determined interpreter
+    """
     if interpreter:
         if not osp.isdir(TEMPDIR):
             os.mkdir(TEMPDIR)
@@ -302,8 +421,8 @@ def is_module_installed(module_name, version=None, installed_version=None,
                 else:
                     f.write("print(is_module_installed('%s'))" % module_name)
             try:
-                output, _err = subprocess.Popen([interpreter, script],
-                                        stdout=subprocess.PIPE).communicate()
+                proc = run_program(interpreter, [script])
+                output, _err = proc.communicate()
             except subprocess.CalledProcessError:
                 return True
             if output:  # TODO: Check why output could be empty!
diff --git a/spyderlib/utils/qthelpers.py b/spyderlib/utils/qthelpers.py
index fc0110b..33bf359 100644
--- a/spyderlib/utils/qthelpers.py
+++ b/spyderlib/utils/qthelpers.py
@@ -6,25 +6,27 @@
 
 """Qt utilities"""
 
-from spyderlib.qt.QtGui import (QAction, QStyle, QWidget, QApplication,
-                                QLabel, QVBoxLayout, QHBoxLayout, QLineEdit,
-                                QKeyEvent, QMenu, QKeySequence, QToolButton,
-                                QPixmap)
-from spyderlib.qt.QtCore import (Signal, QObject, Qt, QLocale, QTranslator,
-                                 QLibraryInfo, QEvent, Slot, QTimer)
-from spyderlib.qt.compat import to_qvariant, from_qvariant
-import spyderlib.utils.icon_manager as ima
-from spyderlib.utils.icon_manager import get_icon, get_std_icon
-
+# Standard library imports
 import os
-import re
 import os.path as osp
+import re
 import sys
 
-# Local import
+# Third party imports
+from qtpy.compat import to_qvariant, from_qvariant
+from qtpy.QtCore import (QEvent, QLibraryInfo, QLocale, QObject, Qt, QTimer,
+                         QTranslator, Signal, Slot)
+from qtpy.QtGui import QKeyEvent, QKeySequence, QPixmap
+from qtpy.QtWidgets import (QAction, QApplication, QHBoxLayout, QLabel,
+                            QLineEdit, QMenu, QStyle, QToolButton, QVBoxLayout,
+                            QWidget)
+
+# Local imports
 from spyderlib.config.base import get_image_path, running_in_mac_app
 from spyderlib.config.gui import get_shortcut
 from spyderlib.utils import programs
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.icon_manager import get_icon, get_std_icon
 from spyderlib.py3compat import is_text_string, to_text_string
 
 # Note: How to redirect a signal from widget *a* to widget *b* ?
@@ -48,7 +50,7 @@ def get_image_label(name, default="not_found.png"):
 
 class MacApplication(QApplication):
     """Subclass to be able to open external files with our Mac app"""
-    open_external_file = Signal(str)
+    sig_open_external_file = Signal(str)
     
     def __init__(self, *args):
         QApplication.__init__(self, *args)
@@ -56,7 +58,7 @@ class MacApplication(QApplication):
     def event(self, event):
         if event.type() == QEvent.FileOpen:
             fname = str(event.file())
-            self.open_external_file.emit(fname)
+            self.sig_open_external_file.emit(fname)
         return QApplication.event(self, event)
 
 
@@ -245,8 +247,6 @@ def create_action(parent, text, shortcut=None, icon=None, tip=None,
         if is_text_string(icon):
             icon = get_icon(icon)
         action.setIcon(icon)
-    if shortcut is not None:
-        action.setShortcut(shortcut)
     if tip is not None:
         action.setToolTip(tip)
         action.setStatusTip(tip)
@@ -254,10 +254,27 @@ def create_action(parent, text, shortcut=None, icon=None, tip=None,
         action.setData(to_qvariant(data))
     if menurole is not None:
         action.setMenuRole(menurole)
-    #TODO: Hard-code all shortcuts and choose context=Qt.WidgetShortcut
-    # (this will avoid calling shortcuts from another dockwidget
-    #  since the context thing doesn't work quite well with these widgets)
-    action.setShortcutContext(context)
+
+    # Workround for Mac because setting context=Qt.WidgetShortcut
+    # there doesn't have any effect
+    if sys.platform == 'darwin':
+        action._shown_shortcut = None
+        if context == Qt.WidgetShortcut:
+            if shortcut is not None:
+                action._shown_shortcut = shortcut
+            else:
+                # This is going to be filled by
+                # main.register_shortcut
+                action._shown_shortcut = 'missing'
+        else:
+            if shortcut is not None:
+                action.setShortcut(shortcut)
+            action.setShortcutContext(context)
+    else:
+        if shortcut is not None:
+            action.setShortcut(shortcut)
+        action.setShortcutContext(context)
+
     return action
 
 
diff --git a/spyderlib/utils/sourcecode.py b/spyderlib/utils/sourcecode.py
index 99b7f77..74f3b1d 100644
--- a/spyderlib/utils/sourcecode.py
+++ b/spyderlib/utils/sourcecode.py
@@ -1,14 +1,16 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright © 2009-2010 Pierre Raybaut
+# Copyright © 2009- The Spyder Development Team
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
 """
 Source code text utilities
 """
+
 import re
 
+
 # Order is important:
 EOL_CHARS = (("\r\n", 'nt'), ("\n", 'posix'), ("\r", 'mac'))
 
@@ -32,24 +34,28 @@ PYTHON_LIKE_LANGUAGES = ('Python', 'Cython', 'Enaml')
 
 CELL_LANGUAGES = {'Python': ('#%%', '# %%', '# <codecell>', '# In[')}
 
+
 def get_eol_chars(text):
     """Get text EOL characters"""
     for eol_chars, _os_name in EOL_CHARS:
         if text.find(eol_chars) > -1:
             return eol_chars
 
+
 def get_os_name_from_eol_chars(eol_chars):
     """Return OS name from EOL characters"""
     for chars, os_name in EOL_CHARS:
         if eol_chars == chars:
             return os_name
 
+
 def get_eol_chars_from_os_name(os_name):
     """Return EOL characters from OS name"""
     for eol_chars, name in EOL_CHARS:
         if name == os_name:
             return eol_chars
 
+
 def has_mixed_eol_chars(text):
     """Detect if text has mixed EOL characters"""
     eol_chars = get_eol_chars(text)
@@ -58,6 +64,7 @@ def has_mixed_eol_chars(text):
     correct_text = eol_chars.join((text+eol_chars).splitlines())
     return repr(correct_text) != repr(text)
 
+
 def fix_indentation(text):
     """Replace tabs by spaces"""
     return text.replace('\t', ' '*4)
diff --git a/spyderlib/utils/stringmatching.py b/spyderlib/utils/stringmatching.py
index eeaaad0..4f43a07 100644
--- a/spyderlib/utils/stringmatching.py
+++ b/spyderlib/utils/stringmatching.py
@@ -21,7 +21,7 @@ def get_search_regex(query, ignore_case=True):
     Parameters
     ----------
     query : str
-        String to search in another string (in order of character occurence).
+        String to search in another string (in order of character occurrence).
     ignore_case : True
         Optional value perform a case insensitive search (True by default).
 
@@ -238,10 +238,10 @@ def test():
              'preferences', 'quit', 'restart', 'save current layout',
              'switch to breakpoints', 'switch to console', 'switch to editor',
              'switch to explorer', 'switch to find_in_files',
-             'switch to historylog', 'switch to inspector',
+             'switch to historylog', 'switch to help',
              'switch to ipython_console', 'switch to onlinehelp',
              'switch to outline_explorer', 'switch to project_explorer',
-             'switch to variable_explorer', 'toggle default layout',
+             'switch to variable_explorer',
              'use next layout', 'use previous layout', 'clear line',
              'clear shell', 'inspect current object', 'blockcomment',
              'breakpoint', 'close all', 'code completion',
diff --git a/spyderlib/utils/syntaxhighlighters.py b/spyderlib/utils/syntaxhighlighters.py
index a587050..6d7e952 100644
--- a/spyderlib/utils/syntaxhighlighters.py
+++ b/spyderlib/utils/syntaxhighlighters.py
@@ -9,16 +9,17 @@ Editor widget syntax highlighters based on QtGui.QSyntaxHighlighter
 (Python syntax highlighting rules are inspired from idlelib)
 """
 
+# Standard library imports
 from __future__ import print_function
-
+import keyword
 import os
 import re
-import keyword
 
-from spyderlib.qt.QtGui import (QColor, QApplication, QFont,
-                                QSyntaxHighlighter, QCursor, QTextCharFormat,
-                                QTextOption)
-from spyderlib.qt.QtCore import Qt
+# Third party imports
+from qtpy.QtCore import Qt
+from qtpy.QtGui import (QColor, QCursor, QFont, QSyntaxHighlighter,
+                        QTextCharFormat, QTextOption)
+from qtpy.QtWidgets import QApplication
 
 # Local imports
 from spyderlib import dependencies
@@ -28,39 +29,54 @@ from spyderlib.py3compat import builtins, is_text_string, to_text_string
 from spyderlib.utils.sourcecode import CELL_LANGUAGES
 
 
-PYGMENTS_REQVER = '>=1.6'
-dependencies.add("pygments", _("Syntax highlighting for Matlab, Julia and other "
-                               "file types"),
+PYGMENTS_REQVER = '>=2.0'
+dependencies.add("pygments", _("Syntax highlighting for Matlab, Julia and "
+                               "other file types"),
                  required_version=PYGMENTS_REQVER)
 
 
-#==============================================================================
+# =============================================================================
 # Constants
-#==============================================================================
-COLOR_SCHEME_KEYS = ("background", "currentline", "currentcell", "occurence",
-                     "ctrlclick", "sideareas", "matched_p", "unmatched_p",
-                     "normal", "keyword", "builtin", "definition",
-                     "comment", "string", "number", "instance")
+# =============================================================================
+COLOR_SCHEME_KEYS = {
+                      "background":     _("Background:"),
+                      "currentline":    _("Current line:"),
+                      "currentcell":    _("Current cell:"),
+                      "occurrence":     _("Occurrence:"),
+                      "ctrlclick":      _("Link:"),
+                      "sideareas":      _("Side areas:"),
+                      "matched_p":      _("Matched <br>parens:"),
+                      "unmatched_p":    _("Unmatched <br>parens:"),
+                      "normal":         _("Normal text:"),
+                      "keyword":        _("Keyword:"),
+                      "builtin":        _("Builtin:"),
+                      "definition":     _("Definition:"),
+                      "comment":        _("Comment:"),
+                      "string":         _("String:"),
+                      "number":         _("Number:"),
+                      "instance":       _("Instance:"),
+                      }
 COLOR_SCHEME_NAMES = CONF.get('color_schemes', 'names')
 # Mapping for file extensions that use Pygments highlighting but should use
 # different lexers than Pygments' autodetection suggests.  Keys are file
 # extensions or tuples of extensions, values are Pygments lexer names.
 CUSTOM_EXTENSION_LEXER = {'.ipynb': 'json',
+                          '.txt': 'text',
                           '.nt': 'bat',
                           '.scss': 'css',
                           '.m': 'matlab',
                           ('.properties', '.session', '.inf', '.reg', '.url',
                            '.cfg', '.cnf', '.aut', '.iss'): 'ini'}
 # Convert custom extensions into a one-to-one mapping for easier lookup.
-_custom_extension_lexer_mapping = {}
+custom_extension_lexer_mapping = {}
 for key, value in CUSTOM_EXTENSION_LEXER.items():
     # Single key is mapped unchanged.
     if is_text_string(key):
-        _custom_extension_lexer_mapping[key] = value
+        custom_extension_lexer_mapping[key] = value
     # Tuple of keys is iterated over and each is mapped to value.
     else:
         for k in key:
-            _custom_extension_lexer_mapping[k] = value
+            custom_extension_lexer_mapping[k] = value
 
 
 #==============================================================================
@@ -90,14 +106,13 @@ class BaseSH(QSyntaxHighlighter):
     NORMAL = 0
     # Syntax highlighting parameters.
     BLANK_ALPHA_FACTOR = 0.31
-    
+
     def __init__(self, parent, font=None, color_scheme='Spyder'):
         QSyntaxHighlighter.__init__(self, parent)
-        
+
         self.outlineexplorer_data = {}
-        
+
         self.font = font
-        self._check_color_scheme(color_scheme)
         if is_text_string(color_scheme):
             self.color_scheme = get_color_scheme(color_scheme)
         else:
@@ -106,7 +121,7 @@ class BaseSH(QSyntaxHighlighter):
         self.background_color = None
         self.currentline_color = None
         self.currentcell_color = None
-        self.occurence_color = None
+        self.occurrence_color = None
         self.ctrlclick_color = None
         self.sideareas_color = None
         self.matched_p_color = None
@@ -130,8 +145,8 @@ class BaseSH(QSyntaxHighlighter):
     def get_currentcell_color(self):
         return QColor(self.currentcell_color)
         
-    def get_occurence_color(self):
-        return QColor(self.occurence_color)
+    def get_occurrence_color(self):
+        return QColor(self.occurrence_color)
     
     def get_ctrlclick_color(self):
         return QColor(self.ctrlclick_color)
@@ -164,7 +179,7 @@ class BaseSH(QSyntaxHighlighter):
         self.background_color = colors.pop("background")
         self.currentline_color = colors.pop("currentline")
         self.currentcell_color = colors.pop("currentcell")
-        self.occurence_color = colors.pop("occurence")
+        self.occurrence_color = colors.pop("occurrence")
         self.ctrlclick_color = colors.pop("ctrlclick")
         self.sideareas_color = colors.pop("sideareas")
         self.matched_p_color = colors.pop("matched_p")
@@ -177,15 +192,8 @@ class BaseSH(QSyntaxHighlighter):
                 format.setFontWeight(QFont.Bold)
             format.setFontItalic(italic)
             self.formats[name] = format
-        
-    def _check_color_scheme(self, color_scheme):
-        if is_text_string(color_scheme):
-            assert color_scheme in COLOR_SCHEME_NAMES
-        else:
-            assert all([key in color_scheme for key in COLOR_SCHEME_KEYS])
 
     def set_color_scheme(self, color_scheme):
-        self._check_color_scheme(color_scheme)
         if is_text_string(color_scheme):
             self.color_scheme = get_color_scheme(color_scheme)
         else:
@@ -862,8 +870,13 @@ class BaseWebSH(BaseSH):
                                            self.formats["comment"])
                         else:
                             self.setCurrentBlockState(self.NORMAL)
-                            self.setFormat(start, end-start,
-                                           self.formats[key])
+                            try:
+                                self.setFormat(start, end-start,
+                                               self.formats[key])
+                            except KeyError:
+                                # happens with unmatched end-of-comment;
+                                # see issue 1462
+                                pass
             
             match = self.PROG.search(text, match.end())
             match_count += 1
@@ -969,8 +982,8 @@ def guess_pygments_highlighter(filename):
     except ImportError:
         return TextSH
     root, ext = os.path.splitext(filename)
-    if ext in _custom_extension_lexer_mapping:
-        lexer = get_lexer_by_name(_custom_extension_lexer_mapping[ext])
+    if ext in custom_extension_lexer_mapping:
+        lexer = get_lexer_by_name(custom_extension_lexer_mapping[ext])
     else:
         try:
             lexer = get_lexer_for_filename(filename)
@@ -979,23 +992,3 @@ def guess_pygments_highlighter(filename):
     class GuessedPygmentsSH(PygmentsSH):
         _lexer = lexer
     return GuessedPygmentsSH
-
-
-
-if __name__ == '__main__':
-    # Test Python Outline Explorer comment regexps
-    valid_comments = [
-      '# --- First variant',
-      '#------ 2nd variant',
-      '### 3rd variant'
-    ]
-    invalid_comments = [
-      '#---', '#--------', '#---   ', '# -------'
-    ]
-    for line in valid_comments:
-        if not PythonSH.OECOMMENT.match(line):
-            print("Error matching '%s' as outline comment" % line)
-    for line in invalid_comments:
-        if PythonSH.OECOMMENT.match(line):
-            print("Error: '%s' is matched as outline comment" % line)
-        
diff --git a/spyderlib/utils/vcs.py b/spyderlib/utils/vcs.py
index 6a64915..b56686a 100644
--- a/spyderlib/utils/vcs.py
+++ b/spyderlib/utils/vcs.py
@@ -100,10 +100,9 @@ def get_hg_revision(repopath):
            ('eba7273c69df+', '2015+', 'default')
     """
     try:
-        hg = programs.find_program('hg')
-        assert hg is not None and osp.isdir(osp.join(repopath, '.hg'))
-        output, _err = subprocess.Popen([hg, 'id', '-nib', repopath],
-                                        stdout=subprocess.PIPE).communicate()
+        assert osp.isdir(osp.join(repopath, '.hg'))
+        proc = programs.run_program('hg', ['id', '-nib', repopath])
+        output, _err = proc.communicate()
         # output is now: ('eba7273c69df+ 2015+ default\n', None)
         # Split 2 times max to allow spaces in branch names.
         return tuple(output.decode().strip().split(None, 2))
@@ -113,26 +112,24 @@ def get_hg_revision(repopath):
 
 
 def get_git_revision(repopath):
-    """Return Git revision for the repository located at repopath
-       Result is a tuple (latest commit hash, branch), with None values on
-       error
+    """
+    Return Git revision for the repository located at repopath
+    
+    Result is a tuple (latest commit hash, branch), with None values on
+    error
     """
     try:
         git = programs.find_program('git')
         assert git is not None and osp.isdir(osp.join(repopath, '.git'))
-
-        # Revision
-        commit = subprocess.Popen([git, 'rev-parse', '--short', 'HEAD'],
-                                  stdout=subprocess.PIPE,
-                                  cwd=repopath).communicate()
+        commit = programs.run_program(git, ['rev-parse', '--short', 'HEAD'],
+                                      cwd=repopath).communicate()
         commit = commit[0].strip()
         if PY3:
             commit = commit.decode(sys.getdefaultencoding())
 
         # Branch
-        branches = subprocess.Popen([git, 'branch'],
-                                     stdout=subprocess.PIPE,
-                                     cwd=repopath).communicate()
+        branches = programs.run_program(git, ['branch'],
+                                        cwd=repopath).communicate()
         branches = branches[0]
         if PY3:
             branches = branches.decode(sys.getdefaultencoding())
diff --git a/spyderlib/widgets/arraybuilder.py b/spyderlib/widgets/arraybuilder.py
index a7838cb..5cb7826 100644
--- a/spyderlib/widgets/arraybuilder.py
+++ b/spyderlib/widgets/arraybuilder.py
@@ -5,7 +5,7 @@
 # (see spyderlib/__init__.py for details)
 
 """
-Numpy Matrix/Array Builder Widget
+Numpy Matrix/Array Builder Widget.
 """
 
 # TODO:
@@ -13,23 +13,25 @@ Numpy Matrix/Array Builder Widget
 # -Fix positioning
 # -Use the same font as editor/console?
 
+# Standard library imports
 from __future__ import division
-
 import re
 
-from spyderlib.qt.QtCore import (QEvent, QPoint, Qt)
-from spyderlib.qt.QtGui import (QDialog, QHBoxLayout, QLineEdit, QTableWidget,
-                                QTableWidgetItem, QToolButton, QToolTip,
-                                QWidget)
+# Third party imports
+from qtpy.QtCore import QEvent, QPoint, Qt
+from qtpy.QtWidgets import (QDialog, QHBoxLayout, QLineEdit, QTableWidget,
+                            QTableWidgetItem, QToolButton, QToolTip,
+                            QWidget)
 
+# Local imports
 from spyderlib.config.base import _
 from spyderlib.utils import icon_manager as ima
 from spyderlib.widgets.helperwidgets import HelperToolButton
 
 
 # Constants
-SHORTCUT_INLINE = "Shift+Ctrl+*"  # Fixed shortcuts for editor and consoles
-SHORTCUT_TABLE = "Ctrl+*"         # Fixed shortcuts for editor and consoles
+SHORTCUT_TABLE = "Ctrl+M"
+SHORTCUT_INLINE = "Ctrl+Alt+M"
 ELEMENT_SEPARATOR = ', '
 ROW_SEPARATOR = ';'
 BRACES = '], ['
@@ -37,13 +39,14 @@ NAN_VALUES = ['nan', 'NAN', 'NaN', 'Na', 'NA', 'na']
 
 
 class NumpyArrayInline(QLineEdit):
-    """ """
     def __init__(self, parent):
         QLineEdit.__init__(self, parent)
         self._parent = parent
 
     def keyPressEvent(self, event):
-        """ """
+        """
+        Qt override.
+        """
         if event.key() in [Qt.Key_Enter, Qt.Key_Return]:
             self._parent.process_text()
             if self._parent.is_valid():
@@ -53,6 +56,11 @@ class NumpyArrayInline(QLineEdit):
 
     # to catch the Tab key event
     def event(self, event):
+        """
+        Qt override.
+
+        This is needed to be able to intercept the Tab key press event.
+        """
         if event.type() == QEvent.KeyPress:
             if (event.key() == Qt.Key_Tab or event.key() == Qt.Key_Space):
                 text = self.text()
@@ -71,18 +79,20 @@ class NumpyArrayInline(QLineEdit):
 
 
 class NumpyArrayTable(QTableWidget):
-    """ """
     def __init__(self, parent):
         QTableWidget.__init__(self, parent)
         self._parent = parent
         self.setRowCount(2)
         self.setColumnCount(2)
         self.reset_headers()
+
         # signals
         self.cellChanged.connect(self.cell_changed)
 
     def keyPressEvent(self, event):
-        """ """
+        """
+        Qt override.
+        """
         if event.key() in [Qt.Key_Enter, Qt.Key_Return]:
             QTableWidget.keyPressEvent(self, event)
             # To avoid having to enter one final tab
@@ -93,10 +103,15 @@ class NumpyArrayTable(QTableWidget):
             QTableWidget.keyPressEvent(self, event)
 
     def cell_changed(self, row, col):
-        """ """
-        value = self.item(row, col).text()
-        rows = self.rowCount()
-        cols = self.columnCount()
+        """
+        """
+        item = self.item(row, col)
+        value = None
+
+        if item:
+            rows = self.rowCount()
+            cols = self.columnCount()
+            value = item.text()
 
         if value:
             if row == rows - 1:
@@ -106,7 +121,9 @@ class NumpyArrayTable(QTableWidget):
         self.reset_headers()
 
     def reset_headers(self):
-        """ """
+        """
+        Update the column and row numbering in the headers.
+        """
         rows = self.rowCount()
         cols = self.columnCount()
 
@@ -117,7 +134,9 @@ class NumpyArrayTable(QTableWidget):
             self.setColumnWidth(c, 40)
 
     def text(self):
-        """ """
+        """
+        Return the entered array in a parseable form.
+        """
         text = []
         rows = self.rowCount()
         cols = self.columnCount()
@@ -127,8 +146,6 @@ class NumpyArrayTable(QTableWidget):
             item = self.item(0, 0)
             if item is None:
                 return ''
-            elif item.text() == '':
-                return ''
 
         for r in range(rows - 1):
             for c in range(cols - 1):
@@ -138,8 +155,9 @@ class NumpyArrayTable(QTableWidget):
                 else:
                     value = '0'
 
-                if value == '':
+                if not value.strip():
                     value = '0'
+
                 text.append(' ')
                 text.append(value)
             text.append(ROW_SEPARATOR)
@@ -148,16 +166,15 @@ class NumpyArrayTable(QTableWidget):
 
 
 class NumpyArrayDialog(QDialog):
-    """ """
-    def __init__(self, parent, inline=True, offset=0):
-        QDialog.__init__(self, parent)
+    def __init__(self, parent=None, inline=True, offset=0, force_float=False):
+        QDialog.__init__(self, parent=parent)
         self._parent = parent
         self._text = None
         self._valid = None
         self._offset = offset
 
         # TODO: add this as an option in the General Preferences?
-        self._force_float = False
+        self._force_float = force_float
 
         self._help_inline = _("""
            <b>Numpy Array/Matrix Helper</b><br>
@@ -181,7 +198,7 @@ class NumpyArrayDialog(QDialog):
            Use two tabs at the end of a row to move to the next row.
            """)
 
-        # widgets
+        # Widgets
         self._button_warning = QToolButton()
         self._button_help = HelperToolButton()
         self._button_help.setIcon(ima.icon('MessageBoxInformation'))
@@ -240,7 +257,9 @@ class NumpyArrayDialog(QDialog):
         self._widget.setFocus()
 
     def keyPressEvent(self, event):
-        """Override Qt method"""
+        """
+        Qt override.
+        """
         QToolTip.hideText()
         ctrl = event.modifiers() & Qt.ControlModifier
 
@@ -254,12 +273,19 @@ class NumpyArrayDialog(QDialog):
             QDialog.keyPressEvent(self, event)
 
     def event(self, event):
+        """
+        Qt Override.
+
+        Usefull when in line edit mode.
+        """
         if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab:
             return False
         return QWidget.event(self, event)
 
     def process_text(self, array=True):
-        """ """
+        """
+        Construct the text based on the entered content in the widget.
+        """
         if array:
             prefix = 'np.array([['
         else:
@@ -317,7 +343,7 @@ class NumpyArrayDialog(QDialog):
             if nrows == 1:
                 prefix = prefix[:-1]
                 suffix = suffix.replace("]])", "])")
-            
+
             # Fix offset
             offset = self._offset
             braces = BRACES.replace(' ', '\n' + ' '*(offset + len(prefix) - 1))
@@ -331,7 +357,9 @@ class NumpyArrayDialog(QDialog):
         self.update_warning()
 
     def update_warning(self):
-        """ """
+        """
+        Updates the icon and tip based on the validity of the array content.
+        """
         widget = self._button_warning
         if not self.is_valid():
             tip = _('Array dimensions not valid')
@@ -342,32 +370,34 @@ class NumpyArrayDialog(QDialog):
             self._button_warning.setToolTip('')
 
     def is_valid(self):
-        """ """
+        """
+        Return if the current array state is valid.
+        """
         return self._valid
 
     def text(self):
-        """ """
+        """
+        Return the parsed array/matrix text.
+        """
         return self._text
 
-    def mousePressEvent(self, event):
-        """ """
-        pass
+    @property
+    def array_widget(self):
+        """
+        Return the array builder widget.
+        """
+        return self._widget
 
 
-def test():
+def test():  # pragma: no cover
     from spyderlib.utils.qthelpers import qapplication
     app = qapplication()
-    app.setStyle('Plastique')
-
     dlg_table = NumpyArrayDialog(None, inline=False)
     dlg_inline = NumpyArrayDialog(None, inline=True)
-
-    if dlg_table.exec_():
-        print(dlg_table.text())
-
-    if dlg_inline.exec_():
-        print(dlg_inline.text())
+    dlg_table.show()
+    dlg_inline.show()
+    app.exec_()
 
 
-if __name__ == "__main__":
+if __name__ == "__main__":  # pragma: no cover
     test()
diff --git a/spyderlib/widgets/browser.py b/spyderlib/widgets/browser.py
index ec3eb12..caa0435 100644
--- a/spyderlib/widgets/browser.py
+++ b/spyderlib/widgets/browser.py
@@ -6,27 +6,50 @@
 
 """Simple web browser widget"""
 
+# Standard library imports
 import sys
 
-from spyderlib.qt.QtCore import QUrl, Slot, Signal
-from spyderlib.qt.QtGui import (QHBoxLayout, QWidget, QVBoxLayout,
-                                QProgressBar, QLabel, QMenu, QFrame)
-from spyderlib.qt.QtWebKit import QWebView, QWebPage, QWebSettings
+# Third party imports
+from qtpy.QtCore import QUrl, Signal, Slot
+from qtpy.QtWidgets import (QFrame, QHBoxLayout, QLabel, QProgressBar, QMenu,
+                            QVBoxLayout, QWidget)
+from qtpy.QtWebEngineWidgets import (QWebEnginePage, QWebEngineSettings,
+                                     QWebEngineView, WEBENGINE)
 
 # Local imports
-from spyderlib.config.base import DEV, _
-from spyderlib.utils.qthelpers import (create_action, add_actions,
-                                       create_toolbutton, action2button)
+from spyderlib.config.base import _, DEV
+from spyderlib.py3compat import is_text_string, to_text_string
+from spyderlib.utils.qthelpers import (action2button, add_actions,
+                                       create_action, create_toolbutton)
 from spyderlib.utils import icon_manager as ima
 from spyderlib.widgets.comboboxes import UrlComboBox
 from spyderlib.widgets.findreplace import FindReplace
-from spyderlib.py3compat import to_text_string, is_text_string
 
 
-class WebView(QWebView):
-    """Web page"""
+class WebPage(QWebEnginePage):
+    """
+    Web page subclass to manage hyperlinks for WebEngine
+
+    Note: This can't be used for WebKit because the
+    acceptNavigationRequest method has a different
+    functionality for it.
+    """
+    linkClicked = Signal(QUrl)
+
+    def acceptNavigationRequest(self, url, navigation_type, isMainFrame):
+        """
+        Overloaded method to handle links ourselves
+        """
+        if navigation_type == QWebEnginePage.NavigationTypeLinkClicked:
+            self.linkClicked.emit(url)
+            return False
+        return True
+
+
+class WebView(QWebEngineView):
+    """Web view"""
     def __init__(self, parent):
-        QWebView.__init__(self, parent)
+        QWebEngineView.__init__(self, parent)
         self.zoom_factor = 1.
         self.zoom_out_action = create_action(self, _("Zoom out"),
                                              icon=ima.icon('zoom_out'),
@@ -34,18 +57,26 @@ class WebView(QWebView):
         self.zoom_in_action = create_action(self, _("Zoom in"),
                                             icon=ima.icon('zoom_in'),
                                             triggered=self.zoom_in)
-        
+        if WEBENGINE:
+            web_page = WebPage(self)
+            self.setPage(web_page)
+
     def find_text(self, text, changed=True,
                   forward=True, case=False, words=False,
                   regexp=False):
         """Find text"""
-        findflag = QWebPage.FindWrapsAroundDocument
+        if not WEBENGINE:
+            findflag = QWebEnginePage.FindWrapsAroundDocument
+        else:
+            findflag = 0
+
         if not forward:
-            findflag = findflag | QWebPage.FindBackward
+            findflag = findflag | QWebEnginePage.FindBackward
         if case:
-            findflag = findflag | QWebPage.FindCaseSensitively
-        return self.findText(text, findflag)
-    
+            findflag = findflag | QWebEnginePage.FindCaseSensitively
+
+        return self.findText(text, QWebEnginePage.FindFlags(findflag))
+
     def get_selected_text(self):
         """Return text selected by current text cursor"""
         return self.selectedText()
@@ -92,22 +123,22 @@ class WebView(QWebView):
         self.zoom_factor += .1
         self.apply_zoom_factor()
     
-    #------ QWebView API -------------------------------------------------------
+    #------ QWebEngineView API -------------------------------------------------------
     def createWindow(self, webwindowtype):
         import webbrowser
         webbrowser.open(to_text_string(self.url().toString()))
         
     def contextMenuEvent(self, event):
         menu = QMenu(self)
-        actions = [self.pageAction(QWebPage.Back),
-                   self.pageAction(QWebPage.Forward), None,
-                   self.pageAction(QWebPage.SelectAll),
-                   self.pageAction(QWebPage.Copy), None,
+        actions = [self.pageAction(QWebEnginePage.Back),
+                   self.pageAction(QWebEnginePage.Forward), None,
+                   self.pageAction(QWebEnginePage.SelectAll),
+                   self.pageAction(QWebEnginePage.Copy), None,
                    self.zoom_in_action, self.zoom_out_action]
-        if DEV:
+        if DEV and not WEBENGINE:
             settings = self.page().settings()
-            settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
-            actions += [None, self.pageAction(QWebPage.InspectElement)]
+            settings.setAttribute(QWebEngineSettings.DeveloperExtrasEnabled, True)
+            actions += [None, self.pageAction(QWebEnginePage.InspectElement)]
         add_actions(menu, actions)
         menu.popup(event.globalPos())
         event.accept()
@@ -136,10 +167,10 @@ class WebBrowser(QWidget):
         
         pageact2btn = lambda prop: action2button(self.webview.pageAction(prop),
                                                  parent=self.webview)
-        refresh_button = pageact2btn(QWebPage.Reload)
-        stop_button = pageact2btn(QWebPage.Stop)
-        previous_button = pageact2btn(QWebPage.Back)
-        next_button = pageact2btn(QWebPage.Forward)
+        refresh_button = pageact2btn(QWebEnginePage.Reload)
+        stop_button = pageact2btn(QWebEnginePage.Stop)
+        previous_button = pageact2btn(QWebEnginePage.Back)
+        next_button = pageact2btn(QWebEnginePage.Forward)
         
         stop_button.setEnabled(False)
         self.webview.loadStarted.connect(lambda: stop_button.setEnabled(True))
@@ -151,13 +182,14 @@ class WebBrowser(QWidget):
         self.webview.loadStarted.connect(progressbar.show)
         self.webview.loadProgress.connect(progressbar.setValue)
         self.webview.loadFinished.connect(lambda _state: progressbar.hide())
-        
+
         label = QLabel(self.get_label())
-        
+
         self.url_combo = UrlComboBox(self)
         self.url_combo.valid.connect(self.url_combo_activated)
-        self.webview.iconChanged.connect(self.icon_changed)
-        
+        if not WEBENGINE:
+            self.webview.iconChanged.connect(self.icon_changed)
+
         self.find_widget = FindReplace(self)
         self.find_widget.set_editor(self.webview)
         self.find_widget.hide()
@@ -242,7 +274,7 @@ class WebBrowser(QWidget):
 
 class FrameWebView(QFrame):
     """
-    Framed QWebView for UI consistency in Spyder.
+    Framed QWebEngineView for UI consistency in Spyder.
     """
     linkClicked = Signal(QUrl)
 
@@ -258,22 +290,17 @@ class FrameWebView(QFrame):
 
         self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
 
-        self._webview.linkClicked.connect(self.linkClicked)
-
-    def set_font(self, font, fixed_font=None):
-        self._webview.set_font(font, fixed_font=fixed_font)
-
-    def setHtml(self, html_text, base_url):
-        self._webview.setHtml(html_text, base_url)
-
-    def url(self):
-        return self._webview.url()
+        if WEBENGINE:
+            self._webview.page().linkClicked.connect(self.linkClicked)
+        else:
+            self._webview.linkClicked.connect(self.linkClicked)
 
-    def load(self, url):
-        self._webview.load(url)
+    def __getattr__(self, name):
+        return getattr(self._webview, name)
 
-    def page(self):
-        return self._webview.page()
+    @property
+    def web_widget(self):
+        return self._webview
 
 
 def test():
diff --git a/spyderlib/widgets/calltip.py b/spyderlib/widgets/calltip.py
index a87f597..94882ef 100644
--- a/spyderlib/widgets/calltip.py
+++ b/spyderlib/widgets/calltip.py
@@ -14,14 +14,17 @@ Calltip widget used only to show signatures
 # Standard library imports
 from unicodedata import category
 
-# System library imports
-from spyderlib.qt import QtCore, QtGui
+# Third party imports
+from qtpy.QtCore import QBasicTimer, QCoreApplication, QEvent, Qt
+from qtpy.QtGui import QCursor, QPalette
+from qtpy.QtWidgets import (QFrame, QLabel, QTextEdit, QPlainTextEdit, QStyle,
+                            QStyleOptionFrame, QStylePainter, QToolTip)
 
 # Local imports
 from spyderlib.py3compat import to_text_string
 
 
-class CallTipWidget(QtGui.QLabel):
+class CallTipWidget(QLabel):
     """ Shows call tips by parsing the current text of Q[Plain]TextEdit.
     """
 
@@ -33,24 +36,24 @@ class CallTipWidget(QtGui.QLabel):
         """ Create a call tip manager that is attached to the specified Qt
             text edit widget.
         """
-        assert isinstance(text_edit, (QtGui.QTextEdit, QtGui.QPlainTextEdit))
-        super(CallTipWidget, self).__init__(None, QtCore.Qt.ToolTip)
-        self.app = QtCore.QCoreApplication.instance()
+        assert isinstance(text_edit, (QTextEdit, QPlainTextEdit))
+        super(CallTipWidget, self).__init__(None, Qt.ToolTip)
+        self.app = QCoreApplication.instance()
 
         self.hide_timer_on = hide_timer_on
-        self._hide_timer = QtCore.QBasicTimer()
+        self._hide_timer = QBasicTimer()
         self._text_edit = text_edit
 
         self.setFont(text_edit.document().defaultFont())
-        self.setForegroundRole(QtGui.QPalette.ToolTipText)
-        self.setBackgroundRole(QtGui.QPalette.ToolTipBase)
-        self.setPalette(QtGui.QToolTip.palette())
+        self.setForegroundRole(QPalette.ToolTipText)
+        self.setBackgroundRole(QPalette.ToolTipBase)
+        self.setPalette(QToolTip.palette())
 
-        self.setAlignment(QtCore.Qt.AlignLeft)
+        self.setAlignment(Qt.AlignLeft)
         self.setIndent(1)
-        self.setFrameStyle(QtGui.QFrame.NoFrame)
+        self.setFrameStyle(QFrame.NoFrame)
         self.setMargin(1 + self.style().pixelMetric(
-                QtGui.QStyle.PM_ToolTipLabelFrameWidth, None, self))
+                QStyle.PM_ToolTipLabelFrameWidth, None, self))
 
     def eventFilter(self, obj, event):
         """ Reimplemented to hide on certain key presses and on text edit focus
@@ -59,24 +62,24 @@ class CallTipWidget(QtGui.QLabel):
         if obj == self._text_edit:
             etype = event.type()
 
-            if etype == QtCore.QEvent.KeyPress:
+            if etype == QEvent.KeyPress:
                 key = event.key()
-                if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return,
-                           QtCore.Qt.Key_Down):
+                if key in (Qt.Key_Enter, Qt.Key_Return,
+                           Qt.Key_Down):
                     self.hide()
-                elif key == QtCore.Qt.Key_Escape:
+                elif key == Qt.Key_Escape:
                     self.hide()
                     return True
 
-            elif etype == QtCore.QEvent.FocusOut:
+            elif etype == QEvent.FocusOut:
                 self.hide()
 
-            elif etype == QtCore.QEvent.Enter:
+            elif etype == QEvent.Enter:
                 if (self._hide_timer.isActive() and
-                  self.app.topLevelAt(QtGui.QCursor.pos()) == self):
+                  self.app.topLevelAt(QCursor.pos()) == self):
                     self._hide_timer.stop()
 
-            elif etype == QtCore.QEvent.Leave:
+            elif etype == QEvent.Leave:
                 self._leave_event_hide()
 
         return super(CallTipWidget, self).eventFilter(obj, event)
@@ -97,7 +100,7 @@ class CallTipWidget(QtGui.QLabel):
         """
         super(CallTipWidget, self).enterEvent(event)
         if (self._hide_timer.isActive() and
-          self.app.topLevelAt(QtGui.QCursor.pos()) == self):
+          self.app.topLevelAt(QCursor.pos()) == self):
             self._hide_timer.stop()
 
     def hideEvent(self, event):
@@ -121,10 +124,10 @@ class CallTipWidget(QtGui.QLabel):
     def paintEvent(self, event):
         """ Reimplemented to paint the background panel.
         """
-        painter = QtGui.QStylePainter(self)
-        option = QtGui.QStyleOptionFrame()
+        painter = QStylePainter(self)
+        option = QStyleOptionFrame()
         option.initFrom(self)
-        painter.drawPrimitive(QtGui.QStyle.PE_PanelTipLabel, option)
+        painter.drawPrimitive(QStyle.PE_PanelTipLabel, option)
         painter.end()
 
         super(CallTipWidget, self).paintEvent(event)
@@ -274,7 +277,7 @@ class CallTipWidget(QtGui.QLabel):
             # If Enter events always came after Leave events, we wouldn't need
             # this check. But on Mac OS, it sometimes happens the other way
             # around when the tooltip is created.
-            self.app.topLevelAt(QtGui.QCursor.pos()) != self):
+            self.app.topLevelAt(QCursor.pos()) != self):
             self._hide_timer.start(800, self)
 
     #------ Signal handlers ----------------------------------------------------
diff --git a/spyderlib/widgets/colors.py b/spyderlib/widgets/colors.py
index e355009..6ccd814 100644
--- a/spyderlib/widgets/colors.py
+++ b/spyderlib/widgets/colors.py
@@ -4,9 +4,10 @@
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
-from spyderlib.qt.QtGui import (QLineEdit, QIcon, QHBoxLayout, QColor,
-                                QPushButton, QColorDialog, QPixmap)
-from spyderlib.qt.QtCore import QSize, Signal, Slot, Property
+# Third party imports
+from qtpy.QtCore import Property, QSize, Signal, Slot
+from qtpy.QtGui import QColor, QIcon, QPixmap
+from qtpy.QtWidgets import QColorDialog, QHBoxLayout, QLineEdit, QPushButton
 
 # Local imports
 from spyderlib.py3compat import is_text_string
diff --git a/spyderlib/widgets/comboboxes.py b/spyderlib/widgets/comboboxes.py
index 47401db..6eff48b 100644
--- a/spyderlib/widgets/comboboxes.py
+++ b/spyderlib/widgets/comboboxes.py
@@ -18,9 +18,9 @@ import os
 import os.path as osp
 
 # Third party imports
-from spyderlib.qt.QtCore import QEvent, Qt, QTimer, QUrl, Signal
-from spyderlib.qt.QtGui import (QComboBox, QCompleter, QFont,
-                                QSizePolicy, QToolTip)
+from qtpy.QtCore import QEvent, Qt, QTimer, QUrl, Signal
+from qtpy.QtGui import QFont
+from qtpy.QtWidgets import QComboBox, QCompleter, QSizePolicy, QToolTip
 
 # Local imports
 from spyderlib.config.base import _
@@ -227,8 +227,9 @@ class PathComboBox(EditableComboBox):
         """Handle focus out event restoring the last valid selected path."""
         # Calling asynchronously the 'add_current_text' to avoid crash
         # https://groups.google.com/group/spyderlib/browse_thread/thread/2257abf530e210bd
-        lineedit = self.lineEdit()
-        QTimer.singleShot(50, lambda: lineedit.setText(self.selected_text))
+        if not self.is_valid():
+            lineedit = self.lineEdit()
+            QTimer.singleShot(50, lambda: lineedit.setText(self.selected_text))
 
         hide_status = getattr(self.lineEdit(), 'hide_status_icon', None)
         if hide_status:
diff --git a/spyderlib/widgets/dependencies.py b/spyderlib/widgets/dependencies.py
index f49bfe8..5aca0e4 100644
--- a/spyderlib/widgets/dependencies.py
+++ b/spyderlib/widgets/dependencies.py
@@ -6,17 +6,21 @@
 
 """Module checking Spyder runtime dependencies"""
 
-from spyderlib.qt.QtGui import (QDialog, QTableView, QItemDelegate, QColor,
-                                QVBoxLayout, QHBoxLayout, QPushButton,
-                                QApplication, QLabel, QDialogButtonBox)
-from spyderlib.qt.QtCore import Qt, QModelIndex, QAbstractTableModel
-from spyderlib.qt.compat import to_qvariant
-import spyderlib.utils.icon_manager as ima
+# Standard library imports
 import sys
 
+# Third party imports
+from qtpy.compat import to_qvariant
+from qtpy.QtCore import Qt, QModelIndex, QAbstractTableModel
+from qtpy.QtGui import QColor
+from qtpy.QtWidgets import (QApplication, QDialog, QDialogButtonBox,
+                            QHBoxLayout, QItemDelegate, QLabel, QPushButton,
+                            QTableView, QVBoxLayout)
+
 # Local imports
-from spyderlib.config.base import _
 from spyderlib import __version__
+from spyderlib.config.base import _
+from spyderlib.utils import icon_manager as ima
 
 
 class DependenciesTableModel(QAbstractTableModel):
diff --git a/spyderlib/widgets/editor.py b/spyderlib/widgets/editor.py
index 59c9487..74cddad 100644
--- a/spyderlib/widgets/editor.py
+++ b/spyderlib/widgets/editor.py
@@ -11,43 +11,45 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Local imports
 from __future__ import print_function
-
-from spyderlib.qt import is_pyqt46
-from spyderlib.qt.QtGui import (QVBoxLayout, QMessageBox, QMenu, QFont,
-                                QAction, QApplication, QWidget,
-                                QKeySequence, QMainWindow, QSplitter,
-                                QHBoxLayout)
-from spyderlib.qt.QtCore import (Signal, Qt, QFileInfo, QThread, QObject,
-                                 QByteArray, QSize, QPoint, QTimer, Slot)
-from spyderlib.qt.compat import getsavefilename
-import spyderlib.utils.icon_manager as ima
-
 import os
-import sys
 import os.path as osp
+import sys
+
+# Third party imports
+from qtpy import is_pyqt46
+from qtpy.compat import getsavefilename
+from qtpy.QtCore import (QByteArray, QFileInfo, QObject, QPoint, QSize, Qt,
+                         QThread, QTimer, Signal, Slot)
+from qtpy.QtGui import QFont, QKeySequence
+from qtpy.QtWidgets import (QAction, QApplication, QHBoxLayout, QMainWindow,
+                            QMessageBox, QMenu, QSplitter, QVBoxLayout,
+                            QWidget)
 
 # Local imports
-from spyderlib.utils import encoding, sourcecode, codeanalysis
-from spyderlib.utils import introspection
-from spyderlib.config.base import _, DEBUG, STDOUT, STDERR
-from spyderlib.config.main import EDIT_FILTERS, EDIT_EXT, get_filter, EDIT_FILETYPES
-from spyderlib.config.gui import create_shortcut, new_shortcut
-from spyderlib.utils.qthelpers import (create_action, add_actions,
-                                       mimedata2url, get_filetype_icon,
-                                       create_toolbutton)
-from spyderlib.utils import syntaxhighlighters
-from spyderlib.widgets.tabs import BaseTabs
-from spyderlib.widgets.findreplace import FindReplace
+from spyderlib.config.base import _, DEBUG, STDERR, STDOUT
+from spyderlib.config.gui import (config_shortcut, fixed_shortcut,
+                                  RUN_CELL_SHORTCUT,
+                                  RUN_CELL_AND_ADVANCE_SHORTCUT)
+from spyderlib.config.utils import get_edit_extensions
+from spyderlib.py3compat import qbytearray_to_str, to_text_string, u
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils import (codeanalysis, encoding, sourcecode,
+                             syntaxhighlighters)
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton, get_filetype_icon,
+                                       mimedata2url)
 from spyderlib.widgets.editortools import OutlineExplorerWidget
-from spyderlib.widgets.status import (ReadWriteStatus, EOLStatus,
-                                      EncodingStatus, CursorPositionStatus)
+from spyderlib.widgets.fileswitcher import FileSwitcher
+from spyderlib.widgets.findreplace import FindReplace
 from spyderlib.widgets.sourcecode import codeeditor
-from spyderlib.widgets.sourcecode.base import TextEditBaseWidget  #analysis:ignore
-from spyderlib.widgets.sourcecode.codeeditor import Printer  #analysis:ignore
+from spyderlib.widgets.sourcecode.base import TextEditBaseWidget  # analysis:ignore
+from spyderlib.widgets.sourcecode.codeeditor import Printer       # analysis:ignore
 from spyderlib.widgets.sourcecode.codeeditor import get_file_language
-from spyderlib.widgets.fileswitcher import FileSwitcher
-from spyderlib.py3compat import to_text_string, qbytearray_to_str, u
+from spyderlib.widgets.status import (CursorPositionStatus, EncodingStatus,
+                                      EOLStatus, ReadWriteStatus)
+from spyderlib.widgets.tabs import BaseTabs
 
 DEBUG_EDITOR = DEBUG >= 3
 
@@ -160,7 +162,7 @@ class FileInfo(QObject):
     save_breakpoints = Signal(str, str)
     text_changed_at = Signal(str, int)
     edit_goto = Signal(str, int, str)
-    send_to_inspector = Signal(str, str, str, str, bool)
+    send_to_help = Signal(str, str, str, str, bool)
 
     def __init__(self, filename, encoding, editor, new, threadmanager,
                  introspection_plugin):
@@ -301,11 +303,15 @@ class EditorStack(QWidget):
     save_breakpoints = Signal(str, str)
     text_changed_at = Signal(str, int)
     current_file_changed = Signal(str ,int)
-    plugin_load = Signal(str)
+    plugin_load = Signal((str,), ())
     edit_goto = Signal(str, int, str)
     split_vertically = Signal()
     split_horizontally = Signal()
     sig_new_file = Signal((str,), ())
+    sig_save_as = Signal()
+    sig_prev_edit_pos = Signal()
+    sig_prev_cursor = Signal()
+    sig_next_cursor = Signal()
 
     def __init__(self, parent, actions):
         QWidget.__init__(self, parent)
@@ -345,10 +351,16 @@ class EditorStack(QWidget):
                 icon=ima.icon('editcopy'),
                 triggered=lambda:
                 QApplication.clipboard().setText(self.get_current_filename()))
+        close_right = create_action(self, _("Close all to the right"),
+                                    triggered=self.close_all_right)
+        close_all_but_this = create_action(self, _("Close all but this"),
+                                           triggered=self.close_all_but_this)
+
         self.menu_actions = actions + [None, fileswitcher_action,
-                                       copy_to_cb_action]
+                                       copy_to_cb_action, None, close_right,
+                                       close_all_but_this]
         self.outlineexplorer = None
-        self.inspector = None
+        self.help = None
         self.unregister_callback = None
         self.is_closable = False
         self.new_action = None
@@ -377,15 +389,15 @@ class EditorStack(QWidget):
         self.auto_unindent_enabled = True
         self.indent_chars = " "*4
         self.tab_stop_width = 40
-        self.inspector_enabled = False
+        self.help_enabled = False
         self.default_font = None
         self.wrap_enabled = False
         self.tabmode_enabled = False
         self.intelligent_backspace_enabled = True
         self.highlight_current_line_enabled = False
         self.highlight_current_cell_enabled = False
-        self.occurence_highlighting_enabled = True
-        self.occurence_highlighting_timeout=1500
+        self.occurrence_highlighting_enabled = True
+        self.occurrence_highlighting_timeout=1500
         self.checkeolchars_enabled = True
         self.always_remove_trailing_spaces = False
         self.fullpath_sorting_enabled = None
@@ -395,13 +407,7 @@ class EditorStack(QWidget):
         if ccs not in syntaxhighlighters.COLOR_SCHEME_NAMES:
             ccs = syntaxhighlighters.COLOR_SCHEME_NAMES[0]
         self.color_scheme = ccs
-        self.introspector = introspection.PluginManager(self)
-
-        self.introspector.send_to_inspector.connect(self.send_to_inspector)
-        self.introspector.edit_goto.connect(
-             lambda fname, lineno, name:
-             self.edit_goto.emit(fname, lineno, name))
-
+        self.introspector = None
         self.__file_status_flag = False
 
         # Real-time code analysis
@@ -418,34 +424,69 @@ class EditorStack(QWidget):
 
     def create_shortcuts(self):
         """Create local shortcuts"""
-        # Configurable shortcuts
-        inspect = create_shortcut(self.inspect_current_object, context='Editor',
+        # --- Configurable shortcuts
+        inspect = config_shortcut(self.inspect_current_object, context='Editor',
                                   name='Inspect current object', parent=self)
-        breakpoint = create_shortcut(self.set_or_clear_breakpoint,
-                                     context='Editor', name='Breakpoint',
-                                     parent=self)
-        cbreakpoint = create_shortcut(self.set_or_edit_conditional_breakpoint,
-                                      context='Editor',
-                                      name='Conditional breakpoint',
-                                      parent=self)
-        gotoline = create_shortcut(self.go_to_line, context='Editor',
+        set_breakpoint = config_shortcut(self.set_or_clear_breakpoint,
+                                         context='Editor', name='Breakpoint',
+                                         parent=self)
+        set_cond_breakpoint = config_shortcut(
+                                    self.set_or_edit_conditional_breakpoint,
+                                    context='Editor',
+                                    name='Conditional breakpoint',
+                                    parent=self)
+        gotoline = config_shortcut(self.go_to_line, context='Editor',
                                    name='Go to line', parent=self)
-        tab = create_shortcut(self.go_to_previous_file, context='Editor',
+        tab = config_shortcut(self.go_to_previous_file, context='Editor',
                               name='Go to previous file', parent=self)
-        tabshift = create_shortcut(self.go_to_next_file, context='Editor',
+        tabshift = config_shortcut(self.go_to_next_file, context='Editor',
                                    name='Go to next file', parent=self)
+        run_selection = config_shortcut(self.run_selection, context='Editor',
+                                        name='Run selection', parent=self)
+        new_file = config_shortcut(lambda : self.sig_new_file[()].emit(),
+                                   context='Editor', name='New file',
+                                   parent=self)
+        open_file = config_shortcut(lambda : self.plugin_load[()].emit(),
+                                    context='Editor', name='Open file',
+                                    parent=self)
+        save_file = config_shortcut(self.save, context='Editor',
+                                    name='Save file', parent=self)
+        save_all = config_shortcut(self.save_all, context='Editor',
+                                   name='Save all', parent=self)
+        save_as = config_shortcut(lambda : self.sig_save_as.emit(),
+                                  context='Editor', name='Save As',
+                                  parent=self)
+        close_all = config_shortcut(self.close_all_files, context='Editor',
+                                    name='Close all', parent=self)
+        prev_edit_pos = config_shortcut(lambda : self.sig_prev_edit_pos.emit(),
+                                        context="Editor",
+                                        name="Last edit location",
+                                        parent=self)
+        prev_cursor = config_shortcut(lambda : self.sig_prev_cursor.emit(),
+                                      context="Editor",
+                                      name="Previous cursor position",
+                                      parent=self)
+        next_cursor = config_shortcut(lambda : self.sig_next_cursor.emit(),
+                                      context="Editor",
+                                      name="Next cursor position",
+                                      parent=self)
 
-        # Fixed shortcuts
-        new_shortcut(QKeySequence.ZoomIn, self, lambda: self.zoom_in.emit())
-        new_shortcut("Ctrl+=", self, lambda: self.zoom_in.emit())
-        new_shortcut(QKeySequence.ZoomOut, self, lambda: self.zoom_out.emit())
-        new_shortcut("Ctrl+0", self, lambda: self.zoom_reset.emit())
-        new_shortcut("Ctrl+W", self, self.close_file)
-        new_shortcut("Ctrl+F4", self, self.close_file)
+        # --- Fixed shortcuts
+        fixed_shortcut(QKeySequence.ZoomIn, self, lambda: self.zoom_in.emit())
+        fixed_shortcut("Ctrl+=", self, lambda: self.zoom_in.emit())
+        fixed_shortcut(QKeySequence.ZoomOut, self, lambda: self.zoom_out.emit())
+        fixed_shortcut("Ctrl+0", self, lambda: self.zoom_reset.emit())
+        fixed_shortcut("Ctrl+W", self, self.close_file)
+        fixed_shortcut("Ctrl+F4", self, self.close_file)
+        fixed_shortcut(QKeySequence(RUN_CELL_SHORTCUT), self, self.run_cell)
+        fixed_shortcut(QKeySequence(RUN_CELL_AND_ADVANCE_SHORTCUT), self,
+                       self.run_cell_and_advance)
 
         # Return configurable ones
-        return [inspect, breakpoint, cbreakpoint, gotoline, tab,
-                tabshift]
+        return [inspect, set_breakpoint, set_cond_breakpoint, gotoline, tab,
+                tabshift, run_selection, new_file, open_file, save_file,
+                save_all, save_as, close_all, prev_edit_pos, prev_cursor,
+                next_cursor]
 
     def get_shortcut_data(self):
         """
@@ -568,16 +609,16 @@ class EditorStack(QWidget):
             editor.add_remove_breakpoint(edit_condition=True)
 
     def inspect_current_object(self):
-        """Inspect current object in Object Inspector"""
+        """Inspect current object in the Help plugin"""
         if self.introspector:
             editor = self.get_current_editor()
             position = editor.get_position('cursor')
-            self.inspector.switch_to_editor_source()
+            self.help.switch_to_editor_source()
             self.introspector.show_object_info(position, auto=False)
         else:
             text = self.get_current_editor().get_current_object()
             if text:
-                self.send_to_inspector(text, force=True)
+                self.send_to_help(text, force=True)
 
     #------ Editor Widget Settings
     def set_closable(self, state):
@@ -611,8 +652,8 @@ class EditorStack(QWidget):
         oe_btn.setDefaultAction(self.outlineexplorer.visibility_action)
         self.add_corner_widgets_to_tabbar([5, oe_btn])
 
-    def set_inspector(self, inspector):
-        self.inspector = inspector
+    def set_help(self, help_plugin):
+        self.help = help_plugin
 
     def set_tempfile_path(self, path):
         self.tempfile_path = path
@@ -679,7 +720,7 @@ class EditorStack(QWidget):
         if self.data:
             for finfo in self.data:
                 finfo.editor.set_blanks_enabled(state)
-        
+
     def set_edgeline_enabled(self, state):
         # CONF.get(self.CONF_SECTION, 'edge_line')
         self.edgeline_enabled = state
@@ -770,11 +811,10 @@ class EditorStack(QWidget):
             for finfo in self.data:
                 finfo.editor.setTabStopWidth(tab_stop_width)
 
-    def set_inspector_enabled(self, state):
-        self.inspector_enabled = state
+    def set_help_enabled(self, state):
+        self.help_enabled = state
 
     def set_default_font(self, font, color_scheme=None):
-        # get_font(self.CONF_SECTION)
         self.default_font = font
         if color_scheme is not None:
             self.color_scheme = color_scheme
@@ -809,19 +849,19 @@ class EditorStack(QWidget):
             for finfo in self.data:
                 finfo.editor.toggle_intelligent_backspace(state)
 
-    def set_occurence_highlighting_enabled(self, state):
-        # CONF.get(self.CONF_SECTION, 'occurence_highlighting')
-        self.occurence_highlighting_enabled = state
+    def set_occurrence_highlighting_enabled(self, state):
+        # CONF.get(self.CONF_SECTION, 'occurrence_highlighting')
+        self.occurrence_highlighting_enabled = state
         if self.data:
             for finfo in self.data:
-                finfo.editor.set_occurence_highlighting(state)
+                finfo.editor.set_occurrence_highlighting(state)
 
-    def set_occurence_highlighting_timeout(self, timeout):
-        # CONF.get(self.CONF_SECTION, 'occurence_highlighting/timeout')
-        self.occurence_highlighting_timeout = timeout
+    def set_occurrence_highlighting_timeout(self, timeout):
+        # CONF.get(self.CONF_SECTION, 'occurrence_highlighting/timeout')
+        self.occurrence_highlighting_timeout = timeout
         if self.data:
             for finfo in self.data:
-                finfo.editor.set_occurence_timeout(timeout)
+                finfo.editor.set_occurrence_timeout(timeout)
 
     def set_highlight_current_line_enabled(self, state):
         self.highlight_current_line_enabled = state
@@ -856,6 +896,9 @@ class EditorStack(QWidget):
     def set_focus_to_editor(self, state):
         self.focus_to_editor = state
 
+    def set_introspector(self, introspector):
+        self.introspector = introspector
+
     #------ Stacked widget management
     def get_stack_index(self):
         return self.tabs.currentIndex()
@@ -1131,6 +1174,18 @@ class EditorStack(QWidget):
         while self.close_file():
             pass
 
+    def close_all_right(self):
+        """ Close all files opened to the right """
+        num = self.get_stack_index()
+        n = self.get_stack_count()
+        for i in range(num, n-1):
+            self.close_file(num+1)
+    
+    def close_all_but_this(self):
+        """Close all files but the current one"""
+        self.close_all_right()
+        for i in range(0, self.get_stack_count()-1  ):
+            self.close_file(0)
 
     #------ Save
     def save_if_changed(self, cancelable=False, index=None):
@@ -1242,11 +1297,9 @@ class EditorStack(QWidget):
         finfo.lastmodified = QFileInfo(finfo.filename).lastModified()
 
     def select_savename(self, original_filename):
-        selectedfilter = get_filter(EDIT_FILETYPES,
-                                    osp.splitext(original_filename)[1])
         self.redirect_stdio.emit(False)
-        filename, _selfilter = getsavefilename(self, _("Save Python script"),
-                               original_filename, EDIT_FILTERS, selectedfilter)
+        filename, _selfilter = getsavefilename(self, _("Save file"),
+                                               original_filename)
         self.redirect_stdio.emit(True)
         if filename:
             return osp.normpath(filename)
@@ -1599,7 +1652,7 @@ class EditorStack(QWidget):
                          self.introspector)
 
         self.add_to_data(finfo, set_current)
-        finfo.send_to_inspector.connect(self.send_to_inspector)
+        finfo.send_to_help.connect(self.send_to_help)
         finfo.analysis_results_changed.connect(
                                   lambda: self.analysis_results_changed.emit())
         finfo.todo_results_changed.connect(
@@ -1624,8 +1677,8 @@ class EditorStack(QWidget):
                 intelligent_backspace=self.intelligent_backspace_enabled,
                 highlight_current_line=self.highlight_current_line_enabled,
                 highlight_current_cell=self.highlight_current_cell_enabled,
-                occurence_highlighting=self.occurence_highlighting_enabled,
-                occurence_timeout=self.occurence_highlighting_timeout,
+                occurrence_highlighting=self.occurrence_highlighting_enabled,
+                occurrence_timeout=self.occurrence_highlighting_timeout,
                 codecompletion_auto=self.codecompletion_auto_enabled,
                 codecompletion_case=self.codecompletion_case_enabled,
                 codecompletion_enter=self.codecompletion_enter_enabled,
@@ -1671,17 +1724,17 @@ class EditorStack(QWidget):
         """Cursor position of one of the editor in the stack has changed"""
         self.sig_editor_cursor_position_changed.emit(line, index)
 
-    def send_to_inspector(self, qstr1, qstr2=None, qstr3=None,
-                          qstr4=None, force=False):
+    def send_to_help(self, qstr1, qstr2=None, qstr3=None, qstr4=None,
+                     force=False):
         """qstr1: obj_text, qstr2: argpspec, qstr3: note, qstr4: doc_text"""
-        if not force and not self.inspector_enabled:
+        if not force and not self.help_enabled:
             return
-        if self.inspector is not None \
-           and (force or self.inspector.dockwidget.isVisible()):
-            # ObjectInspector widget exists and is visible
+        if self.help is not None \
+          and (force or self.help.dockwidget.isVisible()):
+            # Help plugin exists and is visible
             if qstr4 is None:
-                self.inspector.set_object_text(qstr1, ignore_unknown=True,
-                                               force_refresh=force)
+                self.help.set_object_text(qstr1, ignore_unknown=True,
+                                          force_refresh=force)
             else:
                 objtxt = to_text_string(qstr1)
                 name = objtxt.split('.')[-1]
@@ -1690,7 +1743,7 @@ class EditorStack(QWidget):
                 docstring = to_text_string(qstr4)
                 doc = {'obj_text': objtxt, 'name': name, 'argspec': argspec,
                        'note': note, 'docstring': docstring}
-                self.inspector.set_editor_doc(doc, force_refresh=force)
+                self.help.set_editor_doc(doc, force_refresh=force)
             editor = self.get_current_editor()
             editor.setFocus()
 
@@ -1757,12 +1810,21 @@ class EditorStack(QWidget):
 
     #------ Run
     def run_selection(self):
-        """Run selected text or current line in console"""
+        """
+        Run selected text or current line in console. If no text is selected, 
+        then advance cursor to next line.
+        """
         text = self.get_current_editor().get_selection_as_executable_code()
-        if not text:
-            line = self.get_current_editor().get_current_line()
+        if text:
+            move_next_line = False
+        else:
+            editor = self.get_current_editor()
+            line = editor.get_current_line()
             text = line.lstrip()
+            move_next_line = True
         self.exec_in_extconsole.emit(text, self.focus_to_editor)
+        if move_next_line:
+            editor.move_cursor_to_next('line', 'down')
 
     def run_cell(self):
         """Run current cell"""
@@ -1792,7 +1854,7 @@ class EditorStack(QWidget):
         # The second check is necessary on Windows, where source.hasUrls()
         # can return True but source.urls() is []
         if source.hasUrls() and source.urls():
-            if mimedata2url(source, extlist=EDIT_EXT):
+            if mimedata2url(source, extlist=get_edit_extensions()):
                 event.acceptProposedAction()
             else:
                 all_urls = mimedata2url(source)
@@ -1819,7 +1881,7 @@ class EditorStack(QWidget):
         if source.hasUrls():
             files = mimedata2url(source)
             files = [f for f in files if encoding.is_text_file(f)]
-            supported_files = mimedata2url(source, extlist=EDIT_EXT)
+            supported_files = mimedata2url(source, extlist=get_edit_extensions())
             files = set(files or []) | set(supported_files or [])
             for fname in files:
                 self.plugin_load.emit(fname)
@@ -1987,7 +2049,7 @@ class EditorWidget(QSplitter):
         self.plugin = plugin
 
         self.find_widget = FindReplace(self, enable_replace=True)
-        self.plugin.register_widget_shortcuts("Editor", self.find_widget)
+        self.plugin.register_widget_shortcuts(self.find_widget)
         self.find_widget.hide()
         self.outlineexplorer = OutlineExplorerWidget(self,
                                             show_fullpath=show_fullpath,
@@ -2167,13 +2229,14 @@ class EditorPluginExample(QSplitter):
         self.outlineexplorer = OutlineExplorerWidget(self, show_fullpath=False,
                                                      show_all_files=False)
         self.outlineexplorer.edit_goto.connect(self.go_to_file)
+        self.editor_splitter = EditorSplitter(self, self, menu_actions,
+                                              first=True)
 
         editor_widgets = QWidget(self)
         editor_layout = QVBoxLayout()
         editor_layout.setContentsMargins(0, 0, 0, 0)
         editor_widgets.setLayout(editor_layout)
-        editor_layout.addWidget(EditorSplitter(self, self, menu_actions,
-                                               first=True))
+        editor_layout.addWidget(self.editor_splitter)
         editor_layout.addWidget(self.find_widget)
 
         self.setContentsMargins(0, 0, 0, 0)
@@ -2271,7 +2334,7 @@ class EditorPluginExample(QSplitter):
     def get_focus_widget(self):
         pass
 
-    @Slot(int, int)
+    @Slot(str, int)
     def close_file_in_all_editorstacks(self, editorstack_id_str, index):
         for editorstack in self.editorstacks:
             if str(id(editorstack)) != editorstack_id_str:
@@ -2281,7 +2344,7 @@ class EditorPluginExample(QSplitter):
 
     # This method is never called in this plugin example. It's here only
     # to show how to use the file_saved signal (see above).
-    @Slot(int, int)
+    @Slot(str, int, str)
     def file_saved_in_editorstack(self, editorstack_id_str, index, filename):
         """A file was saved in editorstack, this notifies others"""
         for editorstack in self.editorstacks:
@@ -2290,7 +2353,7 @@ class EditorPluginExample(QSplitter):
 
     # This method is never called in this plugin example. It's here only
     # to show how to use the file_saved signal (see above).
-    @Slot(int, int)
+    @Slot(str, int, str)
     def file_renamed_in_data_in_editorstack(self, editorstack_id_str,
                                             index, filename):
         """A file was renamed in data in editorstack, this notifies others"""
@@ -2298,25 +2361,36 @@ class EditorPluginExample(QSplitter):
             if str(id(editorstack)) != editorstack_id_str:
                 editorstack.rename_in_data(index, filename)
 
-    def register_widget_shortcuts(self, context, widget):
+    def register_widget_shortcuts(self, widget):
         """Fake!"""
         pass
 
 
 def test():
     from spyderlib.utils.qthelpers import qapplication
-    app = qapplication()
+    from spyderlib.config.base import get_module_path
+    from spyderlib.utils.introspection.manager import IntrospectionManager
+
+    cur_dir = osp.join(get_module_path('spyderlib'), 'widgets')
+    app = qapplication(test_time=8)
+    introspector = IntrospectionManager()
+
     test = EditorPluginExample()
     test.resize(900, 700)
     test.show()
+
+    editorstack = test.editor_splitter.editorstack
+    editorstack.set_introspector(introspector)
+    introspector.set_editor_widget(editorstack)
+
     import time
-    cur_dir = osp.dirname(osp.abspath(__file__))
     t0 = time.time()
     test.load(osp.join(cur_dir, "editor.py"))
     test.load(osp.join(cur_dir, "explorer.py"))
     test.load(osp.join(cur_dir, "variableexplorer", "collectionseditor.py"))
     test.load(osp.join(cur_dir, "sourcecode", "codeeditor.py"))
     print("Elapsed time: %.3f s" % (time.time()-t0))
+
     sys.exit(app.exec_())
 
 
diff --git a/spyderlib/widgets/editortools.py b/spyderlib/widgets/editortools.py
index 48ba59b..55ba360 100644
--- a/spyderlib/widgets/editortools.py
+++ b/spyderlib/widgets/editortools.py
@@ -6,23 +6,23 @@
 
 """Editor tools: outline explorer, etc."""
 
+# Standard library imports
 from __future__ import print_function
-
-import re
 import os.path as osp
+import re
 
-from spyderlib.qt.QtGui import (QWidget, QTreeWidgetItem,  QHBoxLayout,
-                                QVBoxLayout)
-from spyderlib.qt.QtCore import Qt, Signal, Slot
-from spyderlib.qt.compat import from_qvariant
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.compat import from_qvariant
+from qtpy.QtCore import Qt, Signal, Slot
+from qtpy.QtWidgets import QHBoxLayout, QTreeWidgetItem, QVBoxLayout, QWidget
 
-# Local import
+# Local imports
 from spyderlib.config.base import _, STDOUT
+from spyderlib.py3compat import to_text_string
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.qthelpers import (create_action, create_toolbutton,
                                        set_item_user_text)
 from spyderlib.widgets.onecolumntree import OneColumnTree
-from spyderlib.py3compat import to_text_string
 
 
 #===============================================================================
diff --git a/spyderlib/widgets/explorer.py b/spyderlib/widgets/explorer.py
index 4eb2bf7..e43eabd 100644
--- a/spyderlib/widgets/explorer.py
+++ b/spyderlib/widgets/explorer.py
@@ -11,34 +11,35 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 from __future__ import with_statement
-
 import os
-import re
 import os.path as osp
+import re
 import shutil
 
-from spyderlib.qt import is_pyqt46
-from spyderlib.qt.QtGui import (QVBoxLayout, QLabel, QHBoxLayout, QInputDialog,
-                                QFileSystemModel, QMenu, QWidget, QToolButton,
-                                QLineEdit, QMessageBox, QTreeView,
-                                QDrag, QSortFilterProxyModel)
-from spyderlib.qt.QtCore import (Qt, Signal, QMimeData, QSize, QDir, QUrl,
-                                 QTimer, Slot)
-from spyderlib.qt.compat import getsavefilename, getexistingdirectory
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy import API, is_pyqt46
+from qtpy.compat import getsavefilename, getexistingdirectory
+from qtpy.QtCore import (QDir, QMimeData, QSize, QSortFilterProxyModel, Qt,
+                         QTimer, QUrl, Signal, Slot)
+from qtpy.QtGui import QDrag
+from qtpy.QtWidgets import (QFileSystemModel, QHBoxLayout, QInputDialog,
+                            QLabel, QLineEdit, QMenu, QMessageBox, QToolButton,
+                            QTreeView, QVBoxLayout, QWidget)
 
 # Local imports
-from spyderlib.utils.qthelpers import create_action, add_actions, file_uri
-from spyderlib.utils import misc, encoding, programs, vcs
 from spyderlib.config.base import _
-from spyderlib.py3compat import (PY2, to_text_string, to_binary_string, getcwd,
-                                 str_lower)
+from spyderlib.py3compat import (getcwd, str_lower, to_binary_string,
+                                 to_text_string, PY2)
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils import encoding, misc, programs, vcs
+from spyderlib.utils.qthelpers import add_actions, create_action, file_uri
 
 try:
-    from IPython.nbconvert import PythonExporter as nbexporter
+    from nbconvert import PythonExporter as nbexporter
 except:
-    nbexporter = None      # analysis:ignore
+    nbexporter = None    # analysis:ignore
 
 
 def fixpath(path):
@@ -268,21 +269,30 @@ class DirView(QTreeView):
         actions += [None]
         if only_notebooks and nbexporter is not None:
             actions.append(ipynb_convert_action)
-        
+
         # VCS support is quite limited for now, so we are enabling the VCS
         # related actions only when a single file/folder is selected:
         dirname = fnames[0] if osp.isdir(fnames[0]) else osp.dirname(fnames[0])
         if len(fnames) == 1 and vcs.is_vcs_repository(dirname):
+            # QAction.triggered works differently for PySide and PyQt
+            if not API == 'pyside':
+                commit_slot = lambda _checked, fnames=[dirname]:\
+                                    self.vcs_command(fnames, 'commit')
+                browse_slot = lambda _checked, fnames=[dirname]:\
+                                    self.vcs_command(fnames, 'browse')
+            else:
+                commit_slot = lambda fnames=[dirname]:\
+                                    self.vcs_command(fnames, 'commit')
+                browse_slot = lambda fnames=[dirname]:\
+                                    self.vcs_command(fnames, 'browse')
             vcs_ci = create_action(self, _("Commit"),
                                    icon=ima.icon('vcs_commit'),
-                                   triggered=lambda fnames=[dirname]:
-                                   self.vcs_command(fnames, 'commit'))
+                                   triggered=commit_slot)
             vcs_log = create_action(self, _("Browse repository"),
                                     icon=ima.icon('vcs_browse'),
-                                    triggered=lambda fnames=[dirname]:
-                                    self.vcs_command(fnames, 'browse'))
+                                    triggered=browse_slot)
             actions += [None, vcs_ci, vcs_log]
-        
+
         return actions
 
     def create_folder_manage_actions(self, fnames):
@@ -371,6 +381,8 @@ class DirView(QTreeView):
             self.rename()
         elif event.key() == Qt.Key_Delete:
             self.delete()
+        elif event.key() == Qt.Key_Backspace:
+            self.go_to_parent_directory()
         else:
             QTreeView.keyPressEvent(self, event)
 
diff --git a/spyderlib/widgets/externalshell/baseshell.py b/spyderlib/widgets/externalshell/baseshell.py
index 807e48c..2ccc24b 100644
--- a/spyderlib/widgets/externalshell/baseshell.py
+++ b/spyderlib/widgets/externalshell/baseshell.py
@@ -9,23 +9,26 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
+from time import time, strftime, gmtime
 import os
 import os.path as osp
-from time import time, strftime, gmtime
-
-from spyderlib.qt.QtGui import (QWidget, QVBoxLayout, QHBoxLayout, QMenu,
-                                QLabel, QInputDialog, QLineEdit, QToolButton)
-from spyderlib.qt.QtCore import (QProcess, Signal, QByteArray, QTimer, Qt,
-                                 QTextCodec, Slot)
-import spyderlib.utils.icon_manager as ima
 
-LOCALE_CODEC = QTextCodec.codecForLocale()
+# Third party imports
+from qtpy.QtCore import (QByteArray, QProcess, Qt, QTextCodec, QTimer,
+                         Signal, Slot, QMutex)
+from qtpy.QtWidgets import (QHBoxLayout, QInputDialog, QLabel, QLineEdit,
+                            QMenu, QToolButton, QVBoxLayout, QWidget)
 
 # Local imports
-from spyderlib.utils.qthelpers import (create_toolbutton, create_action, 
-                                       add_actions)
-from spyderlib.config.base import get_conf_path, _
+from spyderlib.config.base import _, get_conf_path
 from spyderlib.py3compat import is_text_string, to_text_string
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton)
+
+
+LOCALE_CODEC = QTextCodec.codecForLocale()
 
 
 def add_pathlist_to_PYTHONPATH(env, pathlist, drop_env=False):
@@ -59,6 +62,9 @@ class ExternalShellBase(QWidget):
         QWidget.__init__(self, parent)
         
         self.menu_actions = menu_actions
+        self.write_lock = QMutex()
+        self.buffer_lock = QMutex()
+        self.buffer = []
         
         self.run_button = None
         self.kill_button = None
@@ -290,10 +296,30 @@ class ExternalShellBase(QWidget):
         return self.transcode(qba)
 
     def write_output(self):
+        # if we are already writing something else,
+        # store the present message in a buffer
+        if not self.write_lock.tryLock():
+            self.buffer_lock.lock()
+            self.buffer.append(self.get_stdout())
+            self.buffer_lock.unlock()
+
+            if not self.write_lock.tryLock():
+                return
+
         self.shell.write(self.get_stdout(), flush=True)
-        # Commenting the line below improves crashes on long
-        # output. See Issue 2251
-        # QApplication.processEvents()
+
+        while True:
+            self.buffer_lock.lock()
+            messages = self.buffer
+            self.buffer = []
+
+            if not messages:
+                self.write_lock.unlock()
+                self.buffer_lock.unlock()
+                return
+
+            self.buffer_lock.unlock()
+            self.shell.write("\n".join(messages), flush=True)
 
     def send_to_process(self, qstr):
         raise NotImplementedError
diff --git a/spyderlib/widgets/externalshell/introspection.py b/spyderlib/widgets/externalshell/introspection.py
index 0a9aa2b..c8dbc1b 100644
--- a/spyderlib/widgets/externalshell/introspection.py
+++ b/spyderlib/widgets/externalshell/introspection.py
@@ -6,18 +6,20 @@
 
 """External shell's introspection and notification servers"""
 
-from spyderlib.qt.QtCore import QThread, Signal
-
-import threading
-import socket
+# Standard library imports
 import errno
 import os
+import socket
+import threading
+
+# Third party imports
+from qtpy.QtCore import QThread, Signal
 
 # Local imports
 from spyderlib.config.base import get_conf_path, DEBUG
-from spyderlib.utils.misc import select_port
 from spyderlib.utils.debug import log_last_error
 from spyderlib.utils.bsdsocket import read_packet, write_packet
+from spyderlib.utils.misc import select_port
 
 
 LOG_FILENAME = get_conf_path('introspection.log')
@@ -31,6 +33,7 @@ if DEBUG_INTROSPECTION:
 
 SPYDER_PORT = 20128
 
+
 class IntrospectionServer(threading.Thread):
     """Introspection server"""
     def __init__(self):
diff --git a/spyderlib/widgets/externalshell/monitor.py b/spyderlib/widgets/externalshell/monitor.py
index 27f82bb..0f64af3 100644
--- a/spyderlib/widgets/externalshell/monitor.py
+++ b/spyderlib/widgets/externalshell/monitor.py
@@ -248,9 +248,9 @@ class Monitor(threading.Thread):
         else:
             ns.update(glbs)
             ns.update(self.pdb_locals)
-        
-        # Add magics to ns so we can show help about them on the Object
-        # Inspector
+
+        # Add magics to ns so we can show help about them on the Help
+        # plugin
         if self.ip and with_magics:
             line_magics = self.ip.magics_manager.magics['line']
             cell_magics = self.ip.magics_manager.magics['cell']
diff --git a/spyderlib/widgets/externalshell/pythonshell.py b/spyderlib/widgets/externalshell/pythonshell.py
index 1667ad7..ad653c1 100644
--- a/spyderlib/widgets/externalshell/pythonshell.py
+++ b/spyderlib/widgets/externalshell/pythonshell.py
@@ -6,33 +6,34 @@
 
 """External Python Shell widget: execute Python script in a separate process"""
 
+# Standard library imports
 import os
 import os.path as osp
 import socket
 import sys
 
-from spyderlib.qt.QtGui import QApplication, QMessageBox, QSplitter, QMenu
-from spyderlib.qt.QtCore import QProcess, Signal, Slot, Qt
-from spyderlib.qt.QtCore import QProcessEnvironment
-from spyderlib.qt.compat import getexistingdirectory
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.compat import getexistingdirectory
+from qtpy.QtCore import QProcess, QProcessEnvironment, Qt, Signal, Slot
+from qtpy.QtWidgets import QApplication, QMenu, QMessageBox, QSplitter
 
 # Local imports
-from spyderlib.utils.qthelpers import (add_actions, create_toolbutton,
-                                       create_action, DialogManager)
+from spyderlib.config.base import (_, DEBUG, get_module_source_path,
+                                   MAC_APP_NAME, running_in_mac_app)
+from spyderlib.py3compat import (is_text_string, to_binary_string,
+                                 to_text_string)
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.bsdsocket import communicate, write_packet
 from spyderlib.utils.environ import RemoteEnvDialog
-from spyderlib.utils.programs import get_python_args
 from spyderlib.utils.misc import get_python_executable
-from spyderlib.config.base import (_, get_module_source_path, DEBUG,
-                                  MAC_APP_NAME, running_in_mac_app)
+from spyderlib.utils.programs import get_python_args
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton, DialogManager)
+from spyderlib.widgets.externalshell.baseshell import (ExternalShellBase,
+                                                       add_pathlist_to_PYTHONPATH)
 from spyderlib.widgets.shell import PythonShellWidget
 from spyderlib.widgets.variableexplorer.namespacebrowser import NamespaceBrowser
-from spyderlib.utils.bsdsocket import communicate, write_packet
-from spyderlib.widgets.externalshell.baseshell import (ExternalShellBase,
-                                                   add_pathlist_to_PYTHONPATH)
 from spyderlib.widgets.variableexplorer.collectionseditor import CollectionsEditor
-from spyderlib.py3compat import (is_text_string, to_text_string,
-                                 to_binary_string)
 
 
 class ExtPythonShellWidget(PythonShellWidget):
@@ -670,10 +671,9 @@ def test():
                                 mpl_backend=0,
                                 light_background=False)
 
-    from spyderlib.qt.QtGui import QFont
-    from spyderlib.config.main import CONF
-    font = QFont(CONF.get('console', 'font/family')[0])
-    font.setPointSize(10)
+    from spyderlib.config.gui import get_font
+    
+    font = get_font()
     shell.shell.set_font(font)
 
     shell.shell.toggle_wrap_mode(True)
diff --git a/spyderlib/widgets/externalshell/sitecustomize.py b/spyderlib/widgets/externalshell/sitecustomize.py
index 5046c27..63eeda1 100644
--- a/spyderlib/widgets/externalshell/sitecustomize.py
+++ b/spyderlib/widgets/externalshell/sitecustomize.py
@@ -32,6 +32,13 @@ if not hasattr(sys, 'argv'):
 
 
 #==============================================================================
+# Main constants
+#==============================================================================
+IS_IPYTHON = os.environ.get("IPYTHON_KERNEL", "").lower() == "true"
+IS_EXT_INTERPRETER = os.environ.get('EXTERNAL_INTERPRETER', '').lower() == "true"
+
+
+#==============================================================================
 # Important Note:
 #
 # We avoid importing spyderlib here, so we are handling Python 3 compatiblity
@@ -92,7 +99,8 @@ except ImportError:
     basestring = (str,)
     def execfile(filename, namespace):
         # Open a source file correctly, whatever its encoding is
-        exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
+        with open(filename, 'rb') as f:
+            exec(compile(f.read(), filename, 'exec'), namespace)
 
 
 #==============================================================================
@@ -150,7 +158,7 @@ os.environ['SPYDER_PARENT_DIR'] = spyderlib_path
 # Setting console encoding (otherwise Python does not recognize encoding)
 # for Windows platforms
 #==============================================================================
-if os.name == 'nt':
+if os.name == 'nt' and PY2:
     try:
         import locale, ctypes
         _t, _cp = locale.getdefaultlocale('LANG')
@@ -168,8 +176,6 @@ if os.name == 'nt':
 #==============================================================================
 # Settings for our MacOs X app
 #==============================================================================
-IS_EXT_INTERPRETER = os.environ.get('EXTERNAL_INTERPRETER', '').lower() == "true"
-
 if sys.platform == 'darwin':
     from spyderlib.config.base import MAC_APP_NAME
     if MAC_APP_NAME in __file__:
@@ -205,7 +211,7 @@ except ImportError:
 
 #==============================================================================
 # Add default filesystem encoding on Linux to avoid an error with
-# Matplotlib 1.5 in Python 2 (Fixes Issue 2793) 
+# Matplotlib 1.5 in Python 2 (Fixes Issue 2793)
 #==============================================================================
 if PY2 and sys.platform.startswith('linux'):
     def _getfilesystemencoding_wrapper():
@@ -215,6 +221,19 @@ if PY2 and sys.platform.startswith('linux'):
 
 
 #==============================================================================
+# Set PyQt API to #2
+#==============================================================================
+if os.environ["QT_API"] == 'pyqt':
+    try:
+        import sip
+        for qtype in ('QString', 'QVariant', 'QDate', 'QDateTime',
+                      'QTextStream', 'QTime', 'QUrl'):
+            sip.setapi(qtype, 2)
+    except:
+        pass
+
+
+#==============================================================================
 # Importing matplotlib before creating the monitor.
 # This prevents a kernel crash with the inline backend in our IPython
 # consoles on Linux and Python 3 (Fixes Issue 2257)
@@ -267,7 +286,7 @@ else:
     builtins.open_in_spyder = open_in_spyder
 
     # Our own input hook, monitor based and for Windows only
-    if os.name == 'nt':
+    if os.name == 'nt' and matplotlib and not IS_IPYTHON:
         # Qt imports
         if os.environ["QT_API"] == 'pyqt5':
             from PyQt5 import QtCore
@@ -324,61 +343,59 @@ else:
 #==============================================================================
 # Matplotlib settings
 #==============================================================================
-IS_IPYTHON = os.environ.get("IPYTHON_KERNEL", "").lower() == "true"
-
 if matplotlib is not None:
-    mpl_backend = os.environ.get("SPY_MPL_BACKEND", "")
-    mpl_ion = os.environ.get("MATPLOTLIB_ION", "")
-
-    # Setting no backend if the user asks for it
-    if not mpl_backend or mpl_backend.lower() == 'none':
-        mpl_backend = ""
-
-    # Set backend automatically
-    if mpl_backend.lower() == 'automatic':
-        if not IS_EXT_INTERPRETER:
-            if os.environ["QT_API"] == 'pyqt5':
-                mpl_backend = 'Qt5Agg'
+    if not IS_IPYTHON:
+        mpl_backend = os.environ.get("SPY_MPL_BACKEND", "")
+        mpl_ion = os.environ.get("MATPLOTLIB_ION", "")
+
+        # Setting no backend if the user asks for it
+        if not mpl_backend or mpl_backend.lower() == 'none':
+            mpl_backend = ""
+
+        # Set backend automatically
+        if mpl_backend.lower() == 'automatic':
+            if not IS_EXT_INTERPRETER:
+                if os.environ["QT_API"] == 'pyqt5':
+                    mpl_backend = 'Qt5Agg'
+                else:
+                    mpl_backend = 'Qt4Agg'
             else:
-                mpl_backend = 'Qt4Agg'
-        else:
-            # Test for backend libraries on external interpreters
-            def set_mpl_backend(backend):
-                mod, bend, qt_api = backend
-                try:
-                    if mod:
-                        __import__(mod)
-                    if qt_api and (os.environ["QT_API"] != qt_api):
+                # Test for backend libraries on external interpreters
+                def set_mpl_backend(backend):
+                    mod, bend, qt_api = backend
+                    try:
+                        if mod:
+                            __import__(mod)
+                        if qt_api and (os.environ["QT_API"] != qt_api):
+                            return None
+                        else:
+                            matplotlib.use(bend)
+                            return bend
+                    except (ImportError, ValueError):
                         return None
-                    else:
-                        matplotlib.use(bend)
-                        return bend
-                except (ImportError, ValueError):
-                    return None
-
-            backends = [('PyQt5', 'Qt5Agg', 'pyqt5'),
-                        ('PyQt4', 'Qt4Agg', 'pyqt'),
-                        ('PySide', 'Qt4Agg', 'pyqt')]
-            if not os.name == 'nt':
-                 backends.append( ('_tkinter', 'TkAgg', None) )
-
-            for b in backends:
-                mpl_backend = set_mpl_backend(b)
-                if mpl_backend:
-                    break
-
-            if not mpl_backend:
-                _print("NOTE: No suitable Matplotlib backend was found!\n"
-                       "      You won't be able to create plots\n")
-
-    # To have mpl docstrings as rst
-    matplotlib.rcParams['docstring.hardcopy'] = True
-
-    # Activate interactive mode when needed
-    if mpl_ion.lower() == "true":
-        matplotlib.rcParams['interactive'] = True
 
-    if not IS_IPYTHON:
+                backends = [('PyQt5', 'Qt5Agg', 'pyqt5'),
+                            ('PyQt4', 'Qt4Agg', 'pyqt'),
+                            ('PySide', 'Qt4Agg', 'pyqt')]
+                if not os.name == 'nt':
+                     backends.append( ('_tkinter', 'TkAgg', None) )
+    
+                for b in backends:
+                    mpl_backend = set_mpl_backend(b)
+                    if mpl_backend:
+                        break
+
+                if not mpl_backend:
+                    _print("NOTE: No suitable Matplotlib backend was found!\n"
+                           "      You won't be able to create plots\n")
+
+        # To have mpl docstrings as rst
+        matplotlib.rcParams['docstring.hardcopy'] = True
+
+        # Activate interactive mode when needed
+        if mpl_ion.lower() == "true":
+            matplotlib.rcParams['interactive'] = True
+
         from spyderlib.widgets.externalshell import inputhooks
         if mpl_backend:
             import ctypes
@@ -421,6 +438,9 @@ if matplotlib is not None:
                 inputhooks.remove_pyqt_inputhook()
         else:
             inputhooks.remove_pyqt_inputhook()
+    else:
+        # To have mpl docstrings as rst
+        matplotlib.rcParams['docstring.hardcopy'] = True
 
 
 #==============================================================================
@@ -443,21 +463,39 @@ if IS_IPYTHON:
             kwargs['exit'] = False
             TestProgram.__init__(self, *args, **kwargs)
     unittest.main = IPyTesProgram
-    
-    # Pandas monkey-patches
-    try:
-        # Make Pandas recognize our IPython consoles as proper qtconsoles
-        # Fixes Issue 2015
-        def in_qtconsole():
-            return True
-        import pandas as pd
-        pd.core.common.in_qtconsole = in_qtconsole
-        
-        # Set Pandas output encoding
-        pd.options.display.encoding = 'utf-8'
-    except (ImportError, AttributeError):
-        pass
-        
+
+
+#==============================================================================
+# Pandas adjustments
+#==============================================================================
+try:
+    # Make Pandas recognize our IPython consoles as proper qtconsoles
+    # Fixes Issue 2015
+    def in_qtconsole():
+        return True
+    import pandas as pd
+    pd.core.common.in_qtconsole = in_qtconsole
+
+    # Set Pandas output encoding
+    pd.options.display.encoding = 'utf-8'
+
+    # Filter warning that appears for DataFrames with np.nan values
+    # Example:
+    # >>> import pandas as pd, numpy as np
+    # >>> pd.Series([np.nan,np.nan,np.nan],index=[1,2,3])
+    # Fixes Issue 2991
+    import warnings
+    # For 0.18-
+    warnings.filterwarnings(action='ignore', category=RuntimeWarning,
+                            module='pandas.core.format',
+                            message=".*invalid value encountered in.*")
+    # For 0.18.1+
+    warnings.filterwarnings(action='ignore', category=RuntimeWarning,
+                            module='pandas.formats.format',
+                            message=".*invalid value encountered in.*")
+except (ImportError, AttributeError):
+    pass
+
 
 #==============================================================================
 # Pdb adjustments
@@ -838,8 +876,8 @@ def evalsc(command):
     """Evaluate special commands
     (analog to IPython's magic commands but far less powerful/complete)"""
     assert command.startswith('%')
-    
-    from subprocess import Popen, PIPE
+    from spyderlib.utils import programs
+
     namespace = _get_globals()
     command = command[1:].strip()  # Remove leading %
 
@@ -863,10 +901,10 @@ def evalsc(command):
             _print(os.getcwd())
     elif command == 'ls':
         if os.name == 'nt':
-            Popen('dir', shell=True, stdin=PIPE)
+            programs.run_shell_command('dir')
             _print('\n')
         else:
-            Popen('ls', shell=True, stdin=PIPE)
+            programs.run_shell_command('ls')
             _print('\n')
     elif command == 'scientific':
         from spyderlib.config import base
diff --git a/spyderlib/widgets/externalshell/start_ipython_kernel.py b/spyderlib/widgets/externalshell/start_ipython_kernel.py
index 4814bb7..2862eab 100644
--- a/spyderlib/widgets/externalshell/start_ipython_kernel.py
+++ b/spyderlib/widgets/externalshell/start_ipython_kernel.py
@@ -10,14 +10,6 @@
 import sys
 import os.path as osp
 
-# TODO: Move to Jupyter imports in 3.1
-try:
-    import warnings
-    from IPython.utils.shimmodule import ShimWarning
-    warnings.simplefilter('ignore', ShimWarning)
-except:
-    pass
-
 
 def sympy_config(mpl_backend):
     """Sympy configuration"""
@@ -40,11 +32,11 @@ def kernel_config():
     """Create a config object with IPython kernel options"""
     import os
 
-    from IPython.config.loader import Config, load_pyconfig_files
     from IPython.core.application import get_ipython_dir
     from spyderlib.config.main import CONF
     from spyderlib.utils.programs import is_module_installed
-    
+    from traitlets.config.loader import Config, load_pyconfig_files
+
     # ---- IPython config ----
     try:
         profile_path = osp.join(get_ipython_dir(), 'profile_default')
@@ -100,7 +92,7 @@ def kernel_config():
                                          "%matplotlib {0}".format(mpl_backend))
 
         # Inline backend configuration
-        if backends[backend_o] == 'inline':
+        if mpl_backend == 'inline':
            # Figure format
            format_o = CONF.get('ipython_console',
                                'pylab/inline/figure_format', 0)
@@ -192,7 +184,7 @@ __name__ = '__main__'
 sys.path.insert(0, '')
 
 # Fire up the kernel instance.
-from IPython.kernel.zmq.kernelapp import IPKernelApp
+from ipykernel.kernelapp import IPKernelApp
 ipk_temp = IPKernelApp.instance()
 ipk_temp.config = kernel_config()
 ipk_temp.initialize()
diff --git a/spyderlib/widgets/externalshell/systemshell.py b/spyderlib/widgets/externalshell/systemshell.py
index 48c1453..31b15d9 100644
--- a/spyderlib/widgets/externalshell/systemshell.py
+++ b/spyderlib/widgets/externalshell/systemshell.py
@@ -6,23 +6,26 @@
 
 """External System Shell widget: execute terminal in a separate process"""
 
+# Standard library imports
 import os
 import sys
 
-from spyderlib.qt.QtGui import QMessageBox
-from spyderlib.qt.QtCore import (QProcess, Signal, QTextCodec,
-                                 QProcessEnvironment)
-LOCALE_CODEC = QTextCodec.codecForLocale()
-CP850_CODEC = QTextCodec.codecForName('cp850')
+# Third party imports
+from qtpy.QtCore import QProcess, QProcessEnvironment, QTextCodec, Signal
+from qtpy.QtWidgets import QMessageBox
 
 # Local imports
-from spyderlib.utils.programs import shell_split
 from spyderlib.config.base import _
-from spyderlib.widgets.externalshell.baseshell import (ExternalShellBase,
-                                                   add_pathlist_to_PYTHONPATH)
+from spyderlib.py3compat import is_text_string, to_text_string
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.programs import shell_split
+from spyderlib.widgets.externalshell.baseshell import (add_pathlist_to_PYTHONPATH,
+                                                       ExternalShellBase)
 from spyderlib.widgets.shell import TerminalWidget
-from spyderlib.py3compat import to_text_string, is_text_string
-import spyderlib.utils.icon_manager as ima
+
+
+LOCALE_CODEC = QTextCodec.codecForLocale()
+CP850_CODEC = QTextCodec.codecForName('cp850')
 
 
 class ExternalSystemShell(ExternalShellBase):
@@ -168,9 +171,8 @@ def test():
 
     app.aboutToQuit.connect(shell.finish_process)
 
-    from spyderlib.qt.QtGui import QFont
-    from spyderlib.config.main import CONF
-    font = QFont(CONF.get('console', 'font/family')[0])
+    from qtpy.QtGui import QFont
+    font = QFont()
     font.setPointSize(10)
     shell.shell.set_font(font)
 
diff --git a/spyderlib/widgets/fileswitcher.py b/spyderlib/widgets/fileswitcher.py
index b65ce71..e1f633d 100644
--- a/spyderlib/widgets/fileswitcher.py
+++ b/spyderlib/widgets/fileswitcher.py
@@ -4,15 +4,16 @@
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
+# Standard library imports
 from __future__ import print_function
-
 import os
 import os.path as osp
 
-from spyderlib.qt.QtGui import (QDialog, QHBoxLayout, QIcon, QLabel, QLineEdit,
-                                QListWidget, QListWidgetItem, QRegExpValidator,
-                                QTextCursor, QVBoxLayout)
-from spyderlib.qt.QtCore import Signal, QEvent, QObject, QRegExp, QSize, Qt
+# Third party imports
+from qtpy.QtCore import Signal, QEvent, QObject, QRegExp, QSize, Qt
+from qtpy.QtGui import (QIcon, QRegExpValidator, QTextCursor)
+from qtpy.QtWidgets import (QDialog, QHBoxLayout, QLabel, QLineEdit,
+                            QListWidget, QListWidgetItem, QVBoxLayout)
 
 # Local imports
 from spyderlib.config.base import _
diff --git a/spyderlib/widgets/findinfiles.py b/spyderlib/widgets/findinfiles.py
index fb3d312..9440c63 100644
--- a/spyderlib/widgets/findinfiles.py
+++ b/spyderlib/widgets/findinfiles.py
@@ -11,31 +11,31 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 from __future__ import with_statement
-
-from spyderlib.qt.QtGui import (QHBoxLayout, QWidget, QTreeWidgetItem,
-                                QSizePolicy, QRadioButton, QVBoxLayout, QLabel)
-from spyderlib.qt.QtCore import (Signal, Slot, Qt, QThread, QMutexLocker,
-                                 QMutex)
-from spyderlib.qt.compat import getexistingdirectory
-import spyderlib.utils.icon_manager as ima
-
-import sys
-import os
-import re
 import fnmatch
+import os
 import os.path as osp
-from subprocess import Popen, PIPE
+import re
+import sys
 import traceback
 
+# Third party imports
+from qtpy.compat import getexistingdirectory
+from qtpy.QtCore import QMutex, QMutexLocker, Qt, QThread, Signal, Slot
+from qtpy.QtWidgets import (QHBoxLayout, QLabel, QRadioButton, QSizePolicy,
+                            QTreeWidgetItem, QVBoxLayout, QWidget)
+
 # Local imports
-from spyderlib.utils.vcs import is_hg_installed, get_vcs_root
+from spyderlib.config.base import _
+from spyderlib.py3compat import getcwd, to_text_string
+from spyderlib.utils import programs
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.misc import abspardir, get_common_path
 from spyderlib.utils.qthelpers import create_toolbutton, get_filetype_icon
-from spyderlib.config.base import _
+from spyderlib.utils.vcs import is_hg_installed, get_vcs_root
 from spyderlib.widgets.comboboxes import PathComboBox, PatternComboBox
 from spyderlib.widgets.onecolumntree import OneColumnTree
-from spyderlib.py3compat import to_text_string, getcwd
 
 
 #def find_files_in_hg_manifest(rootpath, include, exclude):
@@ -189,8 +189,7 @@ class SearchThread(QThread):
         return ok
 
     def find_files_in_hg_manifest(self):
-        p = Popen(['hg', 'manifest'], stdout=PIPE,
-                  cwd=self.rootpath, shell=True)
+        p = programs.run_shell_command('hg manifest', cwd=self.rootpath)
         hgroot = get_vcs_root(self.rootpath)
         self.pathlist = [hgroot]
         for path in p.stdout.read().decode().splitlines():
@@ -472,7 +471,7 @@ class FindOptions(QWidget):
         hg_manifest = self.hg_manifest.isChecked()
         path = osp.abspath( to_text_string( self.dir_combo.currentText() ) )
         
-        # Finding text occurences
+        # Finding text occurrences
         if not include_re:
             include = fnmatch.translate(include)
         if not exclude_re:
diff --git a/spyderlib/widgets/findreplace.py b/spyderlib/widgets/findreplace.py
index 8c2314d..bdd2ec8 100644
--- a/spyderlib/widgets/findreplace.py
+++ b/spyderlib/widgets/findreplace.py
@@ -11,19 +11,22 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt.QtGui import (QHBoxLayout, QGridLayout, QCheckBox, QLabel,
-                                QWidget, QSizePolicy, QTextCursor)
-from spyderlib.qt.QtCore import Signal, Slot, Qt, QTimer
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import re
 
+# Third party imports
+from qtpy.QtCore import Qt, QTimer, Signal, Slot
+from qtpy.QtGui import QTextCursor
+from qtpy.QtWidgets import (QCheckBox, QGridLayout, QHBoxLayout, QLabel,
+                            QSizePolicy, QWidget)
+
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.config.gui import create_shortcut, new_shortcut
-from spyderlib.utils.qthelpers import get_icon, create_toolbutton
-from spyderlib.widgets.comboboxes import PatternComboBox
+from spyderlib.config.gui import config_shortcut, fixed_shortcut
 from spyderlib.py3compat import to_text_string
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import create_toolbutton, get_icon
+from spyderlib.widgets.comboboxes import PatternComboBox
 
 
 def is_position_sup(pos1, pos2):
@@ -38,9 +41,10 @@ def is_position_inf(pos1, pos2):
 class FindReplace(QWidget):
     """Find widget"""
     STYLE = {False: "background-color:rgb(255, 175, 90);",
-             True: ""}
+             True: "",
+             None: ""}
     visibility_changed = Signal(bool)
-    
+
     def __init__(self, parent, enable_replace=False):
         QWidget.__init__(self, parent)
         self.enable_replace = enable_replace
@@ -144,20 +148,20 @@ class FindReplace(QWidget):
     def create_shortcuts(self, parent):
         """Create shortcuts for this widget"""
         # Configurable
-        findnext = create_shortcut(self.find_next, context='Editor',
+        findnext = config_shortcut(self.find_next, context='_',
                                    name='Find next', parent=parent)
-        findprev = create_shortcut(self.find_previous, context='Editor',
+        findprev = config_shortcut(self.find_previous, context='_',
                                    name='Find previous', parent=parent)
-        togglefind = create_shortcut(self.show, context='Editor',
+        togglefind = config_shortcut(self.show, context='_',
                                      name='Find text', parent=parent)
-        togglereplace = create_shortcut(self.toggle_replace_widgets,
-                                        context='Editor', name='Replace text',
+        togglereplace = config_shortcut(self.toggle_replace_widgets,
+                                        context='_', name='Replace text',
                                         parent=parent)
         # Fixed
-        new_shortcut("Escape", self, self.hide)
+        fixed_shortcut("Escape", self, self.hide)
 
         return [findnext, findprev, togglefind, togglereplace]
-        
+
     def get_shortcut_data(self):
         """
         Returns shortcut data, a list of tuples (shortcut, text, default)
@@ -198,7 +202,20 @@ class FindReplace(QWidget):
         self.visibility_changed.emit(True)
         if self.editor is not None:
             text = self.editor.get_selected_text()
-            if len(text) > 0:
+
+            # If no text is highlighted for search, use whatever word is under
+            # the cursor
+            if not text:
+                try:
+                    cursor = self.editor.textCursor()
+                    cursor.select(QTextCursor.WordUnderCursor)
+                    text = to_text_string(cursor.selectedText())
+                except AttributeError:
+                    # We can't do this for all widgets, e.g. WebView's
+                    pass
+
+            # Now that text value is sorted out, use it for the search
+            if text:
                 self.search_text.setEditText(text)
                 self.search_text.lineEdit().selectAll()
                 self.refresh()
@@ -247,9 +264,14 @@ class FindReplace(QWidget):
             browser.WebView
         """
         self.editor = editor
-        from spyderlib.qt.QtWebKit import QWebView
-        self.words_button.setVisible(not isinstance(editor, QWebView))
-        self.re_button.setVisible(not isinstance(editor, QWebView))
+        # Note: This is necessary to test widgets/editor.py
+        # in Qt builds that don't have web widgets
+        try:
+            from qtpy.QtWebEngineWidgets import QWebEngineView
+        except ImportError:
+            QWebEngineView = type(None)
+        self.words_button.setVisible(not isinstance(editor, QWebEngineView))
+        self.re_button.setVisible(not isinstance(editor, QWebEngineView))
         from spyderlib.widgets.sourcecode.codeeditor import CodeEditor
         self.is_code_editor = isinstance(editor, CodeEditor)
         self.highlight_button.setVisible(self.is_code_editor)
@@ -260,7 +282,7 @@ class FindReplace(QWidget):
 
     @Slot()
     def find_next(self):
-        """Find next occurence"""
+        """Find next occurrence"""
         state = self.find(changed=False, forward=True, rehighlight=False)
         self.editor.setFocus()
         self.search_text.add_current_text()
@@ -268,7 +290,7 @@ class FindReplace(QWidget):
 
     @Slot()
     def find_previous(self):
-        """Find previous occurence"""
+        """Find previous occurrence"""
         state = self.find(changed=False, forward=False, rehighlight=False)
         self.editor.setFocus()
         return state
@@ -298,6 +320,9 @@ class FindReplace(QWidget):
         text = self.search_text.currentText()
         if len(text) == 0:
             self.search_text.lineEdit().setStyleSheet("")
+            if not self.is_code_editor:
+                # Clears the selection for WebEngine
+                self.editor.find_text('')
             return None
         else:
             case = self.case_button.isChecked()
@@ -361,7 +386,7 @@ class FindReplace(QWidget):
                             # part of the search string
                             break
                     if position1 == position0:
-                        # Avoid infinite loop: single found occurence
+                        # Avoid infinite loop: single found occurrence
                         break
                     position0 = position1
                 if pattern is None:
diff --git a/spyderlib/widgets/formlayout.py b/spyderlib/widgets/formlayout.py
index 33f5e7a..d7ac4f1 100644
--- a/spyderlib/widgets/formlayout.py
+++ b/spyderlib/widgets/formlayout.py
@@ -33,8 +33,6 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 """
 
-from __future__ import print_function
-
 # History:
 # 1.0.15: added support for multiline strings
 # 1.0.14: fixed Python 3 support (regression in 1.0.13)
@@ -46,31 +44,34 @@ from __future__ import print_function
 # 1.0.7: added support for "Apply" button
 # 1.0.6: code cleaning
 
-__version__ = '1.0.15'
-__license__ = __doc__
-
+# Standard library imports
+from __future__ import print_function
+import datetime
 import os
 
+# Third party imports
 try:
-    from spyderlib.qt.QtGui import QFormLayout
+    from qtpy.QtWidgets import QFormLayout
 except ImportError:
     raise ImportError("Warning: formlayout requires PyQt4 >v4.3")
 
-from spyderlib.qt.QtGui import (QWidget, QLineEdit, QComboBox, QLabel,
-                                QSpinBox, QIcon, QStyle, QDialogButtonBox,
-                                QHBoxLayout, QVBoxLayout, QDialog, QColor,
-                                QPushButton, QCheckBox, QColorDialog, QPixmap,
-                                QTabWidget, QApplication, QStackedWidget,
-                                QDateEdit, QDateTimeEdit, QFont, QFontComboBox,
-                                QFontDatabase, QGridLayout, QDoubleValidator,
-                                QTextEdit)
-from spyderlib.qt.QtCore import Qt, Signal, QSize, Slot, Property
-import datetime
+from qtpy.QtCore import Property, QSize, Qt, Signal, Slot
+from qtpy.QtGui import (QColor, QDoubleValidator, QFont, QFontDatabase, QIcon,
+                        QPixmap)
+from qtpy.QtWidgets import (QApplication, QCheckBox, QColorDialog, QComboBox,
+                            QDateEdit, QDateTimeEdit, QDialog,
+                            QDialogButtonBox, QFontComboBox, QGridLayout,
+                            QHBoxLayout, QLabel, QLineEdit, QPushButton,
+                            QSpinBox, QStackedWidget, QStyle, QTabWidget,
+                            QTextEdit, QVBoxLayout, QWidget)
 
 # Local imports
 from spyderlib.config.base import _, DEBUG, STDERR
-from spyderlib.py3compat import is_text_string, to_text_string, is_string
+from spyderlib.py3compat import is_string, is_text_string, to_text_string
+
 
+__version__ = '1.0.15'
+__license__ = __doc__
 DEBUG_FORMLAYOUT = DEBUG >= 2
 
 
diff --git a/spyderlib/widgets/helperwidgets.py b/spyderlib/widgets/helperwidgets.py
index 03ee710..e2d4a61 100644
--- a/spyderlib/widgets/helperwidgets.py
+++ b/spyderlib/widgets/helperwidgets.py
@@ -9,13 +9,12 @@ Helper widgets.
 """
 
 # Third party imports
-from spyderlib.qt.QtCore import QPoint, QSize, Qt
-from spyderlib.qt.QtGui import (QToolButton, QToolTip,
-                                QStyledItemDelegate, QApplication,
-                                QTextDocument, QStyleOptionViewItem,
-                                QAbstractTextDocumentLayout, QStyle,
-                                QVBoxLayout, QSpacerItem, QPainter,
-                                QMessageBox, QCheckBox, QLineEdit)
+from qtpy.QtCore import QPoint, QSize, Qt
+from qtpy.QtGui import QAbstractTextDocumentLayout, QPainter, QTextDocument
+from qtpy.QtWidgets import (QApplication, QCheckBox, QLineEdit, QMessageBox,
+                            QSpacerItem, QStyle, QStyledItemDelegate,
+                            QStyleOptionViewItem, QToolButton, QToolTip,
+                            QVBoxLayout)
 
 # Local imports
 from spyderlib.config.base import _
diff --git a/spyderlib/widgets/internalshell.py b/spyderlib/widgets/internalshell.py
index 2f4cc65..f0b7d8c 100644
--- a/spyderlib/widgets/internalshell.py
+++ b/spyderlib/widgets/internalshell.py
@@ -13,33 +13,35 @@
 
 #FIXME: Internal shell MT: for i in range(100000): print i -> bug
 
-#----Builtins*
-from spyderlib.py3compat import builtins
-from spyderlib.widgets.variableexplorer.objecteditor import oedit
-builtins.oedit = oedit
-
+# Standard library imports
+from time import time
 import os
 import threading
-from time import time
-from subprocess import Popen
 
-from spyderlib.qt.QtGui import QMessageBox
-from spyderlib.qt.QtCore import Signal, Slot, QObject, QEventLoop
+# Third party imports
+from qtpy.QtCore import QEventLoop, QObject, Signal, Slot
+from qtpy.QtWidgets import QMessageBox
 
-# Local import
+# Local imports
 from spyderlib import get_versions
-from spyderlib.utils.qthelpers import create_action
 from spyderlib.interpreter import Interpreter
-from spyderlib.utils.dochelpers import getargtxt, getsource, getdoc, getobjdir
+from spyderlib.py3compat import (builtins, getcwd, to_binary_string,
+                                 to_text_string, u)
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils import programs
+from spyderlib.utils.dochelpers import getargtxt, getdoc, getobjdir, getsource
 from spyderlib.utils.misc import get_error_match
-#TODO: remove the CONF object and make it work anyway
+from spyderlib.utils.qthelpers import create_action
+from spyderlib.widgets.shell import PythonShellWidget
+from spyderlib.widgets.variableexplorer.objecteditor import oedit
+# TODO: remove the CONF object and make it work anyway
 # In fact, this 'CONF' object has nothing to do in package spyderlib.widgets
 # which should not contain anything directly related to Spyder's main app
-from spyderlib.config.base import get_conf_path, _, DEBUG
+from spyderlib.config.base import _, DEBUG, get_conf_path
 from spyderlib.config.main import CONF
-from spyderlib.widgets.shell import PythonShellWidget
-from spyderlib.py3compat import to_text_string, getcwd, to_binary_string, u
-import spyderlib.utils.icon_manager as ima
+
+
+builtins.oedit = oedit
 
 
 def create_banner(message):
@@ -78,6 +80,11 @@ class SysOutput(QObject):
     def flush(self):
         pass
 
+    # This is needed to fix Issue 2984
+    @property
+    def closed(self):
+        return False
+
 class WidgetProxyData(object):
     pass
 
@@ -298,11 +305,10 @@ class InternalShell(PythonShellWidget):
         editor_path = CONF.get('internal_console', 'external_editor/path')
         goto_option = CONF.get('internal_console', 'external_editor/gotoline')
         try:
+            args = [filename]
             if goto > 0 and goto_option:
-                Popen(r'%s "%s" %s%d' % (editor_path, filename,
-                                         goto_option, goto))
-            else:
-                Popen(r'%s "%s"' % (editor_path, filename))
+                args.append('%s%d'.format(goto_option, goto))
+            programs.run_program(editor_path, args)
         except OSError:
             self.write_error("External editor was not found:"
                              " %s\n" % editor_path)
diff --git a/spyderlib/widgets/ipython.py b/spyderlib/widgets/ipython.py
index 9b36a0a..f5083a6 100644
--- a/spyderlib/widgets/ipython.py
+++ b/spyderlib/widgets/ipython.py
@@ -7,59 +7,55 @@
 """
 IPython v0.13+ client's widget
 """
-# Fix for Issue 1356
-from __future__ import absolute_import
 
-# Stdlib imports
+# Standard library imports
+from __future__ import absolute_import  # Fix for Issue 1356
+from string import Template
 import os
 import os.path as osp
 import re
-from string import Template
 import sys
 import time
 
-# Qt imports
-from spyderlib.qt.QtGui import (QTextEdit, QKeySequence, QWidget, QMenu,
-                                QHBoxLayout, QToolButton, QVBoxLayout,
-                                QMessageBox)
-from spyderlib.qt.QtCore import Signal, Slot, Qt
-import spyderlib.utils.icon_manager as ima
-
-# IPython imports
-try:
-    from qtconsole.rich_jupyter_widget import RichJupyterWidget as RichIPythonWidget
-except ImportError:
-    from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
-from IPython.qt.console.ansi_code_processor import ANSI_OR_SPECIAL_PATTERN
+# Third party imports
+from qtpy.QtCore import Qt, QUrl, Signal, Slot
+from qtpy.QtGui import QKeySequence
+from qtpy.QtWidgets import (QHBoxLayout, QMenu, QMessageBox, QTextEdit,
+                            QToolButton, QVBoxLayout, QWidget)
+
+# Third party imports (IPython/Jupyter)
 from IPython.core.application import get_ipython_dir
 from IPython.core.oinspect import call_tip
-from IPython.config.loader import Config, load_pyconfig_files
+from qtconsole.rich_jupyter_widget import RichJupyterWidget
+from qtconsole.ansi_code_processor import ANSI_OR_SPECIAL_PATTERN
+from traitlets.config.loader import Config, load_pyconfig_files
 
 # Local imports
-from spyderlib.config.base import (get_conf_path, get_image_path,
-                                   get_module_source_path, _)
+from spyderlib.config.base import (_, get_conf_path, get_image_path,
+                                   get_module_source_path)
+from spyderlib.config.gui import (config_shortcut, get_font, get_shortcut,
+                                  fixed_shortcut)
 from spyderlib.config.main import CONF
-from spyderlib.config.gui import (create_shortcut, get_font, get_shortcut,
-                                  new_shortcut)
-from spyderlib.utils.dochelpers import getargspecfromtext, getsignaturefromtext
-from spyderlib.utils.qthelpers import (create_toolbutton, add_actions, 
-                                       create_action, restore_keyevent)
+from spyderlib.py3compat import PY3
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils import programs, sourcecode
+from spyderlib.utils.dochelpers import getargspecfromtext, getsignaturefromtext
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton, restore_keyevent)
+from spyderlib.widgets.arraybuilder import SHORTCUT_INLINE, SHORTCUT_TABLE
 from spyderlib.widgets.browser import WebView
 from spyderlib.widgets.calltip import CallTipWidget
-from spyderlib.widgets.mixins import (BaseEditMixin, InspectObjectMixin,
+from spyderlib.widgets.mixins import (BaseEditMixin, GetHelpMixin,
                                       SaveHistoryMixin, TracebackLinksMixin)
-from spyderlib.widgets.arraybuilder import (SHORTCUT_INLINE, SHORTCUT_TABLE)
-from spyderlib.py3compat import PY3
 
 
 #-----------------------------------------------------------------------------
 # Templates
 #-----------------------------------------------------------------------------
-# Using the same css file from the Object Inspector for now. Maybe
+# Using the same css file from the Help plugin for now. Maybe
 # later it'll be a good idea to create a new one.
 UTILS_PATH = get_module_source_path('spyderlib', 'utils')
-CSS_PATH = osp.join(UTILS_PATH, 'inspector', 'static', 'css')
+CSS_PATH = osp.join(UTILS_PATH, 'help', 'static', 'css')
 TEMPLATES_PATH = osp.join(UTILS_PATH, 'ipython', 'templates')
 
 BLANK = open(osp.join(TEMPLATES_PATH, 'blank.html')).read()
@@ -69,7 +65,7 @@ KERNEL_ERROR = open(osp.join(TEMPLATES_PATH, 'kernel_error.html')).read()
 #-----------------------------------------------------------------------------
 # Control widgets
 #-----------------------------------------------------------------------------
-class IPythonControlWidget(TracebackLinksMixin, InspectObjectMixin, QTextEdit,
+class IPythonControlWidget(TracebackLinksMixin, GetHelpMixin, QTextEdit,
                            BaseEditMixin):
     """
     Subclass of QTextEdit with features from Spyder's mixins to use as the
@@ -84,7 +80,7 @@ class IPythonControlWidget(TracebackLinksMixin, InspectObjectMixin, QTextEdit,
         QTextEdit.__init__(self, parent)
         BaseEditMixin.__init__(self)
         TracebackLinksMixin.__init__(self)
-        InspectObjectMixin.__init__(self)
+        GetHelpMixin.__init__(self)
 
         self.calltip_widget = CallTipWidget(self, hide_timer_on=True)
         self.found_results = []
@@ -167,7 +163,7 @@ class IPythonPageControlWidget(QTextEdit, BaseEditMixin):
 #-----------------------------------------------------------------------------
 # Shell widget
 #-----------------------------------------------------------------------------
-class IPythonShellWidget(RichIPythonWidget):
+class IPythonShellWidget(RichJupyterWidget):
     """
     Spyder's IPython shell widget
 
@@ -202,12 +198,12 @@ class IPythonShellWidget(RichIPythonWidget):
         """Bind this shell widget to an IPython client one"""
         self.ipyclient = ipyclient
         self.exit_requested.connect(ipyclient.exit_callback)
-    
+
     def long_banner(self):
         """Banner for IPython widgets with pylab message"""
-        from IPython.core.usage import default_gui_banner
-        banner = default_gui_banner
-        
+        from IPython.core.usage import default_banner
+        banner = default_banner
+
         pylab_o = CONF.get('ipython_console', 'pylab', True)
         autoload_pylab_o = CONF.get('ipython_console', 'pylab/autoload', True)
         mpl_installed = programs.is_module_installed('matplotlib')
@@ -240,6 +236,20 @@ These commands were executed:
 
     def clear_console(self):
         self.execute("%clear")
+        
+    def reset_namespace(self):
+        """Resets the namespace by removing all names defined by the user"""
+        
+        reply = QMessageBox.question(
+            self,
+            _("Reset IPython namespace"),
+            _("All user-defined variables will be removed."
+            "<br>Are you sure you want to reset the namespace?"),
+            QMessageBox.Yes | QMessageBox.No,
+            )
+
+        if reply == QMessageBox.Yes:
+            self.execute("%reset -f")
 
     def write_to_stdin(self, line):
         """Send raw characters to the IPython kernel through stdin"""
@@ -249,20 +259,21 @@ These commands were executed:
         lightbg_o = CONF.get('ipython_console', 'light_color')
         if not lightbg_o:
             self.set_default_style(colors='linux')
-    
+
     def create_shortcuts(self):
-        inspect = create_shortcut(self._control.inspect_current_object,
+        inspect = config_shortcut(self._control.inspect_current_object,
                                   context='Console', name='Inspect current object',
                                   parent=self)
-        clear_console = create_shortcut(self.clear_console, context='Console',
+        clear_console = config_shortcut(self.clear_console, context='Console',
                                         name='Clear shell', parent=self)
 
         # Fixed shortcuts
-        new_shortcut("Ctrl+T", self, lambda: self.new_client.emit())
-        new_shortcut(SHORTCUT_INLINE, self,
-                     lambda: self._control.enter_array_inline())
-        new_shortcut(SHORTCUT_TABLE, self,
-                     lambda: self._control.enter_array_table())
+        fixed_shortcut("Ctrl+T", self, lambda: self.new_client.emit())
+        fixed_shortcut("Ctrl+R", self, lambda: self.reset_namespace())
+        fixed_shortcut(SHORTCUT_INLINE, self,
+                       lambda: self._control.enter_array_inline())
+        fixed_shortcut(SHORTCUT_TABLE, self,
+                       lambda: self._control.enter_array_table())
 
         return [inspect, clear_console]
 
@@ -420,11 +431,12 @@ class IPythonClient(QWidget, SaveHistoryMixin):
         self.history_filename = get_conf_path(history_filename)
         self.history = []
         self.namespacebrowser = None
-        
+
         self.set_infowidget_font()
         self.loading_page = self._create_loading_page()
-        self.infowidget.setHtml(self.loading_page)
-        
+        self.infowidget.setHtml(self.loading_page,
+                                QUrl.fromLocalFile(CSS_PATH))
+
         vlayout = QVBoxLayout()
         toolbar_buttons = self.get_toolbar_buttons()
         hlayout = QHBoxLayout()
@@ -535,9 +547,9 @@ class IPythonClient(QWidget, SaveHistoryMixin):
         restart_action = create_action(self, _("Restart kernel"),
                                        shortcut=QKeySequence("Ctrl+."),
                                        icon=ima.icon('restart'),
-                                       triggered=self.restart_kernel)
-        restart_action.setShortcutContext(Qt.WidgetWithChildrenShortcut)
-        
+                                       triggered=self.restart_kernel,
+                                       context=Qt.WidgetWithChildrenShortcut)
+
         # Main menu
         if self.menu_actions is not None:
             actions = [restart_action, None] + self.menu_actions
@@ -587,6 +599,9 @@ class IPythonClient(QWidget, SaveHistoryMixin):
                                           QKeySequence("Shift+Escape"),
                                           icon=ima.icon('editdelete'),
                                           triggered=self.clear_line)
+        reset_namespace_action = create_action(self, _("Reset namespace"),
+                                          QKeySequence("Ctrl+R"),
+                                          triggered=self.reset_namespace)
         clear_console_action = create_action(self, _("Clear console"),
                                              QKeySequence(get_shortcut('console',
                                                                'clear shell')),
@@ -595,19 +610,20 @@ class IPythonClient(QWidget, SaveHistoryMixin):
         quit_action = create_action(self, _("&Quit"), icon=ima.icon('exit'),
                                     triggered=self.exit_callback)
         add_actions(menu, (None, inspect_action, clear_line_action,
-                           clear_console_action, None, quit_action))
+                           clear_console_action, reset_namespace_action,
+                           None, quit_action))
         return menu
     
     def set_font(self, font):
         """Set IPython widget's font"""
         self.shellwidget._control.setFont(font)
         self.shellwidget.font = font
-    
+
     def set_infowidget_font(self):
         """Set font for infowidget"""
-        font = get_font('inspector', 'rich_text')
+        font = get_font(option='rich_font')
         self.infowidget.set_font(font)
-    
+
     def interrupt_kernel(self):
         """Interrupt the associanted Spyder kernel if it's running"""
         self.shellwidget.request_interrupt_kernel()
@@ -619,7 +635,7 @@ class IPythonClient(QWidget, SaveHistoryMixin):
 
     @Slot()
     def inspect_object(self):
-        """Show how to inspect an object with our object inspector"""
+        """Show how to inspect an object with our Help plugin"""
         self.shellwidget._control.inspect_current_object()
 
     @Slot()
@@ -630,7 +646,12 @@ class IPythonClient(QWidget, SaveHistoryMixin):
     @Slot()
     def clear_console(self):
         """Clear the whole console"""
-        self.shellwidget.execute("%clear")
+        self.shellwidget.clear_console()
+        
+    @Slot()
+    def reset_namespace(self):
+        """Resets the namespace by removing all names defined by the user"""
+        self.shellwidget.reset_namespace()
     
     def if_kernel_dies(self, t):
         """
diff --git a/spyderlib/widgets/mixins.py b/spyderlib/widgets/mixins.py
index 4fafc1b..dc1dea8 100644
--- a/spyderlib/widgets/mixins.py
+++ b/spyderlib/widgets/mixins.py
@@ -7,29 +7,32 @@
 """Mix-in classes
 
 These classes were created to be able to provide Spyder's regular text and
-console widget features to an independant widget based on QTextEdit for the 
+console widget features to an independant widget based on QTextEdit for the
 IPython console plugin.
 """
 
+# Standard library imports
+from xml.sax.saxutils import escape
 import os
 import re
 import sre_constants
 import textwrap
-from xml.sax.saxutils import escape
 
-from spyderlib.qt.QtGui import (QTextCursor, QTextDocument, QApplication,
-                                QCursor, QToolTip)
-from spyderlib.qt.QtCore import Qt, QPoint, QRegExp
+# Third party imports
+from qtpy.QtCore import QPoint, QRegExp, Qt
+from qtpy.QtGui import QCursor, QTextCursor, QTextDocument
+from qtpy.QtWidgets import QApplication, QToolTip
 
 # Local imports
 from spyderlib.config.base import _
+from spyderlib.py3compat import is_text_string, to_text_string, u
 from spyderlib.utils import encoding, sourcecode
-from spyderlib.utils.misc import get_error_match
-from spyderlib.utils.dochelpers import (getobj, getargspecfromtext,
+from spyderlib.utils.dochelpers import (getargspecfromtext, getobj,
                                         getsignaturefromtext)
-from spyderlib.py3compat import is_text_string, to_text_string, u
+from spyderlib.utils.misc import get_error_match
 from spyderlib.widgets.arraybuilder import NumpyArrayDialog
 
+
 HISTORY_FILENAMES = []
 
 
@@ -581,19 +584,19 @@ class TracebackLinksMixin(object):
         self.QT_CLASS.leaveEvent(self, event)
 
 
-class InspectObjectMixin(object):
+class GetHelpMixin(object):
     def __init__(self):
-        self.inspector = None
-        self.inspector_enabled = False
-    
-    def set_inspector(self, inspector):
-        """Set ObjectInspector DockWidget reference"""
-        self.inspector = inspector
-        self.inspector.set_shell(self)
+        self.help = None
+        self.help_enabled = False
+
+    def set_help(self, help_plugin):
+        """Set Help DockWidget reference"""
+        self.help = help_plugin
+        self.help.set_shell(self)
+
+    def set_help_enabled(self, state):
+        self.help_enabled = state
 
-    def set_inspector_enabled(self, state):
-        self.inspector_enabled = state
-    
     def inspect_current_object(self):
         text = ''
         text1 = self.get_text('sol', 'cursor')
@@ -606,22 +609,22 @@ class InspectObjectMixin(object):
             text += tl2[0]
         if text:
             self.show_object_info(text, force=True)
-    
+
     def show_object_info(self, text, call=False, force=False):
-        """Show signature calltip and/or docstring in the Object Inspector"""
+        """Show signature calltip and/or docstring in the Help plugin"""
         text = to_text_string(text) # Useful only for ExternalShellBase
-        
+
         # Show docstring
-        insp_enabled = self.inspector_enabled or force
-        if force and self.inspector is not None:
-            self.inspector.dockwidget.setVisible(True)
-            self.inspector.dockwidget.raise_()
-        if insp_enabled and (self.inspector is not None) and \
-           (self.inspector.dockwidget.isVisible()):
-            # ObjectInspector widget exists and is visible
-            self.inspector.set_shell(self)
-            self.inspector.set_object_text(text, ignore_unknown=False)
-            self.setFocus() # if inspector was not at top level, raising it to
+        help_enabled = self.help_enabled or force
+        if force and self.help is not None:
+            self.help.dockwidget.setVisible(True)
+            self.help.dockwidget.raise_()
+        if help_enabled and (self.help is not None) and \
+           (self.help.dockwidget.isVisible()):
+            # Help widget exists and is visible
+            self.help.set_shell(self)
+            self.help.set_object_text(text, ignore_unknown=False)
+            self.setFocus() # if help was not at top level, raising it to
                             # top will automatically give it focus because of
                             # the visibility_changed signal, so we must give
                             # focus back to shell
diff --git a/spyderlib/widgets/onecolumntree.py b/spyderlib/widgets/onecolumntree.py
index 813d8f5..7f59a1b 100644
--- a/spyderlib/widgets/onecolumntree.py
+++ b/spyderlib/widgets/onecolumntree.py
@@ -4,13 +4,15 @@
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
-from spyderlib.qt.QtCore import Slot
-from spyderlib.qt.QtGui import QTreeWidget, QMenu
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.QtCore import Slot
+from qtpy.QtWidgets import QTreeWidget, QMenu
 
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.utils.qthelpers import create_action, add_actions, get_item_user_text
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       get_item_user_text)
 
 
 class OneColumnTree(QTreeWidget):
diff --git a/spyderlib/widgets/pathmanager.py b/spyderlib/widgets/pathmanager.py
index ca3b090..6ca78bd 100644
--- a/spyderlib/widgets/pathmanager.py
+++ b/spyderlib/widgets/pathmanager.py
@@ -6,23 +6,24 @@
 
 """Spyder path manager"""
 
+# Standard library imports
 from __future__ import print_function
-
-from spyderlib.qt.QtGui import (QDialog, QListWidget, QDialogButtonBox,
-                                QVBoxLayout, QHBoxLayout, QMessageBox,
-                                QListWidgetItem)
-from spyderlib.qt.QtCore import Qt, Signal, Slot
-from spyderlib.qt.compat import getexistingdirectory
-import spyderlib.utils.icon_manager as ima
-
 import os
-import sys
 import os.path as osp
+import sys
+
+# Third party imports
+from qtpy.compat import getexistingdirectory
+from qtpy.QtCore import Qt, Signal, Slot
+from qtpy.QtWidgets import (QDialog, QDialogButtonBox, QHBoxLayout,
+                            QListWidget, QListWidgetItem, QMessageBox,
+                            QVBoxLayout)
 
 # Local imports
-from spyderlib.utils.qthelpers import create_toolbutton
 from spyderlib.config.base import _
 from spyderlib.py3compat import getcwd
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import create_toolbutton
 
 
 class PathManager(QDialog):
diff --git a/spyderlib/widgets/projectexplorer.py b/spyderlib/widgets/projectexplorer.py
index 4f2a4ac..bda611a 100644
--- a/spyderlib/widgets/projectexplorer.py
+++ b/spyderlib/widgets/projectexplorer.py
@@ -8,31 +8,31 @@
 
 # pylint: disable=C0103
 
+# Standard library imports
 from __future__ import print_function
-
 import os
+import os.path as osp
 import re
 import shutil
-import os.path as osp
 import xml.etree.ElementTree as ElementTree
 
-from spyderlib.qt import PYQT5
-from spyderlib.qt.QtGui import (QVBoxLayout, QLabel, QHBoxLayout, QWidget,
-                                QFileIconProvider, QMessageBox, QInputDialog,
-                                QLineEdit, QPushButton, QHeaderView,
-                                QAbstractItemView)
-from spyderlib.qt.QtCore import Qt, QFileInfo, Slot, Signal
-from spyderlib.qt.compat import getexistingdirectory
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy import PYQT5
+from qtpy.compat import getexistingdirectory
+from qtpy.QtCore import QFileInfo, Qt, Signal, Slot
+from qtpy.QtWidgets import (QAbstractItemView, QFileIconProvider, QHBoxLayout,
+                            QHeaderView, QInputDialog, QLabel, QLineEdit,
+                            QMessageBox, QPushButton, QVBoxLayout, QWidget)
 
 # Local imports
+from spyderlib.config.base import _, get_image_path, STDERR
+from spyderlib.py3compat import getcwd, pickle, to_text_string
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils import misc
-from spyderlib.utils.qthelpers import get_icon, create_action
-from spyderlib.config.base import _, STDERR, get_image_path
-from spyderlib.widgets.explorer import FilteredDirView, listdir, fixpath
+from spyderlib.utils.qthelpers import create_action, get_icon
+from spyderlib.widgets.explorer import FilteredDirView, fixpath, listdir
 from spyderlib.widgets.formlayout import fedit
 from spyderlib.widgets.pathmanager import PathManager
-from spyderlib.py3compat import to_text_string, getcwd, pickle
 
 
 def has_children_files(path, include, exclude, show_all):
diff --git a/spyderlib/widgets/pydocgui.py b/spyderlib/widgets/pydocgui.py
index 4c94595..7740247 100644
--- a/spyderlib/widgets/pydocgui.py
+++ b/spyderlib/widgets/pydocgui.py
@@ -6,17 +6,20 @@
 
 """pydoc widget"""
 
-from spyderlib.qt.QtGui import QApplication, QCursor
-from spyderlib.qt.QtCore import QThread, QUrl, Qt, Signal
-
-import sys
+# Standard library imports
 import os.path as osp
+import sys
+
+# Third party imports
+from qtpy.QtCore import Qt, QThread, QUrl, Signal
+from qtpy.QtGui import QCursor
+from qtpy.QtWidgets import QApplication
 
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.widgets.browser import WebBrowser
+from spyderlib.py3compat import PY3, to_text_string
 from spyderlib.utils.misc import select_port
-from spyderlib.py3compat import to_text_string, PY3
+from spyderlib.widgets.browser import WebBrowser
 
 
 class PydocServer(QThread):
diff --git a/spyderlib/widgets/shell.py b/spyderlib/widgets/shell.py
index 8a4cb69..4bb454a 100644
--- a/spyderlib/widgets/shell.py
+++ b/spyderlib/widgets/shell.py
@@ -11,6 +11,7 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 import keyword
 import locale
 import os
@@ -19,27 +20,26 @@ import re
 import sys
 import time
 
-from spyderlib.qt.QtGui import (QMenu, QApplication, QToolTip, QKeySequence,
-                                QMessageBox, QTextCursor, QTextCharFormat)
-from spyderlib.qt.QtCore import (Qt, QCoreApplication, QTimer, Signal,
-                                 Property, Slot)
-from spyderlib.qt.compat import getsavefilename
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.compat import getsavefilename
+from qtpy.QtCore import Property, QCoreApplication, Qt, QTimer, Signal, Slot
+from qtpy.QtGui import QKeySequence, QTextCharFormat, QTextCursor
+from qtpy.QtWidgets import QApplication, QMenu, QMessageBox, QToolTip
 
 # Local import
-from spyderlib.config.base import get_conf_path, _, STDERR, DEBUG
+from spyderlib.config.base import _, DEBUG, get_conf_path, STDERR
+from spyderlib.config.gui import config_shortcut, get_shortcut, fixed_shortcut
 from spyderlib.config.main import CONF
-from spyderlib.config.gui import (get_font, create_shortcut, get_shortcut,
-                                  new_shortcut)
+from spyderlib.py3compat import (builtins, is_string, is_text_string,
+                                 PY3, to_text_string)
 from spyderlib.utils import encoding
-from spyderlib.utils.qthelpers import (keybinding, create_action, add_actions,
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import (add_actions, create_action, keybinding,
                                        restore_keyevent)
+from spyderlib.widgets.arraybuilder import SHORTCUT_INLINE, SHORTCUT_TABLE
+from spyderlib.widgets.mixins import (GetHelpMixin, SaveHistoryMixin,
+                                      TracebackLinksMixin)
 from spyderlib.widgets.sourcecode.base import ConsoleBaseWidget
-from spyderlib.widgets.mixins import (InspectObjectMixin, TracebackLinksMixin,
-                                      SaveHistoryMixin)
-from spyderlib.widgets.arraybuilder import (SHORTCUT_INLINE, SHORTCUT_TABLE)
-from spyderlib.py3compat import (is_text_string, to_text_string, builtins,
-                                 is_string, PY3)
 
 
 class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
@@ -90,15 +90,10 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
 
         # Give focus to widget
         self.setFocus()
-        
-        # Completion
-        completion_size = CONF.get('shell_appearance', 'completion/size')
-        completion_font = get_font('console')
-        self.completion_widget.setup_appearance(completion_size,
-                                                completion_font)
+
         # Cursor width
-        self.setCursorWidth( CONF.get('shell_appearance', 'cursor/width') )
-        
+        self.setCursorWidth( CONF.get('main', 'cursor/width') )
+
     def toggle_wrap_mode(self, enable):
         """Enable/disable wrap mode"""
         self.set_wrap_mode('character' if enable else None)
@@ -676,7 +671,7 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
 # log_methods_calls('log.log', ShellBaseWidget)
 
 class PythonShellWidget(TracebackLinksMixin, ShellBaseWidget,
-                        InspectObjectMixin):
+                        GetHelpMixin):
     """Python shell widget"""
     QT_CLASS = ShellBaseWidget
     INITHISTORY = ['# -*- coding: utf-8 -*-',
@@ -687,15 +682,15 @@ class PythonShellWidget(TracebackLinksMixin, ShellBaseWidget,
     def __init__(self, parent, history_filename, profile=False):
         ShellBaseWidget.__init__(self, parent, history_filename, profile)
         TracebackLinksMixin.__init__(self)
-        InspectObjectMixin.__init__(self)
+        GetHelpMixin.__init__(self)
 
         # Local shortcuts
         self.shortcuts = self.create_shortcuts()
-    
+
     def create_shortcuts(self):
-        new_shortcut(SHORTCUT_INLINE, self, lambda: self.enter_array_inline())
-        new_shortcut(SHORTCUT_TABLE, self, lambda: self.enter_array_table())        
-        inspectsc = create_shortcut(self.inspect_current_object,
+        fixed_shortcut(SHORTCUT_INLINE, self, lambda: self.enter_array_inline())
+        fixed_shortcut(SHORTCUT_TABLE, self, lambda: self.enter_array_table())
+        inspectsc = config_shortcut(self.inspect_current_object,
                                     context='Console',
                                     name='Inspect current object',
                                     parent=self)
diff --git a/spyderlib/widgets/sourcecode/base.py b/spyderlib/widgets/sourcecode/base.py
index 26879bc..0be8e88 100644
--- a/spyderlib/widgets/sourcecode/base.py
+++ b/spyderlib/widgets/sourcecode/base.py
@@ -11,26 +11,28 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 import os
 import re
 import sys
 
-from spyderlib.qt.QtGui import (QTextCursor, QColor, QFont, QApplication,
-                                QTextEdit, QTextCharFormat, QToolTip,
-                                QListWidget, QPlainTextEdit, QPalette,
-                                QMainWindow, QTextOption, QMouseEvent,
-                                QTextFormat, QClipboard, QAbstractItemView,
-                                QListWidgetItem)
-from spyderlib.qt.QtCore import Signal, Slot, Qt, QEventLoop, QEvent, QPoint
-from spyderlib.qt.compat import to_qvariant
-import spyderlib.utils.icon_manager as ima
-
+# Third party imports
+from qtpy.compat import to_qvariant
+from qtpy.QtCore import QEvent, QEventLoop, QPoint, Qt, Signal, Slot
+from qtpy.QtGui import (QClipboard, QColor, QFont, QMouseEvent, QPalette,
+                        QTextCharFormat, QTextFormat, QTextOption, QTextCursor)
+from qtpy.QtWidgets import (QAbstractItemView, QApplication, QListWidget,
+                            QListWidgetItem, QMainWindow, QPlainTextEdit,
+                            QTextEdit, QToolTip)
 
 # Local imports
-from spyderlib.widgets.sourcecode.terminal import ANSIEscapeCodeHandler
-from spyderlib.widgets.mixins import BaseEditMixin
+from spyderlib.config.gui import get_font
+from spyderlib.config.main import CONF
+from spyderlib.py3compat import PY3, str_lower, to_text_string
+from spyderlib.utils import icon_manager as ima
 from spyderlib.widgets.calltip import CallTipWidget
-from spyderlib.py3compat import to_text_string, str_lower, PY3
+from spyderlib.widgets.mixins import BaseEditMixin
+from spyderlib.widgets.sourcecode.terminal import ANSIEscapeCodeHandler
 
 
 def insert_text_to(cursor, text, fmt):
@@ -245,6 +247,7 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         self.codecompletion_case = True
         self.codecompletion_enter = False
         self.completion_text = ""
+        self.setup_completion()
 
         self.calltip_widget = CallTipWidget(self, hide_timer_on=True)
         self.calltips = True
@@ -262,13 +265,15 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         self.bracepos = None
         self.matched_p_color = QColor(Qt.green)
         self.unmatched_p_color = QColor(Qt.red)
-        
-    def setup_completion(self, size=None, font=None):
+
+    def setup_completion(self):
+        size = CONF.get('main', 'completion/size')
+        font = get_font()
         self.completion_widget.setup_appearance(size, font)
-        
+
     def set_indent_chars(self, indent_chars):
         self.indent_chars = indent_chars
-        
+
     def set_palette(self, background, foreground):
         """
         Set text editor palette colors:
@@ -487,7 +492,8 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         Reimplement Qt method
         Copy text to clipboard with correct EOL chars
         """
-        QApplication.clipboard().setText(self.get_selected_text())
+        if self.get_selected_text():
+            QApplication.clipboard().setText(self.get_selected_text())
     
     def toPlainText(self):
         """
@@ -1329,8 +1335,11 @@ class ConsoleBaseWidget(TextEditBaseWidget):
                 insert_text_to(cursor, text[last_end:match.start()],
                                self.default_style.format)
                 last_end = match.end()
-                for code in [int(_c) for _c in match.group(1).split(';')]:
-                    self.ansi_handler.set_code(code)
+                try:
+                    for code in [int(_c) for _c in match.group(1).split(';')]:
+                        self.ansi_handler.set_code(code)
+                except ValueError:
+                    pass
                 self.default_style.format = self.ansi_handler.get_format()
             insert_text_to(cursor, text[last_end:], self.default_style.format)
 #            # Slower alternative:
diff --git a/spyderlib/widgets/sourcecode/codeeditor.py b/spyderlib/widgets/sourcecode/codeeditor.py
index 6e09be2..257fa67 100644
--- a/spyderlib/widgets/sourcecode/codeeditor.py
+++ b/spyderlib/widgets/sourcecode/codeeditor.py
@@ -8,65 +8,63 @@
 Editor widget based on QtGui.QPlainTextEdit
 """
 
+# TODO: Try to separate this module from spyderlib to create a self
+#       consistent editor module (Qt source code and shell widgets library)
+
 # %% This line is for cell execution testing
 # pylint: disable=C0103
 # pylint: disable=R0903
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 from __future__ import division
-
-import sys
+from unicodedata import category
+import os.path as osp
 import re
 import sre_constants
-import os.path as osp
+import sys
 import time
-from unicodedata import category
 
-from spyderlib.qt import is_pyqt46
-from spyderlib.qt.QtGui import (QColor, QMenu, QApplication, QSplitter, QFont,
-                                QTextEdit, QTextFormat, QPainter, QTextCursor,
-                                QBrush, QTextDocument, QTextCharFormat,
-                                QPrinter, QToolTip, QCursor, QLabel,
-                                QInputDialog, QTextBlockUserData, QLineEdit,
-                                QKeySequence, QVBoxLayout, QHBoxLayout,
-                                QDialog, QIntValidator, QDialogButtonBox,
-                                QGridLayout, QPaintEvent, QMessageBox, QWidget,
-                                QTextOption)
-from spyderlib.qt.QtCore import (Qt, Signal, QTimer, QRect, QRegExp, QSize,
-                                 Slot)
-from spyderlib.qt.compat import to_qvariant
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy import is_pyqt46
+from qtpy.compat import to_qvariant
+from qtpy.QtCore import QRect, QRegExp, QSize, Qt, QTimer, Signal, Slot
+from qtpy.QtGui import (QBrush, QColor, QCursor, QFont, QIntValidator,
+                        QKeySequence, QPaintEvent, QPainter,
+                        QTextBlockUserData, QTextCharFormat, QTextCursor,
+                        QTextDocument, QTextFormat, QTextOption)
+from qtpy.QtPrintSupport import QPrinter
+from qtpy.QtWidgets import (QApplication, QDialog, QDialogButtonBox,
+                            QGridLayout, QHBoxLayout, QInputDialog, QLabel,
+                            QLineEdit, QMenu, QMessageBox, QSplitter,
+                            QTextEdit, QToolTip, QVBoxLayout, QWidget)
 
 # %% This line is for cell execution testing
-# Local import
-# TODO: Try to separate this module from spyderlib to create a self
-#       consistent editor module (Qt source code and shell widgets library)
+
+# Local imports
 from spyderlib.config.base import get_conf_path, _, DEBUG
+from spyderlib.config.gui import (config_shortcut, fixed_shortcut, get_shortcut,
+                                  RUN_CELL_SHORTCUT,
+                                  RUN_CELL_AND_ADVANCE_SHORTCUT)
 from spyderlib.config.main import CONF
-from spyderlib.config.gui import (get_font, create_shortcut, new_shortcut,
-                                  get_shortcut)
-from spyderlib.utils.qthelpers import (add_actions, create_action, keybinding,
-                                       mimedata2url)
-from spyderlib.utils.dochelpers import getobj
+from spyderlib.py3compat import to_text_string
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils import syntaxhighlighters as sh
 from spyderlib.utils import encoding, sourcecode
+from spyderlib.utils.dochelpers import getobj
+from spyderlib.utils.qthelpers import add_actions, create_action, mimedata2url
 from spyderlib.utils.sourcecode import ALL_LANGUAGES, CELL_LANGUAGES
-from spyderlib.utils import syntaxhighlighters as sh
+from spyderlib.widgets.arraybuilder import SHORTCUT_INLINE, SHORTCUT_TABLE
 from spyderlib.widgets.editortools import PythonCFM
 from spyderlib.widgets.sourcecode.base import TextEditBaseWidget
 from spyderlib.widgets.sourcecode.kill_ring import QtKillRing
-from spyderlib.widgets.arraybuilder import SHORTCUT_INLINE, SHORTCUT_TABLE
-from spyderlib.py3compat import to_text_string
 
 try:
-    try:   # Ipython 4
-        import nbformat as nbformat
-        from nbconvert import PythonExporter as nbexporter  
-    except ImportError:  # Ipython 3
-        import IPython.nbformat as nbformat
-        from IPython.nbconvert import PythonExporter as nbexporter
-except ImportError:
-    nbformat = None                      # analysis:ignore
+    import nbformat as nbformat
+    from nbconvert import PythonExporter as nbexporter
+except:
+    nbformat = None  # analysis:ignore
 
 # %% This line is for cell execution testing
 # For debugging purpose:
@@ -373,19 +371,13 @@ class CodeEditor(TextEditBaseWidget):
             plugin_name = repr(parent)
             if 'editor' in plugin_name.lower():
                 self.setObjectName('editor')
-            elif 'inspector' in plugin_name.lower():
-                self.setObjectName('inspector')
+            elif 'help' in plugin_name.lower():
+                self.setObjectName('help')
             elif 'historylog' in plugin_name.lower():
                 self.setObjectName('historylog')
 
-        # Completion
-        completion_size = CONF.get('editor_appearance', 'completion/size')
-        completion_font = get_font('editor')
-        self.completion_widget.setup_appearance(completion_size,
-                                                completion_font)
-
         # Caret (text cursor)
-        self.setCursorWidth( CONF.get('editor_appearance', 'cursor/width') )
+        self.setCursorWidth( CONF.get('main', 'cursor/width') )
 
         # 79-col edge line
         self.edge_line_enabled = True
@@ -414,7 +406,7 @@ class CodeEditor(TextEditBaseWidget):
 
         # Colors to be defined in _apply_highlighter_color_scheme()
         # Currentcell color and current line color are defined in base.py
-        self.occurence_color = None
+        self.occurrence_color = None
         self.ctrl_click_color = None
         self.sideareas_color = None
         self.matched_p_color = None
@@ -434,7 +426,7 @@ class CodeEditor(TextEditBaseWidget):
         #   - providing data for Outliner
         # - self.highlighter is not responsible for
         #   - background highlight for current line
-        #   - background highlight for search / current line occurences
+        #   - background highlight for search / current line occurrences
 
         self.highlighter_class = sh.TextSH
         self.highlighter = None
@@ -458,7 +450,7 @@ class CodeEditor(TextEditBaseWidget):
 
         self.document_id = id(self)
 
-        # Indicate occurences of the selected word
+        # Indicate occurrences of the selected word
         self.cursorPositionChanged.connect(self.__cursor_position_changed)
         self.__find_first_pos = None
         self.__find_flags = None
@@ -475,14 +467,14 @@ class CodeEditor(TextEditBaseWidget):
         # Update breakpoints if the number of lines in the file changes
         self.blockCountChanged.connect(self.update_breakpoints)
 
-        # Mark occurences timer
-        self.occurence_highlighting = None
-        self.occurence_timer = QTimer(self)
-        self.occurence_timer.setSingleShot(True)
-        self.occurence_timer.setInterval(1500)
-        self.occurence_timer.timeout.connect(self.__mark_occurences)
-        self.occurences = []
-        self.occurence_color = QColor(Qt.yellow).lighter(160)
+        # Mark occurrences timer
+        self.occurrence_highlighting = None
+        self.occurrence_timer = QTimer(self)
+        self.occurrence_timer.setSingleShot(True)
+        self.occurrence_timer.setInterval(1500)
+        self.occurrence_timer.timeout.connect(self.__mark_occurrences)
+        self.occurrences = []
+        self.occurrence_color = QColor(Qt.yellow).lighter(160)
 
         # Mark found results
         self.textChanged.connect(self.__text_has_changed)
@@ -522,28 +514,28 @@ class CodeEditor(TextEditBaseWidget):
         self.painted.connect(self._draw_editor_cell_divider)
 
         self.verticalScrollBar().valueChanged.connect(
-                                       lambda value: self.rehighlight_cells())                                 
+                                       lambda value: self.rehighlight_cells())
 
     def create_shortcuts(self):
-        codecomp = create_shortcut(self.do_completion, context='Editor',
+        codecomp = config_shortcut(self.do_completion, context='Editor',
                                    name='Code Completion', parent=self)
-        duplicate_line = create_shortcut(self.duplicate_line, context='Editor',
+        duplicate_line = config_shortcut(self.duplicate_line, context='Editor',
                                          name='Duplicate line', parent=self)
-        copyline = create_shortcut(self.copy_line, context='Editor',
+        copyline = config_shortcut(self.copy_line, context='Editor',
                                    name='Copy line', parent=self)
-        deleteline = create_shortcut(self.delete_line, context='Editor',
+        deleteline = config_shortcut(self.delete_line, context='Editor',
                                      name='Delete line', parent=self)
-        movelineup = create_shortcut(self.move_line_up, context='Editor',
+        movelineup = config_shortcut(self.move_line_up, context='Editor',
                                      name='Move line up', parent=self)
-        movelinedown = create_shortcut(self.move_line_down, context='Editor',
+        movelinedown = config_shortcut(self.move_line_down, context='Editor',
                                        name='Move line down', parent=self)
-        gotodef = create_shortcut(self.do_go_to_definition, context='Editor',
+        gotodef = config_shortcut(self.do_go_to_definition, context='Editor',
                                   name='Go to definition', parent=self)
-        toggle_comment = create_shortcut(self.toggle_comment, context='Editor',
+        toggle_comment = config_shortcut(self.toggle_comment, context='Editor',
                                          name='Toggle comment', parent=self)
-        blockcomment = create_shortcut(self.blockcomment, context='Editor',
+        blockcomment = config_shortcut(self.blockcomment, context='Editor',
                                        name='Blockcomment', parent=self)
-        unblockcomment = create_shortcut(self.unblockcomment, context='Editor',
+        unblockcomment = config_shortcut(self.unblockcomment, context='Editor',
                                          name='Unblockcomment', parent=self)
 
         def cb_maker(attr):
@@ -556,61 +548,77 @@ class CodeEditor(TextEditBaseWidget):
                 self.setTextCursor(cursor)
             return cursor_move_event
 
-        line_start = create_shortcut(cb_maker('StartOfLine'), context='Editor',
+        line_start = config_shortcut(cb_maker('StartOfLine'), context='Editor',
                                      name='Start of line', parent=self)
-        line_end = create_shortcut(cb_maker('EndOfLine'), context='Editor',
+        line_end = config_shortcut(cb_maker('EndOfLine'), context='Editor',
                                    name='End of line', parent=self)
 
-        prev_line = create_shortcut(cb_maker('Up'), context='Editor',
+        prev_line = config_shortcut(cb_maker('Up'), context='Editor',
                                     name='Previous line', parent=self)
-        next_line = create_shortcut(cb_maker('Down'), context='Editor',
+        next_line = config_shortcut(cb_maker('Down'), context='Editor',
                                     name='Next line', parent=self)
 
-        prev_char = create_shortcut(cb_maker('Left'), context='Editor',
+        prev_char = config_shortcut(cb_maker('Left'), context='Editor',
                                     name='Previous char', parent=self)
-        next_char = create_shortcut(cb_maker('Right'), context='Editor',
+        next_char = config_shortcut(cb_maker('Right'), context='Editor',
                                     name='Next char', parent=self)
 
-        prev_word = create_shortcut(cb_maker('StartOfWord'), context='Editor',
+        prev_word = config_shortcut(cb_maker('StartOfWord'), context='Editor',
                                     name='Previous word', parent=self)
-        next_word = create_shortcut(cb_maker('EndOfWord'), context='Editor',
+        next_word = config_shortcut(cb_maker('EndOfWord'), context='Editor',
                                     name='Next word', parent=self)
 
-        kill_line_end = create_shortcut(self.kill_line_end, context='Editor',
+        kill_line_end = config_shortcut(self.kill_line_end, context='Editor',
                                         name='Kill to line end', parent=self)
-        kill_line_start = create_shortcut(self.kill_line_start,
+        kill_line_start = config_shortcut(self.kill_line_start,
                                           context='Editor',
                                           name='Kill to line start',
                                           parent=self)
-        yank = create_shortcut(self._kill_ring.yank, context='Editor',
+        yank = config_shortcut(self._kill_ring.yank, context='Editor',
                                name='Yank', parent=self)
-        kill_ring_rotate = create_shortcut(self._kill_ring.rotate,
+        kill_ring_rotate = config_shortcut(self._kill_ring.rotate,
                                            context='Editor',
                                            name='Rotate kill ring',
                                            parent=self)
 
-        kill_prev_word = create_shortcut(self.kill_prev_word, context='Editor',
+        kill_prev_word = config_shortcut(self.kill_prev_word, context='Editor',
                                          name='Kill previous word',
                                          parent=self)
-        kill_next_word = create_shortcut(self.kill_next_word, context='Editor',
+        kill_next_word = config_shortcut(self.kill_next_word, context='Editor',
                                          name='Kill next word', parent=self)
 
-        start_doc = create_shortcut(cb_maker('Start'), context='Editor',
+        start_doc = config_shortcut(cb_maker('Start'), context='Editor',
                                     name='Start of Document', parent=self)
 
-        end_doc = create_shortcut(cb_maker('End'), context='Editor',
+        end_doc = config_shortcut(cb_maker('End'), context='Editor',
                                   name='End of document', parent=self)
 
+        undo = config_shortcut(self.undo, context='Editor',
+                               name='undo', parent=self)
+        redo = config_shortcut(self.redo, context='Editor',
+                               name='redo', parent=self)
+        cut = config_shortcut(self.cut, context='Editor',
+                              name='cut', parent=self)
+        copy = config_shortcut(self.copy, context='Editor',
+                               name='copy', parent=self)
+        paste = config_shortcut(self.paste, context='Editor',
+                                name='paste', parent=self)
+        delete = config_shortcut(self.delete, context='Editor',
+                                 name='delete', parent=self)
+        select_all = config_shortcut(self.selectAll, context='Editor',
+                                     name='Select All', parent=self)
+
         # Fixed shortcuts
-        new_shortcut(SHORTCUT_INLINE, self, lambda: self.enter_array_inline())
-        new_shortcut(SHORTCUT_TABLE, self, lambda: self.enter_array_table())
+        fixed_shortcut(SHORTCUT_INLINE, self, lambda: self.enter_array_inline())
+        fixed_shortcut(SHORTCUT_TABLE, self, lambda: self.enter_array_table())
 
         return [codecomp, duplicate_line, copyline, deleteline, movelineup,
                 movelinedown, gotodef, toggle_comment, blockcomment,
                 unblockcomment, line_start, line_end, prev_line, next_line,
                 prev_char, next_char, prev_word, next_word, kill_line_end,
                 kill_line_start, yank, kill_ring_rotate, kill_prev_word,
-                kill_next_word, start_doc, end_doc]
+                kill_next_word, start_doc, end_doc, undo, redo, copy,
+                paste, delete, select_all]
 
     def get_shortcut_data(self):
         """
@@ -644,7 +652,7 @@ class CodeEditor(TextEditBaseWidget):
     def setup_editor(self, linenumbers=True, language=None, markers=False,
                      font=None, color_scheme=None, wrap=False, tab_mode=True,
                      intelligent_backspace=True, highlight_current_line=True,
-                     highlight_current_cell=True, occurence_highlighting=True,
+                     highlight_current_cell=True, occurrence_highlighting=True,
                      scrollflagarea=True, edge_line=True, edge_line_column=79,
                      codecompletion_auto=False, codecompletion_case=True,
                      codecompletion_enter=False, show_blanks=False,
@@ -652,7 +660,7 @@ class CodeEditor(TextEditBaseWidget):
                      close_parentheses=True, close_quotes=False,
                      add_colons=True, auto_unindent=True, indent_chars=" "*4,
                      tab_stop_width=40, cloned_from=None, filename=None,
-                     occurence_timeout=1500):
+                     occurrence_timeout=1500):
         
         # Code completion and calltips
         self.set_codecompletion_auto(codecompletion_auto)
@@ -691,9 +699,9 @@ class CodeEditor(TextEditBaseWidget):
         # Highlight current line
         self.set_highlight_current_line(highlight_current_line)
 
-        # Occurence highlighting
-        self.set_occurence_highlighting(occurence_highlighting)
-        self.set_occurence_timeout(occurence_timeout)
+        # Occurrence highlighting
+        self.set_occurrence_highlighting(occurrence_highlighting)
+        self.set_occurrence_timeout(occurrence_timeout)
 
         # Tab always indents (even when cursor is not at the begin of line)
         self.set_tab_mode(tab_mode)
@@ -742,15 +750,15 @@ class CodeEditor(TextEditBaseWidget):
         """Enable/disable automatic unindent after else/elif/finally/except"""
         self.auto_unindent_enabled = enable
 
-    def set_occurence_highlighting(self, enable):
-        """Enable/disable occurence highlighting"""
-        self.occurence_highlighting = enable
+    def set_occurrence_highlighting(self, enable):
+        """Enable/disable occurrence highlighting"""
+        self.occurrence_highlighting = enable
         if not enable:
-            self.__clear_occurences()
+            self.__clear_occurrences()
 
-    def set_occurence_timeout(self, timeout):
-        """Set occurence highlighting timeout (ms)"""
-        self.occurence_timer.setInterval(timeout)
+    def set_occurrence_timeout(self, timeout):
+        """Set occurrence highlighting timeout (ms)"""
+        self.occurrence_timer.setInterval(timeout)
 
     def set_highlight_current_line(self, enable):
         """Enable/disable current line highlighting"""
@@ -925,9 +933,15 @@ class CodeEditor(TextEditBaseWidget):
         offset = self.get_position('cursor')
         return sourcecode.get_primary_at(source_code, offset)
 
-    #------Find occurences
+    @Slot()
+    def delete(self):
+        """Remove selected text"""
+        if self.has_selected_text():
+            self.remove_selected_text()
+
+    #------Find occurrences
     def __find_first(self, text):
-        """Find first occurence: scan whole document"""
+        """Find first occurrence: scan whole document"""
         flags = QTextDocument.FindCaseSensitively|QTextDocument.FindWholeWords
         cursor = self.textCursor()
         # Scanning whole document
@@ -938,7 +952,7 @@ class CodeEditor(TextEditBaseWidget):
         return cursor
 
     def __find_next(self, text, cursor):
-        """Find next occurence"""
+        """Find next occurrence"""
         flags = QTextDocument.FindCaseSensitively|QTextDocument.FindWholeWords
         regexp = QRegExp(r"\b%s\b" % QRegExp.escape(text), Qt.CaseSensitive)
         cursor = self.document().find(regexp, cursor, flags)
@@ -957,14 +971,14 @@ class CodeEditor(TextEditBaseWidget):
             self.highlight_current_line()
         else:
             self.unhighlight_current_line()
-        if self.occurence_highlighting:
-            self.occurence_timer.stop()
-            self.occurence_timer.start()
-
-    def __clear_occurences(self):
-        """Clear occurence markers"""
-        self.occurences = []
-        self.clear_extra_selections('occurences')
+        if self.occurrence_highlighting:
+            self.occurrence_timer.stop()
+            self.occurrence_timer.start()
+
+    def __clear_occurrences(self):
+        """Clear occurrence markers"""
+        self.occurrences = []
+        self.clear_extra_selections('occurrences')
         self.scrollflagarea.update()
 
     def __highlight_selection(self, key, cursor, foreground_color=None,
@@ -990,9 +1004,9 @@ class CodeEditor(TextEditBaseWidget):
         if update:
             self.update_extra_selections()
 
-    def __mark_occurences(self):
-        """Marking occurences of the currently selected word"""
-        self.__clear_occurences()
+    def __mark_occurrences(self):
+        """Marking occurrences of the currently selected word"""
+        self.__clear_occurrences()
 
         if not self.supported_language:
             return
@@ -1008,20 +1022,20 @@ class CodeEditor(TextEditBaseWidget):
            to_text_string(text) == 'self'):
             return
 
-        # Highlighting all occurences of word *text*
+        # Highlighting all occurrences of word *text*
         cursor = self.__find_first(text)
-        self.occurences = []
+        self.occurrences = []
         while cursor:
-            self.occurences.append(cursor.blockNumber())
-            self.__highlight_selection('occurences', cursor,
-                                       background_color=self.occurence_color)
+            self.occurrences.append(cursor.blockNumber())
+            self.__highlight_selection('occurrences', cursor,
+                                       background_color=self.occurrence_color)
             cursor = self.__find_next(text, cursor)
         self.update_extra_selections()
-        if len(self.occurences) > 1 and self.occurences[-1] == 0:
+        if len(self.occurrences) > 1 and self.occurrences[-1] == 0:
             # XXX: this is never happening with PySide but it's necessary
             # for PyQt4... this must be related to a different behavior for
             # the QTextDocument.find function between those two libraries
-            self.occurences.pop(-1)
+            self.occurrences.pop(-1)
         self.scrollflagarea.update()
 
     #-----highlight found results (find/replace widget)
@@ -1417,10 +1431,10 @@ class CodeEditor(TextEditBaseWidget):
                     painter.drawRect(make_flag(position))
             block = block.next()
 
-        # Occurences
-        if self.occurences:
-            set_scrollflagarea_painter(painter, self.occurence_color)
-            for line_number in self.occurences:
+        # Occurrences
+        if self.occurrences:
+            set_scrollflagarea_painter(painter, self.occurrence_color)
+            for line_number in self.occurrences:
                 position = self.scrollflagarea.value_to_position(line_number)
                 painter.drawRect(make_flag(position))
 
@@ -1489,7 +1503,7 @@ class CodeEditor(TextEditBaseWidget):
                              foreground=hl.get_foreground_color())
             self.currentline_color = hl.get_currentline_color()
             self.currentcell_color = hl.get_currentcell_color()
-            self.occurence_color = hl.get_occurence_color()
+            self.occurrence_color = hl.get_occurrence_color()
             self.ctrl_click_color = hl.get_ctrlclick_color()
             self.sideareas_color = hl.get_sideareas_color()
             self.comment_color = hl.get_comment_color()
@@ -1662,7 +1676,7 @@ class CodeEditor(TextEditBaseWidget):
                 regexp = QRegExp(r"\b%s\b" % QRegExp.escape(text),
                                  Qt.CaseSensitive)
                 color = self.error_color if error else self.warning_color
-                # Highlighting all occurences (this is a compromise as pyflakes
+                # Highlighting all occurrences (this is a compromise as pyflakes
                 # do not provide the column number -- see Issue 709 on Spyder's
                 # GoogleCode project website)
                 cursor = document.find(regexp, cursor, flags)
@@ -1880,8 +1894,6 @@ class CodeEditor(TextEditBaseWidget):
 
         Returns True if indent needed to be fixed
         """
-        if not self.is_python_like():
-            return
         cursor = self.textCursor()
         block_nb = cursor.blockNumber()
         # find the line that contains our scope
@@ -1891,10 +1903,11 @@ class CodeEditor(TextEditBaseWidget):
         for prevline in range(block_nb-1, -1, -1):
             cursor.movePosition(QTextCursor.PreviousBlock)
             prevtext = to_text_string(cursor.block().text()).rstrip()
-            if not prevtext.strip().startswith('#'):
+            if (self.is_python_like() and not prevtext.strip().startswith('#') \
+              and prevtext) or prevtext:
                 if prevtext.strip().endswith(')'):
                     comment_or_string = True  # prevent further parsing
-                elif prevtext.strip().endswith(':'):
+                elif prevtext.strip().endswith(':') and self.is_python_like():
                     add_indent = True
                     comment_or_string = True
                 if prevtext.count(')') > prevtext.count('('):
@@ -1917,15 +1930,14 @@ class CodeEditor(TextEditBaseWidget):
             correct_indent += len(self.indent_chars)
 
         if not comment_or_string:
-            if prevtext.endswith(':'):
+            if prevtext.endswith(':') and self.is_python_like():
                 # Indent
                 correct_indent += len(self.indent_chars)
-            elif prevtext.endswith('continue') or prevtext.endswith('break') \
-              or prevtext.endswith('pass'):
+            elif (prevtext.endswith('continue') or prevtext.endswith('break') \
+              or prevtext.endswith('pass')) and self.is_python_like():
                 # Unindent
                 correct_indent -= len(self.indent_chars)
-            elif prevtext.endswith(',') \
-              and len(re.split(r'\(|\{|\[', prevtext)) > 1:
+            elif len(re.split(r'\(|\{|\[', prevtext)) > 1:
                 rlmap = {")":"(", "]":"[", "}":"{"}
                 for par in rlmap:
                     i_right = prevtext.rfind(par)
@@ -1951,12 +1963,10 @@ class CodeEditor(TextEditBaseWidget):
 
         if correct_indent >= 0:
             cursor = self.textCursor()
-            cursor.beginEditBlock()
             cursor.movePosition(QTextCursor.StartOfBlock)
             cursor.setPosition(cursor.position()+indent, QTextCursor.KeepAnchor)
             cursor.removeSelectedText()
             cursor.insertText(self.indent_chars[0]*correct_indent)
-            cursor.endEditBlock()
             return True
 
     @Slot()
@@ -2313,6 +2323,22 @@ class CodeEditor(TextEditBaseWidget):
                 match = self.find_brace_match(line_pos+pos, char, forward=True)
                 if (match is None) or (match > line_pos+len(text)):
                     return True
+            if char in [')', ']', '}']:
+                match = self.find_brace_match(line_pos+pos, char, forward=False)
+                if (match is None) or (match < line_pos):
+                    return True
+        return False
+
+    def __has_colon_not_in_brackets(self, text):
+        """
+        Return whether a string has a colon which is not between brackets.
+        This function returns True if the given string has a colon which is
+        not between a pair of (round, square or curly) brackets. It assumes
+        that the brackets in the string are balanced.
+        """
+        for pos, char in enumerate(text):
+            if char == ':' and not self.__unmatched_braces_in_line(text[:pos]):
+                return True
         return False
 
     def autoinsert_colons(self):
@@ -2328,6 +2354,8 @@ class CodeEditor(TextEditBaseWidget):
             return False
         elif self.__unmatched_braces_in_line(line_text):
             return False
+        elif self.__has_colon_not_in_brackets(line_text):
+            return False
         else:
             return True
 
@@ -2427,24 +2455,18 @@ class CodeEditor(TextEditBaseWidget):
     def setup_context_menu(self):
         """Setup context menu"""
         self.undo_action = create_action(self, _("Undo"),
-                           shortcut=keybinding('Undo'),
-                           icon=ima.icon('undo'), triggered=self.undo)
+                             icon=ima.icon('undo'), triggered=self.undo)
         self.redo_action = create_action(self, _("Redo"),
-                           shortcut=keybinding('Redo'),
-                           icon=ima.icon('redo'), triggered=self.redo)
+                             icon=ima.icon('redo'), triggered=self.redo)
         self.cut_action = create_action(self, _("Cut"),
-                           shortcut=keybinding('Cut'),
-                           icon=ima.icon('editcut'), triggered=self.cut)
+                             icon=ima.icon('editcut'), triggered=self.cut)
         self.copy_action = create_action(self, _("Copy"),
-                           shortcut=keybinding('Copy'),
-                           icon=ima.icon('editcopy'), triggered=self.copy)
+                             icon=ima.icon('editcopy'), triggered=self.copy)
         self.paste_action = create_action(self, _("Paste"),
-                           shortcut=keybinding('Paste'),
-                           icon=ima.icon('editpaste'), triggered=self.paste)
+                             icon=ima.icon('editpaste'), triggered=self.paste)
         selectall_action = create_action(self, _("Select All"),
-                           shortcut=keybinding('SelectAll'),
-                           icon=ima.icon('selectall'),
-                           triggered=self.selectAll)
+                             icon=ima.icon('selectall'),
+                             triggered=self.selectAll)
         toggle_comment_action = create_action(self,
                                 _("Comment")+"/"+_("Uncomment"),
                                 icon=ima.icon('comment'),
@@ -2458,27 +2480,37 @@ class CodeEditor(TextEditBaseWidget):
                                                icon=ima.icon('python'))
         self.gotodef_action = create_action(self, _("Go to definition"),
                                    triggered=self.go_to_definition_from_cursor)
+
+        # Run actions
         self.run_cell_action = create_action(self,
                         _("Run cell"),
                         icon=ima.icon('run_cell'),
+                        shortcut=QKeySequence(RUN_CELL_SHORTCUT),
                         triggered=lambda: self.run_cell.emit())
         self.run_cell_and_advance_action = create_action(self,
                         _("Run cell and advance"),
                         icon=ima.icon('run_cell'),
+                        shortcut=QKeySequence(RUN_CELL_AND_ADVANCE_SHORTCUT),
                         triggered=lambda: self.run_cell_and_advance.emit())
         self.run_selection_action = create_action(self,
                         _("Run &selection or current line"),
                         icon=ima.icon('run_selection'),
                         triggered=lambda: self.run_selection.emit())
+
+        # Zoom actions
         zoom_in_action = create_action(self, _("Zoom in"),
-                      QKeySequence(QKeySequence.ZoomIn), icon=ima.icon('zoom_in'),
+                      QKeySequence(QKeySequence.ZoomIn),
+                      icon=ima.icon('zoom_in'),
                       triggered=lambda: self.zoom_in.emit())
         zoom_out_action = create_action(self, _("Zoom out"),
-                      QKeySequence(QKeySequence.ZoomOut), icon=ima.icon('zoom_out'),
+                      QKeySequence(QKeySequence.ZoomOut),
+                      icon=ima.icon('zoom_out'),
                       triggered=lambda: self.zoom_out.emit())
         zoom_reset_action = create_action(self, _("Zoom reset"),
                       QKeySequence("Ctrl+0"),
                       triggered=lambda: self.zoom_reset.emit())
+
+        # Build menu
         self.menu = QMenu(self)
         actions_1 = [self.run_cell_action, self.run_cell_and_advance_action,
                      self.run_selection_action, self.gotodef_action, None,
@@ -2508,7 +2540,7 @@ class CodeEditor(TextEditBaseWidget):
         shift = event.modifiers() & Qt.ShiftModifier
         text = to_text_string(event.text())
         if text:
-            self.__clear_occurences()
+            self.__clear_occurrences()
         if QToolTip.isVisible():
             self.hide_tooltip_if_necessary(key)
 
@@ -2539,15 +2571,19 @@ class CodeEditor(TextEditBaseWidget):
             if not shift and not ctrl:
                 if self.add_colons_enabled and self.is_python_like() and \
                   self.autoinsert_colons():
+                    self.textCursor().beginEditBlock()
                     self.insert_text(':' + self.get_line_separator())
                     self.fix_indent()
+                    self.textCursor().endEditBlock()
                 elif self.is_completion_widget_visible() \
                    and self.codecompletion_enter:
                     self.select_completion_list()
                 else:
                     cmt_or_str = self.in_comment_or_string()
+                    self.textCursor().beginEditBlock()
                     TextEditBaseWidget.keyPressEvent(self, event)
                     self.fix_indent(comment_or_string=cmt_or_str)
+                    self.textCursor().endEditBlock()
             elif shift:
                 self.run_cell_and_advance.emit()
             elif ctrl:
diff --git a/spyderlib/widgets/sourcecode/kill_ring.py b/spyderlib/widgets/sourcecode/kill_ring.py
index 6698571..d7678e8 100644
--- a/spyderlib/widgets/sourcecode/kill_ring.py
+++ b/spyderlib/widgets/sourcecode/kill_ring.py
@@ -1,19 +1,19 @@
-""" A generic Emacs-style kill ring, as well as a Qt-specific version.
+"""
+A generic Emacs-style kill ring, as well as a Qt-specific version.
 Copyright (c) 2001-2015, IPython Development Team
 Copyright (c) 2015-, Jupyter Development Team
 All rights reserved.
 """
-#-----------------------------------------------------------------------------
-# Imports
-#-----------------------------------------------------------------------------
 
-# System library imports
-from spyderlib.qt import QtCore, QtGui
+# Third party imports
+from qtpy.QtCore import QObject
+from qtpy.QtGui import QTextCursor
+from qtpy.QtWidgets import QTextEdit, QPlainTextEdit
 
-#-----------------------------------------------------------------------------
-# Classes
-#-----------------------------------------------------------------------------
 
+# ----------------------------------------------------------------------------
+# Classes
+# ----------------------------------------------------------------------------
 class KillRing(object):
     """ A generic Emacs-style kill ring.
     """
@@ -55,18 +55,18 @@ class KillRing(object):
         return None
 
 
-class QtKillRing(QtCore.QObject):
+class QtKillRing(QObject):
     """ A kill ring attached to Q[Plain]TextEdit.
     """
 
-    #--------------------------------------------------------------------------
+    # -------------------------------------------------------------------------
     # QtKillRing interface
-    #--------------------------------------------------------------------------
+    # -------------------------------------------------------------------------
 
     def __init__(self, text_edit):
         """ Create a kill ring attached to the specified Qt text edit.
         """
-        assert isinstance(text_edit, (QtGui.QTextEdit, QtGui.QPlainTextEdit))
+        assert isinstance(text_edit, (QTextEdit, QPlainTextEdit))
         super(QtKillRing, self).__init__()
 
         self._ring = KillRing()
@@ -113,17 +113,17 @@ class QtKillRing(QtCore.QObject):
             if text:
                 self._skip_cursor = True
                 cursor = self._text_edit.textCursor()
-                cursor.movePosition(QtGui.QTextCursor.Left,
-                                    QtGui.QTextCursor.KeepAnchor,
+                cursor.movePosition(QTextCursor.Left,
+                                    QTextCursor.KeepAnchor,
                                     n=len(self._prev_yank))
                 cursor.insertText(text)
                 self._prev_yank = text
 
-    #--------------------------------------------------------------------------
+    # -------------------------------------------------------------------------
     # Protected interface
-    #--------------------------------------------------------------------------
+    # -------------------------------------------------------------------------
 
-    #------ Signal handlers ----------------------------------------------------
+    # ----- Signal handlers ---------------------------------------------------
 
     def _cursor_position_changed(self):
         if self._skip_cursor:
diff --git a/spyderlib/widgets/status.py b/spyderlib/widgets/status.py
index e082e3d..ece0b3a 100644
--- a/spyderlib/widgets/status.py
+++ b/spyderlib/widgets/status.py
@@ -6,16 +6,18 @@
 
 """Status bar widgets"""
 
+# Standard library imports
 import os
 
-from spyderlib.qt.QtGui import QWidget, QHBoxLayout, QLabel
-from spyderlib.qt.QtCore import QTimer
+# Third party imports
+from qtpy.QtCore import QTimer
+from qtpy.QtWidgets import QHBoxLayout, QLabel, QWidget
 
-# Local import
+# Local imports
+from spyderlib import dependencies
 from spyderlib.config.base import _
 from spyderlib.config.gui import get_font
 from spyderlib.py3compat import to_text_string
-from spyderlib import dependencies
 
 
 if not os.name == 'nt':
@@ -28,10 +30,10 @@ class StatusBarWidget(QWidget):
     def __init__(self, parent, statusbar):
         QWidget.__init__(self, parent)
 
-        self.label_font = font = get_font('editor')
+        self.label_font = font = get_font(option='rich_font')
         font.setPointSize(self.font().pointSize())
         font.setBold(True)
-        
+
         layout = QHBoxLayout()
         layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(layout)
@@ -182,8 +184,9 @@ class CursorPositionStatus(StatusBarWidget):
 
 
 def test():
-    from spyderlib.qt.QtGui import QMainWindow
+    from qtpy.QtWidgets import QMainWindow
     from spyderlib.utils.qthelpers import qapplication
+
     app = qapplication(test_time=5)
     win = QMainWindow()
     win.setWindowTitle("Status widgets test")
diff --git a/spyderlib/widgets/tabs.py b/spyderlib/widgets/tabs.py
index 1fd770d..e664ffd 100644
--- a/spyderlib/widgets/tabs.py
+++ b/spyderlib/widgets/tabs.py
@@ -11,21 +11,24 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt.QtGui import (QTabWidget, QMenu, QDrag, QApplication,
-                                QTabBar, QWidget, QHBoxLayout)
-from spyderlib.qt.QtCore import Signal, Qt, QPoint, QMimeData, QByteArray
-import spyderlib.utils.icon_manager as ima
-
+# Standard library imports
 import os.path as osp
 import sys
 
+# Third party imports
+from qtpy.QtCore import QByteArray, QMimeData, QPoint, Qt, Signal
+from qtpy.QtGui import QDrag
+from qtpy.QtWidgets import (QApplication, QHBoxLayout, QMenu, QTabBar,
+                            QTabWidget, QWidget)
+
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.config.gui import new_shortcut
-from spyderlib.utils.misc import get_common_path
-from spyderlib.utils.qthelpers import (add_actions, create_toolbutton,
-                                       create_action)
+from spyderlib.config.gui import fixed_shortcut
 from spyderlib.py3compat import PY2, to_text_string
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.misc import get_common_path
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton)
 
 
 class TabBar(QTabBar):
@@ -43,6 +46,7 @@ class TabBar(QTabBar):
         # Dragging tabs
         self.__drag_start_pos = QPoint()
         self.setAcceptDrops(True)
+        self.setUsesScrollButtons(True)
 
     def mousePressEvent(self, event):
         """Reimplement Qt method"""
@@ -218,6 +222,7 @@ class BaseTabs(QTabWidget):
         
     def contextMenuEvent(self, event):
         """Override Qt method"""
+        self.setCurrentIndex(self.tabBar().tabAt(event.pos()))
         if self.menu:
             self.menu.popup(event.globalPos())
             
@@ -287,14 +292,14 @@ class Tabs(BaseTabs):
         tab_bar.sig_move_tab[(str, int, int)].connect(
                                           self.move_tab_from_another_tabwidget)
         self.setTabBar(tab_bar)
-        
-        new_shortcut("Ctrl+Tab", parent, lambda: self.tab_navigate(1))
-        new_shortcut("Shift+Ctrl+Tab", parent, lambda: self.tab_navigate(-1))
-        new_shortcut("Ctrl+W", parent,
-                     lambda: self.sig_close_tab.emit(self.currentIndex()))
-        new_shortcut("Ctrl+F4", parent,
-                     lambda: self.sig_close_tab.emit(self.currentIndex()))
-        
+
+        fixed_shortcut("Ctrl+Tab", parent, lambda: self.tab_navigate(1))
+        fixed_shortcut("Shift+Ctrl+Tab", parent, lambda: self.tab_navigate(-1))
+        fixed_shortcut("Ctrl+W", parent,
+                       lambda: self.sig_close_tab.emit(self.currentIndex()))
+        fixed_shortcut("Ctrl+F4", parent,
+                       lambda: self.sig_close_tab.emit(self.currentIndex()))
+
     def tab_navigate(self, delta=1):
         """Ctrl+Tab"""
         if delta > 0 and self.currentIndex() == self.count()-1:
diff --git a/spyplugins/ui/breakpoints/widgets/__init__.py b/spyderlib/widgets/tests/__init__.py
similarity index 100%
rename from spyplugins/ui/breakpoints/widgets/__init__.py
rename to spyderlib/widgets/tests/__init__.py
diff --git a/spyderlib/widgets/tests/test_array_builder.py b/spyderlib/widgets/tests/test_array_builder.py
new file mode 100644
index 0000000..e980e9a
--- /dev/null
+++ b/spyderlib/widgets/tests/test_array_builder.py
@@ -0,0 +1,174 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009- The Spyder Development Team
+# Licensed under the terms of the MIT License
+#
+
+"""
+Tests for the Numpy Matrix/Array Builder Widget.
+"""
+
+# Third party imports
+from qtpy.QtCore import Qt
+from pytestqt import qtbot
+import pytest
+
+# Local imports
+from spyderlib.widgets.arraybuilder import NumpyArrayDialog
+
+
+# --- Fixtures
+# -----------------------------------------------------------------------------
+ at pytest.fixture
+def botinline(qtbot):
+    dialog = NumpyArrayDialog(inline=True)
+    qtbot.addWidget(dialog)
+    dialog.show()
+    return qtbot, dialog, dialog.array_widget
+
+
+ at pytest.fixture
+def botinlinefloat(qtbot):
+    dialog = NumpyArrayDialog(inline=True, force_float=True)
+    qtbot.addWidget(dialog)
+    dialog.show()
+    return qtbot, dialog, dialog.array_widget
+
+
+ at pytest.fixture
+def botarray(qtbot):
+    dialog = NumpyArrayDialog(inline=False)
+    qtbot.addWidget(dialog)
+    dialog.show()
+    return qtbot, dialog, dialog.array_widget
+
+
+# --- Tests
+# -----------------------------------------------------------------------------
+def test_array_inline_array(botinline):
+    qtbot, dialog, widget = botinline
+    qtbot.keyClicks(widget, '1 2 3  4 5 6')
+    qtbot.keyPress(widget, Qt.Key_Return)
+    value = dialog.text()
+    assert value == 'np.array([[1, 2, 3],\n          [4, 5, 6]])'
+
+def test_array_inline_matrix(botinline):
+    qtbot, dialog, widget = botinline
+    qtbot.keyClicks(widget, '4 5 6  7 8 9')
+    qtbot.keyPress(widget, Qt.Key_Return, modifier=Qt.ControlModifier)
+    value = dialog.text()
+    assert value == 'np.matrix([[4, 5, 6],\n           [7, 8, 9]])'
+
+def test_array_inline_array_invalid(botinline):
+    qtbot, dialog, widget = botinline
+    qtbot.keyClicks(widget, '1 2  3 4  5 6 7')
+    qtbot.keyPress(widget, Qt.Key_Return)
+    dialog.update_warning()
+    assert not dialog.is_valid()
+
+def test_array_inline_1d_array(botinline):
+    qtbot, dialog, widget = botinline
+    qtbot.keyClicks(widget, '4 5 6')
+    qtbot.keyPress(widget, Qt.Key_Return, modifier=Qt.ControlModifier)
+    value = dialog.text()
+    assert value == 'np.matrix([4, 5, 6])'
+
+def test_array_inline_nan_array(botinline):
+    qtbot, dialog, widget = botinline
+    qtbot.keyClicks(widget, '4 nan 6 8 9')
+    qtbot.keyPress(widget, Qt.Key_Return, modifier=Qt.ControlModifier)
+    value = dialog.text()
+    assert value == 'np.matrix([4, np.nan, 6, 8, 9])'
+
+def test_array_inline_force_float_array(botinlinefloat):
+    qtbot, dialog, widget = botinlinefloat
+    qtbot.keyClicks(widget, '4 5 6 8 9')
+    qtbot.keyPress(widget, Qt.Key_Return, modifier=Qt.ControlModifier)
+    value = dialog.text()
+    assert value == 'np.matrix([4.0, 5.0, 6.0, 8.0, 9.0])'
+
+def test_array_inline_force_float_error_array(botinlinefloat):
+    qtbot, dialog, widget = botinlinefloat
+    qtbot.keyClicks(widget, '4 5 6 a 9')
+    qtbot.keyPress(widget, Qt.Key_Return, modifier=Qt.ControlModifier)
+    value = dialog.text()
+    assert value == 'np.matrix([4.0, 5.0, 6.0, a, 9.0])'
+
+def test_array_table_array(botarray):
+    qtbot, dialog, widget = botarray
+    qtbot.keyClick(widget, Qt.Key_1)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_2)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_Backtab)  # Hack: in the tests the selected cell is wrong
+    qtbot.keyClick(widget, Qt.Key_3)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_4)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_5)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_6)
+    qtbot.keyClick(widget, Qt.Key_Tab)  # Hack: in the tests the selected cell is wrong
+    qtbot.keyClick(widget, Qt.Key_Return, modifier=Qt.NoModifier)
+    value = dialog.text()
+    assert value == 'np.array([[1, 2, 3],\n          [4, 5, 6]])'
+
+def test_array_table_matrix(botarray):  # analysis:ignore
+    qtbot, dialog, widget = botarray
+    qtbot.keyClick(widget, Qt.Key_1)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_2)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_Backtab)  # Hack: in the tests the selected cell is wrong
+    qtbot.keyClick(widget, Qt.Key_3)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_4)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_5)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_6)
+    qtbot.keyClick(widget, Qt.Key_Tab)  # Hack: in the tests the selected cell is wrong
+    qtbot.keyClick(widget, Qt.Key_Return, modifier=Qt.ControlModifier)
+    value = dialog.text()
+    assert value == 'np.matrix([[1, 2, 3],\n           [4, 5, 6]])'
+
+def test_array_table_array_empty_items(botarray):  # analysis:ignore
+    qtbot, dialog, widget = botarray
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_2)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_Backtab)  # Hack: in the tests the selected cell is wrong
+    qtbot.keyClick(widget, Qt.Key_3)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_5)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_6)
+    qtbot.keyClick(widget, Qt.Key_Tab)  # Hack: in the tests the selected cell is wrong
+    qtbot.keyClick(widget, Qt.Key_Return, modifier=Qt.NoModifier)
+    value = dialog.text()
+    assert value == 'np.array([[0, 2, 3],\n          [0, 5, 6]])'
+
+def test_array_table_array_spaces_in_item(botarray):  # analysis:ignore
+    qtbot, dialog, widget = botarray
+    qtbot.keyClicks(widget, '   ')
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_2)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_Backtab)
+    qtbot.keyClick(widget, Qt.Key_3)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_5)
+    qtbot.keyClick(widget, Qt.Key_Tab)
+    qtbot.keyClick(widget, Qt.Key_6)
+    qtbot.keyClick(widget, Qt.Key_Tab)  # Hack: in the tests the selected cell is wrong
+    qtbot.keyClick(widget, Qt.Key_Return, modifier=Qt.NoModifier)
+    value = dialog.text()
+    assert value == 'np.array([[0, 2, 3],\n          [0, 5, 6]])'
+
+def test_array_table_matrix_empty(botarray):  # analysis:ignore
+    qtbot, dialog, widget = botarray
+    qtbot.keyClick(widget, Qt.Key_Return, modifier=Qt.NoModifier)
+    value = dialog.text()
+    assert value == ''
diff --git a/spyderlib/widgets/variableexplorer/__init__.py b/spyderlib/widgets/variableexplorer/__init__.py
index 77e6402..b509a93 100644
--- a/spyderlib/widgets/variableexplorer/__init__.py
+++ b/spyderlib/widgets/variableexplorer/__init__.py
@@ -6,7 +6,7 @@
 
 """
 spyderlib.widgets.variableexplorer
-========================
+==================================
 
 Variable Explorer related widgets
 """
diff --git a/spyderlib/widgets/variableexplorer/arrayeditor.py b/spyderlib/widgets/variableexplorer/arrayeditor.py
index bd8f772..234431e 100644
--- a/spyderlib/widgets/variableexplorer/arrayeditor.py
+++ b/spyderlib/widgets/variableexplorer/arrayeditor.py
@@ -13,30 +13,31 @@ NumPy Array Editor Dialog based on Qt
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 from __future__ import print_function
 
-from spyderlib.qt.QtGui import (QHBoxLayout, QColor, QTableView, QItemDelegate,
-                                QLineEdit, QCheckBox, QGridLayout, QCursor,
-                                QDoubleValidator, QDialog, QDialogButtonBox,
-                                QMessageBox, QPushButton, QInputDialog, QMenu,
-                                QApplication, QKeySequence, QLabel, QComboBox,
-                                QSpinBox, QStackedWidget, QWidget, QVBoxLayout,
-                                QAbstractItemDelegate)
-from spyderlib.qt.QtCore import (Qt, QModelIndex, QAbstractTableModel, Slot,
-                                 QItemSelection, QItemSelectionRange)
-
-from spyderlib.qt.compat import to_qvariant, from_qvariant
-import spyderlib.utils.icon_manager as ima
-
+# Third party imports
+from qtpy.compat import from_qvariant, to_qvariant
+from qtpy.QtCore import (QAbstractTableModel, QItemSelection,
+                         QItemSelectionRange, QModelIndex, Qt, Slot)
+from qtpy.QtGui import QColor, QCursor, QDoubleValidator, QKeySequence
+from qtpy.QtWidgets import (QAbstractItemDelegate, QApplication, QCheckBox,
+                            QComboBox, QDialog, QDialogButtonBox, QGridLayout,
+                            QHBoxLayout, QInputDialog, QItemDelegate, QLabel,
+                            QLineEdit,  QMenu, QMessageBox, QPushButton,
+                            QSpinBox, QStackedWidget, QTableView, QVBoxLayout,
+                            QWidget)
 import numpy as np
 
 # Local imports
 from spyderlib.config.base import _
-from spyderlib.config.gui import get_font, new_shortcut
-from spyderlib.utils.qthelpers import (add_actions, create_action, keybinding,
-                                       qapplication)
-from spyderlib.py3compat import (PY3, io, to_text_string, is_text_string,
-                                 is_binary_string, to_binary_string, is_string)
+from spyderlib.config.fonts import DEFAULT_SMALL_DELTA
+from spyderlib.config.gui import get_font, fixed_shortcut
+from spyderlib.py3compat import (io, is_binary_string, is_string,
+                                 is_text_string, PY3, to_binary_string,
+                                 to_text_string)
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import add_actions, create_action, keybinding
 
 
 # Note: string and unicode data types will be formatted with '%s' (see below)
@@ -45,6 +46,7 @@ SUPPORTED_FORMATS = {
                      'double': '%.3f',
                      'float_': '%.3f',
                      'longfloat': '%.3f',
+                     'float16': '%.3f',
                      'float32': '%.3f',
                      'float64': '%.3f',
                      'float96': '%.3f',
@@ -270,7 +272,7 @@ class ArrayModel(QAbstractTableModel):
             color = QColor.fromHsvF(hue, self.sat, self.val, self.alp)
             return to_qvariant(color)
         elif role == Qt.FontRole:
-            return to_qvariant(get_font('arrayeditor'))
+            return to_qvariant(get_font(font_size_delta=DEFAULT_SMALL_DELTA))
         return to_qvariant()
 
     def setData(self, index, value, role=Qt.EditRole):
@@ -357,7 +359,7 @@ class ArrayDelegate(QItemDelegate):
             return
         elif value is not np.ma.masked:
             editor = QLineEdit(parent)
-            editor.setFont(get_font('arrayeditor'))
+            editor.setFont(get_font(font_size_delta=DEFAULT_SMALL_DELTA))
             editor.setAlignment(Qt.AlignCenter)
             if is_number(self.dtype):
                 editor.setValidator(QDoubleValidator(editor))
@@ -397,7 +399,7 @@ class ArrayView(QTableView):
         self.viewport().resize(min(total_width, 1024), self.height())
         self.shape = shape
         self.menu = self.setup_menu()
-        new_shortcut(QKeySequence.Copy, self, self.copy)
+        fixed_shortcut(QKeySequence.Copy, self, self.copy)
         self.horizontalScrollBar().valueChanged.connect(
                             lambda val: self.load_more_data(val, columns=True))
         self.verticalScrollBar().valueChanged.connect(
@@ -795,71 +797,3 @@ class ArrayEditor(QDialog):
             for index in range(self.stack.count()):
                 self.stack.widget(index).reject_changes()
         QDialog.reject(self)
-
-
-#==============================================================================
-# Tests
-#==============================================================================    
-def test_edit(data, title="", xlabels=None, ylabels=None,
-              readonly=False, parent=None):
-    """Test subroutine"""
-    app = qapplication(test_time=1.5)    # analysis:ignore
-    dlg = ArrayEditor(parent)
-
-    if dlg.setup_and_check(data, title, xlabels=xlabels, ylabels=ylabels,
-                           readonly=readonly):
-        dlg.exec_()
-        return dlg.get_value()
-    else:
-        import sys
-        sys.exit(1)
-
-
-def test():
-    """Array editor test"""
-    from numpy.testing import assert_array_equal
-
-    arr = np.array(["kjrekrjkejr"])
-    assert arr == test_edit(arr, "string array")
-
-    arr = np.array([u"ñññéáíó"])
-    assert arr == test_edit(arr, "unicode array")
-
-    arr = np.ma.array([[1, 0], [1, 0]], mask=[[True, False], [False, False]])
-    assert_array_equal(arr, test_edit(arr, "masked array"))
-
-    arr = np.zeros((2, 2), {'names': ('red', 'green', 'blue'),
-                           'formats': (np.float32, np.float32, np.float32)})
-    assert_array_equal(arr, test_edit(arr, "record array"))
-
-    arr = np.array([(0, 0.0), (0, 0.0), (0, 0.0)],
-                   dtype=[(('title 1', 'x'), '|i1'),
-                          (('title 2', 'y'), '>f4')])
-    assert_array_equal(arr, test_edit(arr, "record array with titles"))
-
-    arr = np.random.rand(5, 5)
-    assert_array_equal(arr, test_edit(arr, "float array",
-                                      xlabels=['a', 'b', 'c', 'd', 'e']))
-
-    arr = np.round(np.random.rand(5, 5)*10)+\
-                   np.round(np.random.rand(5, 5)*10)*1j
-    assert_array_equal(arr, test_edit(arr, "complex array",
-                                      xlabels=np.linspace(-12, 12, 5),
-                                      ylabels=np.linspace(-12, 12, 5)))
-
-    arr_in = np.array([True, False, True])
-    arr_out = test_edit(arr_in, "bool array")
-    assert arr_in is arr_out
-
-    arr = np.array([1, 2, 3], dtype="int8")
-    assert_array_equal(arr, test_edit(arr, "int array"))
-
-    arr = np.zeros((3,3,4))
-    arr[0,0,0]=1
-    arr[0,0,1]=2
-    arr[0,0,2]=3
-    assert_array_equal(arr, test_edit(arr, "3D array"))
-
-
-if __name__ == "__main__":
-    test()
diff --git a/spyderlib/widgets/variableexplorer/collectionseditor.py b/spyderlib/widgets/variableexplorer/collectionseditor.py
index a2a5057..533602f 100644
--- a/spyderlib/widgets/variableexplorer/collectionseditor.py
+++ b/spyderlib/widgets/variableexplorer/collectionseditor.py
@@ -16,41 +16,45 @@ Collections (i.e. dictionary, list and tuple) editor widget and dialog
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+# Standard library imports
 from __future__ import print_function
-
-import sys
 import datetime
+import sys
 import warnings
 
-from spyderlib.qt.QtGui import (QMessageBox, QTableView, QItemDelegate,
-                                QLineEdit, QVBoxLayout, QWidget, QColor,
-                                QDialog, QDateEdit, QDialogButtonBox, QMenu,
-                                QInputDialog, QDateTimeEdit, QApplication,
-                                QKeySequence, QAbstractItemDelegate)
-from spyderlib.qt.QtCore import (Qt, QModelIndex, QAbstractTableModel, Signal,
-                                 QDateTime, Slot)
-import spyderlib.utils.icon_manager as ima
-from spyderlib.qt.compat import to_qvariant, getsavefilename
-from spyderlib.utils.qthelpers import mimedata2url
+# Third party imports
+from qtpy.compat import getsavefilename, to_qvariant
+from qtpy.QtCore import (QAbstractTableModel, QDateTime, QModelIndex, Qt,
+                         Signal, Slot)
+from qtpy.QtGui import QColor, QKeySequence
+from qtpy.QtWidgets import (QAbstractItemDelegate, QApplication, QDateEdit,
+                            QDateTimeEdit, QDialog, QDialogButtonBox,
+                            QInputDialog, QItemDelegate, QLineEdit, QMenu,
+                            QMessageBox, QTableView, QVBoxLayout, QWidget)
 
 # Local import
 from spyderlib.config.base import _
+from spyderlib.config.fonts import DEFAULT_SMALL_DELTA
 from spyderlib.config.gui import get_font
+from spyderlib.py3compat import (io, is_binary_string, is_text_string,
+                                 getcwd, PY3, to_text_string)
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.misc import fix_reference_name
-from spyderlib.utils.qthelpers import add_actions, create_action, qapplication
-from spyderlib.widgets.variableexplorer.utils import (sort_against, get_size,
-               get_human_readable_type, value_to_display, get_color_name,
-               is_known_type, FakeObject, Image, ndarray, array, MaskedArray,
-               unsorted_unique, try_to_eval, is_editable_type, DataFrame,
-               Series, display_to_value, np_savetxt)
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       mimedata2url)
+from spyderlib.widgets.variableexplorer.importwizard import ImportWizard
+from spyderlib.widgets.variableexplorer.texteditor import TextEditor
+from spyderlib.widgets.variableexplorer.utils import (
+    array, DataFrame, display_to_value, FakeObject, get_color_name,
+    get_human_readable_type, get_size, Image, is_editable_type, is_known_type,
+    MaskedArray, ndarray, np_savetxt, Series, sort_against, try_to_eval,
+    unsorted_unique, value_to_display,)
+
 if ndarray is not FakeObject:
     from spyderlib.widgets.variableexplorer.arrayeditor import ArrayEditor
+
 if DataFrame is not FakeObject:
     from spyderlib.widgets.variableexplorer.dataframeeditor import DataFrameEditor
-from spyderlib.widgets.variableexplorer.texteditor import TextEditor
-from spyderlib.widgets.variableexplorer.importwizard import ImportWizard
-from spyderlib.py3compat import (to_text_string, is_text_string, PY3, io,
-                                 is_binary_string, getcwd)
 
 
 LARGE_NROWS = 100
@@ -297,19 +301,13 @@ class ReadOnlyCollectionsModel(QAbstractTableModel):
         elif role == Qt.BackgroundColorRole:
             return to_qvariant( self.get_bgcolor(index) )
         elif role == Qt.FontRole:
-            if index.column() < 3:
-                return to_qvariant(get_font('dicteditor_header'))
-            else:
-                return to_qvariant(get_font('dicteditor'))
+            return to_qvariant(get_font(font_size_delta=DEFAULT_SMALL_DELTA))
         return to_qvariant()
-    
+
     def headerData(self, section, orientation, role=Qt.DisplayRole):
         """Overriding method headerData"""
         if role != Qt.DisplayRole:
-            if role == Qt.FontRole:
-                return to_qvariant(get_font('dicteditor_header'))
-            else:
-                return to_qvariant()
+            return to_qvariant()
         i_column = int(section)
         if orientation == Qt.Horizontal:
             headers = (self.header0, _("Type"), _("Size"), _("Value"))
@@ -472,13 +470,13 @@ class CollectionsDelegate(QItemDelegate):
         elif isinstance(value, datetime.datetime):
             editor = QDateTimeEdit(value, parent)
             editor.setCalendarPopup(True)
-            editor.setFont(get_font('dicteditor'))
+            editor.setFont(get_font(font_size_delta=DEFAULT_SMALL_DELTA))
             return editor
         #---editor = QDateEdit
         elif isinstance(value, datetime.date):
             editor = QDateEdit(value, parent)
             editor.setCalendarPopup(True)
-            editor.setFont(get_font('dicteditor'))
+            editor.setFont(get_font(font_size_delta=DEFAULT_SMALL_DELTA))
             return editor
         #---editor = TextEditor
         elif is_text_string(value) and len(value)>40:
@@ -489,7 +487,7 @@ class CollectionsDelegate(QItemDelegate):
         #---editor = QLineEdit
         elif is_editable_type(value):
             editor = QLineEdit(parent)
-            editor.setFont(get_font('dicteditor'))
+            editor.setFont(get_font(font_size_delta=DEFAULT_SMALL_DELTA))
             editor.setAlignment(Qt.AlignLeft)
             editor.returnPressed.connect(self.commitAndCloseEditor)
             return editor
@@ -1065,6 +1063,10 @@ class BaseTableView(QTableView):
                 else:
                     obj = output.getvalue().decode('utf-8')
                 output.close()
+            elif is_binary_string(obj):
+                obj = to_text_string(obj, 'utf8')
+            else:
+                obj = to_text_string(obj)
             clipl.append(obj)
         clipboard.setText('\n'.join(clipl))
 
@@ -1456,6 +1458,8 @@ def get_test_data():
 
 def editor_test():
     """Collections editor test"""
+    from spyderlib.utils.qthelpers import qapplication
+
     app = qapplication()             #analysis:ignore
     dialog = CollectionsEditor()
     dialog.setup(get_test_data())
@@ -1466,19 +1470,25 @@ def editor_test():
 
 def remote_editor_test():
     """Remote collections editor test"""
+    from pprint import pprint
+
+    from spyderlib.utils.qthelpers import qapplication
     app = qapplication()
+
     from spyderlib.plugins.variableexplorer import VariableExplorer
     from spyderlib.widgets.externalshell.monitor import make_remote_view
+
     remote = make_remote_view(get_test_data(), VariableExplorer.get_settings())
-    from pprint import pprint
     pprint(remote)
     dialog = CollectionsEditor()
     dialog.setup(remote, remote=True)
     dialog.show()
-    app.exec_()
+
     if dialog.result():
         print(dialog.get_value())
 
+    app.exec_()
+
 
 if __name__ == "__main__":
     editor_test()
diff --git a/spyderlib/widgets/variableexplorer/dataframeeditor.py b/spyderlib/widgets/variableexplorer/dataframeeditor.py
index 9bd405e..76e658d 100644
--- a/spyderlib/widgets/variableexplorer/dataframeeditor.py
+++ b/spyderlib/widgets/variableexplorer/dataframeeditor.py
@@ -13,25 +13,28 @@
 Pandas DataFrame Editor Dialog
 """
 
-from spyderlib.qt.QtCore import QAbstractTableModel, Qt, QModelIndex, Slot
-from spyderlib.qt.QtGui import (QDialog, QTableView, QColor, QGridLayout,
-                                QDialogButtonBox, QHBoxLayout, QPushButton,
-                                QCheckBox, QMessageBox, QInputDialog, QCursor,
-                                QLineEdit, QApplication, QMenu, QKeySequence)
-from spyderlib.qt.compat import to_qvariant, from_qvariant
-import spyderlib.utils.icon_manager as ima
-from spyderlib.utils.qthelpers import (qapplication, create_action,
-                                       add_actions, keybinding)
+# Third party imports
+from pandas import DataFrame, Series
+from qtpy import API
+from qtpy.compat import from_qvariant, to_qvariant
+from qtpy.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot
+from qtpy.QtGui import QColor, QCursor, QKeySequence
+from qtpy.QtWidgets import (QApplication, QCheckBox, QDialogButtonBox, QDialog,
+                            QGridLayout, QHBoxLayout, QInputDialog, QLineEdit,
+                            QMenu, QMessageBox, QPushButton, QTableView)
+import numpy as np
 
+# Local imports
 from spyderlib.config.base import _
-from spyderlib.config.gui import get_font, new_shortcut
-from spyderlib.py3compat import PY2, io, is_text_string, to_text_string
+from spyderlib.config.fonts import DEFAULT_SMALL_DELTA
+from spyderlib.config.gui import get_font, fixed_shortcut
+from spyderlib.py3compat import io, is_text_string, PY2, to_text_string
 from spyderlib.utils import encoding
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       keybinding, qapplication)
 from spyderlib.widgets.variableexplorer.arrayeditor import get_idx_rect
 
-from pandas import DataFrame, Series
-import numpy as np
-
 # Supported Numbers and complex numbers
 _sup_nr = (float, int, np.int64, np.int32)
 _sup_com = (complex, np.complex64, np.complex128)
@@ -208,6 +211,8 @@ class DataFrameModel(QAbstractTableModel):
             vmax, vmin = self.return_max(self.max_min_col, column-1)
             hue = self.hue0 + self.dhue*(vmax-color_func(value)) / (vmax-vmin)
             hue = float(abs(hue))
+            if hue > 1:
+                hue = 1
             color = QColor.fromHsvF(hue, self.sat, self.val, self.alp)
         elif is_text_string(value):
             color = QColor(Qt.lightGray)
@@ -252,7 +257,7 @@ class DataFrameModel(QAbstractTableModel):
         elif role == Qt.BackgroundColorRole:
             return to_qvariant(self.get_bgcolor(index))
         elif role == Qt.FontRole:
-            return to_qvariant(get_font('arrayeditor'))
+            return to_qvariant(get_font(font_size_delta=DEFAULT_SMALL_DELTA))
         return to_qvariant()
 
     def sort(self, column, order=Qt.AscendingOrder):
@@ -264,12 +269,20 @@ class DataFrameModel(QAbstractTableModel):
                                      "relation is defined for complex numbers")
                 return False
         try:
+            ascending = order == Qt.AscendingOrder
             if column > 0:
-                self.df.sort(columns=self.df.columns[column-1],
-                             ascending=order, inplace=True)
+                try:
+                    self.df.sort_values(by=self.df.columns[column-1],
+                                        ascending=ascending, inplace=True,
+                                        kind='mergesort')
+                except AttributeError:
+                    # for pandas version < 0.17
+                    self.df.sort(columns=self.df.columns[column-1],
+                                 ascending=ascending, inplace=True,
+                                 kind='mergesort')
                 self.update_df_index()
             else:
-                self.df.sort_index(inplace=True, ascending=order)
+                self.df.sort_index(inplace=True, ascending=ascending)
                 self.update_df_index()
         except TypeError as e:
             QMessageBox.critical(self.dialog, "Error",
@@ -385,7 +398,7 @@ class DataFrameView(QTableView):
         self.header_class = self.horizontalHeader()
         self.header_class.sectionClicked.connect(self.sortByColumn)
         self.menu = self.setup_menu()
-        new_shortcut(QKeySequence.Copy, self, self.copy)
+        fixed_shortcut(QKeySequence.Copy, self, self.copy)
         self.horizontalScrollBar().valueChanged.connect(
                             lambda val: self.load_more_data(val, columns=True))
         self.verticalScrollBar().valueChanged.connect(
@@ -428,9 +441,13 @@ class DataFrameView(QTableView):
                      (_("To str"), to_text_string))
         types_in_menu = [copy_action]
         for name, func in functions:
+            # QAction.triggered works differently for PySide and PyQt
+            if not API == 'pyside':
+                slot = lambda _checked, func=func: self.change_type(func)
+            else:
+                slot = lambda func=func: self.change_type(func)
             types_in_menu += [create_action(self, name,
-                                            triggered=lambda func=func:
-                                                      self.change_type(func),
+                                            triggered=slot,
                                             context=Qt.WidgetShortcut)]
         menu = QMenu(self)
         add_actions(menu, types_in_menu)
diff --git a/spyderlib/widgets/variableexplorer/importwizard.py b/spyderlib/widgets/variableexplorer/importwizard.py
index 4e9384f..5c1a583 100644
--- a/spyderlib/widgets/variableexplorer/importwizard.py
+++ b/spyderlib/widgets/variableexplorer/importwizard.py
@@ -8,21 +8,20 @@
 Text data Importing Wizard based on Qt
 """
 
+# Standard library imports
 from __future__ import print_function
-
-from spyderlib.qt.QtGui import (QTableView, QVBoxLayout, QHBoxLayout,
-                                QGridLayout, QWidget, QDialog, QTextEdit,
-                                QTabWidget, QPushButton, QLabel, QSpacerItem,
-                                QSizePolicy, QCheckBox, QColor, QRadioButton,
-                                QLineEdit, QFrame, QMenu, QIntValidator,
-                                QGroupBox, QMessageBox)
-from spyderlib.qt.QtCore import (Qt, QModelIndex, QAbstractTableModel, Signal,
-                                 Slot)
-from spyderlib.qt.compat import to_qvariant
-import spyderlib.utils.icon_manager as ima
-
 from functools import partial as ft_partial
 
+# Third party imports
+from qtpy.compat import to_qvariant
+from qtpy.QtCore import QAbstractTableModel, QModelIndex, Qt, Signal, Slot
+from qtpy.QtGui import QColor, QIntValidator
+from qtpy.QtWidgets import (QCheckBox, QDialog, QFrame, QGridLayout, QGroupBox,
+                            QHBoxLayout, QLabel, QLineEdit,
+                            QPushButton, QMenu, QMessageBox, QRadioButton,
+                            QSizePolicy, QSpacerItem, QTableView, QTabWidget,
+                            QTextEdit, QVBoxLayout, QWidget)
+
 try:
     import pandas as pd
 except ImportError:
@@ -30,10 +29,11 @@ except ImportError:
 
 # Local import
 from spyderlib.config.base import _
+from spyderlib.py3compat import (INT_TYPES, io, TEXT_TYPES, to_text_string,
+                                 zip_longest)
 from spyderlib.utils import programs
+from spyderlib.utils import icon_manager as ima
 from spyderlib.utils.qthelpers import add_actions, create_action
-from spyderlib.py3compat import (TEXT_TYPES, INT_TYPES, to_text_string, io,
-                                 zip_longest)
 
 
 def try_to_parse(value):
diff --git a/spyderlib/widgets/variableexplorer/namespacebrowser.py b/spyderlib/widgets/variableexplorer/namespacebrowser.py
index 95e7fbc..0d4b853 100644
--- a/spyderlib/widgets/variableexplorer/namespacebrowser.py
+++ b/spyderlib/widgets/variableexplorer/namespacebrowser.py
@@ -10,33 +10,35 @@ Namespace browser widget
 This is the main widget used in the Variable Explorer plugin
 """
 
+# Standard library imports
 import os.path as osp
 import socket
 
-from spyderlib.qt.QtGui import (QWidget, QVBoxLayout, QHBoxLayout, QMenu,
-                                QToolButton, QMessageBox, QApplication,
-                                QCursor, QInputDialog)
-from spyderlib.qt.QtCore import Qt, Signal, Slot
-from spyderlib.qt.compat import getopenfilenames, getsavefilename
-import spyderlib.utils.icon_manager as ima
+# Third library imports
+from qtpy.compat import getsavefilename, getopenfilenames
+from qtpy.QtCore import Qt, Signal, Slot
+from qtpy.QtGui import QCursor
+from qtpy.QtWidgets import (QApplication, QHBoxLayout, QInputDialog, QMenu,
+                            QMessageBox, QToolButton, QVBoxLayout, QWidget)
 
 # Local imports
-from spyderlib.widgets.externalshell.monitor import (
-            monitor_set_global, monitor_get_global, monitor_del_global,
-            monitor_copy_global, monitor_save_globals, monitor_load_globals,
-            communicate, REMOTE_SETTINGS)
-from spyderlib.widgets.variableexplorer.collectionseditor import (
-                  RemoteCollectionsEditorTableView, CollectionsEditorTableView)
-from spyderlib.widgets.variableexplorer.utils import globalsfilter
+from spyderlib.config.base import _, get_supported_types
+from spyderlib.py3compat import is_text_string, getcwd, to_text_string
 from spyderlib.utils import encoding
+from spyderlib.utils import icon_manager as ima
+from spyderlib.utils.iofuncs import iofunctions
 from spyderlib.utils.misc import fix_reference_name
 from spyderlib.utils.programs import is_module_installed
-from spyderlib.utils.qthelpers import (create_toolbutton, add_actions,
-                                       create_action)
-from spyderlib.utils.iofuncs import iofunctions
+from spyderlib.utils.qthelpers import (add_actions, create_action,
+                                       create_toolbutton)
+from spyderlib.widgets.externalshell.monitor import (
+    communicate, monitor_copy_global, monitor_del_global, monitor_get_global,
+    monitor_load_globals, monitor_save_globals, monitor_set_global,
+    REMOTE_SETTINGS)
+from spyderlib.widgets.variableexplorer.collectionseditor import (
+    CollectionsEditorTableView, RemoteCollectionsEditorTableView)
 from spyderlib.widgets.variableexplorer.importwizard import ImportWizard
-from spyderlib.config.base import _, get_supported_types
-from spyderlib.py3compat import is_text_string, to_text_string, getcwd
+from spyderlib.widgets.variableexplorer.utils import globalsfilter
 
 
 SUPPORTED_TYPES = get_supported_types()
@@ -54,11 +56,9 @@ class NamespaceBrowser(QWidget):
         self.is_internal_shell = None
         self.ipyclient = None
         self.is_ipykernel = None
-        
-        self.is_visible = True # Do not modify: light mode won't work!
-        
+        self.is_visible = True
         self.setup_in_progress = None
-        
+
         # Remote dict editor settings
         self.check_all = None
         self.exclude_private = None
@@ -452,6 +452,7 @@ class NamespaceBrowser(QWidget):
         """Collapse"""
         self.sig_collapse.emit()
 
+    @Slot(bool)
     @Slot(list)
     def import_data(self, filenames=None):
         """Import data from text file"""
diff --git a/spyderlib/widgets/variableexplorer/objecteditor.py b/spyderlib/widgets/variableexplorer/objecteditor.py
index f3ee2b9..e9c190f 100644
--- a/spyderlib/widgets/variableexplorer/objecteditor.py
+++ b/spyderlib/widgets/variableexplorer/objecteditor.py
@@ -8,9 +8,11 @@
 Generic object editor dialog
 """
 
+# Standard library imports
 from __future__ import print_function
 
-from spyderlib.qt.QtCore import QObject
+# Third party imports
+from qtpy.QtCore import QObject
 
 # Local imports
 from spyderlib.py3compat import is_text_string
diff --git a/spyderlib/widgets/variableexplorer/texteditor.py b/spyderlib/widgets/variableexplorer/texteditor.py
index 8a7aa69..6dc7ca9 100644
--- a/spyderlib/widgets/variableexplorer/texteditor.py
+++ b/spyderlib/widgets/variableexplorer/texteditor.py
@@ -8,17 +8,19 @@
 Text editor dialog
 """
 
+# Standard library imports
 from __future__ import print_function
 
-from spyderlib.qt.QtCore import Qt
-from spyderlib.qt.QtGui import QVBoxLayout, QTextEdit, QDialog, QDialogButtonBox
-import spyderlib.utils.icon_manager as ima
+# Third party imports
+from qtpy.QtCore import Qt
+from qtpy.QtWidgets import QDialog, QDialogButtonBox, QTextEdit, QVBoxLayout
 
 # Local import
 from spyderlib.config.base import _
 from spyderlib.config.gui import get_font
-from spyderlib.py3compat import (to_text_string, to_binary_string,
-                                 is_binary_string)
+from spyderlib.py3compat import (is_binary_string, to_binary_string,
+                                 to_text_string)
+from spyderlib.utils import icon_manager as ima
 
 
 class TextEditor(QDialog):
@@ -52,7 +54,7 @@ class TextEditor(QDialog):
         self.edit.setReadOnly(readonly)
         self.edit.setPlainText(text)
         if font is None:
-            font = get_font('texteditor')
+            font = get_font()
         self.edit.setFont(font)
         self.layout.addWidget(self.edit)
 
diff --git a/spyderlib/widgets/variableexplorer/utils.py b/spyderlib/widgets/variableexplorer/utils.py
index 0dbd7bf..4116ef6 100644
--- a/spyderlib/widgets/variableexplorer/utils.py
+++ b/spyderlib/widgets/variableexplorer/utils.py
@@ -27,12 +27,12 @@ from spyderlib.config.base import _
 PANDAS_REQVER = '>=0.13.1'
 dependencies.add('pandas',  _("View and edit DataFrames and Series in the "
                               "Variable Explorer"),
-                 required_version=PANDAS_REQVER)
+                 required_version=PANDAS_REQVER, optional=True)
 
 NUMPY_REQVER = '>=1.7'
 dependencies.add("numpy", _("View and edit two and three dimensional arrays "
                             "in the Variable Explorer"),
-                 required_version=NUMPY_REQVER)
+                 required_version=NUMPY_REQVER, optional=True)
 
 #==============================================================================
 # FakeObject
@@ -214,12 +214,18 @@ def is_editable_type(value):
 #==============================================================================
 # Sorting
 #==============================================================================
-def sort_against(lista, listb, reverse=False):
-    """Arrange lista items in the same order as sorted(listb)"""
+def sort_against(list1, list2, reverse=False):
+    """
+    Arrange items of list1 in the same order as sorted(list2).
+
+    In other words, apply to list1 the permutation which takes list2 
+    to sorted(list2, reverse).
+    """
     try:
-        return [item for _, item in sorted(zip(listb, lista), reverse=reverse)]
+        return [item for _, item in 
+                sorted(zip(list2, list1), key=lambda x: x[0], reverse=reverse)]
     except:
-        return lista
+        return list1
 
 
 def unsorted_unique(lista):
@@ -238,16 +244,14 @@ def value_to_display(value, truncate=False, trunc_len=80, minmax=False):
             display = 'Field names: ' + ', '.join(fields)
         elif isinstance(value, MaskedArray):
             display = 'Masked array'
-        elif minmax and isinstance(value, ndarray):
-            if value.size == 0:
+        elif isinstance(value, ndarray):
+            if minmax:
+                try:
+                    display = 'Min: %r\nMax: %r' % (value.min(), value.max())
+                except (TypeError, ValueError):
+                    display = repr(value)
+            else:
                 display = repr(value)
-            try:
-                display = 'Min: %r\nMax: %r' % (value.min(), value.max())
-            except TypeError:
-                pass
-            except ValueError:
-                # Happens when one of the array cell contains a sequence
-                pass
         elif isinstance(value, ndarray):
             display = repr(value)
         elif isinstance(value, (list, tuple, dict, set)):
@@ -277,7 +281,7 @@ def value_to_display(value, truncate=False, trunc_len=80, minmax=False):
             try:
                 display = to_text_string(value, 'utf8')
             except:
-                pass
+                display = value
         elif is_text_string(value):
             display = value
         elif isinstance(value, NUMERIC_TYPES) or isinstance(value, bool) or \
@@ -301,7 +305,7 @@ def value_to_display(value, truncate=False, trunc_len=80, minmax=False):
 
 def display_to_value(value, default_value, ignore_errors=True):
     """Convert back to value"""
-    from spyderlib.qt.compat import from_qvariant
+    from qtpy.compat import from_qvariant
     value = from_qvariant(value, to_text_string)
     try:
         np_dtype = get_numpy_dtype(default_value)
diff --git a/spyderlib/workers/updates.py b/spyderlib/workers/updates.py
index 924f2ad..6228d55 100644
--- a/spyderlib/workers/updates.py
+++ b/spyderlib/workers/updates.py
@@ -5,13 +5,17 @@
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
+# Standard library imports
 import json
 import ssl
 
+# Third party imports
+from qtpy.QtCore import QObject, Signal
+
+# Local imports
 from spyderlib import __version__
 from spyderlib.config.base import _
 from spyderlib.py3compat import PY3
-from spyderlib.qt.QtCore import Signal, QObject
 from spyderlib.utils.programs import check_version, is_stable_version
 
 
diff --git a/spyplugins/__init__.py b/spyplugins/__init__.py
deleted file mode 100644
index b98aaa1..0000000
--- a/spyplugins/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-'spyplugins' makes uses of namespace packages to keep different plugins
-organized in the sitepackages directory and in the user directory.
-
-Spyder plugins can be of 'io' type or 'ui' type. Each type also makes use
-of namespace packages.
-
-For more information on namespace packages visit:
-- https://www.python.org/dev/peps/pep-0382/
-- https://www.python.org/dev/peps/pep-0420/
-"""
-__import__('pkg_resources').declare_namespace(__name__)
diff --git a/spyplugins/io/__init__.py b/spyplugins/io/__init__.py
deleted file mode 100644
index f74acdb..0000000
--- a/spyplugins/io/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-'spyplugins' makes uses of namespace packages to keep different plugins
-organized in the sitepackages directory and in the user directory.
-
-Spyder plugins can be of 'io' type or 'ui' type. Each type also makes use
-of namespace packages.
-
-For more information on namespace packages visit:
-- https://www.python.org/dev/peps/pep-0382/
-- https://www.python.org/dev/peps/pep-0420/
-"""
-__import__('pkg_resources').declare_namespace(__name__)
\ No newline at end of file
diff --git a/spyplugins/io/dcm/__init__.py b/spyplugins/io/dcm/__init__.py
deleted file mode 100644
index 04f3a59..0000000
--- a/spyplugins/io/dcm/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# =============================================================================
-# The following statements are required to register this I/O plugin:
-# =============================================================================
-from .dcm import load_dicom
-
-FORMAT_NAME = "DICOM images"
-FORMAT_EXT  = ".dcm"
-FORMAT_LOAD = load_dicom
-FORMAT_SAVE = None
\ No newline at end of file
diff --git a/spyplugins/io/dcm/dcm.py b/spyplugins/io/dcm/dcm.py
deleted file mode 100644
index 33b6fde..0000000
--- a/spyplugins/io/dcm/dcm.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# -*- coding:utf-8 -*-
-"""Example of I/O plugin for loading DICOM files"""
-
-import os.path as osp
-
-try:
-    try:
-        # pydicom 0.9
-        import dicom as dicomio
-    except ImportError:
-        # pydicom 1.0
-        from pydicom import dicomio
-    def load_dicom(filename):
-        try:
-            name = osp.splitext(osp.basename(filename))[0]
-            try:
-                data = dicomio.read_file(filename, force=True)
-            except TypeError:
-                data = dicomio.read_file(filename)                
-            arr = data.pixel_array
-            return {name: arr}, None
-        except Exception as error:
-            return None, str(error)
-except ImportError:
-    load_dicom = None
-
diff --git a/spyplugins/io/hdf5/__init__.py b/spyplugins/io/hdf5/__init__.py
deleted file mode 100644
index 1b23fea..0000000
--- a/spyplugins/io/hdf5/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# =============================================================================
-# The following statements are required to register this I/O plugin:
-# =============================================================================
-from .hdf5 import load_hdf5, save_hdf5
-
-FORMAT_NAME = "HDF5"
-FORMAT_EXT  = ".h5"
-FORMAT_LOAD = load_hdf5
-FORMAT_SAVE = save_hdf5
diff --git a/spyplugins/io/hdf5/hdf5.py b/spyplugins/io/hdf5/hdf5.py
deleted file mode 100644
index 6b02599..0000000
--- a/spyplugins/io/hdf5/hdf5.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# -*- coding:utf-8 -*-
-#
-# Copyright © 2011 David Anthony Powell
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""I/O plugin for loading/saving HDF5 files
-
-Note that this is a fairly dumb implementation which reads the whole HDF5 file into
-Spyder's variable explorer.  Since HDF5 files are designed for storing very large
-data-sets, it may be much better to work directly with the HDF5 objects, thus keeping
-the data on disk.  Nonetheless, this plugin gives quick and dirty but convenient 
-access to HDF5 files.
-
-There is no support for creating files with compression, chunking etc, although
-these can be read without problem.
-
-All datatypes to be saved must be convertible to a numpy array, otherwise an exception
-will be raised.
-
-Data attributes are currently ignored.
-
-When reading an HDF5 file with sub-groups, groups in the HDF5 file will
-correspond to dictionaries with the same layout.  However, when saving
-data, dictionaries are not turned into HDF5 groups.
-
-TODO: Look for the pytables library if h5py is not found??
-TODO: Check issues with valid python names vs valid h5f5 names
-"""
-
-from __future__ import print_function
-
-try:
-    # Do not import h5py here because it will try to import IPython,
-    # and this is freezing the Spyder GUI
-    import imp
-    imp.find_module('h5py')
-    import numpy as np
-    
-    def load_hdf5(filename):
-        import h5py
-        def get_group(group):
-            contents = {}
-            for name, obj in list(group.items()):
-                if isinstance(obj, h5py.Dataset):
-                    contents[name] = np.array(obj)
-                elif isinstance(obj, h5py.Group):
-                    # it is a group, so call self recursively
-                    contents[name] = get_group(obj)
-                # other objects such as links are ignored
-            return contents
-            
-        try:
-            f = h5py.File(filename, 'r')
-            contents = get_group(f)
-            f.close()
-            return contents, None
-        except Exception as error:
-            return None, str(error)
-            
-    def save_hdf5(data, filename):
-        import h5py
-        try:
-            f = h5py.File(filename, 'w')
-            for key, value in list(data.items()):
-                f[key] = np.array(value)
-            f.close()
-        except Exception as error:
-            return str(error)            
-except ImportError:
-    load_hdf5 = None
-    save_hdf5 = None
-
-
-if __name__ == "__main__":
-    data = {'a' : [1, 2, 3, 4], 'b' : 4.5}
-    print(save_hdf5(data, "test.h5"))
-    print(load_hdf5("test.h5"))
diff --git a/spyplugins/ui/__init__.py b/spyplugins/ui/__init__.py
deleted file mode 100644
index f74acdb..0000000
--- a/spyplugins/ui/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""
-'spyplugins' makes uses of namespace packages to keep different plugins
-organized in the sitepackages directory and in the user directory.
-
-Spyder plugins can be of 'io' type or 'ui' type. Each type also makes use
-of namespace packages.
-
-For more information on namespace packages visit:
-- https://www.python.org/dev/peps/pep-0382/
-- https://www.python.org/dev/peps/pep-0420/
-"""
-__import__('pkg_resources').declare_namespace(__name__)
\ No newline at end of file
diff --git a/spyplugins/ui/breakpoints/__init__.py b/spyplugins/ui/breakpoints/__init__.py
deleted file mode 100644
index 9b8bfbb..0000000
--- a/spyplugins/ui/breakpoints/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- coding: utf-8 -*-
-
-#==============================================================================
-# The following statement is required to register this 3rd party plugin:
-#==============================================================================
-from .breakpoints import Breakpoints as PLUGIN_CLASS
diff --git a/spyplugins/ui/breakpoints/breakpoints.py b/spyplugins/ui/breakpoints/breakpoints.py
deleted file mode 100644
index 9ef5d7b..0000000
--- a/spyplugins/ui/breakpoints/breakpoints.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# -*- coding:utf-8 -*-
-#
-# Copyright © 2012 Jed Ludlow
-# Based loosely on p_pylint.py by Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""Breakpoint Plugin"""
-
-# pylint: disable=C0103
-# pylint: disable=R0903
-# pylint: disable=R0911
-# pylint: disable=R0201
-
-# Standard library imports
-import os.path as osp
-
-# Local imports
-from spyderlib.config.base import get_translation
-from spyderlib.utils import icon_manager as ima
-from spyderlib.utils.qthelpers import create_action
-from spyderlib.plugins import SpyderPluginMixin
-from spyderlib.py3compat import to_text_string, is_text_string
-from .widgets.breakpointsgui import BreakpointWidget
-
-_ = get_translation("breakpoints", "spyplugins.ui.breakpoints")
-
-
-class Breakpoints(BreakpointWidget, SpyderPluginMixin):
-    """Breakpoint list"""
-    CONF_SECTION = 'breakpoints'
-
-#    CONFIGWIDGET_CLASS = BreakpointConfigPage
-    def __init__(self, parent=None):
-        BreakpointWidget.__init__(self, parent=parent)
-        SpyderPluginMixin.__init__(self, parent)
-        
-        # Initialize plugin
-        self.initialize_plugin()
-        self.set_data()
-    
-    #------ SpyderPluginWidget API --------------------------------------------
-    def get_plugin_title(self):
-        """Return widget title"""
-        return _("Breakpoints")
-    
-    def get_plugin_icon(self):
-        """Return widget icon"""
-        path = osp.join(self.PLUGIN_PATH, self.IMG_PATH)
-        return ima.icon('profiler', icon_path=path)
-    
-    def get_focus_widget(self):
-        """
-        Return the widget to give focus to when
-        this plugin's dockwidget is raised on top-level
-        """
-        return self.dictwidget
-    
-    def get_plugin_actions(self):
-        """Return a list of actions related to plugin"""
-        return []
-
-    def on_first_registration(self):
-        """Action to be performed on first plugin registration"""
-        self.main.tabify_plugins(self.main.inspector, self)
-
-    def register_plugin(self):
-        """Register plugin in Spyder's main window"""
-        self.edit_goto.connect(self.main.editor.load)
-        #self.redirect_stdio.connect(self.main.redirect_internalshell_stdio)
-        self.clear_all_breakpoints.connect(
-                                        self.main.editor.clear_all_breakpoints)
-        self.clear_breakpoint.connect(self.main.editor.clear_breakpoint)
-        self.main.editor.breakpoints_saved.connect(self.set_data)
-        self.set_or_edit_conditional_breakpoint.connect(
-                           self.main.editor.set_or_edit_conditional_breakpoint)
-        
-        self.main.add_dockwidget(self)
-        
-        list_action = create_action(self, _("List breakpoints"),
-                                   triggered=self.show)
-        list_action.setEnabled(True)
-        
-        # A fancy way to insert the action into the Breakpoints menu under
-        # the assumption that Breakpoints is the first QMenu in the list.
-        for item in self.main.debug_menu_actions:
-            try:
-                menu_title = item.title()
-            except AttributeError:
-                pass
-            else:
-                # Depending on Qt API version, could get a QString or 
-                # unicode from title()
-                if not is_text_string(menu_title): # string is a QString
-                    menu_title = to_text_string(menu_title.toUtf8)
-                item.addAction(list_action)
-                # If we've reached this point it means we've located the 
-                # first QMenu in the run_menu. Since there might be other
-                # QMenu entries in run_menu, we'll break so that the
-                # breakpoint action is only inserted once into the run_menu.
-                break
-        self.main.editor.pythonfile_dependent_actions += [list_action]
-
-    def refresh_plugin(self):
-        """Refresh widget"""
-        pass
-        
-    def closing_plugin(self, cancelable=False):
-        """Perform actions before parent main window is closed"""
-        return True
-            
-    def apply_plugin_settings(self, options):
-        """Apply configuration file's plugin settings"""
-        pass
-        
-    def show(self):
-        """Show the breakpoints dockwidget"""
-        if self.dockwidget and not self.ismaximized:
-            self.dockwidget.setVisible(True)
-            self.dockwidget.setFocus()
-            self.dockwidget.raise_()
diff --git a/spyplugins/ui/breakpoints/locale/es/LC_MESSAGES/breakpoints.mo b/spyplugins/ui/breakpoints/locale/es/LC_MESSAGES/breakpoints.mo
deleted file mode 100644
index c4c9a53..0000000
Binary files a/spyplugins/ui/breakpoints/locale/es/LC_MESSAGES/breakpoints.mo and /dev/null differ
diff --git a/spyplugins/ui/breakpoints/locale/fr/LC_MESSAGES/breakpoints.mo b/spyplugins/ui/breakpoints/locale/fr/LC_MESSAGES/breakpoints.mo
deleted file mode 100644
index 8c28814..0000000
Binary files a/spyplugins/ui/breakpoints/locale/fr/LC_MESSAGES/breakpoints.mo and /dev/null differ
diff --git a/spyplugins/ui/breakpoints/locale/pt_BR/LC_MESSAGES/breakpoints.mo b/spyplugins/ui/breakpoints/locale/pt_BR/LC_MESSAGES/breakpoints.mo
deleted file mode 100644
index 2ad5a3c..0000000
Binary files a/spyplugins/ui/breakpoints/locale/pt_BR/LC_MESSAGES/breakpoints.mo and /dev/null differ
diff --git a/spyplugins/ui/breakpoints/widgets/breakpointsgui.py b/spyplugins/ui/breakpoints/widgets/breakpointsgui.py
deleted file mode 100644
index c233528..0000000
--- a/spyplugins/ui/breakpoints/widgets/breakpointsgui.py
+++ /dev/null
@@ -1,256 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009- The Spyder Development Team
-# based loosley on pylintgui.py by Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""Breakpoint widget"""
-
-# pylint: disable=C0103
-# pylint: disable=R0903
-# pylint: disable=R0911
-# pylint: disable=R0201
-
-from spyderlib.qt.QtGui import (QWidget, QTableView, QItemDelegate,
-                                QVBoxLayout, QMenu)
-from spyderlib.qt.QtCore import (Qt, Signal, QTextCodec, QModelIndex,
-                                 QAbstractTableModel)
-locale_codec = QTextCodec.codecForLocale()
-from spyderlib.qt.compat import to_qvariant
-import sys
-import os.path as osp
-
-# Local imports
-from spyderlib.config.base import get_translation
-from spyderlib.config.main import CONF
-from spyderlib.utils.qthelpers import create_action, add_actions
-
-# This is needed for testing this module as a stand alone script
-try:
-    _ = get_translation("breakpoints", "spyplugins.ui.breakpoints")
-except KeyError as error:
-    import gettext
-    _ = gettext.gettext
-
-
-class BreakpointTableModel(QAbstractTableModel):
-    """
-    Table model for breakpoints dictionary
-    
-    """
-    def __init__(self, parent, data):
-        QAbstractTableModel.__init__(self, parent)
-        if data is None:
-            data = {}
-        self._data = None
-        self.breakpoints = None
-        self.set_data(data)    
-    
-    def set_data(self, data):
-        """Set model data"""
-        self._data = data
-        keys = list(data.keys())
-        self.breakpoints = []
-        for key in keys:
-            bp_list = data[key]
-            if bp_list:
-                for item in data[key]:
-                    self.breakpoints.append((key, item[0], item[1], ""))
-        self.reset()   
-    
-    def rowCount(self, qindex=QModelIndex()):
-        """Array row number"""
-        return len(self.breakpoints)
-    
-    def columnCount(self, qindex=QModelIndex()):
-        """Array column count"""
-        return 4
-
-    def sort(self, column, order=Qt.DescendingOrder):
-        """Overriding sort method"""
-        if column == 0:
-            self.breakpoints.sort(
-                key=lambda breakpoint: breakpoint[1])
-            self.breakpoints.sort(
-                key=lambda breakpoint: osp.basename(breakpoint[0]))
-        elif column == 1:
-            pass
-        elif column == 2:
-            pass
-        elif column == 3:
-            pass
-        self.reset()
-
-    def headerData(self, section, orientation, role=Qt.DisplayRole):
-        """Overriding method headerData"""
-        if role != Qt.DisplayRole:
-            return to_qvariant()
-        i_column = int(section)
-        if orientation == Qt.Horizontal:
-            headers = (_("File"), _("Line"), _("Condition"), "")
-            return to_qvariant( headers[i_column] )
-        else:
-            return to_qvariant()
-    
-    def get_value(self, index):
-        """Return current value"""
-        return self.breakpoints[index.row()][index.column()] 
-    
-    def data(self, index, role=Qt.DisplayRole):
-        """Return data at table index"""
-        if not index.isValid():
-            return to_qvariant()
-        if role == Qt.DisplayRole:
-            if index.column() == 0:
-                value = osp.basename(self.get_value(index))
-                return to_qvariant(value)
-            else:
-                value = self.get_value(index)
-                return to_qvariant(value)
-        elif role == Qt.TextAlignmentRole:
-            return to_qvariant(int(Qt.AlignLeft|Qt.AlignVCenter))
-        elif role == Qt.ToolTipRole:
-            if index.column() == 0:
-                value = self.get_value(index)
-                return to_qvariant(value)
-            else:
-                return to_qvariant()
-
-    def reset(self):
-        self.beginResetModel()
-        self.endResetModel()
-
-    
-class BreakpointDelegate(QItemDelegate):
-    def __init__(self, parent=None):
-        QItemDelegate.__init__(self, parent)
-
-
-class BreakpointTableView(QTableView):
-    edit_goto = Signal(str, int, str)
-    clear_breakpoint = Signal(str, int)
-    clear_all_breakpoints = Signal()
-    set_or_edit_conditional_breakpoint = Signal()
-    
-    def __init__(self, parent, data):
-        QTableView.__init__(self, parent)
-        self.model = BreakpointTableModel(self, data)
-        self.setModel(self.model)
-        self.delegate = BreakpointDelegate(self)
-        self.setItemDelegate(self.delegate)
-
-        self.setup_table()
-        
-    def setup_table(self):
-        """Setup table"""
-        self.horizontalHeader().setStretchLastSection(True)
-        self.adjust_columns()
-        self.columnAt(0)
-        # Sorting columns
-        self.setSortingEnabled(False)
-        self.sortByColumn(0, Qt.DescendingOrder)
-    
-    def adjust_columns(self):
-        """Resize three first columns to contents"""
-        for col in range(3):
-            self.resizeColumnToContents(col)    
-    
-    def mouseDoubleClickEvent(self, event):
-        """Reimplement Qt method"""
-        index_clicked = self.indexAt(event.pos())
-        if self.model.breakpoints:
-            filename = self.model.breakpoints[index_clicked.row()][0]
-            line_number_str = self.model.breakpoints[index_clicked.row()][1]
-            self.edit_goto.emit(filename, int(line_number_str), '')
-        if index_clicked.column()==2:
-            self.set_or_edit_conditional_breakpoint.emit()
-                           
-    def contextMenuEvent(self, event):
-        index_clicked = self.indexAt(event.pos())
-        actions = []
-        self.popup_menu = QMenu(self)
-        clear_all_breakpoints_action = create_action(self, 
-            _("Clear breakpoints in all files"),
-            triggered=lambda: self.clear_all_breakpoints.emit())
-        actions.append(clear_all_breakpoints_action)
-        if self.model.breakpoints:
-            filename = self.model.breakpoints[index_clicked.row()][0]
-            lineno = int(self.model.breakpoints[index_clicked.row()][1])         
-            clear_breakpoint_action = create_action(self,
-                    _("Clear this breakpoint"),
-                    triggered=lambda filename=filename, lineno=lineno: \
-                    self.clear_breakpoint.emit(filename, lineno))
-            actions.insert(0,clear_breakpoint_action)
-
-            edit_breakpoint_action = create_action(self,
-                    _("Edit this breakpoint"),
-                    triggered=lambda filename=filename, lineno=lineno: \
-                    (self.edit_goto.emit(filename, lineno, ''),
-                     self.set_or_edit_conditional_breakpoint.emit())
-                    )
-            actions.append(edit_breakpoint_action)
-        add_actions(self.popup_menu, actions)        
-        self.popup_menu.popup(event.globalPos())
-        event.accept()
-
-
-class BreakpointWidget(QWidget):
-    """
-    Breakpoint widget
-    """
-    VERSION = '1.0.0'
-    clear_all_breakpoints = Signal()
-    set_or_edit_conditional_breakpoint = Signal()
-    clear_breakpoint = Signal(str, int)
-    edit_goto = Signal(str, int, str)
-    
-    def __init__(self, parent):
-        QWidget.__init__(self, parent)
-        
-        self.setWindowTitle("Breakpoints")        
-        self.dictwidget = BreakpointTableView(self, 
-                               self._load_all_breakpoints())
-        layout = QVBoxLayout()
-        layout.addWidget(self.dictwidget)
-        self.setLayout(layout)
-        self.dictwidget.clear_all_breakpoints.connect(
-                                     lambda: self.clear_all_breakpoints.emit())
-        self.dictwidget.clear_breakpoint.connect(
-                         lambda s1, lino: self.clear_breakpoint.emit(s1, lino))
-        self.dictwidget.edit_goto.connect(
-                        lambda s1, lino, s2: self.edit_goto.emit(s1, lino, s2))
-        self.dictwidget.set_or_edit_conditional_breakpoint.connect(
-                        lambda: self.set_or_edit_conditional_breakpoint.emit())
-                     
-    def _load_all_breakpoints(self):
-        bp_dict = CONF.get('run', 'breakpoints', {})
-        for filename in list(bp_dict.keys()):
-            if not osp.isfile(filename):
-                bp_dict.pop(filename)
-        return bp_dict    
-    
-    def get_data(self):
-        pass
-        
-    def set_data(self):
-        bp_dict = self._load_all_breakpoints()
-        self.dictwidget.model.set_data(bp_dict)
-        self.dictwidget.adjust_columns()
-        self.dictwidget.sortByColumn(0, Qt.DescendingOrder)
-
-
-#==============================================================================
-# Tests
-#==============================================================================
-def test():
-    """Run breakpoint widget test"""
-    from spyderlib.utils.qthelpers import qapplication
-    app = qapplication()
-    widget = BreakpointWidget(None)
-    widget.show()
-    sys.exit(app.exec_())
-
-
-if __name__ == '__main__':
-    test()
diff --git a/spyplugins/ui/profiler/__init__.py b/spyplugins/ui/profiler/__init__.py
deleted file mode 100644
index 72d8de8..0000000
--- a/spyplugins/ui/profiler/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- coding: utf-8 -*-
-
-#==============================================================================
-# The following statement is required to register this 3rd party plugin:
-#==============================================================================
-from .profiler import Profiler as PLUGIN_CLASS
diff --git a/spyplugins/ui/profiler/images/profiler.png b/spyplugins/ui/profiler/images/profiler.png
deleted file mode 100644
index 496ab30..0000000
Binary files a/spyplugins/ui/profiler/images/profiler.png and /dev/null differ
diff --git a/spyplugins/ui/profiler/locale/es/LC_MESSAGES/profiler.mo b/spyplugins/ui/profiler/locale/es/LC_MESSAGES/profiler.mo
deleted file mode 100644
index 155f930..0000000
Binary files a/spyplugins/ui/profiler/locale/es/LC_MESSAGES/profiler.mo and /dev/null differ
diff --git a/spyplugins/ui/profiler/locale/fr/LC_MESSAGES/profiler.mo b/spyplugins/ui/profiler/locale/fr/LC_MESSAGES/profiler.mo
deleted file mode 100644
index f36f05d..0000000
Binary files a/spyplugins/ui/profiler/locale/fr/LC_MESSAGES/profiler.mo and /dev/null differ
diff --git a/spyplugins/ui/profiler/locale/pt_BR/LC_MESSAGES/profiler.mo b/spyplugins/ui/profiler/locale/pt_BR/LC_MESSAGES/profiler.mo
deleted file mode 100644
index d32074a..0000000
Binary files a/spyplugins/ui/profiler/locale/pt_BR/LC_MESSAGES/profiler.mo and /dev/null differ
diff --git a/spyplugins/ui/profiler/profiler.py b/spyplugins/ui/profiler/profiler.py
deleted file mode 100644
index ed4f529..0000000
--- a/spyplugins/ui/profiler/profiler.py
+++ /dev/null
@@ -1,147 +0,0 @@
-# -*- coding:utf-8 -*-
-#
-# Copyright © 2009- The Spyder Development Team
-# based on p_pylint.py by Pierre Raybaut
-#
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""Profiler Plugin."""
-
-# Standard library imports
-import os.path as osp
-
-# Third party imports
-from spyderlib.qt.QtCore import Signal, Qt
-from spyderlib.qt.QtGui import QVBoxLayout, QGroupBox, QLabel
-
-# Local imports
-from spyderlib.config.base import get_translation
-from spyderlib.plugins import SpyderPluginMixin, PluginConfigPage, runconfig
-from spyderlib.utils import icon_manager as ima
-from spyderlib.utils.qthelpers import create_action
-from .widgets.profilergui import (ProfilerWidget, is_profiler_installed)
-
-
-_ = get_translation("profiler", "spyplugins.ui.profiler")
-
-
-class ProfilerConfigPage(PluginConfigPage):
-    def setup_page(self):
-        results_group = QGroupBox(_("Results"))
-        results_label1 = QLabel(_("Profiler plugin results "
-                                  "(the output of python's profile/cProfile)\n"
-                                  "are stored here:"))
-        results_label1.setWordWrap(True)
-
-        # Warning: do not try to regroup the following QLabel contents with
-        # widgets above -- this string was isolated here in a single QLabel
-        # on purpose: to fix Issue 863
-        results_label2 = QLabel(ProfilerWidget.DATAPATH)
-
-        results_label2.setTextInteractionFlags(Qt.TextSelectableByMouse)
-        results_label2.setWordWrap(True)
-
-        results_layout = QVBoxLayout()
-        results_layout.addWidget(results_label1)
-        results_layout.addWidget(results_label2)
-        results_group.setLayout(results_layout)
-
-        vlayout = QVBoxLayout()
-        vlayout.addWidget(results_group)
-        vlayout.addStretch(1)
-        self.setLayout(vlayout)
-
-
-class Profiler(ProfilerWidget, SpyderPluginMixin):
-    """Profiler (after python's profile and pstats)"""
-    CONF_SECTION = 'profiler'
-    CONFIGWIDGET_CLASS = ProfilerConfigPage
-    edit_goto = Signal(str, int, str)
-    
-    def __init__(self, parent=None):
-        ProfilerWidget.__init__(self, parent=parent,
-                              max_entries=self.get_option('max_entries', 50))
-        SpyderPluginMixin.__init__(self, parent)
-        
-        # Initialize plugin
-        self.initialize_plugin()
-        
-    #------ SpyderPluginWidget API ---------------------------------------------    
-    def get_plugin_title(self):
-        """Return widget title"""
-        return _("Profiler")
-
-    def get_plugin_icon(self):
-        """Return widget icon"""
-        path = osp.join(self.PLUGIN_PATH, self.IMG_PATH)
-        return ima.icon('profiler', icon_path=path)
-
-    def get_focus_widget(self):
-        """
-        Return the widget to give focus to when
-        this plugin's dockwidget is raised on top-level
-        """
-        return self.datatree
-    
-    def get_plugin_actions(self):
-        """Return a list of actions related to plugin"""
-        return []
-
-    def on_first_registration(self):
-        """Action to be performed on first plugin registration"""
-        self.main.tabify_plugins(self.main.inspector, self)
-        self.dockwidget.hide()
-
-    def register_plugin(self):
-        """Register plugin in Spyder's main window"""
-        self.edit_goto.connect(self.main.editor.load)
-        self.redirect_stdio.connect(self.main.redirect_internalshell_stdio)
-        self.main.add_dockwidget(self)
-
-        profiler_act = create_action(self, _("Profile"),
-                                     icon=self.get_plugin_icon(),
-                                     triggered=self.run_profiler)
-        profiler_act.setEnabled(is_profiler_installed())
-        self.register_shortcut(profiler_act, context="Profiler",
-                               name="Run profiler")
-        
-        self.main.run_menu_actions += [profiler_act]
-        self.main.editor.pythonfile_dependent_actions += [profiler_act]
-
-    def refresh_plugin(self):
-        """Refresh profiler widget"""
-        #self.remove_obsolete_items()  # FIXME: not implemented yet
-        
-    def closing_plugin(self, cancelable=False):
-        """Perform actions before parent main window is closed"""
-        return True
-            
-    def apply_plugin_settings(self, options):
-        """Apply configuration file's plugin settings"""
-        # The history depth option will be applied at 
-        # next Spyder startup, which is soon enough
-        pass
-        
-    #------ Public API ---------------------------------------------------------        
-    def run_profiler(self):
-        """Run profiler"""
-        if self.main.editor.save():
-            self.analyze(self.main.editor.get_current_filename())
-
-    def analyze(self, filename):
-        """Reimplement analyze method"""
-        if self.dockwidget and not self.ismaximized:
-            self.dockwidget.setVisible(True)
-            self.dockwidget.setFocus()
-            self.dockwidget.raise_()
-        pythonpath = self.main.get_spyder_pythonpath()
-        runconf = runconfig.get_run_configuration(filename)
-        wdir, args = None, []
-        if runconf is not None:
-            if runconf.wdir_enabled:
-                wdir = runconf.wdir
-            if runconf.args_enabled:
-                args = runconf.args
-        ProfilerWidget.analyze(self, filename, wdir=wdir, args=args,
-                               pythonpath=pythonpath)
diff --git a/spyplugins/ui/profiler/widgets/__init__.py b/spyplugins/ui/profiler/widgets/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/spyplugins/ui/profiler/widgets/profilergui.py b/spyplugins/ui/profiler/widgets/profilergui.py
deleted file mode 100644
index 1dfcb49..0000000
--- a/spyplugins/ui/profiler/widgets/profilergui.py
+++ /dev/null
@@ -1,689 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009- The Spyder Development Team
-# based on pylintgui.py by Pierre Raybaut
-#
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""
-Profiler widget
-
-See the official documentation on python profiling:
-http://docs.python.org/library/profile.html
-"""
-
-from __future__ import with_statement
-
-from spyderlib.qt.QtGui import (QHBoxLayout, QWidget, QMessageBox, QVBoxLayout,
-                                QLabel, QTreeWidget, QTreeWidgetItem,
-                                QApplication, QColor)
-from spyderlib.qt.QtCore import (Signal, QProcess, QByteArray, Qt, QTextCodec,
-                                 QProcessEnvironment)
-
-import spyderlib.utils.icon_manager as ima
-locale_codec = QTextCodec.codecForLocale()
-from spyderlib.qt.compat import getopenfilename, getsavefilename
-
-import sys
-import os
-import os.path as osp
-import time
-
-# Local imports
-from spyderlib.utils.qthelpers import (create_toolbutton, get_item_user_text,
-                                       set_item_user_text)
-from spyderlib.utils.programs import shell_split
-from spyderlib.config.base import get_conf_path, get_translation
-from spyderlib.widgets.variableexplorer.texteditor import TextEditor
-from spyderlib.widgets.comboboxes import PythonModulesComboBox
-from spyderlib.widgets.externalshell import baseshell
-from spyderlib.py3compat import to_text_string, getcwd
-
-# This is needed for testing this module as a stand alone script
-try:
-    _ = get_translation("profiler", "spyplugins.ui.profiler")
-except KeyError as error:
-    import gettext
-    _ = gettext.gettext
-
-
-def is_profiler_installed():
-    from spyderlib.utils.programs import is_module_installed
-    return is_module_installed('cProfile') and is_module_installed('pstats')
-
-
-class ProfilerWidget(QWidget):
-    """
-    Profiler widget
-    """
-    DATAPATH = get_conf_path('profiler.results')
-    VERSION = '0.0.1'
-    redirect_stdio = Signal(bool)
-    
-    def __init__(self, parent, max_entries=100):
-        QWidget.__init__(self, parent)
-        
-        self.setWindowTitle("Profiler")
-        
-        self.output = None
-        self.error_output = None
-        
-        self._last_wdir = None
-        self._last_args = None
-        self._last_pythonpath = None
-        
-        self.filecombo = PythonModulesComboBox(self)
-        
-        self.start_button = create_toolbutton(self, icon=ima.icon('run'),
-                                    text=_("Profile"),
-                                    tip=_("Run profiler"),
-                                    triggered=lambda : self.start(),
-                                    text_beside_icon=True)
-        self.stop_button = create_toolbutton(self,
-                                             icon=ima.icon('stop'),
-                                             text=_("Stop"),
-                                             tip=_("Stop current profiling"),
-                                             text_beside_icon=True)
-        self.filecombo.valid.connect(self.start_button.setEnabled)
-        #self.connect(self.filecombo, SIGNAL('valid(bool)'), self.show_data)
-        # FIXME: The combobox emits this signal on almost any event
-        #        triggering show_data() too early, too often. 
-
-        browse_button = create_toolbutton(self, icon=ima.icon('fileopen'),
-                                          tip=_('Select Python script'),
-                                          triggered=self.select_file)
-
-        self.datelabel = QLabel()
-
-        self.log_button = create_toolbutton(self, icon=ima.icon('log'),
-                                            text=_("Output"),
-                                            text_beside_icon=True,
-                                            tip=_("Show program's output"),
-                                            triggered=self.show_log)
-
-        self.datatree = ProfilerDataTree(self)
-
-        self.collapse_button = create_toolbutton(self,
-                                                 icon=ima.icon('collapse'),
-                                                 triggered=lambda dD:
-                                                 self.datatree.change_view(-1),
-                                                 tip=_('Collapse one level up'))
-        self.expand_button = create_toolbutton(self,
-                                               icon=ima.icon('expand'),
-                                               triggered=lambda dD:
-                                               self.datatree.change_view(1),
-                                               tip=_('Expand one level down'))
-                                
-        self.save_button = create_toolbutton(self, text_beside_icon=True,
-                                             text=_("Save data"),
-                                             icon=ima.icon('filesave'),
-                                             triggered=self.save_data,
-                                             tip=_('Save profiling data'))
-        self.load_button = create_toolbutton(self, text_beside_icon=True,
-                            text=_("Load data"),
-                            icon=ima.icon('fileimport'),
-                            triggered=self.compare,
-                            tip=_('Load profiling data for comparison'))
-        self.clear_button = create_toolbutton(self, text_beside_icon=True,
-                                              text=_("Clear comparison"),
-                                              icon=ima.icon('editdelete'),
-                                              triggered=self.clear)
-
-        hlayout1 = QHBoxLayout()
-        hlayout1.addWidget(self.filecombo)
-        hlayout1.addWidget(browse_button)
-        hlayout1.addWidget(self.start_button)
-        hlayout1.addWidget(self.stop_button)
-
-        hlayout2 = QHBoxLayout()
-        hlayout2.addWidget(self.collapse_button)
-        hlayout2.addWidget(self.expand_button)
-        hlayout2.addStretch()
-        hlayout2.addWidget(self.datelabel)
-        hlayout2.addStretch()
-        hlayout2.addWidget(self.log_button)
-        hlayout2.addWidget(self.save_button)
-        hlayout2.addWidget(self.load_button)
-        hlayout2.addWidget(self.clear_button)
-        
-        layout = QVBoxLayout()
-        layout.addLayout(hlayout1)
-        layout.addLayout(hlayout2)
-        layout.addWidget(self.datatree)
-        self.setLayout(layout)
-        
-        self.process = None
-        self.set_running_state(False)
-        self.start_button.setEnabled(False)
-        self.clear_button.setEnabled(False)
-
-        if not is_profiler_installed():
-            # This should happen only on certain GNU/Linux distributions 
-            # or when this a home-made Python build because the Python 
-            # profilers are included in the Python standard library
-            for widget in (self.datatree, self.filecombo,
-                           self.start_button, self.stop_button):
-                widget.setDisabled(True)
-            url = 'http://docs.python.org/library/profile.html'
-            text = '%s <a href=%s>%s</a>' % (_('Please install'), url,
-                                             _("the Python profiler modules"))
-            self.datelabel.setText(text)
-        else:
-            pass # self.show_data()
-            
-    def save_data(self):
-        """Save data"""
-        title = _( "Save profiler result")
-        filename, _selfilter = getsavefilename(self, title,
-                                               getcwd(),
-                                               _("Profiler result")+" (*.Result)")
-        if filename:
-            self.datatree.save_data(filename)
-            
-    def compare(self):
-        filename, _selfilter = getopenfilename(self, _("Select script to compare"),
-                                               getcwd(), _("Profiler result")+" (*.Result)")
-        if filename:
-            self.datatree.compare(filename)
-            self.show_data()
-            self.clear_button.setEnabled(True)
-
-    def clear(self):
-        self.datatree.compare(None)
-        self.datatree.hide_diff_cols(True)
-        self.show_data()
-        self.clear_button.setEnabled(False)
-
-    def analyze(self, filename, wdir=None, args=None, pythonpath=None):
-        if not is_profiler_installed():
-            return
-        self.kill_if_running()
-        #index, _data = self.get_data(filename)
-        index = None # FIXME: storing data is not implemented yet
-        if index is None:
-            self.filecombo.addItem(filename)
-            self.filecombo.setCurrentIndex(self.filecombo.count()-1)
-        else:
-            self.filecombo.setCurrentIndex(self.filecombo.findText(filename))
-        self.filecombo.selected()
-        if self.filecombo.is_valid():
-            if wdir is None:
-                wdir = osp.dirname(filename)
-            self.start(wdir, args, pythonpath)
-            
-    def select_file(self):
-        self.redirect_stdio.emit(False)
-        filename, _selfilter = getopenfilename(self, _("Select Python script"),
-                           getcwd(), _("Python scripts")+" (*.py ; *.pyw)")
-        self.redirect_stdio.emit(True)
-        if filename:
-            self.analyze(filename)
-        
-    def show_log(self):
-        if self.output:
-            TextEditor(self.output, title=_("Profiler output"),
-                       readonly=True, size=(700, 500)).exec_()
-    
-    def show_errorlog(self):
-        if self.error_output:
-            TextEditor(self.error_output, title=_("Profiler output"),
-                       readonly=True, size=(700, 500)).exec_()
-
-    def start(self, wdir=None, args=None, pythonpath=None):
-        filename = to_text_string(self.filecombo.currentText())
-        if wdir is None:
-            wdir = self._last_wdir
-            if wdir is None:
-                wdir = osp.basename(filename)
-        if args is None:
-            args = self._last_args
-            if args is None:
-                args = []
-        if pythonpath is None:
-            pythonpath = self._last_pythonpath
-        self._last_wdir = wdir
-        self._last_args = args
-        self._last_pythonpath = pythonpath
-        
-        self.datelabel.setText(_('Profiling, please wait...'))
-        
-        self.process = QProcess(self)
-        self.process.setProcessChannelMode(QProcess.SeparateChannels)
-        self.process.setWorkingDirectory(wdir)
-        self.process.readyReadStandardOutput.connect(self.read_output)
-        self.process.readyReadStandardError.connect(
-                                          lambda: self.read_output(error=True))
-        self.process.finished.connect(lambda ec, es=QProcess.ExitStatus:
-                                      self.finished(ec, es))
-        self.stop_button.clicked.connect(self.process.kill)
-
-        if pythonpath is not None:
-            env = [to_text_string(_pth)
-                   for _pth in self.process.systemEnvironment()]
-            baseshell.add_pathlist_to_PYTHONPATH(env, pythonpath)
-            processEnvironment = QProcessEnvironment()
-            for envItem in env:
-                envName, separator, envValue = envItem.partition('=')
-                processEnvironment.insert(envName, envValue)
-            self.process.setProcessEnvironment(processEnvironment)
-        
-        self.output = ''
-        self.error_output = ''
-        
-        p_args = ['-m', 'cProfile', '-o', self.DATAPATH]
-        if os.name == 'nt':
-            # On Windows, one has to replace backslashes by slashes to avoid 
-            # confusion with escape characters (otherwise, for example, '\t' 
-            # will be interpreted as a tabulation):
-            p_args.append(osp.normpath(filename).replace(os.sep, '/'))
-        else:
-            p_args.append(filename)
-        if args:
-            p_args.extend(shell_split(args))
-        executable = sys.executable
-        if executable.endswith("spyder.exe"):
-            # py2exe distribution
-            executable = "python.exe"
-        self.process.start(executable, p_args)
-        
-        running = self.process.waitForStarted()
-        self.set_running_state(running)
-        if not running:
-            QMessageBox.critical(self, _("Error"),
-                                 _("Process failed to start"))
-    
-    def set_running_state(self, state=True):
-        self.start_button.setEnabled(not state)
-        self.stop_button.setEnabled(state)
-        
-    def read_output(self, error=False):
-        if error:
-            self.process.setReadChannel(QProcess.StandardError)
-        else:
-            self.process.setReadChannel(QProcess.StandardOutput)
-        qba = QByteArray()
-        while self.process.bytesAvailable():
-            if error:
-                qba += self.process.readAllStandardError()
-            else:
-                qba += self.process.readAllStandardOutput()
-        text = to_text_string( locale_codec.toUnicode(qba.data()) )
-        if error:
-            self.error_output += text
-        else:
-            self.output += text
-        
-    def finished(self, exit_code, exit_status):
-        self.set_running_state(False)
-        self.show_errorlog()  # If errors occurred, show them.
-        self.output = self.error_output + self.output
-        # FIXME: figure out if show_data should be called here or
-        #        as a signal from the combobox
-        self.show_data(justanalyzed=True)
-                
-    def kill_if_running(self):
-        if self.process is not None:
-            if self.process.state() == QProcess.Running:
-                self.process.kill()
-                self.process.waitForFinished()
-        
-    def show_data(self, justanalyzed=False):
-        if not justanalyzed:
-            self.output = None
-        self.log_button.setEnabled(self.output is not None \
-                                   and len(self.output) > 0)
-        self.kill_if_running()
-        filename = to_text_string(self.filecombo.currentText())
-        if not filename:
-            return
-
-        self.datelabel.setText(_('Sorting data, please wait...'))
-        QApplication.processEvents()
-        
-        self.datatree.load_data(self.DATAPATH)
-        self.datatree.show_tree()
-            
-        text_style = "<span style=\'color: #444444\'><b>%s </b></span>"
-        date_text = text_style % time.strftime("%d %b %Y %H:%M",
-                                               time.localtime())
-        self.datelabel.setText(date_text)
-
-
-class TreeWidgetItem( QTreeWidgetItem ):
-    def __init__(self, parent=None):
-        QTreeWidgetItem.__init__(self, parent)
-    
-    def __lt__(self, otherItem):
-        column = self.treeWidget().sortColumn()
-        try:
-            return float( self.text(column) ) > float( otherItem.text(column) )
-        except ValueError:
-            return self.text(column) > otherItem.text(column)
-
-
-class ProfilerDataTree(QTreeWidget):
-    """
-    Convenience tree widget (with built-in model) 
-    to store and view profiler data.
-
-    The quantities calculated by the profiler are as follows 
-    (from profile.Profile):
-    [0] = The number of times this function was called, not counting direct
-          or indirect recursion,
-    [1] = Number of times this function appears on the stack, minus one
-    [2] = Total time spent internal to this function
-    [3] = Cumulative time that this function was present on the stack.  In
-          non-recursive functions, this is the total execution time from start
-          to finish of each invocation of a function, including time spent in
-          all subfunctions.
-    [4] = A dictionary indicating for each function name, the number of times
-          it was called by us.
-    """
-    SEP = r"<[=]>"  # separator between filename and linenumber
-    # (must be improbable as a filename to avoid splitting the filename itself)
-    def __init__(self, parent=None):
-        QTreeWidget.__init__(self, parent)
-        self.header_list = [_('Function/Module'), _('Total Time'), _('Diff'),
-                            _('Local Time'), _('Diff'), _('Calls'), _('Diff'),
-                            _('File:line')]
-        self.icon_list = {'module': ima.icon('python'),
-                         'function': ima.icon('function'),
-                         'builtin': ima.icon('python_t'),
-                         'constructor': ima.icon('class')}
-        self.profdata = None   # To be filled by self.load_data()
-        self.stats = None      # To be filled by self.load_data()
-        self.item_depth = None
-        self.item_list = None
-        self.items_to_be_shown = None
-        self.current_view_depth = None
-        self.compare_file = None
-        self.setColumnCount(len(self.header_list))
-        self.setHeaderLabels(self.header_list)
-        self.initialize_view()
-        self.itemActivated.connect(self.item_activated)
-        self.itemExpanded.connect(self.item_expanded)
-
-    def set_item_data(self, item, filename, line_number):
-        """Set tree item user data: filename (string) and line_number (int)"""
-        set_item_user_text(item, '%s%s%d' % (filename, self.SEP, line_number))
-    
-    def get_item_data(self, item):
-        """Get tree item user data: (filename, line_number)"""
-        filename, line_number_str = get_item_user_text(item).split(self.SEP)
-        return filename, int(line_number_str)
-
-    def initialize_view(self):
-        """Clean the tree and view parameters"""
-        self.clear()
-        self.item_depth = 0   # To be use for collapsing/expanding one level
-        self.item_list = []  # To be use for collapsing/expanding one level
-        self.items_to_be_shown = {}
-        self.current_view_depth = 0
-
-    def load_data(self, profdatafile):
-        """Load profiler data saved by profile/cProfile module"""
-        import pstats
-        stats_indi = [pstats.Stats(profdatafile),]
-        self.profdata = stats_indi[0]
-        
-        if self.compare_file is not None:
-            stats_indi.append(pstats.Stats(self.compare_file))
-        map(lambda x: x.calc_callees(), stats_indi)
-        self.profdata.calc_callees()
-        self.stats1 = stats_indi
-        self.stats = stats_indi[0].stats
-        
-    def compare(self,filename):
-        self.hide_diff_cols(False)
-        self.compare_file = filename
-        
-    def hide_diff_cols(self, hide):
-        for i in (2,4,6):
-            self.setColumnHidden(i, hide)
-    
-    def save_data(self, filename):
-        """"""
-        self.stats1[0].dump_stats(filename)
-
-    def find_root(self):
-        """Find a function without a caller"""
-        self.profdata.sort_stats("cumulative")
-        for func in self.profdata.fcn_list:
-            if ('~', 0) != func[0:2] and not func[2].startswith(
-                    '<built-in method exec>'):
-                # This skips the profiler function at the top of the list
-                # it does only occur in Python 3
-                return func
-    
-    def find_callees(self, parent):
-        """Find all functions called by (parent) function."""
-        # FIXME: This implementation is very inneficient, because it
-        #        traverses all the data to find children nodes (callees)
-        return self.profdata.all_callees[parent]
-
-    def show_tree(self):
-        """Populate the tree with profiler data and display it."""
-        self.initialize_view() # Clear before re-populating
-        self.setItemsExpandable(True)
-        self.setSortingEnabled(False)
-        rootkey = self.find_root()  # This root contains profiler overhead
-        if rootkey:
-            self.populate_tree(self, self.find_callees(rootkey))
-            self.resizeColumnToContents(0)
-            self.setSortingEnabled(True)
-            self.sortItems(1, Qt.AscendingOrder) # FIXME: hardcoded index
-            self.change_view(1)
-
-    def function_info(self, functionKey):
-        """Returns processed information about the function's name and file."""
-        node_type = 'function'
-        filename, line_number, function_name = functionKey
-        if function_name == '<module>':
-            modulePath, moduleName = osp.split(filename)
-            node_type = 'module'
-            if moduleName == '__init__.py':
-                modulePath, moduleName = osp.split(modulePath)
-            function_name = '<' + moduleName + '>'
-        if not filename or filename == '~':
-            file_and_line = '(built-in)'
-            node_type = 'builtin'
-        else:
-            if function_name == '__init__':
-                node_type = 'constructor'                
-            file_and_line = '%s : %d' % (filename, line_number)
-        return filename, line_number, function_name, file_and_line, node_type
-        
-    def color_string(self, args):
-        x, format = args
-        diff_str = ""
-        color = "black"
-        if len(x) == 2 and self.compare_file is not None:
-            difference = x[0] - x[1]
-            if difference < 0:
-                diff_str = "".join(['',format[1] % difference])
-                color = "green"
-            elif difference > 0:
-                diff_str = "".join(['+',format[1] % difference])
-                color = "red"
-        return [format[0] % x[0], [diff_str, color]]
-
-
-    def format_output(self,child_key):
-        """ Formats the data"""
-        if True:
-            data = [x.stats.get(child_key,[0,0,0,0,0]) for x in self.stats1]
-            return map(self.color_string,zip(list(zip(*data))[1:4], [["%i"]*2, ["%.3f","%.3f"], ["%.3f","%.3f"]]))
-            
-    def populate_tree(self, parentItem, children_list):
-        """Recursive method to create each item (and associated data) in the tree."""
-        for child_key in children_list:
-            self.item_depth += 1
-            (filename, line_number, function_name, file_and_line, node_type
-             ) = self.function_info(child_key)
-
-            ((total_calls, total_calls_dif), (loc_time, loc_time_dif), (cum_time,
-             cum_time_dif)) = self.format_output(child_key)
-
-            (primcalls, total_calls, loc_time, cum_time, callers
-             ) = self.stats[child_key]
-            child_item = TreeWidgetItem(parentItem)
-            self.item_list.append(child_item)
-            self.set_item_data(child_item, filename, line_number)
-
-            # FIXME: indexes to data should be defined by a dictionary on init
-            child_item.setToolTip(0, 'Function or module name')
-            child_item.setData(0, Qt.DisplayRole, function_name)
-            child_item.setIcon(0, self.icon_list[node_type])
-
-            child_item.setToolTip(1, _('Time in function '\
-                                       '(including sub-functions)'))
-            child_item.setData(1, Qt.DisplayRole, cum_time)
-            child_item.setTextAlignment(1, Qt.AlignRight)
-            
-            child_item.setData(2, Qt.DisplayRole, cum_time_dif[0])
-            child_item.setForeground(2, QColor(cum_time_dif[1]))
-            child_item.setTextAlignment(2, Qt.AlignLeft)
-
-            child_item.setToolTip(3, _('Local time in function '\
-                                      '(not in sub-functions)'))
-
-            child_item.setData(3, Qt.DisplayRole, loc_time)
-            child_item.setTextAlignment(3, Qt.AlignRight)
-            
-            child_item.setData(4, Qt.DisplayRole, loc_time_dif[0])
-            child_item.setForeground(4, QColor(loc_time_dif[1]))
-            child_item.setTextAlignment(4, Qt.AlignLeft)
-
-            child_item.setToolTip(5, _('Total number of calls '\
-                                       '(including recursion)'))
-
-            child_item.setData(5, Qt.DisplayRole, total_calls)
-            child_item.setTextAlignment(5, Qt.AlignRight)
-            
-            child_item.setData(6, Qt.DisplayRole, total_calls_dif[0])
-            child_item.setForeground(6, QColor(total_calls_dif[1]))
-            child_item.setTextAlignment(6, Qt.AlignLeft)
-
-            child_item.setToolTip(7, _('File:line '\
-                                       'where function is defined'))
-            child_item.setData(7, Qt.DisplayRole, file_and_line)
-            #child_item.setExpanded(True)
-            if self.is_recursive(child_item):
-                child_item.setData(7, Qt.DisplayRole, '(%s)' % _('recursion'))
-                child_item.setDisabled(True)
-            else:
-                callees = self.find_callees(child_key)
-                if self.item_depth < 3:
-                    self.populate_tree(child_item, callees)
-                elif callees:
-                    child_item.setChildIndicatorPolicy(child_item.ShowIndicator)
-                    self.items_to_be_shown[id(child_item)] = callees
-            self.item_depth -= 1
-        
-    def item_activated(self, item):
-        filename, line_number = self.get_item_data(item)
-        self.parent().edit_goto.emit(filename, line_number, '')
-            
-    def item_expanded(self, item):
-        if item.childCount() == 0 and id(item) in self.items_to_be_shown:
-            callees = self.items_to_be_shown[id(item)]
-            self.populate_tree(item, callees)
-    
-    def is_recursive(self, child_item):
-        """Returns True is a function is a descendant of itself."""
-        ancestor = child_item.parent()
-        # FIXME: indexes to data should be defined by a dictionary on init
-        while ancestor:
-            if (child_item.data(0, Qt.DisplayRole
-                                ) == ancestor.data(0, Qt.DisplayRole) and
-                child_item.data(4, Qt.DisplayRole
-                                ) == ancestor.data(4, Qt.DisplayRole)):
-                return True
-            else:
-                ancestor = ancestor.parent()
-        return False
-    
-    def get_top_level_items(self):
-        """Iterate over top level items"""
-        return [self.topLevelItem(_i) for _i in range(self.topLevelItemCount())]
-    
-    def get_items(self, maxlevel):
-        """Return all items with a level <= `maxlevel`"""
-        itemlist = []
-        def add_to_itemlist(item, maxlevel, level=1):
-            level += 1
-            for index in range(item.childCount()):
-                citem = item.child(index)
-                itemlist.append(citem)
-                if level <= maxlevel:
-                    add_to_itemlist(citem, maxlevel, level)
-        for tlitem in self.get_top_level_items():
-            itemlist.append(tlitem)
-            if maxlevel > 0:
-                add_to_itemlist(tlitem, maxlevel=maxlevel)
-        return itemlist
-            
-    def change_view(self, change_in_depth):
-        """Change the view depth by expand or collapsing all same-level nodes"""
-        self.current_view_depth += change_in_depth
-        if self.current_view_depth < 0:
-            self.current_view_depth = 0
-        self.collapseAll()
-        if self.current_view_depth > 0:
-            for item in self.get_items(maxlevel=self.current_view_depth-1):
-                item.setExpanded(True)
-    
-
-#==============================================================================
-# Tests
-#==============================================================================
-def primes(n):
-    """
-    Simple test function
-    Taken from http://www.huyng.com/posts/python-performance-analysis/
-    """
-    if n==2:
-        return [2]
-    elif n<2:
-        return []
-    s=list(range(3,n+1,2))
-    mroot = n ** 0.5
-    half=(n+1)//2-1
-    i=0
-    m=3
-    while m <= mroot:
-        if s[i]:
-            j=(m*m-3)//2
-            s[j]=0
-            while j<half:
-                s[j]=0
-                j+=m
-        i=i+1
-        m=2*i+3
-    return [2]+[x for x in s if x]
-
-
-def test():
-    """Run widget test"""
-    import inspect
-    import tempfile
-    from spyderlib.utils.qthelpers import qapplication
-
-    primes_sc = inspect.getsource(primes)
-    fd, script = tempfile.mkstemp(suffix='.py')
-    with os.fdopen(fd, 'w') as f:
-        f.write("# -*- coding: utf-8 -*-" + "\n\n")
-        f.write(primes_sc + "\n\n")
-        f.write("primes(100000)")
-    
-    app = qapplication(test_time=5)
-    widget = ProfilerWidget(None)
-    widget.resize(800, 600)
-    widget.show()
-    widget.analyze(script)
-    sys.exit(app.exec_())
-
-
-if __name__ == '__main__':
-    test()
diff --git a/spyplugins/ui/pylint/__init__.py b/spyplugins/ui/pylint/__init__.py
deleted file mode 100644
index 6e29824..0000000
--- a/spyplugins/ui/pylint/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- coding: utf-8 -*-
-
-#==============================================================================
-# The following statement is required to register this 3rd party plugin:
-#==============================================================================
-from .pylint import Pylint as PLUGIN_CLASS
diff --git a/spyplugins/ui/pylint/images/pylint.png b/spyplugins/ui/pylint/images/pylint.png
deleted file mode 100644
index dec028d..0000000
Binary files a/spyplugins/ui/pylint/images/pylint.png and /dev/null differ
diff --git a/spyplugins/ui/pylint/locale/es/LC_MESSAGES/pylint.mo b/spyplugins/ui/pylint/locale/es/LC_MESSAGES/pylint.mo
deleted file mode 100644
index 483dfd5..0000000
Binary files a/spyplugins/ui/pylint/locale/es/LC_MESSAGES/pylint.mo and /dev/null differ
diff --git a/spyplugins/ui/pylint/locale/fr/LC_MESSAGES/pylint.mo b/spyplugins/ui/pylint/locale/fr/LC_MESSAGES/pylint.mo
deleted file mode 100644
index 8572426..0000000
Binary files a/spyplugins/ui/pylint/locale/fr/LC_MESSAGES/pylint.mo and /dev/null differ
diff --git a/spyplugins/ui/pylint/locale/pt_BR/LC_MESSAGES/pylint.mo b/spyplugins/ui/pylint/locale/pt_BR/LC_MESSAGES/pylint.mo
deleted file mode 100644
index 14f6f1f..0000000
Binary files a/spyplugins/ui/pylint/locale/pt_BR/LC_MESSAGES/pylint.mo and /dev/null differ
diff --git a/spyplugins/ui/pylint/pylint.py b/spyplugins/ui/pylint/pylint.py
deleted file mode 100644
index 36563bc..0000000
--- a/spyplugins/ui/pylint/pylint.py
+++ /dev/null
@@ -1,179 +0,0 @@
-# -*- coding:utf-8 -*-
-#
-# Copyright © 2009-2011 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""Pylint Code Analysis Plugin."""
-
-# pylint: disable=C0103
-# pylint: disable=R0903
-# pylint: disable=R0911
-# pylint: disable=R0201
-
-# Standard library imports
-import os.path as osp
-
-# Third party imports
-from spyderlib.qt.QtCore import Signal, Qt
-from spyderlib.qt.QtGui import QInputDialog, QVBoxLayout, QGroupBox, QLabel
-
-# Local imports
-from spyderlib.config.base import get_translation
-from spyderlib.utils import icon_manager as ima
-from spyderlib.utils.qthelpers import create_action
-from spyderlib.plugins import SpyderPluginMixin, PluginConfigPage
-
-from .widgets.pylintgui import PylintWidget, PYLINT_PATH
-
-
-_ = get_translation("pylint", "spyplugins.ui.pylint")
-
-
-class PylintConfigPage(PluginConfigPage):
-    def setup_page(self):
-        settings_group = QGroupBox(_("Settings"))
-        save_box = self.create_checkbox(_("Save file before analyzing it"),
-                                        'save_before', default=True)
-        
-        hist_group = QGroupBox(_("History"))
-        hist_label1 = QLabel(_("The following option will be applied at next "
-                               "startup."))
-        hist_label1.setWordWrap(True)
-        hist_spin = self.create_spinbox(_("History: "),
-                            _(" results"), 'max_entries', default=50,
-                            min_=10, max_=1000000, step=10)
-
-        results_group = QGroupBox(_("Results"))
-        results_label1 = QLabel(_("Results are stored here:"))
-        results_label1.setWordWrap(True)
-
-        # Warning: do not try to regroup the following QLabel contents with 
-        # widgets above -- this string was isolated here in a single QLabel
-        # on purpose: to fix Issue 863
-        results_label2 = QLabel(PylintWidget.DATAPATH)
-
-        results_label2.setTextInteractionFlags(Qt.TextSelectableByMouse)
-        results_label2.setWordWrap(True)
-
-        settings_layout = QVBoxLayout()
-        settings_layout.addWidget(save_box)
-        settings_group.setLayout(settings_layout)
-
-        hist_layout = QVBoxLayout()
-        hist_layout.addWidget(hist_label1)
-        hist_layout.addWidget(hist_spin)
-        hist_group.setLayout(hist_layout)
-
-        results_layout = QVBoxLayout()
-        results_layout.addWidget(results_label1)
-        results_layout.addWidget(results_label2)
-        results_group.setLayout(results_layout)
-
-        vlayout = QVBoxLayout()
-        vlayout.addWidget(settings_group)
-        vlayout.addWidget(hist_group)
-        vlayout.addWidget(results_group)
-        vlayout.addStretch(1)
-        self.setLayout(vlayout)
-
-
-class Pylint(PylintWidget, SpyderPluginMixin):
-    """Python source code analysis based on pylint"""
-    CONF_SECTION = 'pylint'
-    CONFIGWIDGET_CLASS = PylintConfigPage
-    edit_goto = Signal(str, int, str)
-
-    def __init__(self, parent=None):
-        PylintWidget.__init__(self, parent=parent,
-                              max_entries=self.get_option('max_entries', 50))
-        SpyderPluginMixin.__init__(self, parent)
-        
-        # Initialize plugin
-        self.initialize_plugin()
-        
-    #------ SpyderPluginWidget API --------------------------------------------
-    def get_plugin_title(self):
-        """Return widget title"""
-        return _("Static code analysis")
-
-    def get_plugin_icon(self):
-        """Return widget icon"""
-        path = osp.join(self.PLUGIN_PATH, self.IMG_PATH)
-        return ima.icon('pylint', icon_path=path)
-
-    def get_focus_widget(self):
-        """
-        Return the widget to give focus to when
-        this plugin's dockwidget is raised on top-level
-        """
-        return self.treewidget
-    
-    def get_plugin_actions(self):
-        """Return a list of actions related to plugin"""
-        # Font
-        history_action = create_action(self, _("History..."),
-                                       None, ima.icon('history'),
-                                       _("Set history maximum entries"),
-                                       triggered=self.change_history_depth)
-        self.treewidget.common_actions += (None, history_action)
-        return []
-
-    def on_first_registration(self):
-        """Action to be performed on first plugin registration"""
-        self.main.tabify_plugins(self.main.inspector, self)
-        self.dockwidget.hide()
-
-    def register_plugin(self):
-        """Register plugin in Spyder's main window"""
-        self.edit_goto.connect(self.main.editor.load)
-        self.redirect_stdio.connect(self.main.redirect_internalshell_stdio)
-        self.main.add_dockwidget(self)
-        
-        pylint_act = create_action(self, _("Run static code analysis"),
-                                   triggered=self.run_pylint)
-        pylint_act.setEnabled(PYLINT_PATH is not None)
-        self.register_shortcut(pylint_act, context="Pylint",
-                               name="Run analysis")
-        
-        self.main.source_menu_actions += [None, pylint_act]
-        self.main.editor.pythonfile_dependent_actions += [pylint_act]
-
-    def refresh_plugin(self):
-        """Refresh pylint widget"""
-        self.remove_obsolete_items()
-        
-    def closing_plugin(self, cancelable=False):
-        """Perform actions before parent main window is closed"""
-        return True
-            
-    def apply_plugin_settings(self, options):
-        """Apply configuration file's plugin settings"""
-        # The history depth option will be applied at 
-        # next Spyder startup, which is soon enough
-        pass
-        
-    #------ Public API --------------------------------------------------------
-    def change_history_depth(self):
-        "Change history max entries"""
-        depth, valid = QInputDialog.getInteger(self, _('History'),
-                                       _('Maximum entries'),
-                                       self.get_option('max_entries'),
-                                       10, 10000)
-        if valid:
-            self.set_option('max_entries', depth)
-        
-    def run_pylint(self):
-        """Run pylint code analysis"""
-        if self.get_option('save_before', True)\
-           and not self.main.editor.save():
-            return
-        self.analyze( self.main.editor.get_current_filename() )
-        
-    def analyze(self, filename):
-        """Reimplement analyze method"""
-        if self.dockwidget and not self.ismaximized:
-            self.dockwidget.setVisible(True)
-            self.dockwidget.setFocus()
-            self.dockwidget.raise_()
-        PylintWidget.analyze(self, filename)
diff --git a/spyplugins/ui/pylint/widgets/__init__.py b/spyplugins/ui/pylint/widgets/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/spyplugins/ui/pylint/widgets/pylintgui.py b/spyplugins/ui/pylint/widgets/pylintgui.py
deleted file mode 100644
index 621c6e4..0000000
--- a/spyplugins/ui/pylint/widgets/pylintgui.py
+++ /dev/null
@@ -1,508 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009- The Spyder Development Team
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""Pylint widget"""
-
-# pylint: disable=C0103
-# pylint: disable=R0903
-# pylint: disable=R0911
-# pylint: disable=R0201
-
-from __future__ import with_statement, print_function
-
-from spyderlib.qt.QtGui import (QHBoxLayout, QWidget, QTreeWidgetItem,
-                                QMessageBox, QVBoxLayout, QLabel)
-from spyderlib.qt.QtCore import Signal, QProcess, QByteArray, QTextCodec
-locale_codec = QTextCodec.codecForLocale()
-from spyderlib.qt.compat import getopenfilename
-import spyderlib.utils.icon_manager as ima
-
-import sys
-import os
-import os.path as osp
-import time
-import re
-import subprocess
-
-# Local imports
-from spyderlib import dependencies
-from spyderlib.utils import programs
-from spyderlib.utils.encoding import to_unicode_from_fs
-from spyderlib.utils.qthelpers import create_toolbutton
-from spyderlib.config.base import get_conf_path, get_translation
-from spyderlib.widgets.onecolumntree import OneColumnTree
-from spyderlib.widgets.variableexplorer.texteditor import TextEditor
-from spyderlib.widgets.comboboxes import (PythonModulesComboBox,
-                                          is_module_or_package)
-from spyderlib.py3compat import PY3, to_text_string, getcwd, pickle
-
-# This is needed for testing this module as a stand alone script
-try:
-    _ = get_translation("pylint", "spyplugins.ui.pylint")
-except KeyError as error:
-    import gettext
-    _ = gettext.gettext
-
-
-PYLINT = 'pylint'
-if PY3:
-    if programs.find_program('pylint3'):
-        PYLINT = 'pylint3'
-    elif programs.find_program('python3-pylint'):
-        PYLINT = 'python3-pylint'
-
-PYLINT_PATH = programs.find_program(PYLINT)
-
-
-def get_pylint_version():
-    """Return pylint version"""
-    global PYLINT_PATH
-    if PYLINT_PATH is None:
-        return
-    process = subprocess.Popen([PYLINT, '--version'],
-                               stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-                               cwd=osp.dirname(PYLINT_PATH),
-                               shell=True if os.name == 'nt' else False)
-    lines = to_unicode_from_fs(process.stdout.read()).splitlines()
-    if lines:
-        regex = '({0}*|pylint-script.py) ([0-9\.]*)'.format(PYLINT)
-        match = re.match(regex, lines[0])
-        if match is not None:
-            return match.groups()[1]
-
-
-PYLINT_REQVER = '>=0.25'
-PYLINT_VER = get_pylint_version()
-dependencies.add("pylint", _("Static code analysis"),
-                 required_version=PYLINT_REQVER, installed_version=PYLINT_VER)
-
-
-#TODO: display results on 3 columns instead of 1: msg_id, lineno, message
-class ResultsTree(OneColumnTree):
-    def __init__(self, parent):
-        OneColumnTree.__init__(self, parent)
-        self.filename = None
-        self.results = None
-        self.data = None
-        self.set_title('')
-        
-    def activated(self, item):
-        """Double-click event"""
-        data = self.data.get(id(item))
-        if data is not None:
-            fname, lineno = data
-            self.parent().edit_goto.emit(fname, lineno, '')
-
-    def clicked(self, item):
-        """Click event"""
-        self.activated(item)
-        
-    def clear_results(self):
-        self.clear()
-        self.set_title('')
-        
-    def set_results(self, filename, results):
-        self.filename = filename
-        self.results = results
-        self.refresh()
-        
-    def refresh(self):
-        title = _('Results for ')+self.filename
-        self.set_title(title)
-        self.clear()
-        self.data = {}
-        # Populating tree
-        results = ((_('Convention'),
-                   ima.icon('convention'), self.results['C:']),
-                   (_('Refactor'),
-                   ima.icon('refactor'), self.results['R:']),
-                   (_('Warning'),
-                   ima.icon('warning'), self.results['W:']),
-                   (_('Error'),
-                   ima.icon('error'), self.results['E:']))
-        for title, icon, messages in results:
-            title += ' (%d message%s)' % (len(messages),
-                                          's' if len(messages)>1 else '')
-            title_item = QTreeWidgetItem(self, [title], QTreeWidgetItem.Type)
-            title_item.setIcon(0, icon)
-            if not messages:
-                title_item.setDisabled(True)
-            modules = {}
-            for module, lineno, message, msg_id in messages:
-                basename = osp.splitext(osp.basename(self.filename))[0]
-                if not module.startswith(basename):
-                    # Pylint bug
-                    i_base = module.find(basename)
-                    module = module[i_base:]
-                dirname = osp.dirname(self.filename)
-                if module.startswith('.') or module == basename:
-                    modname = osp.join(dirname, module)
-                else:
-                    modname = osp.join(dirname, *module.split('.'))
-                if osp.isdir(modname):
-                    modname = osp.join(modname, '__init__')
-                for ext in ('.py', '.pyw'):
-                    if osp.isfile(modname+ext):
-                        modname = modname + ext
-                        break
-                if osp.isdir(self.filename):
-                    parent = modules.get(modname)
-                    if parent is None:
-                        item = QTreeWidgetItem(title_item, [module],
-                                               QTreeWidgetItem.Type)
-                        item.setIcon(0, ima.icon('python'))
-                        modules[modname] = item
-                        parent = item
-                else:
-                    parent = title_item
-                if len(msg_id) > 1:
-                    text = "[%s] %d : %s" % (msg_id, lineno, message)
-                else:
-                    text = "%d : %s" % (lineno, message)
-                msg_item = QTreeWidgetItem(parent, [text], QTreeWidgetItem.Type)
-                msg_item.setIcon(0, ima.icon('arrow'))
-                self.data[id(msg_item)] = (modname, lineno)
-
-
-class PylintWidget(QWidget):
-    """
-    Pylint widget
-    """
-    DATAPATH = get_conf_path('pylint.results')
-    VERSION = '1.1.0'
-    redirect_stdio = Signal(bool)
-    
-    def __init__(self, parent, max_entries=100):
-        QWidget.__init__(self, parent)
-        
-        self.setWindowTitle("Pylint")
-        
-        self.output = None
-        self.error_output = None
-        
-        self.max_entries = max_entries
-        self.rdata = []
-        if osp.isfile(self.DATAPATH):
-            try:
-                data = pickle.loads(open(self.DATAPATH, 'rb').read())
-                if data[0] == self.VERSION:
-                    self.rdata = data[1:]
-            except (EOFError, ImportError):
-                pass
-
-        self.filecombo = PythonModulesComboBox(self)
-        if self.rdata:
-            self.remove_obsolete_items()
-            self.filecombo.addItems(self.get_filenames())
-        
-        self.start_button = create_toolbutton(self, icon=ima.icon('run'),
-                                    text=_("Analyze"),
-                                    tip=_("Run analysis"),
-                                    triggered=self.start, text_beside_icon=True)
-        self.stop_button = create_toolbutton(self,
-                                             icon=ima.icon('stop'),
-                                             text=_("Stop"),
-                                             tip=_("Stop current analysis"),
-                                             text_beside_icon=True)
-        self.filecombo.valid.connect(self.start_button.setEnabled)
-        self.filecombo.valid.connect(self.show_data)
-
-        browse_button = create_toolbutton(self, icon=ima.icon('fileopen'),
-                               tip=_('Select Python file'),
-                               triggered=self.select_file)
-
-        self.ratelabel = QLabel()
-        self.datelabel = QLabel()
-        self.log_button = create_toolbutton(self, icon=ima.icon('log'),
-                                    text=_("Output"),
-                                    text_beside_icon=True,
-                                    tip=_("Complete output"),
-                                    triggered=self.show_log)
-        self.treewidget = ResultsTree(self)
-        
-        hlayout1 = QHBoxLayout()
-        hlayout1.addWidget(self.filecombo)
-        hlayout1.addWidget(browse_button)
-        hlayout1.addWidget(self.start_button)
-        hlayout1.addWidget(self.stop_button)
-
-        hlayout2 = QHBoxLayout()
-        hlayout2.addWidget(self.ratelabel)
-        hlayout2.addStretch()
-        hlayout2.addWidget(self.datelabel)
-        hlayout2.addStretch()
-        hlayout2.addWidget(self.log_button)
-        
-        layout = QVBoxLayout()
-        layout.addLayout(hlayout1)
-        layout.addLayout(hlayout2)
-        layout.addWidget(self.treewidget)
-        self.setLayout(layout)
-        
-        self.process = None
-        self.set_running_state(False)
-        
-        if PYLINT_PATH is None:
-            for widget in (self.treewidget, self.filecombo,
-                           self.start_button, self.stop_button):
-                widget.setDisabled(True)
-            if os.name == 'nt' \
-               and programs.is_module_installed("pylint"):
-                # Pylint is installed but pylint script is not in PATH
-                # (AFAIK, could happen only on Windows)
-                text = _('Pylint script was not found. Please add "%s" to PATH.')
-                text = to_text_string(text) % osp.join(sys.prefix, "Scripts")
-            else:
-                text = _('Please install <b>pylint</b>:')
-                url = 'http://www.logilab.fr'
-                text += ' <a href=%s>%s</a>' % (url, url)
-            self.ratelabel.setText(text)
-        else:
-            self.show_data()
-        
-    def analyze(self, filename):
-        if PYLINT_PATH is None:
-            return
-        filename = to_text_string(filename) # filename is a QString instance
-        self.kill_if_running()
-        index, _data = self.get_data(filename)
-        if index is None:
-            self.filecombo.addItem(filename)
-            self.filecombo.setCurrentIndex(self.filecombo.count()-1)
-        else:
-            self.filecombo.setCurrentIndex(self.filecombo.findText(filename))
-        self.filecombo.selected()
-        if self.filecombo.is_valid():
-            self.start()
-            
-    def select_file(self):
-        self.redirect_stdio.emit(False)
-        filename, _selfilter = getopenfilename(self, _("Select Python file"),
-                           getcwd(), _("Python files")+" (*.py ; *.pyw)")
-        self.redirect_stdio.emit(True)
-        if filename:
-            self.analyze(filename)
-            
-    def remove_obsolete_items(self):
-        """Removing obsolete items"""
-        self.rdata = [(filename, data) for filename, data in self.rdata
-                      if is_module_or_package(filename)]
-        
-    def get_filenames(self):
-        return [filename for filename, _data in self.rdata]
-    
-    def get_data(self, filename):
-        filename = osp.abspath(filename)
-        for index, (fname, data) in enumerate(self.rdata):
-            if fname == filename:
-                return index, data
-        else:
-            return None, None
-            
-    def set_data(self, filename, data):
-        filename = osp.abspath(filename)
-        index, _data = self.get_data(filename)
-        if index is not None:
-            self.rdata.pop(index)
-        self.rdata.insert(0, (filename, data))
-        self.save()
-        
-    def save(self):
-        while len(self.rdata) > self.max_entries:
-            self.rdata.pop(-1)
-        pickle.dump([self.VERSION]+self.rdata, open(self.DATAPATH, 'wb'), 2)
-        
-    def show_log(self):
-        if self.output:
-            TextEditor(self.output, title=_("Pylint output"),
-                       readonly=True, size=(700, 500)).exec_()
-        
-    def start(self):
-        filename = to_text_string(self.filecombo.currentText())
-        
-        self.process = QProcess(self)
-        self.process.setProcessChannelMode(QProcess.SeparateChannels)
-        self.process.setWorkingDirectory(osp.dirname(filename))
-        self.process.readyReadStandardOutput.connect(self.read_output)
-        self.process.readyReadStandardError.connect(
-                                          lambda: self.read_output(error=True))
-        self.process.finished.connect(lambda ec, es=QProcess.ExitStatus:
-                                      self.finished(ec, es))
-        self.stop_button.clicked.connect(self.process.kill)
-        
-        self.output = ''
-        self.error_output = ''
-        
-        plver = PYLINT_VER
-        if plver is not None:
-            if plver.split('.')[0] == '0':
-                p_args = ['-i', 'yes']
-            else:
-                # Option '-i' (alias for '--include-ids') was removed in pylint
-                # 1.0
-                p_args = ["--msg-template='{msg_id}:{line:3d},"\
-                          "{column}: {obj}: {msg}"]
-            p_args += [osp.basename(filename)]
-        else:
-            p_args = [osp.basename(filename)]
-        self.process.start(PYLINT_PATH, p_args)
-        
-        running = self.process.waitForStarted()
-        self.set_running_state(running)
-        if not running:
-            QMessageBox.critical(self, _("Error"),
-                                 _("Process failed to start"))
-    
-    def set_running_state(self, state=True):
-        self.start_button.setEnabled(not state)
-        self.stop_button.setEnabled(state)
-        
-    def read_output(self, error=False):
-        if error:
-            self.process.setReadChannel(QProcess.StandardError)
-        else:
-            self.process.setReadChannel(QProcess.StandardOutput)
-        qba = QByteArray()
-        while self.process.bytesAvailable():
-            if error:
-                qba += self.process.readAllStandardError()
-            else:
-                qba += self.process.readAllStandardOutput()
-        text = to_text_string( locale_codec.toUnicode(qba.data()) )
-        if error:
-            self.error_output += text
-        else:
-            self.output += text
-        
-    def finished(self, exit_code, exit_status):
-        self.set_running_state(False)
-        if not self.output:
-            if self.error_output:
-                QMessageBox.critical(self, _("Error"), self.error_output)
-                print("pylint error:\n\n" + self.error_output, file=sys.stderr)
-            return
-        
-        # Convention, Refactor, Warning, Error
-        results = {'C:': [], 'R:': [], 'W:': [], 'E:': []}
-        txt_module = '************* Module '
-        
-        module = '' # Should not be needed - just in case something goes wrong
-        for line in self.output.splitlines():
-            if line.startswith(txt_module):
-                # New module
-                module = line[len(txt_module):]
-                continue
-            # Supporting option include-ids: ('R3873:' instead of 'R:')
-            if not re.match('^[CRWE]+([0-9]{4})?:', line):
-                continue
-            i1 = line.find(':')
-            if i1 == -1:
-                continue
-            msg_id = line[:i1]
-            i2 = line.find(':', i1+1)
-            if i2 == -1:
-                continue
-            line_nb = line[i1+1:i2].strip()
-            if not line_nb:
-                continue
-            line_nb = int(line_nb.split(',')[0])
-            message = line[i2+1:]
-            item = (module, line_nb, message, msg_id)
-            results[line[0]+':'].append(item)
-            
-        # Rate
-        rate = None
-        txt_rate = 'Your code has been rated at '
-        i_rate = self.output.find(txt_rate)
-        if i_rate > 0:
-            i_rate_end = self.output.find('/10', i_rate)
-            if i_rate_end > 0:
-                rate = self.output[i_rate+len(txt_rate):i_rate_end]
-        
-        # Previous run
-        previous = ''
-        if rate is not None:
-            txt_prun = 'previous run: '
-            i_prun = self.output.find(txt_prun, i_rate_end)
-            if i_prun > 0:
-                i_prun_end = self.output.find('/10', i_prun)
-                previous = self.output[i_prun+len(txt_prun):i_prun_end]
-            
-        
-        filename = to_text_string(self.filecombo.currentText())
-        self.set_data(filename, (time.localtime(), rate, previous, results))
-        self.output = self.error_output + self.output
-        self.show_data(justanalyzed=True)
-        
-    def kill_if_running(self):
-        if self.process is not None:
-            if self.process.state() == QProcess.Running:
-                self.process.kill()
-                self.process.waitForFinished()
-        
-    def show_data(self, justanalyzed=False):
-        if not justanalyzed:
-            self.output = None
-        self.log_button.setEnabled(self.output is not None \
-                                   and len(self.output) > 0)
-        self.kill_if_running()
-        filename = to_text_string(self.filecombo.currentText())
-        if not filename:
-            return
-        
-        _index, data = self.get_data(filename)
-        if data is None:
-            text = _('Source code has not been rated yet.')
-            self.treewidget.clear_results()
-            date_text = ''
-        else:
-            datetime, rate, previous_rate, results = data
-            if rate is None:
-                text = _('Analysis did not succeed '
-                         '(see output for more details).')
-                self.treewidget.clear_results()
-                date_text = ''
-            else:
-                text_style = "<span style=\'color: #444444\'><b>%s </b></span>"
-                rate_style = "<span style=\'color: %s\'><b>%s</b></span>"
-                prevrate_style = "<span style=\'color: #666666\'>%s</span>"
-                color = "#FF0000"
-                if float(rate) > 5.:
-                    color = "#22AA22"
-                elif float(rate) > 3.:
-                    color = "#EE5500"
-                text = _('Global evaluation:')
-                text = (text_style % text)+(rate_style % (color,
-                                                          ('%s/10' % rate)))
-                if previous_rate:
-                    text_prun = _('previous run:')
-                    text_prun = ' (%s %s/10)' % (text_prun, previous_rate)
-                    text += prevrate_style % text_prun
-                self.treewidget.set_results(filename, results)
-                date = to_text_string(time.strftime("%d %b %Y %H:%M", datetime),
-                                      encoding='utf8')
-                date_text = text_style % date
-            
-        self.ratelabel.setText(text)
-        self.datelabel.setText(date_text)
-
-
-#==============================================================================
-# Tests
-#==============================================================================
-def test():
-    """Run pylint widget test"""
-    from spyderlib.utils.qthelpers import qapplication
-    app = qapplication(test_time=20)
-    widget = PylintWidget(None)
-    widget.resize(640, 480)
-    widget.show()
-    widget.analyze(__file__)
-    sys.exit(app.exec_())
-
-
-if __name__ == '__main__':
-    test()

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/spyder.git



More information about the debian-science-commits mailing list