diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 20af0f8f3ee2923ca7ab994a2c23f1cedc94f289..c0e56ac3a8b97d7b3c2295fbe427fd12b015c467 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -971,12 +971,7 @@ Core::IEditor *EditorManager::activateEditor(Core::Internal::EditorView *view, C
     if (!(flags & NoActivate)) {
         setCurrentEditor(editor, (flags & IgnoreNavigationHistory));
         if (!(flags & NoModeSwitch)) {
-            const QString preferredMode = editor->preferredMode();
-            if (preferredMode.isEmpty() || preferredMode == Core::Constants::MODE_EDIT) {
-                ensureEditorManagerVisible();
-            } else {
-                ModeManager::instance()->activateMode(preferredMode);
-            }
+            switchToPreferedMode();
         }
         if (isVisible())
             editor->widget()->setFocus();
@@ -1255,10 +1250,22 @@ QStringList EditorManager::getOpenFileNames() const
                                                               QString(), &m_d->selectedFilter);
 }
 
-void EditorManager::ensureEditorManagerVisible()
+
+/// Empty mode == figure out the correct mode from the editor
+/// forcePrefered = true, switch to the mode even if the editor is visible in another mode
+/// forcePrefered = false, only switch if it is not visible
+void EditorManager::switchToPreferedMode()
 {
-    if (!isVisible())
-        m_d->m_core->modeManager()->activateMode(Constants::MODE_EDIT);
+    QString preferedMode;
+    // Figure out prefered mode for editor
+    if (m_d->m_currentEditor)
+        preferedMode = m_d->m_currentEditor->preferredMode();
+
+    if (preferedMode.isEmpty())
+        preferedMode = Constants::MODE_EDIT;
+
+    if (m_d->m_core->modeManager()->currentMode()->id() != preferedMode)
+        m_d->m_core->modeManager()->activateMode(preferedMode);
 }
 
 IEditor *EditorManager::openEditorWithContents(const QString &editorId,
@@ -1613,7 +1620,6 @@ void EditorManager::goBackInNavigationHistory()
 {
     currentEditorView()->goBackInNavigationHistory();
     updateActions();
-    ensureEditorManagerVisible();
     return;
 }
 
@@ -1621,7 +1627,6 @@ void EditorManager::goForwardInNavigationHistory()
 {
     currentEditorView()->goForwardInNavigationHistory();
     updateActions();
-    ensureEditorManagerVisible();
 }
 
 OpenEditorsWindow *EditorManager::windowPopup() const
@@ -1717,7 +1722,6 @@ bool EditorManager::restoreState(const QByteArray &state)
     m_d->m_splitter->restoreState(splitterstates);
 
     // splitting and stuff results in focus trouble, that's why we set the focus again after restoration
-    ensureEditorManagerVisible();
     if (m_d->m_currentEditor) {
         m_d->m_currentEditor->widget()->setFocus();
     } else if (Core::Internal::SplitterOrView *view = currentSplitterOrView()) {
diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h
index 0dae2ae0b954c59dfdea3e60b09e28b84aa1a481..0de53d38c63f351a3cc9344770d3567b1baa6980 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.h
+++ b/src/plugins/coreplugin/editormanager/editormanager.h
@@ -126,7 +126,7 @@ public:
     QStringList getOpenFileNames() const;
     QString getOpenWithEditorId(const QString &fileName, bool *isExternalEditor = 0) const;
 
-    void ensureEditorManagerVisible();
+    void switchToPreferedMode();
     bool hasEditor(const QString &fileName) const;
     QList<IEditor *> editorsForFileName(const QString &filename) const;
     QList<IEditor *> editorsForFile(IFile *file) const;
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 1595fd231cda234c4d39854f3e1e265ea0f73ad2..90d234560b629d390c7b235d343259d31560eb7d 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -170,10 +170,8 @@ void CppToolsPlugin::switchHeaderSource()
     Core::EditorManager *editorManager = Core::EditorManager::instance();
     Core::IEditor *editor = editorManager->currentEditor();
     QString otherFile = correspondingHeaderOrSource(editor->file()->fileName());
-    if (!otherFile.isEmpty()) {
+    if (!otherFile.isEmpty())
         editorManager->openEditor(otherFile);
-        editorManager->ensureEditorManagerVisible();
-    }
 }
 
 QFileInfo CppToolsPlugin::findFile(const QDir &dir, const QString &name,
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index e549e6d48328a43f0f3e44228d7e031043e0f62f..bf881a97292c97e15ca55f490aafd51a51948d51 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -679,7 +679,6 @@ Core::IEditor *GitPlugin::openSubmitEditor(const QString &fileName, const Commit
     Core::IEditor *editor = m_core->editorManager()->openEditor(fileName, QLatin1String(Constants::GITSUBMITEDITOR_ID));
     if (Git::Constants::debug)
         qDebug() << Q_FUNC_INFO << fileName << editor;
-    m_core->editorManager()->ensureEditorManagerVisible();
     GitSubmitEditor *submitEditor = qobject_cast<GitSubmitEditor*>(editor);
     QTC_ASSERT(submitEditor, return 0);
     // The actions are for some reason enabled by the context switching
diff --git a/src/plugins/locator/filesystemfilter.cpp b/src/plugins/locator/filesystemfilter.cpp
index 6c2d5c8422c689a1e6854ac7dbc3b63096b366a6..6ef07bdbaec0cbc784b6fe685dd74ea340dc0425 100644
--- a/src/plugins/locator/filesystemfilter.cpp
+++ b/src/plugins/locator/filesystemfilter.cpp
@@ -103,7 +103,6 @@ void FileSystemFilter::accept(FilterEntry selection) const
         return;
     }
     m_editorManager->openEditor(selection.internalData.toString());
-    m_editorManager->ensureEditorManagerVisible();
 }
 
 bool FileSystemFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
diff --git a/src/plugins/locator/opendocumentsfilter.cpp b/src/plugins/locator/opendocumentsfilter.cpp
index 4102d8e0d179a1280b796f560b28610527a056ec..535d670e4703a053011e189d255aa7b725c9e098 100644
--- a/src/plugins/locator/opendocumentsfilter.cpp
+++ b/src/plugins/locator/opendocumentsfilter.cpp
@@ -103,5 +103,4 @@ void OpenDocumentsFilter::accept(FilterEntry selection) const
         return;
     }
     m_editorManager->openEditor(selection.internalData.toString());
-    m_editorManager->ensureEditorManagerVisible();
 }
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index 63a8ac4292ca9a28474e242750beca081710f2e6..1b21bece0906d141da2761a31e28f761e253c44b 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -599,8 +599,6 @@ void MercurialPlugin::showCommitWidget(const QList<QPair<QString, QString> > &st
         return;
     }
 
-    core->editorManager()->ensureEditorManagerVisible();
-
     CommitEditor *commitEditor = qobject_cast<CommitEditor *>(editor);
 
     if (!commitEditor) {
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index c338cdd59df6b280733f095f7bf725e12b9758eb..35067f4bda8ac0628e8b1b11902350d80edeb9b3 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -674,7 +674,6 @@ Core::IEditor *PerforcePlugin::openPerforceSubmitEditor(const QString &fileName,
 {
     Core::EditorManager *editorManager = Core::EditorManager::instance();
     Core::IEditor *editor = editorManager->openEditor(fileName, Constants::PERFORCE_SUBMIT_EDITOR_ID);
-    editorManager->ensureEditorManagerVisible();
     PerforceSubmitEditor *submitEditor = static_cast<PerforceSubmitEditor*>(editor);
     submitEditor->restrictToProjectFiles(depotFileNames);
     submitEditor->registerActions(m_undoAction, m_redoAction, m_submitCurrentLogAction, m_diffSelectedFiles);
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index d7a9daab089dca2559e53c5e4f157b6e56a816c8..2388f11320db20d7f1a37b29dac8ad4dca22d44a 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -2116,7 +2116,6 @@ void ProjectExplorerPlugin::openFile()
     QTC_ASSERT(d->m_currentNode, return)
     Core::EditorManager *em = Core::EditorManager::instance();
     em->openEditor(d->m_currentNode->path());
-    em->ensureEditorManagerVisible();
 }
 
 void ProjectExplorerPlugin::showInGraphicalShell()
@@ -2312,7 +2311,6 @@ void ProjectExplorerPlugin::openEditorFromAction(QAction *action, const QString
         }
 
         em->openEditor(fileName, factory->id());
-        em->ensureEditorManagerVisible();
         return;
     }
     if (qVariantCanConvert<Core::IExternalEditor *>(data)) {
diff --git a/src/plugins/projectexplorer/showineditortaskhandler.cpp b/src/plugins/projectexplorer/showineditortaskhandler.cpp
index 8783bcd7c0625ae68ffa6d3829579f253a151f2a..fce46a94c50681c81e397dca0840e173c51d4156 100644
--- a/src/plugins/projectexplorer/showineditortaskhandler.cpp
+++ b/src/plugins/projectexplorer/showineditortaskhandler.cpp
@@ -56,7 +56,6 @@ void ShowInEditorTaskHandler::handle(const ProjectExplorer::Task &task)
 {
     QFileInfo fi(task.file);
     TextEditor::BaseTextEditor::openEditorAt(fi.canonicalFilePath(), task.line);
-    Core::EditorManager::instance()->ensureEditorManagerVisible();
 }
 
 QAction *ShowInEditorTaskHandler::createAction(QObject *parent)
diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp
index f14efdb6e2db9e11df082b05010b3c66fc211692..4c708a2c0ab6e727415e2d1de5f4b4c34d2b479c 100644
--- a/src/plugins/qmldesigner/designmodewidget.cpp
+++ b/src/plugins/qmldesigner/designmodewidget.cpp
@@ -130,7 +130,7 @@ void DocumentWarningWidget::setError(const RewriterView::Error &error)
 void DocumentWarningWidget::goToError()
 {
     m_designModeWidget->textEditor()->gotoLine(m_error.line(), m_error.column());
-    Core::EditorManager::instance()->ensureEditorManagerVisible();
+    Core::ModeManager::instance()->activateMode(Core::Constants::MODE_EDIT);
 }
 
 // ---------- DesignModeWidget
diff --git a/src/plugins/texteditor/linenumberfilter.cpp b/src/plugins/texteditor/linenumberfilter.cpp
index ee73f4af877457b953ef476da6c20f9168ce2c12..961c03c9e44793d64fe2b1db497fcf4c6678decd 100644
--- a/src/plugins/texteditor/linenumberfilter.cpp
+++ b/src/plugins/texteditor/linenumberfilter.cpp
@@ -31,6 +31,8 @@
 #include "itexteditor.h"
 
 #include <coreplugin/editormanager/editormanager.h>
+#include <coreplugin/coreconstants.h>
+#include <coreplugin/modemanager.h>
 
 #include <QtCore/QVariant>
 
@@ -61,10 +63,10 @@ void LineNumberFilter::accept(FilterEntry selection) const
     ITextEditor *editor = currentTextEditor();
     if (editor) {
         Core::EditorManager *editorManager = Core::EditorManager::instance();
-        editorManager->ensureEditorManagerVisible();
         editorManager->addCurrentPositionToNavigationHistory();
         editor->gotoLine(selection.internalData.toInt());
         editor->widget()->setFocus();
+        Core::ModeManager::instance()->activateMode(Core::Constants::MODE_EDIT);
     }
 }
 
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 83f7d7938a87cc4071784fd0beda3847678af887..fc0281c5ba155e781374c8cf3e3d7f7b4c502810 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -36,6 +36,8 @@
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/ifile.h>
 #include <coreplugin/iversioncontrol.h>
+#include <coreplugin/coreconstants.h>
+#include <coreplugin/modemanager.h>
 #include <extensionsystem/pluginmanager.h>
 #include <projectexplorer/editorconfiguration.h>
 #include <projectexplorer/projectexplorer.h>
@@ -634,7 +636,7 @@ void VCSBaseEditor::jumpToChangeFromDiff(QTextCursor cursor)
 
     Core::EditorManager *em = Core::EditorManager::instance();
     Core::IEditor *ed = em->openEditor(fileName);
-    em->ensureEditorManagerVisible();
+    Core::ModeManager::instance()->activateMode(Core::Constants::MODE_EDIT);
     if (TextEditor::ITextEditor *editor = qobject_cast<TextEditor::ITextEditor *>(ed))
         editor->gotoLine(chunkStart + lineCount);
 }