diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 2029211066ad0197b9ef8331422e9e46efdcdee2..4dbd52206cb54001748954be9cce9ee26116aca2 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -390,12 +390,18 @@ QString Project::generatedUiHeader(const QString & /* formFile */) const
 
 void Project::setProjectContext(Core::Context context)
 {
+    if (d->m_projectContext == context)
+        return;
     d->m_projectContext = context;
+    emit projectContextUpdated();
 }
 
 void Project::setProjectLanguages(Core::Context language)
 {
+    if (d->m_projectLanguages == language)
+        return;
     d->m_projectLanguages = language;
+    emit projectLanguagesUpdated();
 }
 
 Core::Context Project::projectContext() const
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index a8013ad37b8dbce0dc451b3774b7b7caaae8743d..2f8e167bc7d796a1c6a2339d6db65b4269acfc4d 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -142,6 +142,9 @@ signals:
     void settingsLoaded();
     void aboutToSaveSettings();
 
+    void projectContextUpdated();
+    void projectLanguagesUpdated();
+
 protected:
     virtual bool fromMap(const QVariantMap &map);
     virtual bool setupTarget(Target *t);
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 1422a5a32b31fe1f7817fed0d4c8cca36d8f1d6c..c356bdd8b8bac1bbd1bad5afb255404036c99e90 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -211,6 +211,7 @@ struct ProjectExplorerPluginPrivate {
     QString m_sessionToRestoreAtStartup;
 
     Project *m_currentProject;
+    Core::Context m_lastProjectContext;
     Node *m_currentNode;
 
     BuildManager *m_buildManager;
@@ -1757,7 +1758,25 @@ void ProjectExplorerPlugin::updateExternalFileWarning()
     }
     infoBar->addInfo(Core::InfoBarEntry(externalFileId,
                              tr("<b>Warning:</b> This file is outside the project directory."),
-                             Core::InfoBarEntry::GlobalSuppressionEnabled));
+                                        Core::InfoBarEntry::GlobalSuppressionEnabled));
+}
+
+void ProjectExplorerPlugin::updateContext()
+{
+    Core::Context oldContext;
+    oldContext.add(d->m_lastProjectContext);
+
+    Core::Context newContext;
+    if (d->m_currentProject) {
+        newContext.add(d->m_currentProject->projectContext());
+        newContext.add(d->m_currentProject->projectLanguages());
+
+        d->m_lastProjectContext = newContext;
+    } else {
+        d->m_lastProjectContext = Core::Context();
+    }
+
+    Core::ICore::updateAdditionalContexts(oldContext, newContext);
 }
 
 void ProjectExplorerPlugin::setCurrent(Project *project, QString filePath, Node *node)
@@ -1773,24 +1792,22 @@ void ProjectExplorerPlugin::setCurrent(Project *project, QString filePath, Node
 
     bool projectChanged = false;
     if (d->m_currentProject != project) {
-        Core::Context oldContext;
-        Core::Context newContext;
-
         if (d->m_currentProject) {
-            oldContext.add(d->m_currentProject->projectContext());
-            oldContext.add(d->m_currentProject->projectLanguages());
+            disconnect(d->m_currentProject, SIGNAL(projectContextUpdated()),
+                       this, SLOT(updateContext()));
+            disconnect(d->m_currentProject, SIGNAL(projectLanguagesUpdated()),
+                       this, SLOT(updateContext()));
         }
         if (project) {
-            newContext.add(project->projectContext());
-            newContext.add(project->projectLanguages());
+            connect(project, SIGNAL(projectContextUpdated()),
+                    this, SLOT(updateContext()));
+            connect(project, SIGNAL(projectLanguagesUpdated()),
+                    this, SLOT(updateContext()));
         }
-
-        Core::ICore::updateAdditionalContexts(oldContext, newContext);
-
-        d->m_currentProject = project;
-
         projectChanged = true;
     }
+    d->m_currentProject = project;
+    updateContext();
 
     if (!node && Core::EditorManager::currentEditor()) {
         connect(Core::EditorManager::currentEditor(), SIGNAL(changed()),
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 8beb263a16a2483b84ebd175b3352968ea3eed31..f6dd689f49530703cf41a8111789ab264905505d 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -239,6 +239,8 @@ private slots:
     void updateWelcomePage();
     void updateExternalFileWarning();
 
+    void updateContext();
+
 #ifdef WITH_TESTS
     void testAnsiFilterOutputParser_data();
     void testAnsiFilterOutputParser();