diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp
index a05c13e06ead64272185d065a7aa356a1f7d3ff7..4557b38f703acaa2ded1cc89b5a5da99b4844929 100644
--- a/src/plugins/projectexplorer/buildstepspage.cpp
+++ b/src/plugins/projectexplorer/buildstepspage.cpp
@@ -93,6 +93,10 @@ void BuildStepListWidget::init(BuildStepList *bsl)
 
     setupUi();
 
+    connect(bsl, SIGNAL(stepInserted(int)), this, SLOT(addBuildStep(int)));
+    connect(bsl, SIGNAL(stepRemoved(int)), this, SLOT(removeBuildStep(int)));
+    connect(bsl, SIGNAL(stepMoved(int,int)), this, SLOT(stepMoved(int,int)));
+
     foreach (const BuildStepsWidgetStruct &s, m_buildSteps) {
         delete s.widget;
         delete s.detailsWidget;
@@ -142,7 +146,7 @@ void BuildStepListWidget::updateAddBuildStepMenu()
         for (it = map.constBegin(); it != end; ++it) {
             QAction *action = menu->addAction(it.key());
             connect(action, SIGNAL(triggered()),
-                    this, SLOT(addBuildStep()));
+                    this, SLOT(triggerAddBuildStep()));
             m_addBuildStepHash.insert(action, it.value());
         }
     }
@@ -214,52 +218,51 @@ void BuildStepListWidget::addBuildStepWidget(int pos, BuildStep *step)
             m_removeMapper, SLOT(map()));
 }
 
-void BuildStepListWidget::addBuildStep()
+void BuildStepListWidget::triggerAddBuildStep()
 {
     if (QAction *action = qobject_cast<QAction *>(sender())) {
         QPair<QString, IBuildStepFactory *> pair = m_addBuildStepHash.value(action);
         BuildStep *newStep = pair.second->create(m_buildStepList, pair.first);
         int pos = m_buildStepList->count();
         m_buildStepList->insertStep(pos, newStep);
-
-        addBuildStepWidget(pos, newStep);
-        const BuildStepsWidgetStruct s = m_buildSteps.at(pos);
-        s.detailsWidget->setState(Utils::DetailsWidget::Expanded);
     }
+}
+
+void BuildStepListWidget::addBuildStep(int pos)
+{
+    BuildStep *newStep = m_buildStepList->at(pos);
+    addBuildStepWidget(pos, newStep);
+    const BuildStepsWidgetStruct s = m_buildSteps.at(pos);
+    s.detailsWidget->setState(Utils::DetailsWidget::Expanded);
 
     m_noStepsLabel->setVisible(false);
     updateBuildStepButtonsState();
 }
 
-void BuildStepListWidget::stepMoveUp(int pos)
+void BuildStepListWidget::triggerStepMoveUp(int pos)
 {
     m_buildStepList->moveStepUp(pos);
+}
 
-    m_vbox->insertWidget(pos - 1, m_buildSteps.at(pos).detailsWidget);
+void BuildStepListWidget::stepMoved(int from, int to)
+{
+    m_vbox->insertWidget(to, m_buildSteps.at(from).detailsWidget);
 
-    m_buildSteps.swap(pos - 1, pos);
+    Internal::BuildStepsWidgetStruct data = m_buildSteps.at(from);
+    m_buildSteps.removeAt(from);
+    m_buildSteps.insert(to, data);
 
     updateBuildStepButtonsState();
 }
 
-void BuildStepListWidget::stepMoveDown(int pos)
+void BuildStepListWidget::triggerStepMoveDown(int pos)
 {
-    stepMoveUp(pos + 1);
+    triggerStepMoveUp(pos + 1);
 }
 
-void BuildStepListWidget::stepRemove(int pos)
+void BuildStepListWidget::triggerRemoveBuildStep(int pos)
 {
-    if (m_buildStepList->removeStep(pos)) {
-        BuildStepsWidgetStruct s = m_buildSteps.at(pos);
-        delete s.widget;
-        delete s.detailsWidget;
-        m_buildSteps.removeAt(pos);
-
-        updateBuildStepButtonsState();
-
-        bool hasSteps = m_buildStepList->isEmpty();
-        m_noStepsLabel->setVisible(hasSteps);
-    } else {
+    if (!m_buildStepList->removeStep(pos)) {
         QMessageBox::warning(Core::ICore::instance()->mainWindow(),
                              tr("Removing Step failed"),
                              tr("Cannot remove build step while building"),
@@ -267,6 +270,19 @@ void BuildStepListWidget::stepRemove(int pos)
     }
 }
 
+void BuildStepListWidget::removeBuildStep(int pos)
+{
+    BuildStepsWidgetStruct s = m_buildSteps.at(pos);
+    delete s.widget;
+    delete s.detailsWidget;
+    m_buildSteps.removeAt(pos);
+
+    updateBuildStepButtonsState();
+
+    bool hasSteps = m_buildStepList->isEmpty();
+    m_noStepsLabel->setVisible(hasSteps);
+}
+
 void BuildStepListWidget::setupUi()
 {
     if (0 != m_addButton)
@@ -274,13 +290,13 @@ void BuildStepListWidget::setupUi()
 
     m_upMapper = new QSignalMapper(this);
     connect(m_upMapper, SIGNAL(mapped(int)),
-            this, SLOT(stepMoveUp(int)));
+            this, SLOT(triggerStepMoveUp(int)));
     m_downMapper = new QSignalMapper(this);
     connect(m_downMapper, SIGNAL(mapped(int)),
-            this, SLOT(stepMoveDown(int)));
+            this, SLOT(triggerStepMoveDown(int)));
     m_removeMapper = new QSignalMapper(this);
     connect(m_removeMapper, SIGNAL(mapped(int)),
-            this, SLOT(stepRemove(int)));
+            this, SLOT(triggerRemoveBuildStep(int)));
 
     m_vbox = new QVBoxLayout(this);
     m_vbox->setContentsMargins(0, 0, 0, 0);
diff --git a/src/plugins/projectexplorer/buildstepspage.h b/src/plugins/projectexplorer/buildstepspage.h
index 50867fc65bf0ea9dae6c530a5a17c585c19c50a5..8fd621a6cd533eb161f035e528bf836d931c3340 100644
--- a/src/plugins/projectexplorer/buildstepspage.h
+++ b/src/plugins/projectexplorer/buildstepspage.h
@@ -77,11 +77,14 @@ public:
 
 private slots:
     void updateAddBuildStepMenu();
-    void addBuildStep();
+    void triggerAddBuildStep();
+    void addBuildStep(int pos);
     void updateSummary();
-    void stepMoveUp(int pos);
-    void stepMoveDown(int pos);
-    void stepRemove(int pos);
+    void triggerStepMoveUp(int pos);
+    void stepMoved(int from, int to);
+    void triggerStepMoveDown(int pos);
+    void triggerRemoveBuildStep(int pos);
+    void removeBuildStep(int pos);
 
 private:
     void setupUi();