diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 0d1837596e8c41dac8028521ef50cb32059f0189..77112737a5719003f769d6720bab8c99f2c03d07 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1789,37 +1789,62 @@ void ProjectExplorerPlugin::startupProjectChanged()
         d->m_projectsMode->setEnabled(project);
 
     if (previousStartupProject) {
-        disconnect(previousStartupProject->activeTarget(), SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
-                this, SLOT(updateRunActions()));
-
         disconnect(previousStartupProject, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)),
-                   this, SLOT(updateDeployActions()));
-        disconnect(previousStartupProject->activeTarget()->activeRunConfiguration(),
-                   SIGNAL(isEnabledChanged(bool)), this, SLOT(updateRunActions()));
-
-        foreach (Target *t, previousStartupProject->targets())
-            disconnect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
-                       this, SLOT(updateActions()));
+                   this, SLOT(activeTargetChanged()));
     }
 
     previousStartupProject = project;
 
     if (project) {
         connect(project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)),
-                this, SLOT(updateDeployActions()));
+                this, SLOT(activeTargetChanged()));
+    }
 
-        connect(project->activeTarget(), SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
-                this, SLOT(updateRunActions()));
+    activeTargetChanged();
 
-        if (project->activeTarget()->activeRunConfiguration()) {
-            connect(project->activeTarget()->activeRunConfiguration(), SIGNAL(isEnabledChanged(bool)),
-                    this, SLOT(updateRunActions()));
-            foreach (Target *t, project->targets())
-                connect(t, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
-                    this, SLOT(updateActions()));
-        }
+    updateRunActions();
+}
+
+void ProjectExplorerPlugin::activeTargetChanged()
+{
+    static QPointer<Target> previousTarget = 0;
+    Target *target = 0;
+    if (startupProject())
+        target = startupProject()->activeTarget();
+    if (target == previousTarget)
+        return;
+
+    if (previousTarget) {
+        disconnect(previousTarget, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
+                   this, SLOT(activeRunConfigurationChanged()));
+    }
+    previousTarget = target;
+    if (target) {
+        connect(target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
+                this, SLOT(activeRunConfigurationChanged()));
     }
 
+    updateDeployActions();
+    activeRunConfigurationChanged();
+}
+
+void ProjectExplorerPlugin::activeRunConfigurationChanged()
+{
+    static QPointer<RunConfiguration> previousRunConfiguration = 0;
+    RunConfiguration *rc = 0;
+    if (startupProject() && startupProject()->activeTarget())
+        rc = startupProject()->activeTarget()->activeRunConfiguration();
+    if (rc == previousRunConfiguration)
+        return;
+    if (previousRunConfiguration) {
+        disconnect(previousRunConfiguration, SIGNAL(isEnabledChanged(bool)),
+                   this, SLOT(updateRunActions()));
+    }
+    previousRunConfiguration = rc;
+    if (rc) {
+        connect(rc, SIGNAL(isEnabledChanged(bool)),
+                this, SLOT(updateRunActions()));
+    }
     updateRunActions();
 }
 
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 1a76e2cf43421e2793dbb8745d32a84a812dbdf1..292735c9f15fc336cca31f260fcf4ec20c2464e2 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -190,6 +190,9 @@ private slots:
     void runControlFinished();
 
     void startupProjectChanged(); // Calls updateRunAction
+    void activeTargetChanged();
+    void activeRunConfigurationChanged();
+
     void updateDeployActions();
     void updateRunActions();