diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 7f21f251e0f6a0de99784d3cf30c468e1ebc8407..57db6aa0b55bd40baa962aee376c4c7b929e865f 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -35,6 +35,8 @@
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/buildmanager.h>
 
+#include <QtCore/QMetaEnum>
+#include <QtCore/QMetaObject>
 #include <QtCore/QProcess>
 
 using namespace ProjectExplorer;
@@ -59,10 +61,8 @@ IBuildStepFactory *findRestoreFactory(BuildConfiguration *parent, BuildStep::Typ
     return 0;
 }
 
-const char * const BUILD_STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.BuildStepsCount");
-const char * const BUILD_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.BuildStep.");
-const char * const CLEAN_STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.CleanStepsCount");
-const char * const CLEAN_STEPS_PREFIX("ProjectExplorer.BuildConfiguration.CleanStep.");
+const char * const STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.%1StepsCount");
+const char * const STEPS_PREFIX("ProjectExplorer.BuildConfiguration.%1Step.");
 const char * const CLEAR_SYSTEM_ENVIRONMENT_KEY("ProjectExplorer.BuildConfiguration.ClearSystemEnvironment");
 const char * const USER_ENVIRONMENT_CHANGES_KEY("ProjectExplorer.BuildConfiguration.UserEnvironmentChanges");
 
@@ -95,12 +95,15 @@ BuildConfiguration::~BuildConfiguration()
 QVariantMap BuildConfiguration::toMap() const
 {
     QVariantMap map(ProjectConfiguration::toMap());
-    map.insert(QLatin1String(BUILD_STEPS_COUNT_KEY), m_steps[BuildStep::Build].count());
-    for (int i = 0; i < m_steps[BuildStep::Build].count(); ++i)
-        map.insert(QString::fromLatin1(BUILD_STEPS_PREFIX) + QString::number(i), m_steps[BuildStep::Build].at(i)->toMap());
-    map.insert(QLatin1String(CLEAN_STEPS_COUNT_KEY), m_steps[BuildStep::Clean].count());
-    for (int i = 0; i < m_steps[BuildStep::Clean].count(); ++i)
-        map.insert(QString::fromLatin1(CLEAN_STEPS_PREFIX) + QString::number(i), m_steps[BuildStep::Clean].at(i)->toMap());
+    // Save build steps
+    QMetaEnum typeEnum = BuildStep::staticMetaObject.enumerator(BuildStep::staticMetaObject.indexOfEnumerator("Type"));
+    for (int type = 0; type < BuildStep::LastStepType; ++type) {
+        const QString key(typeEnum.key(type));
+        map.insert(QString::fromLatin1(STEPS_COUNT_KEY).arg(key), m_steps[type].count());
+        for (int step = 0; step < m_steps[type].count(); ++step)
+            map.insert(QString::fromLatin1(STEPS_PREFIX).arg(key) + QString::number(step), m_steps[type].at(step)->toMap());
+    }
+
     map.insert(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY), m_clearSystemEnvironment);
     map.insert(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY), EnvironmentItem::toStringList(m_userEnvironmentChanges));
 
@@ -127,48 +130,28 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
     if (!ProjectConfiguration::fromMap(map))
         return false;
 
-    int maxI(map.value(QLatin1String(BUILD_STEPS_COUNT_KEY), 0).toInt());
-    if (maxI < 0)
-        maxI = 0;
-    for (int i = 0; i < maxI; ++i) {
-        QVariantMap bsData(map.value(QString::fromLatin1(BUILD_STEPS_PREFIX) + QString::number(i)).toMap());
-        if (bsData.isEmpty()) {
-            qWarning() << "No buildstep data found (continuing).";
-            continue;
-        }
-        IBuildStepFactory *factory(findRestoreFactory(this, BuildStep::Build, bsData));
-        if (!factory) {
-            qWarning() << "No factory for buildstep found (continuing).";
-            continue;
-        }
-        BuildStep *bs(factory->restore(this, BuildStep::Build, bsData));
-        if (!bs) {
-            qWarning() << "Restoration of buildstep failed (continuing).";
-            continue;
-        }
-        insertStep(BuildStep::Build, m_steps[BuildStep::Build].count(), bs);
-    }
-
-    maxI = map.value(QLatin1String(CLEAN_STEPS_COUNT_KEY), 0).toInt();
-    if (maxI < 0)
-        maxI = 0;
-    for (int i = 0; i < maxI; ++i) {
-        QVariantMap bsData(map.value(QString::fromLatin1(CLEAN_STEPS_PREFIX) + QString::number(i)).toMap());
-        if (bsData.isEmpty()) {
-            qWarning() << "No cleanstep data found for (continuing).";
-            continue;
-        }
-        IBuildStepFactory *factory(findRestoreFactory(this, BuildStep::Clean, bsData));
-        if (!factory) {
-            qWarning() << "No factory for cleanstep found (continuing).";
-            continue;
-        }
-        BuildStep *bs(factory->restore(this, BuildStep::Clean, bsData));
-        if (!bs) {
-            qWarning() << "Restoration of cleanstep failed (continuing).";
-            continue;
+    QMetaEnum typeEnum = BuildStep::staticMetaObject.enumerator(BuildStep::staticMetaObject.indexOfEnumerator("Type"));
+    for (int type = 0; type < BuildStep::LastStepType; ++type) {
+        const QString key(typeEnum.key(type));
+        int maxSteps = map.value(QString::fromLatin1(STEPS_COUNT_KEY).arg(key), 0).toInt();
+        for (int step = 0; step < maxSteps; ++step) {
+            QVariantMap bsData(map.value(QString::fromLatin1(STEPS_PREFIX).arg(key) + QString::number(step)).toMap());
+            if (bsData.isEmpty()) {
+                qWarning() << "No step data found for" << key << step << "(continuing).";
+                continue;
+            }
+            IBuildStepFactory *factory(findRestoreFactory(this, BuildStep::Type(type), bsData));
+            if (!factory) {
+                qWarning() << "No factory for step" << key << step << "found (continuing).";
+                continue;
+            }
+            BuildStep *bs(factory->restore(this, BuildStep::Type(type), bsData));
+            if (!bs) {
+                qWarning() << "Restoration of step" << key << step << "failed (continuing).";
+                continue;
+            }
+            insertStep(BuildStep::Type(type), m_steps[type].count(), bs);
         }
-        insertStep(BuildStep::Clean, m_steps[BuildStep::Clean].count(), bs);
     }
 
     m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool();