diff --git a/src/plugins/coreplugin/coreimpl.cpp b/src/plugins/coreplugin/coreimpl.cpp
index 70eef1a5602fd0effca40d9ad26c6a67309d9825..2c7be1e9cf525f0854c8db9d1a4a2d3a98daa99f 100644
--- a/src/plugins/coreplugin/coreimpl.cpp
+++ b/src/plugins/coreplugin/coreimpl.cpp
@@ -187,16 +187,9 @@ QStatusBar *CoreImpl::statusBar() const
     return m_mainwindow->statusBar();
 }
 
-// adds and removes additional active contexts, this context is appended to the
-// currently active contexts. call updateContext after changing
-void CoreImpl::addAdditionalContext(int context)
+void CoreImpl::updateAdditionalContexts(const QList<int> &remove, const QList<int> &add)
 {
-    m_mainwindow->addAdditionalContext(context);
-}
-
-void CoreImpl::removeAdditionalContext(int context)
-{
-    m_mainwindow->removeAdditionalContext(context);
+    m_mainwindow->updateAdditionalContexts(remove, add);
 }
 
 bool CoreImpl::hasContext(int context) const
@@ -214,11 +207,6 @@ void CoreImpl::removeContextObject(IContext *context)
     m_mainwindow->removeContextObject(context);
 }
 
-void CoreImpl::updateContext()
-{
-    return m_mainwindow->updateContext();
-}
-
 void CoreImpl::openFiles(const QStringList &arguments)
 {
     m_mainwindow->openFiles(arguments);
diff --git a/src/plugins/coreplugin/coreimpl.h b/src/plugins/coreplugin/coreimpl.h
index 3ae7874b537fc7f95c4d38fe3358acdd6436a6e8..749a7962e6f6e5fd73debbdbfc9bc772799617dd 100644
--- a/src/plugins/coreplugin/coreimpl.h
+++ b/src/plugins/coreplugin/coreimpl.h
@@ -81,15 +81,12 @@ public:
     QMainWindow *mainWindow() const;
     QStatusBar *statusBar() const;
 
-    // adds and removes additional active contexts, this context is appended to the
-    // currently active contexts. call updateContext after changing
-    void addAdditionalContext(int context);
-    void removeAdditionalContext(int context);
+    // Adds and removes additional active contexts, these contexts are appended
+    // to the currently active contexts.
+    void updateAdditionalContexts(const QList<int> &remove, const QList<int> &add);
     bool hasContext(int context) const;
-    void addContextObject(IContext *contex);
-    void removeContextObject(IContext *contex);
-
-    void updateContext();
+    void addContextObject(IContext *context);
+    void removeContextObject(IContext *context);
 
     void openFiles(const QStringList &fileNames);
 
diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp
index 2568cb5f3b9b312edcf2b1718070f4d0bb68b979..4f8d40a9ca64ba5e25d51f5bc868cec7fef30b39 100644
--- a/src/plugins/coreplugin/designmode.cpp
+++ b/src/plugins/coreplugin/designmode.cpp
@@ -267,16 +267,10 @@ void DesignMode::updateContext(Core::IMode *newMode, Core::IMode *oldMode)
 {
     if (newMode == this) {
         // Apply active context
-        Core::ICore *core = Core::ICore::instance();
-        foreach (int contextId, d->m_activeContext)
-            core->addAdditionalContext(contextId);
-        core->updateContext();
+        Core::ICore::instance()->updateAdditionalContexts(QList<int>(), d->m_activeContext);
     } else if (oldMode == this) {
         // Remove active context
-        Core::ICore *core = Core::ICore::instance();
-        foreach (int contextId, d->m_activeContext)
-            core->removeAdditionalContext(contextId);
-        core->updateContext();
+        Core::ICore::instance()->updateAdditionalContexts(d->m_activeContext, QList<int>());
     }
 }
 
@@ -285,15 +279,9 @@ void DesignMode::setActiveContext(const QList<int> &context)
     if (d->m_activeContext == context)
         return;
 
-    if (ModeManager::instance()->currentMode() == this) {
-        // Update active context
-        Core::ICore *core = Core::ICore::instance();
-        foreach (int contextId, d->m_activeContext)
-            core->removeAdditionalContext(contextId);
-        foreach (int contextId, context)
-            core->addAdditionalContext(contextId);
-        core->updateContext();
-    }
+    if (ModeManager::instance()->currentMode() == this)
+        Core::ICore::instance()->updateAdditionalContexts(d->m_activeContext, context);
+
     d->m_activeContext = context;
 }
 
diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h
index d82630534c4a5bf7bac3daf293b1503823e3e678..c0ff26c7f4e066ed787e7a2ad9b447b1be49bcce 100644
--- a/src/plugins/coreplugin/icore.h
+++ b/src/plugins/coreplugin/icore.h
@@ -107,17 +107,14 @@ public:
     virtual QMainWindow *mainWindow() const = 0;
     virtual QStatusBar *statusBar() const = 0;
 
-    // adds and removes additional active contexts, this context is appended to the
-    // currently active contexts. call updateContext after changing
     virtual IContext *currentContextObject() const = 0;
-    virtual void addAdditionalContext(int context) = 0;
-    virtual void removeAdditionalContext(int context) = 0;
+    // Adds and removes additional active contexts, these contexts are appended
+    // to the currently active contexts.
+    virtual void updateAdditionalContexts(const QList<int> &remove, const QList<int> &add) = 0;
     virtual bool hasContext(int context) const = 0;
     virtual void addContextObject(IContext *context) = 0;
     virtual void removeContextObject(IContext *context) = 0;
 
-    virtual void updateContext() = 0;
-
     virtual void openFiles(const QStringList &fileNames) = 0;
 
 signals:
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index 9acd4adcbc550f789a9de4e6800648503602b8a4..433c20a2c7c74179809244113e07e5e76612a3aa 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -1171,23 +1171,26 @@ void MainWindow::writeSettings()
     m_navigationWidget->saveSettings(m_settings);
 }
 
-void MainWindow::addAdditionalContext(int context)
+void MainWindow::updateAdditionalContexts(const QList<int> &remove, const QList<int> &add)
 {
-    if (context == 0)
-        return;
+    foreach (const int context, remove) {
+        if (context == 0)
+            continue;
 
-    if (!m_additionalContexts.contains(context))
-        m_additionalContexts.prepend(context);
-}
+        int index = m_additionalContexts.indexOf(context);
+        if (index != -1)
+            m_additionalContexts.removeAt(index);
+    }
 
-void MainWindow::removeAdditionalContext(int context)
-{
-    if (context == 0)
-        return;
+    foreach (const int context, add) {
+        if (context == 0)
+            continue;
 
-    int index = m_additionalContexts.indexOf(context);
-    if (index != -1)
-        m_additionalContexts.removeAt(index);
+        if (!m_additionalContexts.contains(context))
+            m_additionalContexts.prepend(context);
+    }
+
+    updateContext();
 }
 
 bool MainWindow::hasContext(int context) const
diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h
index dcd998b3a031fdddfc91f5ad1e6564f52a1cda69..b872baaeccd4355def64526dae5004fa66feead6 100644
--- a/src/plugins/coreplugin/mainwindow.h
+++ b/src/plugins/coreplugin/mainwindow.h
@@ -114,11 +114,9 @@ public:
     virtual QPrinter *printer() const;
     IContext * currentContextObject() const;
     QStatusBar *statusBar() const;
-    void addAdditionalContext(int context);
-    void removeAdditionalContext(int context);
-    bool hasContext(int context) const;
 
-    void updateContext();
+    void updateAdditionalContexts(const QList<int> &remove, const QList<int> &add);
+    bool hasContext(int context) const;
 
     void setSuppressNavigationWidget(bool suppress);
 
@@ -168,6 +166,8 @@ private slots:
 
 private:
     void updateContextObject(IContext *context);
+    void updateContext();
+
     void registerDefaultContainers();
     void registerDefaultActions();
 
@@ -199,7 +199,7 @@ private:
     Core::StatusBarWidget *m_outputView;
     VersionDialog *m_versionDialog;
 
-    IContext * m_activeContext;
+    IContext *m_activeContext;
 
     QMap<QWidget *, IContext *> m_contextWidgets;
 
diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp
index 6f390f7216e60020ae7b8a105573be0b0cc05d50..84fdc98bcd9d0dd07d85ccaaafb6d9c4e7e8a97a 100644
--- a/src/plugins/coreplugin/modemanager.cpp
+++ b/src/plugins/coreplugin/modemanager.cpp
@@ -271,19 +271,14 @@ void ModeManager::currentTabChanged(int index)
         // FIXME: This hardcoded context update is required for the Debug and Edit modes, since
         // they use the editor widget, which is already a context widget so the main window won't
         // go further up the parent tree to find the mode context.
-        ICore *core = ICore::instance();
-        foreach (const int context, d->m_addedContexts)
-            core->removeAdditionalContext(context);
-
+        ICore::instance()->updateAdditionalContexts(d->m_addedContexts, mode->context());
         d->m_addedContexts = mode->context();
-        foreach (const int context, d->m_addedContexts)
-            core->addAdditionalContext(context);
+
         IMode *oldMode = 0;
         if (d->m_oldCurrent >= 0)
             oldMode = d->m_modes.at(d->m_oldCurrent);
         d->m_oldCurrent = index;
         emit currentModeChanged(mode, oldMode);
-        core->updateContext();
     }
 }
 
diff --git a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp
index 83c83ec53e7805acec0e7cb78f708b817d034fc6..ad6868a85f79951a9e134f0eed31d1254b9a245f 100644
--- a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp
+++ b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp
@@ -80,14 +80,9 @@ QSettings *CorePrototype::settings() const
      return callee()->settings();
 }
 
-void CorePrototype::addAdditionalContext(int context)
+void CorePrototype::updateAdditionalContexts(const QList<int> &remove, const QList<int> &add)
 {
-    callee()->addAdditionalContext(context);
-}
-
-void CorePrototype::removeAdditionalContext(int context)
-{
-    callee()->removeAdditionalContext(context);
+    callee()->updateAdditionalContexts(remove, add);
 }
 
 QString CorePrototype::toString() const
diff --git a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h
index ca4592b3c199f23e428e16dc85b5b25373ae59d6..46acca4cc556b996c62002d97f9d55308d34c1f3 100644
--- a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h
+++ b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h
@@ -66,8 +66,7 @@ public:
     QSettings *settings() const;
 
 public slots:
-    void addAdditionalContext(int context);
-    void removeAdditionalContext(int context);
+    void updateAdditionalContexts(const QList<int> &remove, const QList<int> &add);
     QString toString() const;
 
 private:
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 2dad7377ff63e6a0f6b822bf1806769942439746..6e221d12628ee1127158725684e36c534df74b70 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1229,13 +1229,10 @@ void DebuggerPlugin::handleStateChanged(int state)
 
     const bool startIsContinue = (state == InferiorStopped);
     ICore *core = ICore::instance();
-    if (startIsContinue) {
-        core->addAdditionalContext(m_gdbRunningContext);
-        core->updateContext();
-    } else {
-        core->removeAdditionalContext(m_gdbRunningContext);
-        core->updateContext();
-    }
+    if (startIsContinue)
+        core->updateAdditionalContexts(QList<int>(), QList<int>() << m_gdbRunningContext);
+    else
+        core->updateAdditionalContexts(QList<int>() << m_gdbRunningContext, QList<int>());
 
     const bool started = state == InferiorRunning
         || state == InferiorRunningRequested
diff --git a/src/plugins/debugger/debuggeruiswitcher.cpp b/src/plugins/debugger/debuggeruiswitcher.cpp
index 1857a4473e6c3730725dfe0d03e24cbd4bd703d5..68fe2f7a531bfdeb4286961df635b9135af65890 100644
--- a/src/plugins/debugger/debuggeruiswitcher.cpp
+++ b/src/plugins/debugger/debuggeruiswitcher.cpp
@@ -317,13 +317,7 @@ void DebuggerUISwitcher::changeDebuggerUI(const QString &langName)
         Core::ICore *core = Core::ICore::instance();
         const QList<int> &oldContexts = d->m_contextsForLanguage.value(d->m_activeLanguage);
         const QList<int> &newContexts = d->m_contextsForLanguage.value(langId);
-        foreach(int ctx, oldContexts)
-            core->removeAdditionalContext(ctx);
-
-        foreach(int ctx, newContexts)
-            core->addAdditionalContext(ctx);
-
-        core->updateContext();
+        core->updateAdditionalContexts(oldContexts, newContexts);
 
         d->m_activeLanguage = langId;
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 34c2216138b5391c0c97bea5ed1b44704563c8eb..485eaebf312bbe47986269a755edc2ff4efa9849 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1325,24 +1325,19 @@ void ProjectExplorerPlugin::setCurrent(Project *project, QString filePath, Node
 
     bool projectChanged = false;
     if (d->m_currentProject != project) {
-        int oldContext = -1;
-        int newContext = -1;
-        int oldLanguageID = -1;
-        int newLanguageID = -1;
+        QList<int> oldContext;
+        QList<int> newContext;
+
         if (d->m_currentProject) {
-            oldContext = d->m_currentProject->projectManager()->projectContext();
-            oldLanguageID = d->m_currentProject->projectManager()->projectLanguage();
+            oldContext.append(d->m_currentProject->projectManager()->projectContext());
+            oldContext.append(d->m_currentProject->projectManager()->projectLanguage());
         }
         if (project) {
-            newContext = project->projectManager()->projectContext();
-            newLanguageID = project->projectManager()->projectLanguage();
+            newContext.append(project->projectManager()->projectContext());
+            newContext.append(project->projectManager()->projectLanguage());
         }
 
-        core->removeAdditionalContext(oldContext);
-        core->removeAdditionalContext(oldLanguageID);
-        core->addAdditionalContext(newContext);
-        core->addAdditionalContext(newLanguageID);
-        core->updateContext();
+        core->updateAdditionalContexts(oldContext, newContext);
 
         d->m_currentProject = project;