diff --git a/src/plugins/projectexplorer/targetselector.cpp b/src/plugins/projectexplorer/targetselector.cpp
index 571d1c774181b8bdd7810d56a6bd0a985279e393..2c4ca1421b006cc0976ef516eb7429427925c536 100644
--- a/src/plugins/projectexplorer/targetselector.cpp
+++ b/src/plugins/projectexplorer/targetselector.cpp
@@ -49,6 +49,8 @@ void TargetSelector::insertTarget(int index, const QString &name)
 
     if (m_currentTargetIndex == -1)
         setCurrentIndex(index);
+    else if (m_currentTargetIndex >= index)
+        setCurrentIndex(m_currentTargetIndex + 1);
     update();
 }
 
@@ -66,10 +68,13 @@ void TargetSelector::removeTarget(int index)
     QTC_ASSERT(index >= 0 && index < m_targets.count(), return);
 
     m_targets.removeAt(index);
-    if (m_currentTargetIndex > index)
-        setCurrentIndex(m_currentTargetIndex - 1);
-    if (m_currentTargetIndex == m_targets.count())
-        setCurrentIndex(m_currentTargetIndex - 1);
+
+    if (m_currentTargetIndex >= m_targets.count())
+        setCurrentIndex(m_targets.count() - 1);
+    else if (m_currentTargetIndex >= index)
+        // force a signal since the target pointed to has changed:
+        emit currentChanged(m_currentTargetIndex, m_targets.at(m_currentTargetIndex).currentSubIndex);
+
     update();
 }
 
@@ -86,7 +91,7 @@ void TargetSelector::setCurrentIndex(int index)
     m_currentTargetIndex = index;
 
     update();
-    emit currentIndexChanged(m_currentTargetIndex,
+    emit currentChanged(m_currentTargetIndex,
                              m_currentTargetIndex >= 0 ? m_targets.at(m_currentTargetIndex).currentSubIndex : -1);
 }
 
@@ -110,7 +115,7 @@ void TargetSelector::setCurrentSubIndex(int subindex)
     m_targets[m_currentTargetIndex].currentSubIndex = subindex;
 
     update();
-    emit currentIndexChanged(m_currentTargetIndex,
+    emit currentChanged(m_currentTargetIndex,
                              m_targets.at(m_currentTargetIndex).currentSubIndex);
 }
 
@@ -169,7 +174,7 @@ void TargetSelector::mousePressEvent(QMouseEvent *event)
             m_currentTargetIndex = index;
             //TODO don't emit if nothing changed!
             update();
-            emit currentIndexChanged(m_currentTargetIndex, m_targets.at(m_currentTargetIndex).currentSubIndex);
+            emit currentChanged(m_currentTargetIndex, m_targets.at(m_currentTargetIndex).currentSubIndex);
         } else {
             event->ignore();
         }
diff --git a/src/plugins/projectexplorer/targetselector.h b/src/plugins/projectexplorer/targetselector.h
index 1fa02329514caea2278b8646d697441261dbee73..c1f42d7e8ca77d7628c33ad478ff20f805ab6fe8 100644
--- a/src/plugins/projectexplorer/targetselector.h
+++ b/src/plugins/projectexplorer/targetselector.h
@@ -42,7 +42,9 @@ public slots:
 signals:
     void addButtonClicked();
     void removeButtonClicked();
-    void currentIndexChanged(int targetIndex, int subIndex);
+    // This signal is emited whenever the target pointed to by the indices
+    // has changed.
+    void currentChanged(int targetIndex, int subIndex);
 
 protected:
     void paintEvent(QPaintEvent *event);
diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp
index a07b49ada423e1eb7bff51f965b97d0a01db7383..a634aa6f71603b789beaee30de9d22b3ec710d5c 100644
--- a/src/plugins/projectexplorer/targetsettingspanel.cpp
+++ b/src/plugins/projectexplorer/targetsettingspanel.cpp
@@ -118,7 +118,7 @@ QIcon TargetSettingsPanel::icon() const
 ///
 
 TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) :
-    m_currentIndex(-1),
+    m_currentTarget(0),
     m_project(project),
     m_selector(0),
     m_centralWidget(0)
@@ -171,34 +171,34 @@ void TargetSettingsPanelWidget::setupUi()
     noTargetLayout->addStretch(10);
     m_centralWidget->addWidget(m_noTargetLabel);
 
+    connect(m_selector, SIGNAL(currentChanged(int,int)),
+            this, SLOT(currentTargetChanged(int,int)));
+
     foreach (Target *t, m_project->targets())
         targetAdded(t);
-    m_selector->markActive(m_targets.indexOf(m_project->activeTarget()));
 
-    connect(m_selector, SIGNAL(currentIndexChanged(int,int)),
-            this, SLOT(currentTargetIndexChanged(int,int)));
     connect(m_selector, SIGNAL(addButtonClicked()),
             this, SLOT(addTarget()));
     connect(m_selector, SIGNAL(removeButtonClicked()),
             this, SLOT(removeTarget()));
 
-    if (m_project->targets().count())
-        currentTargetIndexChanged(m_targets.indexOf(m_project->activeTarget()), 0);
+    if (m_project->activeTarget()) {
+        m_selector->markActive(m_targets.indexOf(m_project->activeTarget()));
+        m_selector->setCurrentIndex(m_targets.indexOf(m_project->activeTarget()));
+    }
 }
 
-void TargetSettingsPanelWidget::currentTargetIndexChanged(int targetIndex, int subIndex)
+void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subIndex)
 {
     if (targetIndex < -1 || targetIndex >= m_targets.count())
         return;
     if (subIndex < -1 || subIndex >= 2)
         return;
-    m_selector->setCurrentIndex(targetIndex);
-    m_selector->setCurrentSubIndex(subIndex);
 
     Target *target(m_targets.at(targetIndex));
 
     // Target was not actually changed:
-    if (m_currentIndex == targetIndex) {
+    if (m_currentTarget == target) {
         if (m_panelWidgets[subIndex])
             m_centralWidget->setCurrentWidget(m_panelWidgets[subIndex]);
         else
@@ -206,7 +206,7 @@ void TargetSettingsPanelWidget::currentTargetIndexChanged(int targetIndex, int s
         return;
     }
 
-    m_currentIndex = targetIndex;
+    m_currentTarget = target;
 
     // Target has changed:
     if (targetIndex == -1) { // no more targets!
diff --git a/src/plugins/projectexplorer/targetsettingspanel.h b/src/plugins/projectexplorer/targetsettingspanel.h
index 9b596bbdd2b900ee5f1baa04a50c3b23f449cefa..c50910b68d3e838c43a22e531ef11219a0e4f311 100644
--- a/src/plugins/projectexplorer/targetsettingspanel.h
+++ b/src/plugins/projectexplorer/targetsettingspanel.h
@@ -83,7 +83,7 @@ public:
     void setupUi();
 
 private slots:
-    void currentTargetIndexChanged(int targetIndex, int subIndex);
+    void currentTargetChanged(int targetIndex, int subIndex);
     void addTarget();
     void removeTarget();
     void targetAdded(ProjectExplorer::Target *target);
@@ -91,7 +91,7 @@ private slots:
     void activeTargetChanged(ProjectExplorer::Target *target);
 
 private:
-    int m_currentIndex;
+    Target *m_currentTarget;
     Project *m_project;
     TargetSettingsWidget *m_selector;
     QStackedWidget *m_centralWidget;
diff --git a/src/plugins/projectexplorer/targetsettingswidget.cpp b/src/plugins/projectexplorer/targetsettingswidget.cpp
index 8290e128b457393914bc872a2260caec6f5f31ec..fe4f4216da88097cd55511c64054414540889703 100644
--- a/src/plugins/projectexplorer/targetsettingswidget.cpp
+++ b/src/plugins/projectexplorer/targetsettingswidget.cpp
@@ -19,8 +19,8 @@ TargetSettingsWidget::TargetSettingsWidget(QWidget *parent) :
             this, SIGNAL(addButtonClicked()));
     connect(m_targetSelector, SIGNAL(removeButtonClicked()),
             this, SIGNAL(removeButtonClicked()));
-    connect(m_targetSelector, SIGNAL(currentIndexChanged(int,int)),
-            this, SIGNAL(currentIndexChanged(int,int)));
+    connect(m_targetSelector, SIGNAL(currentChanged(int,int)),
+            this, SIGNAL(currentChanged(int,int)));
     updateTargetSelector();
 }
 
diff --git a/src/plugins/projectexplorer/targetsettingswidget.h b/src/plugins/projectexplorer/targetsettingswidget.h
index bdfefac9221ea5ff003c7b5e6be297635b341b84..2b069de366e62b73ccba8f9b6185deb675725c30 100644
--- a/src/plugins/projectexplorer/targetsettingswidget.h
+++ b/src/plugins/projectexplorer/targetsettingswidget.h
@@ -41,7 +41,7 @@ public slots:
 signals:
     void addButtonClicked();
     void removeButtonClicked();
-    void currentIndexChanged(int targetIndex, int subIndex);
+    void currentChanged(int targetIndex, int subIndex);
 
 protected:
     void changeEvent(QEvent *e);