diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 029aba3d94edac88b4720d5682a588c15c4a8708..21cf5d2a810f5ca93e41272a4a30ed23a33c7599 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -34,6 +34,7 @@
 #include "cmaketarget.h"
 
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/buildsteplist.h>
 #include <utils/qtcassert.h>
 
 #include <QtGui/QInputDialog>
@@ -61,6 +62,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuild
     m_buildDirectory(source->m_buildDirectory),
     m_msvcVersion(source->m_msvcVersion)
 {
+    Q_ASSERT(parent);
     cloneSteps(source);
 }
 
@@ -217,11 +219,14 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer:
     CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget);
     bc->setDisplayName(buildConfigurationName);
 
-    MakeStep *makeStep = new MakeStep(bc);
-    bc->insertStep(ProjectExplorer::BuildStep::Build, 0, makeStep);
+    ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
 
-    MakeStep *cleanMakeStep = new MakeStep(bc);
-    bc->insertStep(ProjectExplorer::BuildStep::Clean, 0, cleanMakeStep);
+    MakeStep *makeStep = new MakeStep(buildSteps);
+    buildSteps->insertStep(0, makeStep);
+
+    MakeStep *cleanMakeStep = new MakeStep(cleanSteps);
+    cleanSteps->insertStep(0, cleanMakeStep);
     cleanMakeStep->setAdditionalArguments(QStringList() << "clean");
     cleanMakeStep->setClean(true);
 
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 7335905ffb5d0ec6a663270d2dee0c607c12de37..924454fbfa7eafd946c00b211e3fd6ad21dbc57b 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -38,6 +38,7 @@
 
 #include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/buildenvironmentwidget.h>
+#include <projectexplorer/buildsteplist.h>
 #include <cpptools/cppmodelmanagerinterface.h>
 #include <extensionsystem/pluginmanager.h>
 #include <utils/qtcassert.h>
@@ -410,7 +411,7 @@ QString CMakeProject::displayName() const
 
 QString CMakeProject::id() const
 {
-    return QLatin1String("CMakeProjectManager.CMakeProject");
+    return QLatin1String(Constants::CMAKEPROJECT_ID);
 }
 
 Core::IFile *CMakeProject::file() const
@@ -521,7 +522,7 @@ bool CMakeProject::fromMap(const QVariantMap &map)
 
     if (!hasUserFile && hasBuildTarget("all")) {
         MakeStep *makeStep = qobject_cast<MakeStep *>(
-                activeTarget()->activeBuildConfiguration()->steps(ProjectExplorer::BuildStep::Build).at(0));
+                    activeTarget()->activeBuildConfiguration()->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->at(0));
         Q_ASSERT(makeStep);
         makeStep->setBuildTarget("all", true);
     }
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
index 7011db96f0de65638e505aabe05364ba2c777d80..5a92bf4d91618a298b6f998dc1c1ddc87763518e 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
@@ -38,6 +38,10 @@ const char * const CMAKEMIMETYPE  = "text/x-cmake"; // TOOD check that this is c
 const char * const CMAKE_EDITOR_ID = "CMakeProject.CMakeEditor";
 const char * const CMAKE_EDITOR_DISPLAY_NAME = "CMake Editor";
 const char * const C_CMAKEEDITOR = "CMakeProject.Context.CMakeEditor";
+
+// Project
+const char * const CMAKEPROJECT_ID = "CMakeProjectManager.CMakeProject";
+
 } // namespace Constants
 } // namespace CMakeProjectManager
 
diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp
index 96eaf8ead1fddd061e06fa85d07deb2c1adff137..d38772e49bd474c43a01c277def34353f29955e9 100644
--- a/src/plugins/cmakeprojectmanager/cmaketarget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmaketarget.cpp
@@ -34,7 +34,10 @@
 #include "cmakerunconfiguration.h"
 #include "cmakebuildconfiguration.h"
 
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/deployconfiguration.h>
 #include <projectexplorer/customexecutablerunconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
 
 #include <QtGui/QApplication>
 #include <QtGui/QStyle>
@@ -58,7 +61,8 @@ QString displayNameForId(const QString &id) {
 
 CMakeTarget::CMakeTarget(CMakeProject *parent) :
     ProjectExplorer::Target(parent, QLatin1String(DEFAULT_CMAKE_TARGET_ID)),
-    m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this))
+    m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this)),
+    m_deployConfigurationFactory(new ProjectExplorer::DeployConfigurationFactory(this))
 {
     setDisplayName(displayNameForId(id()));
     setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon));
@@ -81,7 +85,12 @@ CMakeBuildConfiguration *CMakeTarget::activeBuildConfiguration() const
 
 CMakeBuildConfigurationFactory *CMakeTarget::buildConfigurationFactory() const
 {
-        return m_buildConfigurationFactory;
+    return m_buildConfigurationFactory;
+}
+
+ProjectExplorer::DeployConfigurationFactory *CMakeTarget::deployConfigurationFactory() const
+{
+    return m_deployConfigurationFactory;
 }
 
 QString CMakeTarget::defaultBuildDirectory() const
@@ -187,16 +196,21 @@ CMakeTarget *CMakeTargetFactory::create(ProjectExplorer::Project *parent, const
     CMakeBuildConfiguration *bc(new CMakeBuildConfiguration(t));
     bc->setDisplayName("all");
 
+    ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
+
     // Now create a standard build configuration
-    bc->insertStep(ProjectExplorer::BuildStep::Build, 0, new MakeStep(bc));
+    buildSteps->insertStep(0, new MakeStep(buildSteps));
 
-    MakeStep *cleanMakeStep = new MakeStep(bc);
-    bc->insertStep(ProjectExplorer::BuildStep::Clean, 0, cleanMakeStep);
+    MakeStep *cleanMakeStep = new MakeStep(cleanSteps);
+    cleanSteps->insertStep(0, cleanMakeStep);
     cleanMakeStep->setAdditionalArguments(QStringList() << "clean");
     cleanMakeStep->setClean(true);
 
     t->addBuildConfiguration(bc);
 
+    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
+
     t->updateRunConfigurations();
 
     return t;
diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.h b/src/plugins/cmakeprojectmanager/cmaketarget.h
index 4812505fd8100e726879d9e59d12a3d55b32d2ee..c4d20f85edb7d11190d7b36a1d60f021ade9ba41 100644
--- a/src/plugins/cmakeprojectmanager/cmaketarget.h
+++ b/src/plugins/cmakeprojectmanager/cmaketarget.h
@@ -58,6 +58,7 @@ public:
     CMakeBuildConfiguration *activeBuildConfiguration() const;
 
     CMakeBuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
 
     QString defaultBuildDirectory() const;
 
@@ -69,6 +70,7 @@ private slots:
 
 private:
     CMakeBuildConfigurationFactory *m_buildConfigurationFactory;
+    ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory;
 };
 
 class CMakeTargetFactory : public ProjectExplorer::ITargetFactory
diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp
index e888a4356b02f6c4d1c0d4a7405bc392c8f97858..a60b62e0da8a331ffa8c4e8e904e21df4a74616b 100644
--- a/src/plugins/cmakeprojectmanager/makestep.cpp
+++ b/src/plugins/cmakeprojectmanager/makestep.cpp
@@ -34,6 +34,7 @@
 #include "cmaketarget.h"
 #include "cmakebuildconfiguration.h"
 
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/gnumakeparser.h>
 
@@ -57,22 +58,22 @@ const char * const ADDITIONAL_ARGUMENTS_KEY("CMakeProjectManager.MakeStep.Additi
 
 // TODO: Move progress information into an IOutputParser!
 
-MakeStep::MakeStep(BuildConfiguration *bc) :
-    AbstractProcessStep(bc, QLatin1String(MS_ID)), m_clean(false),
+MakeStep::MakeStep(BuildStepList *bsl) :
+    AbstractProcessStep(bsl, QLatin1String(MS_ID)), m_clean(false),
     m_futureInterface(0)
 {
     ctor();
 }
 
-MakeStep::MakeStep(BuildConfiguration *bc, const QString &id) :
-    AbstractProcessStep(bc, id), m_clean(false),
+MakeStep::MakeStep(BuildStepList *bsl, const QString &id) :
+    AbstractProcessStep(bsl, id), m_clean(false),
     m_futureInterface(0)
 {
     ctor();
 }
 
-MakeStep::MakeStep(BuildConfiguration *bc, MakeStep *bs) :
-    AbstractProcessStep(bc, bs),
+MakeStep::MakeStep(BuildStepList *bsl, MakeStep *bs) :
+    AbstractProcessStep(bsl, bs),
     m_clean(bs->m_clean),
     m_futureInterface(0),
     m_buildTargets(bs->m_buildTargets),
@@ -317,42 +318,41 @@ MakeStepFactory::~MakeStepFactory()
 {
 }
 
-bool MakeStepFactory::canCreate(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const
+bool MakeStepFactory::canCreate(BuildStepList *parent, const QString &id) const
 {
-    Q_UNUSED(type)
-    if (!qobject_cast<CMakeBuildConfiguration *>(parent))
+    if (parent->target()->project()->id() != QLatin1String(Constants::CMAKEPROJECT_ID))
         return false;
     return QLatin1String(MS_ID) == id;
 }
 
-BuildStep *MakeStepFactory::create(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id)
+BuildStep *MakeStepFactory::create(BuildStepList *parent, const QString &id)
 {
-    if (!canCreate(parent, type, id))
+    if (!canCreate(parent, id))
         return 0;
     return new MakeStep(parent);
 }
 
-bool MakeStepFactory::canClone(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, BuildStep *source) const
+bool MakeStepFactory::canClone(BuildStepList *parent, BuildStep *source) const
 {
-    return canCreate(parent, type, source->id());
+    return canCreate(parent, source->id());
 }
 
-BuildStep *MakeStepFactory::clone(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, BuildStep *source)
+BuildStep *MakeStepFactory::clone(BuildStepList *parent, BuildStep *source)
 {
-    if (!canClone(parent, type, source))
+    if (!canClone(parent, source))
         return 0;
     return new MakeStep(parent, static_cast<MakeStep *>(source));
 }
 
-bool MakeStepFactory::canRestore(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const
+bool MakeStepFactory::canRestore(BuildStepList *parent, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-BuildStep *MakeStepFactory::restore(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map)
+BuildStep *MakeStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
 {
-    if (!canRestore(parent, type, map))
+    if (!canRestore(parent, map))
         return 0;
     MakeStep *bs(new MakeStep(parent));
     if (bs->fromMap(map))
@@ -361,12 +361,11 @@ BuildStep *MakeStepFactory::restore(BuildConfiguration *parent, ProjectExplorer:
     return 0;
 }
 
-QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const
+QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
 {
-    Q_UNUSED(type)
-    if (!qobject_cast<CMakeBuildConfiguration *>(parent))
-        return QStringList();
-    return QStringList() << QLatin1String(MS_ID);
+    if (parent->target()->project()->id() == QLatin1String(Constants::CMAKEPROJECT_ID))
+        return QStringList() << QLatin1String(MS_ID);
+    return QStringList();
 }
 
 QString MakeStepFactory::displayNameForId(const QString &id) const
diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h
index be759bc2e681c669e78912df157eb93a14a3f29e..c0ac7bfe97b21caeb18c050f9e0dab0d8eff6896 100644
--- a/src/plugins/cmakeprojectmanager/makestep.h
+++ b/src/plugins/cmakeprojectmanager/makestep.h
@@ -52,7 +52,7 @@ class MakeStep : public ProjectExplorer::AbstractProcessStep
     // This is for modifying internal data
 
 public:
-    MakeStep(ProjectExplorer::BuildConfiguration *bc);
+    MakeStep(ProjectExplorer::BuildStepList *bsl);
     virtual ~MakeStep();
 
     CMakeBuildConfiguration *cmakeBuildConfiguration() const;
@@ -73,8 +73,8 @@ public:
     QVariantMap toMap() const;
 
 protected:
-    MakeStep(ProjectExplorer::BuildConfiguration *bc, MakeStep *bs);
-    MakeStep(ProjectExplorer::BuildConfiguration *bc, const QString &id);
+    MakeStep(ProjectExplorer::BuildStepList *bsl, MakeStep *bs);
+    MakeStep(ProjectExplorer::BuildStepList *bsl, const QString &id);
 
     bool fromMap(const QVariantMap &map);
 
@@ -119,14 +119,14 @@ public:
     explicit MakeStepFactory(QObject *parent = 0);
     virtual ~MakeStepFactory();
 
-    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const;
-    virtual ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id);
-    virtual bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source) const;
-    virtual ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source);
-    virtual bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const;
-    virtual ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map);
+    virtual bool canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const;
+    virtual ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, const QString &id);
+    virtual bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) const;
+    virtual ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source);
+    virtual bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
+    virtual ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
 
-    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc, ProjectExplorer::BuildStep::Type type) const;
+    virtual QStringList availableCreationIds(ProjectExplorer::BuildStepList *bc) const;
     virtual QString displayNameForId(const QString &id) const;
 };
 
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index ab83eb035470eae11099d39d11529353eb577478..69d3cb5cb8c50eabf5ea978cb759dea7c8964d33 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -33,6 +33,8 @@
 #include "genericproject.h"
 #include "generictarget.h"
 
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/projectexplorerconstants.h>
 #include <utils/qtcassert.h>
 
 #include <QtGui/QInputDialog>
@@ -182,8 +184,10 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Ta
     GenericBuildConfiguration *bc = new GenericBuildConfiguration(target);
     bc->setDisplayName(buildConfigurationName);
 
-    GenericMakeStep *makeStep = new GenericMakeStep(bc);
-    bc->insertStep(ProjectExplorer::BuildStep::Build, 0, makeStep);
+    ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    Q_ASSERT(buildSteps);
+    GenericMakeStep *makeStep = new GenericMakeStep(buildSteps);
+    buildSteps->insertStep(0, makeStep);
     makeStep->setBuildTarget("all", /* on = */ true);
 
     target->addBuildConfiguration(bc); // also makes the name unique...
diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp
index 884b86338b0a4d626fd81fb4177554902bc26359..4432bcaf2e9b7f2ef05ca93a0dd377ad90d165a1 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.cpp
+++ b/src/plugins/genericprojectmanager/genericmakestep.cpp
@@ -35,6 +35,7 @@
 #include "genericbuildconfiguration.h"
 
 #include <extensionsystem/pluginmanager.h>
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/toolchain.h>
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/gnumakeparser.h>
@@ -60,20 +61,20 @@ const char * const MAKE_ARGUMENTS_KEY("GenericProjectManager.GenericMakeStep.Mak
 const char * const MAKE_COMMAND_KEY("GenericProjectManager.GenericMakeStep.MakeCommand");
 }
 
-GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildConfiguration *bc) :
-    AbstractProcessStep(bc, QLatin1String(GENERIC_MS_ID))
+GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildStepList *parent) :
+    AbstractProcessStep(parent, QLatin1String(GENERIC_MS_ID))
 {
     ctor();
 }
 
-GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildConfiguration *bc, const QString &id) :
-    AbstractProcessStep(bc, id)
+GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildStepList *parent, const QString &id) :
+    AbstractProcessStep(parent, id)
 {
     ctor();
 }
 
-GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildConfiguration *bc, GenericMakeStep *bs) :
-    AbstractProcessStep(bc, bs),
+GenericMakeStep::GenericMakeStep(ProjectExplorer::BuildStepList *parent, GenericMakeStep *bs) :
+    AbstractProcessStep(parent, bs),
     m_buildTargets(bs->m_buildTargets),
     m_makeArguments(bs->m_makeArguments),
     m_makeCommand(bs->m_makeCommand)
@@ -307,57 +308,50 @@ GenericMakeStepFactory::~GenericMakeStepFactory()
 {
 }
 
-bool GenericMakeStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent,
-                                       ProjectExplorer::BuildStep::Type type,
+bool GenericMakeStepFactory::canCreate(ProjectExplorer::BuildStepList *parent,
                                        const QString &id) const
 {
-    Q_UNUSED(type)
-    if (!qobject_cast<GenericBuildConfiguration *>(parent))
+    if (parent->target()->project()->id() != QLatin1String(Constants::GENERICPROJECT_ID))
         return false;
     return id == QLatin1String(GENERIC_MS_ID);
 }
 
-ProjectExplorer::BuildStep *GenericMakeStepFactory::create(ProjectExplorer::BuildConfiguration *parent,
-                                                           ProjectExplorer::BuildStep::Type type,
+ProjectExplorer::BuildStep *GenericMakeStepFactory::create(ProjectExplorer::BuildStepList *parent,
                                                            const QString &id)
 {
-    if (!canCreate(parent, type, id))
+    if (!canCreate(parent, id))
         return 0;
     return new GenericMakeStep(parent);
 }
 
-bool GenericMakeStepFactory::canClone(ProjectExplorer::BuildConfiguration *parent,
-                                      ProjectExplorer::BuildStep::Type type,
+bool GenericMakeStepFactory::canClone(ProjectExplorer::BuildStepList *parent,
                                       ProjectExplorer::BuildStep *source) const
 {
     const QString id(source->id());
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-ProjectExplorer::BuildStep *GenericMakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent,
-                                                          ProjectExplorer::BuildStep::Type type,
+ProjectExplorer::BuildStep *GenericMakeStepFactory::clone(ProjectExplorer::BuildStepList *parent,
                                                           ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, type, source))
+    if (!canClone(parent, source))
         return 0;
     GenericMakeStep *old(qobject_cast<GenericMakeStep *>(source));
     Q_ASSERT(old);
     return new GenericMakeStep(parent, old);
 }
 
-bool GenericMakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent,
-                                        ProjectExplorer::BuildStep::Type type,
+bool GenericMakeStepFactory::canRestore(ProjectExplorer::BuildStepList *parent,
                                         const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-ProjectExplorer::BuildStep *GenericMakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent,
-                                                            ProjectExplorer::BuildStep::Type type,
+ProjectExplorer::BuildStep *GenericMakeStepFactory::restore(ProjectExplorer::BuildStepList *parent,
                                                             const QVariantMap &map)
 {
-    if (!canRestore(parent, type, map))
+    if (!canRestore(parent, map))
         return 0;
     GenericMakeStep *bs(new GenericMakeStep(parent));
     if (bs->fromMap(map))
@@ -366,11 +360,9 @@ ProjectExplorer::BuildStep *GenericMakeStepFactory::restore(ProjectExplorer::Bui
     return 0;
 }
 
-QStringList GenericMakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent,
-                                                         ProjectExplorer::BuildStep::Type type) const
+QStringList GenericMakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
 {
-    Q_UNUSED(type)
-    if (!qobject_cast<GenericBuildConfiguration *>(parent))
+    if (parent->target()->project()->id() != QLatin1String(Constants::GENERICPROJECT_ID))
         return QStringList();
     return QStringList() << QLatin1String(GENERIC_MS_ID);
 }
diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h
index 28e9e20d15f6a61cd0b0e02f50cf78924316940a..1326e5300554b2712c0f6a016dd4e0749970bc33 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.h
+++ b/src/plugins/genericprojectmanager/genericmakestep.h
@@ -54,7 +54,7 @@ class GenericMakeStep : public ProjectExplorer::AbstractProcessStep
     friend class GenericMakeStepFactory;
 
 public:
-    GenericMakeStep(ProjectExplorer::BuildConfiguration *bc);
+    GenericMakeStep(ProjectExplorer::BuildStepList *parent);
     virtual ~GenericMakeStep();
 
     GenericBuildConfiguration *genericBuildConfiguration() const;
@@ -73,8 +73,8 @@ public:
     QVariantMap toMap() const;
 
 protected:
-    GenericMakeStep(ProjectExplorer::BuildConfiguration *bc, GenericMakeStep *bs);
-    GenericMakeStep(ProjectExplorer::BuildConfiguration *bc, const QString &id);
+    GenericMakeStep(ProjectExplorer::BuildStepList *parent, GenericMakeStep *bs);
+    GenericMakeStep(ProjectExplorer::BuildStepList *parent, const QString &id);
     virtual bool fromMap(const QVariantMap &map);
 
 private:
@@ -113,27 +113,20 @@ public:
     explicit GenericMakeStepFactory(QObject *parent = 0);
     virtual ~GenericMakeStepFactory();
 
-    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent,
-                           ProjectExplorer::BuildStep::Type type,
+    virtual bool canCreate(ProjectExplorer::BuildStepList *parent,
                            const QString &id) const;
-    virtual ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent,
-                                               ProjectExplorer::BuildStep::Type type,
+    virtual ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent,
                                                const QString &id);
-    virtual bool canClone(ProjectExplorer::BuildConfiguration *parent,
-                          ProjectExplorer::BuildStep::Type type,
+    virtual bool canClone(ProjectExplorer::BuildStepList *parent,
                           ProjectExplorer::BuildStep *source) const;
-    virtual ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent,
-                                              ProjectExplorer::BuildStep::Type type,
+    virtual ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent,
                                               ProjectExplorer::BuildStep *source);
-    virtual bool canRestore(ProjectExplorer::BuildConfiguration *parent,
-                            ProjectExplorer::BuildStep::Type type,
+    virtual bool canRestore(ProjectExplorer::BuildStepList *parent,
                             const QVariantMap &map) const;
-    virtual ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent,
-                                                ProjectExplorer::BuildStep::Type type,
+    virtual ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent,
                                                 const QVariantMap &map);
 
-    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc,
-                                             ProjectExplorer::BuildStep::Type type) const;
+    virtual QStringList availableCreationIds(ProjectExplorer::BuildStepList *bc) const;
     virtual QString displayNameForId(const QString &id) const;
 };
 
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index ef224384f7d18b9b94596054bd522fa32375e7c6..833324cd7c146666f96f4a0c9a7c5f44700afd93 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -375,7 +375,7 @@ QString GenericProject::displayName() const
 
 QString GenericProject::id() const
 {
-    return QLatin1String("GenericProjectManager.GenericProject");
+    return QLatin1String(Constants::GENERICPROJECT_ID);
 }
 
 Core::IFile *GenericProject::file() const
diff --git a/src/plugins/genericprojectmanager/genericprojectconstants.h b/src/plugins/genericprojectmanager/genericprojectconstants.h
index 248fb2ab3ffd04e80e6c3b4db8f9eaf6c043aa05..53201610e7b28eb503289b89ad55a5f876ae4b70 100644
--- a/src/plugins/genericprojectmanager/genericprojectconstants.h
+++ b/src/plugins/genericprojectmanager/genericprojectconstants.h
@@ -54,6 +54,9 @@ const char *const INCLUDES_MIMETYPE  = "application/vnd.nokia.qt.generic.include
 const char *const CONFIG_EDITOR      = ".config Editor";
 const char *const CONFIG_MIMETYPE    = "application/vnd.nokia.qt.generic.config";
 
+// Project
+const char *const GENERICPROJECT_ID  = "GenericProjectManager.GenericProject";
+
 } // namespace Constants
 } // namespace GenericProjectManager
 
diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp
index c6d373db0277220b1190f60bc35e5a82086f54cb..7afede186e70598ec1eb79433303cd99c44d0e22 100644
--- a/src/plugins/genericprojectmanager/generictarget.cpp
+++ b/src/plugins/genericprojectmanager/generictarget.cpp
@@ -33,7 +33,10 @@
 #include "genericproject.h"
 #include "genericmakestep.h"
 
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/customexecutablerunconfiguration.h>
+#include <projectexplorer/deployconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
 
 #include <QtGui/QApplication>
 #include <QtGui/QStyle>
@@ -51,7 +54,8 @@ using namespace GenericProjectManager::Internal;
 
 GenericTarget::GenericTarget(GenericProject *parent) :
     ProjectExplorer::Target(parent, QLatin1String(GENERIC_DESKTOP_TARGET_ID)),
-    m_buildConfigurationFactory(new GenericBuildConfigurationFactory(this))
+    m_buildConfigurationFactory(new GenericBuildConfigurationFactory(this)),
+    m_deployConfigurationFactory(new ProjectExplorer::DeployConfigurationFactory(this))
 {
     setDisplayName(QApplication::translate("GenericProjectManager::GenericTarget",
                                            GENERIC_DESKTOP_TARGET_DISPLAY_NAME,
@@ -73,6 +77,11 @@ GenericBuildConfigurationFactory *GenericTarget::buildConfigurationFactory() con
     return m_buildConfigurationFactory;
 }
 
+ProjectExplorer::DeployConfigurationFactory *GenericTarget::deployConfigurationFactory() const
+{
+    return m_deployConfigurationFactory;
+}
+
 GenericBuildConfiguration *GenericTarget::activeBuildConfiguration() const
 {
     return static_cast<GenericBuildConfiguration *>(Target::activeBuildConfiguration());
@@ -136,8 +145,9 @@ GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, co
     GenericBuildConfiguration *bc = new GenericBuildConfiguration(t);
     bc->setDisplayName("all");
 
-    GenericMakeStep *makeStep = new GenericMakeStep(bc);
-    bc->insertStep(ProjectExplorer::BuildStep::Build, 0, makeStep);
+    ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    GenericMakeStep *makeStep = new GenericMakeStep(buildSteps);
+    buildSteps->insertStep(0, makeStep);
 
     makeStep->setBuildTarget("all", /* on = */ true);
 
@@ -145,6 +155,8 @@ GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, co
 
     t->addBuildConfiguration(bc);
 
+    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
+
     // Add a runconfiguration. The CustomExecutableRC one will query the user
     // for its settings, so it is a good choice here.
     t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));
diff --git a/src/plugins/genericprojectmanager/generictarget.h b/src/plugins/genericprojectmanager/generictarget.h
index f768d6a5393e1c3a05a65590db822e03a77aec76..123284b33bb483f03ebaf7b45fc934248c02626a 100644
--- a/src/plugins/genericprojectmanager/generictarget.h
+++ b/src/plugins/genericprojectmanager/generictarget.h
@@ -64,6 +64,7 @@ public:
     GenericProject *genericProject() const;
 
     GenericBuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
     GenericBuildConfiguration *activeBuildConfiguration() const;
 
 protected:
@@ -71,6 +72,7 @@ protected:
 
 private:
     GenericBuildConfigurationFactory *m_buildConfigurationFactory;
+    ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory;
 };
 
 class GenericTargetFactory : public ProjectExplorer::ITargetFactory
diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp
index 806da13131870cdfa03d2f29410e66047fc88ef8..fcde4a2a46387fb31037017aec81860fa6d51e89 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.cpp
+++ b/src/plugins/projectexplorer/abstractprocessstep.cpp
@@ -43,16 +43,16 @@
 
 using namespace ProjectExplorer;
 
-AbstractProcessStep::AbstractProcessStep(BuildConfiguration *bc, const QString &id) :
-    BuildStep(bc, id), m_timer(0), m_futureInterface(0),
+AbstractProcessStep::AbstractProcessStep(BuildStepList *bsl, const QString &id) :
+    BuildStep(bsl, id), m_timer(0), m_futureInterface(0),
     m_enabled(true), m_ignoreReturnValue(false),
     m_process(0), m_eventLoop(0), m_outputParserChain(0)
 {
 }
 
-AbstractProcessStep::AbstractProcessStep(BuildConfiguration *bc,
+AbstractProcessStep::AbstractProcessStep(BuildStepList *bsl,
                                          AbstractProcessStep *bs) :
-    BuildStep(bc, bs), m_timer(0), m_futureInterface(0),
+    BuildStep(bsl, bs), m_timer(0), m_futureInterface(0),
     m_enabled(bs->m_enabled), m_ignoreReturnValue(bs->m_ignoreReturnValue),
     m_process(0), m_eventLoop(0), m_outputParserChain(0)
 {
diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h
index 603708132b8adbf807ca37e63e204ce2fb8c393a..8f5ce79215fff61cb01a6bf801c764d3bfac42ce 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.h
+++ b/src/plugins/projectexplorer/abstractprocessstep.h
@@ -117,8 +117,8 @@ public:
     ProjectExplorer::IOutputParser *outputParser() const;
 
 protected:
-    AbstractProcessStep(BuildConfiguration *bc, const QString &id);
-    AbstractProcessStep(BuildConfiguration *bc, AbstractProcessStep *bs);
+    AbstractProcessStep(BuildStepList *bsl, const QString &id);
+    AbstractProcessStep(BuildStepList *bsl, AbstractProcessStep *bs);
 
     /// Called after the process is started
     /// the default implementation adds a process started message to the output message
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index 57db6aa0b55bd40baa962aee376c4c7b929e865f..2f06037d89b84ce14de423242413dee7e9fae238 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -29,100 +29,81 @@
 
 #include "buildconfiguration.h"
 
-#include <utils/qtcassert.h>
-#include <coreplugin/icore.h>
-#include <extensionsystem/pluginmanager.h>
-#include <projectexplorer/projectexplorer.h>
-#include <projectexplorer/buildmanager.h>
-
-#include <QtCore/QMetaEnum>
-#include <QtCore/QMetaObject>
+#include "buildmanager.h"
+#include "buildsteplist.h"
+#include "projectexplorer.h"
+#include "projectexplorerconstants.h"
+#include "target.h"
+
 #include <QtCore/QProcess>
 
 using namespace ProjectExplorer;
 
 namespace {
 
-IBuildStepFactory *findCloneFactory(BuildConfiguration *parent, BuildStep::Type type, BuildStep *source)
-{
-    QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
-    foreach(IBuildStepFactory *factory, factories)
-        if (factory->canClone(parent, type, source))
-            return factory;
-    return 0;
-}
-
-IBuildStepFactory *findRestoreFactory(BuildConfiguration *parent, BuildStep::Type type, const QVariantMap &map)
-{
-    QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
-    foreach(IBuildStepFactory *factory, factories)
-        if (factory->canRestore(parent, type, map))
-            return factory;
-    return 0;
-}
-
-const char * const STEPS_COUNT_KEY("ProjectExplorer.BuildConfiguration.%1StepsCount");
-const char * const STEPS_PREFIX("ProjectExplorer.BuildConfiguration.%1Step.");
+const char * const BUILD_STEP_LIST_COUNT("ProjectExplorer.BuildConfiguration.BuildStepListCount");
+const char * const BUILD_STEP_LIST_PREFIX("ProjectExplorer.BuildConfiguration.BuildStepList.");
 const char * const CLEAR_SYSTEM_ENVIRONMENT_KEY("ProjectExplorer.BuildConfiguration.ClearSystemEnvironment");
 const char * const USER_ENVIRONMENT_CHANGES_KEY("ProjectExplorer.BuildConfiguration.UserEnvironmentChanges");
 
 } // namespace
 
 BuildConfiguration::BuildConfiguration(Target *target, const QString &id) :
-    ProjectConfiguration(id),
-    m_target(target),
+    ProjectConfiguration(target, id),
     m_clearSystemEnvironment(false)
 {
-    Q_ASSERT(m_target);
+    Q_ASSERT(target);
+    BuildStepList *bsl = new BuildStepList(this, QLatin1String(Constants::BUILDSTEPS_BUILD));
+    //: Display name of the build build step list. Used as part of the labels in the project window.
+    bsl->setDisplayName(tr("Build"));
+    m_stepLists.append(bsl);
+    bsl = new BuildStepList(this, QLatin1String(Constants::BUILDSTEPS_CLEAN));
+    //: Display name of the clean build step list. Used as part of the labels in the project window.
+    bsl->setDisplayName(tr("Clean"));
+    m_stepLists.append(bsl);
 }
 
 BuildConfiguration::BuildConfiguration(Target *target, BuildConfiguration *source) :
-    ProjectConfiguration(source),
-    m_target(target),
+    ProjectConfiguration(target, source),
     m_clearSystemEnvironment(source->m_clearSystemEnvironment),
     m_userEnvironmentChanges(source->m_userEnvironmentChanges)
 {
-    Q_ASSERT(m_target);
+    Q_ASSERT(target);
+    // Do not clone stepLists here, do that in the derived constructor instead
+    // otherwise BuildStepFactories might reject to set up a BuildStep for us
+    // since we are not yet the derived class!
 }
 
 BuildConfiguration::~BuildConfiguration()
+{ }
+
+QStringList BuildConfiguration::knownStepLists() const
 {
-    for (int i = 0; i < BuildStep::LastStepType; ++i) {
-        qDeleteAll(m_steps[i]);
-    }
+    QStringList result;
+    foreach (BuildStepList *list, m_stepLists)
+        result.append(list->id());
+    return result;
+}
+
+BuildStepList *BuildConfiguration::stepList(const QString &id) const
+{
+    foreach (BuildStepList *list, m_stepLists)
+        if (id == list->id())
+            return list;
+    return 0;
 }
 
 QVariantMap BuildConfiguration::toMap() const
 {
     QVariantMap map(ProjectConfiguration::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));
 
-    return map;
-}
+    map.insert(QLatin1String(BUILD_STEP_LIST_COUNT), m_stepLists.count());
+    for (int i = 0; i < m_stepLists.count(); ++i)
+        map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) % QString::number(i), m_stepLists.at(i)->toMap());
 
-void BuildConfiguration::cloneSteps(BuildConfiguration *source)
-{
-    Q_ASSERT(source);
-    for (int i = 0; i < BuildStep::LastStepType; ++i) {
-        foreach (BuildStep *originalbs, source->steps(BuildStep::Type(i))) {
-            IBuildStepFactory *factory(findCloneFactory(this, BuildStep::Type(i), originalbs));
-            if (!factory)
-                continue;
-            BuildStep *clonebs(factory->clone(this, BuildStep::Type(i), originalbs));
-            if (clonebs)
-                m_steps[i].append(clonebs);
-        }
-    }
+    return map;
 }
 
 bool BuildConfiguration::fromMap(const QVariantMap &map)
@@ -130,74 +111,38 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
     if (!ProjectConfiguration::fromMap(map))
         return false;
 
-    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);
-        }
-    }
-
     m_clearSystemEnvironment = map.value(QLatin1String(CLEAR_SYSTEM_ENVIRONMENT_KEY)).toBool();
     m_userEnvironmentChanges = EnvironmentItem::fromStringList(map.value(QLatin1String(USER_ENVIRONMENT_CHANGES_KEY)).toStringList());
 
-    return true;
-}
-
-QList<BuildStep *> BuildConfiguration::steps(BuildStep::Type type) const
-{
-    Q_ASSERT(type >= 0 && type < BuildStep::LastStepType);
-    return m_steps[type];
-}
-
-void BuildConfiguration::insertStep(BuildStep::Type type, int position, BuildStep *step)
-{
-    Q_ASSERT(type >= 0 && type < BuildStep::LastStepType);
-    m_steps[type].insert(position, step);
-}
+    qDeleteAll(m_stepLists);
+    m_stepLists.clear();
 
-bool BuildConfiguration::removeStep(BuildStep::Type type, int position)
-{
-    Q_ASSERT(type >= 0 && type < BuildStep::LastStepType);
+    int maxI = map.value(QLatin1String(BUILD_STEP_LIST_COUNT), 0).toInt();
+    for (int i = 0; i < maxI; ++i) {
+        QVariantMap data = map.value(QLatin1String(BUILD_STEP_LIST_PREFIX) % QString::number(i)).toMap();
+        if (data.isEmpty()) {
+            qWarning() << "No data for build step list" << i << "found!";
+            continue;
+        }
+        BuildStepList *list = new BuildStepList(this, data);
+        if (list->isNull()) {
+            qWarning() << "Failed to restore build step list" << i;
+            delete list;
+            return false;
+        }
+        m_stepLists.append(list);
+    }
 
-    ProjectExplorer::BuildManager *bm =
-            ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager();
-    if (bm->isBuilding(m_steps[type].at(position)))
-        return false;
+    // TODO: We currently assume there to be at least a clean, build and deploy list!
+    Q_ASSERT(knownStepLists().contains(QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_BUILD)));
+    Q_ASSERT(knownStepLists().contains(QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)));
 
-    delete m_steps[type].at(position);
-    m_steps[type].removeAt(position);
     return true;
 }
 
-void BuildConfiguration::moveStepUp(BuildStep::Type type, int position)
-{
-    Q_ASSERT(type >= 0 && type < BuildStep::LastStepType);
-    if (position <= 0 || m_steps[type].size() <= 1)
-        return;
-    m_steps[type].swap(position - 1, position);
-
-}
-
 Target *BuildConfiguration::target() const
 {
-    return m_target;
+    return static_cast<Target *>(parent());
 }
 
 Environment BuildConfiguration::baseEnvironment() const
@@ -248,15 +193,23 @@ void BuildConfiguration::setUserEnvironmentChanges(const QList<ProjectExplorer::
     emit environmentChanged();
 }
 
+void BuildConfiguration::cloneSteps(BuildConfiguration *source)
+{
+    qDeleteAll(m_stepLists);
+    m_stepLists.clear();
+    foreach (BuildStepList *bsl, source->m_stepLists) {
+        BuildStepList *newBsl = new BuildStepList(this, bsl);
+        m_stepLists.append(newBsl);
+    }
+}
+
 ///
 // IBuildConfigurationFactory
 ///
 
 IBuildConfigurationFactory::IBuildConfigurationFactory(QObject *parent) :
     QObject(parent)
-{
-}
+{ }
 
 IBuildConfigurationFactory::~IBuildConfigurationFactory()
-{
-}
+{ }
diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h
index d095206106ec4446f901a3fe6641904c5f89ba9b..ef0f52d3d233d4198384a9fd0c0cc2d920cdfb90 100644
--- a/src/plugins/projectexplorer/buildconfiguration.h
+++ b/src/plugins/projectexplorer/buildconfiguration.h
@@ -38,11 +38,11 @@
 #include <QtCore/QList>
 #include <QtCore/QObject>
 
-#include "buildstep.h"
 #include "projectconfiguration.h"
 
 namespace ProjectExplorer {
 
+class BuildStepList;
 class Target;
 class IOutputParser;
 
@@ -54,15 +54,8 @@ public:
     // ctors are protected
     virtual ~BuildConfiguration();
 
-    QList<BuildStep *> steps(BuildStep::Type type) const;
-    void insertStep(BuildStep::Type type, int position, BuildStep *step);
-    bool removeStep(BuildStep::Type type, int position);
-    void moveStepUp(BuildStep::Type type, int position);
-
     virtual QString buildDirectory() const = 0;
 
-    Target *target() const;
-
     // TODO: Maybe the BuildConfiguration is not the best place for the environment
     virtual Environment baseEnvironment() const;
     QString baseEnvironmentText() const;
@@ -72,6 +65,9 @@ public:
     bool useSystemEnvironment() const;
     void setUseSystemEnvironment(bool b);
 
+    QStringList knownStepLists() const;
+    BuildStepList *stepList(const QString &id) const;
+
     virtual QVariantMap toMap() const;
 
     // Creates a suitable outputparser for custom build steps
@@ -81,6 +77,8 @@ public:
     // with the generic project manager
     virtual IOutputParser *createOutputParser() const = 0;
 
+    Target *target() const;
+
 signals:
     void environmentChanged();
     void buildDirectoryChanged();
@@ -88,16 +86,15 @@ signals:
 protected:
     BuildConfiguration(Target *target, const QString &id);
     BuildConfiguration(Target *target, BuildConfiguration *source);
+
     void cloneSteps(BuildConfiguration *source);
 
     virtual bool fromMap(const QVariantMap &map);
 
 private:
-    QList<BuildStep *> m_steps[BuildStep::LastStepType];
-    Target *m_target;
-
     bool m_clearSystemEnvironment;
     QList<EnvironmentItem> m_userEnvironmentChanges;
+    QList<BuildStepList *> m_stepLists;
 };
 
 class PROJECTEXPLORER_EXPORT IBuildConfigurationFactory :
diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp
index 3b18945b1a5e9ae3b8435fe2b4981f24355bc405..2236755c4c0cde9547aefd5d56e76cbf1a421139 100644
--- a/src/plugins/projectexplorer/buildmanager.cpp
+++ b/src/plugins/projectexplorer/buildmanager.cpp
@@ -31,6 +31,7 @@
 
 #include "buildprogress.h"
 #include "buildstep.h"
+#include "buildsteplist.h"
 #include "compileoutputwindow.h"
 #include "projectexplorerconstants.h"
 #include "projectexplorer.h"
@@ -409,47 +410,16 @@ bool BuildManager::buildQueueAppend(QList<BuildStep *> steps)
     return true;
 }
 
-bool BuildManager::buildProjects(const QList<BuildConfiguration *> &configurations)
+bool BuildManager::buildList(BuildStepList *bsl)
 {
-    QList<BuildStep *> steps;
-    foreach(BuildConfiguration *bc, configurations)
-        steps.append(bc->steps(BuildStep::Build));
-
-    bool success = buildQueueAppend(steps);
-    if (!success) {
-        m_outputWindow->popup(false);
-        return false;
-    }
-
-    if (ProjectExplorerPlugin::instance()->projectExplorerSettings().showCompilerOutput)
-        m_outputWindow->popup(false);
-    startBuildQueue();
-    return true;
-}
-
-bool BuildManager::deployProjects(const QList<BuildConfiguration *> &configurations)
-{
-    QList<BuildStep *> steps;
-    foreach(BuildConfiguration *bc, configurations)
-        steps.append(bc->steps(BuildStep::Deploy));
-
-    bool success = buildQueueAppend(steps);
-    if (!success) {
-        m_outputWindow->popup(false);
-        return false;
-    }
-
-    if (ProjectExplorerPlugin::instance()->projectExplorerSettings().showCompilerOutput)
-        m_outputWindow->popup(false);
-    startBuildQueue();
-    return true;
+    return buildLists(QList<BuildStepList *>() << bsl);
 }
 
-bool BuildManager::cleanProjects(const QList<BuildConfiguration *> &configurations)
+bool BuildManager::buildLists(QList<BuildStepList *> bsls)
 {
     QList<BuildStep *> steps;
-    foreach(BuildConfiguration *bc, configurations)
-        steps.append(bc->steps(BuildStep::Clean));
+    foreach(BuildStepList *list, bsls)
+        steps.append(list->steps());
 
     bool success = buildQueueAppend(steps);
     if (!success) {
@@ -463,21 +433,6 @@ bool BuildManager::cleanProjects(const QList<BuildConfiguration *> &configuratio
     return true;
 }
 
-bool BuildManager::buildProject(BuildConfiguration *configuration)
-{
-    return buildProjects(QList<BuildConfiguration *>() << configuration);
-}
-
-bool BuildManager::deployProject(BuildConfiguration *configuration)
-{
-    return deployProjects(QList<BuildConfiguration *>() << configuration);
-}
-
-bool BuildManager::cleanProject(BuildConfiguration *configuration)
-{
-    return cleanProjects(QList<BuildConfiguration *>() << configuration);
-}
-
 void BuildManager::appendStep(BuildStep *step)
 {
     bool success = buildQueueAppend(QList<BuildStep *>() << step);
diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h
index e622c294920d8c99d25693965715fd99edf76ba9..59c6fc89da7db86b194c46f57573f14cbff834dc 100644
--- a/src/plugins/projectexplorer/buildmanager.h
+++ b/src/plugins/projectexplorer/buildmanager.h
@@ -49,6 +49,7 @@ namespace Internal {
 }
 
 class BuildStep;
+class BuildStepList;
 class Project;
 class ProjectExplorerPlugin;
 class BuildConfiguration;
@@ -73,12 +74,8 @@ public:
 
     bool tasksAvailable() const;
 
-    bool buildProject(BuildConfiguration *bc);
-    bool buildProjects(const QList<BuildConfiguration *> &configurations);
-    bool deployProject(BuildConfiguration *bc);
-    bool deployProjects(const QList<BuildConfiguration *> &configurations);
-    bool cleanProject(BuildConfiguration *configuration);
-    bool cleanProjects(const QList<BuildConfiguration *> &configurations);
+    bool buildLists(QList<BuildStepList *> bsls);
+    bool buildList(BuildStepList *bsl);
     bool isBuilding(Project *p);
     bool isBuilding(BuildStep *step);
 
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index ff1138134fc7aea95163b8ea1adb858ed844c300..16e518b7dca9f468fe2d3a1be86e1b97cab07c0c 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -31,6 +31,7 @@
 #include "buildstep.h"
 #include "buildstepspage.h"
 #include "project.h"
+#include "projectexplorerconstants.h"
 #include "target.h"
 #include "buildconfiguration.h"
 #include "buildconfigurationmodel.h"
@@ -187,12 +188,14 @@ void BuildSettingsWidget::setupUi()
                 SLOT(updateAddButtonMenu()));
 }
 
-void BuildSettingsWidget::addSubWidget(const QString &name, BuildConfigWidget *widget)
+void BuildSettingsWidget::addSubWidget(BuildConfigWidget *widget)
 {
     widget->setContentsMargins(0, 10, 0, 0);
 
     QLabel *label = new QLabel(this);
-    label->setText(name);
+    label->setText(widget->displayName());
+    connect(widget, SIGNAL(displayNameChanged(QString)),
+            label, SLOT(setText(QString)));
     QFont f = label->font();
     f.setBold(true);
     f.setPointSizeF(f.pointSizeF() * 1.2);
@@ -247,15 +250,14 @@ void BuildSettingsWidget::updateBuildSettings()
 
     // Add pages
     BuildConfigWidget *generalConfigWidget = m_target->project()->createConfigWidget();
-    addSubWidget(generalConfigWidget->displayName(), generalConfigWidget);
+    addSubWidget(generalConfigWidget);
 
-    addSubWidget(tr("Build Steps"), new BuildStepsPage(m_target, BuildStep::Build));
-    addSubWidget(tr("Deploy Steps"), new BuildStepsPage(m_target, BuildStep::Deploy));
-    addSubWidget(tr("Clean Steps"), new BuildStepsPage(m_target, BuildStep::Clean));
+    addSubWidget(new BuildStepsPage(m_target, QLatin1String(Constants::BUILDSTEPS_BUILD)));
+    addSubWidget(new BuildStepsPage(m_target, QLatin1String(Constants::BUILDSTEPS_CLEAN)));
 
     QList<BuildConfigWidget *> subConfigWidgets = m_target->project()->subConfigWidgets();
     foreach (BuildConfigWidget *subConfigWidget, subConfigWidgets)
-        addSubWidget(subConfigWidget->displayName(), subConfigWidget);
+        addSubWidget(subConfigWidget);
 
     foreach (BuildConfigWidget *widget, subWidgets())
         widget->init(m_buildConfiguration);
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.h b/src/plugins/projectexplorer/buildsettingspropertiespage.h
index 444e381b1424d6b77ceceb9b051330473a67c2a6..bb661615d7e5e16cc399e2e354cb16130d47a88d 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.h
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.h
@@ -87,7 +87,7 @@ public:
     ~BuildSettingsWidget();
 
     void clear();
-    void addSubWidget(const QString &name, BuildConfigWidget *widget);
+    void addSubWidget(BuildConfigWidget *widget);
     QList<BuildConfigWidget *> subWidgets() const;
 
     void setupUi();
diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp
index db700902d3d1235098dbce039d3603e830c89c71..459407f63eb3ddc264a2b4fac89b133ace9b1c83 100644
--- a/src/plugins/projectexplorer/buildstep.cpp
+++ b/src/plugins/projectexplorer/buildstep.cpp
@@ -29,20 +29,22 @@
 
 #include "buildstep.h"
 
+#include "buildconfiguration.h"
+#include "buildsteplist.h"
+#include "target.h"
+
 using namespace ProjectExplorer;
 
-BuildStep::BuildStep(BuildConfiguration *bc, const QString &id) :
-    ProjectConfiguration(id),
-    m_buildConfiguration(bc)
+BuildStep::BuildStep(BuildStepList *bsl, const QString &id) :
+    ProjectConfiguration(bsl, id)
 {
-    Q_ASSERT(bc);
+    Q_ASSERT(bsl);
 }
 
-BuildStep::BuildStep(BuildConfiguration *bc, BuildStep *bs) :
-    ProjectConfiguration(bs),
-    m_buildConfiguration(bc)
+BuildStep::BuildStep(BuildStepList *bsl, BuildStep *bs) :
+    ProjectConfiguration(bsl, bs)
 {
-    Q_ASSERT(bc);
+    Q_ASSERT(bsl);
 }
 
 BuildStep::~BuildStep()
@@ -51,7 +53,15 @@ BuildStep::~BuildStep()
 
 BuildConfiguration *BuildStep::buildConfiguration() const
 {
-    return m_buildConfiguration;
+    BuildConfiguration *bc = qobject_cast<BuildConfiguration *>(parent()->parent());
+    if (!bc)
+        bc = target()->activeBuildConfiguration();
+    return bc;
+}
+
+Target *BuildStep::target() const
+{
+    return qobject_cast<Target *>(parent()->parent()->parent());
 }
 
 bool BuildStep::immutable() const
@@ -61,9 +71,7 @@ bool BuildStep::immutable() const
 
 IBuildStepFactory::IBuildStepFactory(QObject *parent) :
     QObject(parent)
-{
-}
+{ }
 
 IBuildStepFactory::~IBuildStepFactory()
-{
-}
+{ }
diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h
index 065289121f05bb83fc25b93d31675d8cf37474cc..ce3ffbf656388d9c55a3992d5c4aba2274e0ec32 100644
--- a/src/plugins/projectexplorer/buildstep.h
+++ b/src/plugins/projectexplorer/buildstep.h
@@ -40,6 +40,8 @@
 namespace ProjectExplorer {
 
 class BuildConfiguration;
+class BuildStepList;
+class Target;
 
 /*
 // BuildSteps are the primary way plugin developers can customize
@@ -68,18 +70,10 @@ class PROJECTEXPLORER_EXPORT BuildStep : public ProjectConfiguration
     Q_OBJECT
 
 protected:
-    BuildStep(BuildConfiguration *bc, const QString &id);
-    BuildStep(BuildConfiguration *bc, BuildStep *bs);
+    BuildStep(BuildStepList *bsl, const QString &id);
+    BuildStep(BuildStepList *bsl, BuildStep *bs);
 
 public:
-    enum Type {
-        Build = 0,
-        Clean,
-        Deploy,
-        LastStepType
-    };
-    Q_ENUMS(Type)
-
     virtual ~BuildStep();
 
     // This function is run in the gui thread,
@@ -103,6 +97,7 @@ public:
     virtual bool immutable() const;
 
     BuildConfiguration *buildConfiguration() const;
+    Target *target() const;
 
     enum OutputFormat { NormalOutput, ErrorOutput, MessageOutput, ErrorMessageOutput };
 
@@ -113,9 +108,6 @@ signals:
     // window.
     // It should be in plain text, with the format in the parameter
     void addOutput(const QString &string, ProjectExplorer::BuildStep::OutputFormat format);
-
-private:
-    BuildConfiguration *m_buildConfiguration;
 };
 
 class PROJECTEXPLORER_EXPORT IBuildStepFactory :
@@ -128,17 +120,17 @@ public:
     virtual ~IBuildStepFactory();
 
     // used to show the list of possible additons to a target, returns a list of types
-    virtual QStringList availableCreationIds(BuildConfiguration *parent, BuildStep::Type type) const = 0;
+    virtual QStringList availableCreationIds(BuildStepList *parent) const = 0;
     // used to translate the types to names to display to the user
     virtual QString displayNameForId(const QString &id) const = 0;
 
-    virtual bool canCreate(BuildConfiguration *parent, BuildStep::Type type, const QString &id) const = 0;
-    virtual BuildStep *create(BuildConfiguration *parent, BuildStep::Type type, const QString &id) = 0;
+    virtual bool canCreate(BuildStepList *parent, const QString &id) const = 0;
+    virtual BuildStep *create(BuildStepList *parent, const QString &id) = 0;
     // used to recreate the runConfigurations when restoring settings
-    virtual bool canRestore(BuildConfiguration *parent, BuildStep::Type type, const QVariantMap &map) const = 0;
-    virtual BuildStep *restore(BuildConfiguration *parent, BuildStep::Type type, const QVariantMap &map) = 0;
-    virtual bool canClone(BuildConfiguration *parent, BuildStep::Type type, BuildStep *product) const = 0;
-    virtual BuildStep *clone(BuildConfiguration *parent, BuildStep::Type type, BuildStep *product) = 0;
+    virtual bool canRestore(BuildStepList *parent, const QVariantMap &map) const = 0;
+    virtual BuildStep *restore(BuildStepList *parent, const QVariantMap &map) = 0;
+    virtual bool canClone(BuildStepList *parent, BuildStep *product) const = 0;
+    virtual BuildStep *clone(BuildStepList *parent, BuildStep *product) = 0;
 };
 
 class PROJECTEXPLORER_EXPORT BuildConfigWidget
@@ -154,6 +146,9 @@ public:
 
     // This is called to set up the config widget before showing it
     virtual void init(BuildConfiguration *bc) = 0;
+
+signals:
+    void displayNameChanged(const QString &);
 };
 
 class PROJECTEXPLORER_EXPORT BuildStepConfigWidget
diff --git a/src/plugins/projectexplorer/buildsteplist.cpp b/src/plugins/projectexplorer/buildsteplist.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b0e27824fbc05cace7a78403edddb7a7968c7e20
--- /dev/null
+++ b/src/plugins/projectexplorer/buildsteplist.cpp
@@ -0,0 +1,221 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "buildsteplist.h"
+
+#include "buildconfiguration.h"
+#include "buildmanager.h"
+#include "buildstep.h"
+#include "deployconfiguration.h"
+#include "projectexplorer.h"
+#include "target.h"
+
+#include <extensionsystem/pluginmanager.h>
+
+using namespace ProjectExplorer;
+
+namespace {
+
+IBuildStepFactory *findCloneFactory(BuildStepList *parent, BuildStep *source)
+{
+    QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
+    foreach(IBuildStepFactory *factory, factories)
+        if (factory->canClone(parent, source))
+            return factory;
+    return 0;
+}
+
+IBuildStepFactory *findRestoreFactory(BuildStepList *parent, const QVariantMap &map)
+{
+    QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
+    foreach(IBuildStepFactory *factory, factories)
+        if (factory->canRestore(parent, map))
+            return factory;
+    return 0;
+}
+
+const char * const STEPS_COUNT_KEY("ProjectExplorer.BuildStepList.StepsCount");
+const char * const STEPS_PREFIX("ProjectExplorer.BuildStepList.Step.");
+
+} // namespace
+
+BuildStepList::BuildStepList(QObject *parent, const QString &id) :
+    ProjectConfiguration(parent, id),
+    m_isNull(false)
+{
+    Q_ASSERT(parent);
+}
+
+BuildStepList::BuildStepList(QObject *parent, BuildStepList *source) :
+    ProjectConfiguration(parent, source),
+    m_isNull(source->m_isNull)
+{
+    Q_ASSERT(parent);
+    // do not clone the steps here:
+    // The BC is not fully set up yet and thus some of the buildstepfactories
+    // will fail to clone the buildsteps!
+}
+
+BuildStepList::BuildStepList(QObject *parent, const QVariantMap &data) :
+    ProjectConfiguration(parent, QLatin1String("UNKNOWN"))
+{
+    Q_ASSERT(parent);
+    m_isNull = !fromMap(data);
+}
+
+BuildStepList::~BuildStepList()
+{
+    qDeleteAll(m_steps);
+}
+
+QVariantMap BuildStepList::toMap() const
+{
+    QVariantMap map(ProjectConfiguration::toMap());
+    // Save build steps
+    map.insert(QString::fromLatin1(STEPS_COUNT_KEY), m_steps.count());
+    for (int i = 0; i < m_steps.count(); ++i)
+        map.insert(QString::fromLatin1(STEPS_PREFIX) + QString::number(i), m_steps.at(i)->toMap());
+
+    return map;
+}
+
+bool BuildStepList::isNull() const
+{
+    return m_isNull;
+}
+
+int BuildStepList::count() const
+{
+    return m_steps.count();
+}
+
+bool BuildStepList::isEmpty() const
+{
+    return m_steps.isEmpty();
+}
+
+bool BuildStepList::contains(const QString &id) const
+{
+    foreach (BuildStep *bs, steps()) {
+        if (bs->id() == id)
+            return true;
+    }
+    return false;
+}
+
+void BuildStepList::cloneSteps(BuildStepList *source)
+{
+    Q_ASSERT(source);
+    foreach (BuildStep *originalbs, source->steps()) {
+        IBuildStepFactory *factory(findCloneFactory(this, originalbs));
+        if (!factory)
+            continue;
+        BuildStep *clonebs(factory->clone(this, originalbs));
+        if (clonebs)
+            m_steps.append(clonebs);
+    }
+}
+
+bool BuildStepList::fromMap(const QVariantMap &map)
+{
+    if (!ProjectConfiguration::fromMap(map))
+        return false;
+
+    int maxSteps = map.value(QString::fromLatin1(STEPS_COUNT_KEY), 0).toInt();
+    for (int i = 0; i < maxSteps; ++i) {
+        QVariantMap bsData(map.value(QString::fromLatin1(STEPS_PREFIX) + QString::number(i)).toMap());
+        if (bsData.isEmpty()) {
+            qWarning() << "No step data found for" << i << "(continuing).";
+            continue;
+        }
+        IBuildStepFactory *factory(findRestoreFactory(this, bsData));
+        if (!factory) {
+            qWarning() << "No factory for step" << i << "found (continuing).";
+            continue;
+        }
+        BuildStep *bs(factory->restore(this, bsData));
+        if (!bs) {
+            qWarning() << "Restoration of step" << i << "failed (continuing).";
+            continue;
+        }
+        insertStep(m_steps.count(), bs);
+    }
+
+    return ProjectConfiguration::fromMap(map);
+}
+
+QList<BuildStep *> BuildStepList::steps() const
+{
+    return m_steps;
+}
+
+void BuildStepList::insertStep(int position, BuildStep *step)
+{
+    m_steps.insert(position, step);
+    emit stepInserted(position);
+}
+
+bool BuildStepList::removeStep(int position)
+{
+    ProjectExplorer::BuildManager *bm =
+            ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager();
+    BuildStep *bs = at(position);
+    if (bm->isBuilding(bs))
+        return false;
+
+    emit aboutToRemoveStep(position);
+    m_steps.removeAt(position);
+    delete bs;
+    emit stepRemoved(position);
+    return true;
+}
+
+void BuildStepList::moveStepUp(int position)
+{
+    m_steps.swap(position - 1, position);
+    emit stepMoved(position, position - 1);
+}
+
+BuildStep *BuildStepList::at(int position)
+{
+    return m_steps.at(position);
+}
+
+Target *BuildStepList::target() const
+{
+    Q_ASSERT(parent());
+    BuildConfiguration *bc = qobject_cast<BuildConfiguration *>(parent());
+    if (bc)
+        return bc->target();
+    DeployConfiguration *dc = qobject_cast<DeployConfiguration *>(parent());
+    if (dc)
+        return dc->target();
+    Q_ASSERT(false);
+    return 0;
+}
diff --git a/src/plugins/projectexplorer/buildsteplist.h b/src/plugins/projectexplorer/buildsteplist.h
new file mode 100644
index 0000000000000000000000000000000000000000..837756f941a42382ea86bd36605fefd2d5386f25
--- /dev/null
+++ b/src/plugins/projectexplorer/buildsteplist.h
@@ -0,0 +1,89 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef PROJECTEXPLORER_BUILDSTEPLIST_H
+#define PROJECTEXPLORER_BUILDSTEPLIST_H
+
+#include "projectexplorer_export.h"
+
+#include "projectconfiguration.h"
+
+#include <QtCore/QVariantMap>
+
+namespace ProjectExplorer {
+
+class BuildStep;
+class Target;
+
+class PROJECTEXPLORER_EXPORT BuildStepList : public ProjectConfiguration
+{
+    Q_OBJECT
+
+public:
+    BuildStepList(QObject *parent, const QString &id);
+    BuildStepList(QObject *parent, BuildStepList *source);
+    BuildStepList(QObject *parent, const QVariantMap &data);
+    virtual ~BuildStepList();
+
+    QList<BuildStep *> steps() const;
+    bool isNull() const;
+    int count() const;
+    bool isEmpty() const;
+    bool contains(const QString &id) const;
+
+    void insertStep(int position, BuildStep *step);
+    bool removeStep(int position);
+    void moveStepUp(int position);
+    BuildStep *at(int position);
+
+    Target *target() const;
+
+    virtual QVariantMap toMap() const;
+
+signals:
+    void stepInserted(int position);
+    void aboutToRemoveStep(int position);
+    void stepRemoved(int position);
+    void stepMoved(int from, int to);
+
+protected:
+    void cloneSteps(BuildStepList *source);
+
+    virtual bool fromMap(const QVariantMap &map);
+
+private:
+    QList<BuildStep *> m_steps;
+    bool m_isNull;
+};
+
+} // namespace ProjectExplorer
+
+Q_DECLARE_METATYPE(ProjectExplorer::BuildStepList *);
+
+#endif // PROJECTEXPLORER_BUILDSTEPLIST_H
diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp
index f6df541a56957a7313d5ffd2f5b406438c4b0636..7ea0a0726596c1a077495aa66eb3e95e91080826 100644
--- a/src/plugins/projectexplorer/buildstepspage.cpp
+++ b/src/plugins/projectexplorer/buildstepspage.cpp
@@ -28,8 +28,11 @@
 **************************************************************************/
 
 #include "buildstepspage.h"
+
 #include "buildconfiguration.h"
+#include "buildsteplist.h"
 #include "detailsbutton.h"
+#include "projectexplorerconstants.h"
 
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/icore.h>
@@ -50,16 +53,15 @@
 using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
-BuildStepsPage::BuildStepsPage(Target *target, BuildStep::Type type) :
-    BuildConfigWidget(),
-    m_type(type),
+BuildStepListWidget::BuildStepListWidget(QWidget *parent) :
+    NamedWidget(parent),
+    m_buildStepList(0),
     m_addButton(0)
 {
-    Q_UNUSED(target);
     setStyleSheet("background: red");
 }
 
-BuildStepsPage::~BuildStepsPage()
+BuildStepListWidget::~BuildStepListWidget()
 {
     foreach(const BuildStepsWidgetStruct &s, m_buildSteps) {
         delete s.widget;
@@ -68,7 +70,7 @@ BuildStepsPage::~BuildStepsPage()
     m_buildSteps.clear();
 }
 
-void BuildStepsPage::updateSummary()
+void BuildStepListWidget::updateSummary()
 {
     BuildStepConfigWidget *widget = qobject_cast<BuildStepConfigWidget *>(sender());
     if (widget) {
@@ -81,23 +83,9 @@ void BuildStepsPage::updateSummary()
     }
 }
 
-QString BuildStepsPage::displayName() const
+void BuildStepListWidget::init(BuildStepList *bsl)
 {
-    switch(m_type) {
-    case BuildStep::Build:
-        return tr("Build Steps");
-    case BuildStep::Deploy:
-        return tr("Deploy Steps");
-    case BuildStep::Clean:
-        return tr("Clean Steps");
-    default:
-        return tr("Unknown Steps");
-    }
-}
-
-void BuildStepsPage::init(BuildConfiguration *bc)
-{
-    QTC_ASSERT(bc, return);
+    Q_ASSERT(bsl);
 
     setupUi();
 
@@ -107,16 +95,17 @@ void BuildStepsPage::init(BuildConfiguration *bc)
     }
     m_buildSteps.clear();
 
-    m_configuration = bc;
+    m_buildStepList = bsl;
+    //: %1 is the name returned by BuildStepList::displayName
+    setDisplayName(tr("%1 Steps").arg(m_buildStepList->displayName()));
 
-    const QList<BuildStep *> &steps = m_configuration->steps(m_type);
-    int i = 0;
-    foreach (BuildStep *bs, steps) {
-        addBuildStepWidget(i, bs);
-        ++i;
-    }
+    for (int i = 0; i < bsl->count(); ++i)
+        addBuildStepWidget(i, m_buildStepList->at(i));
 
-    m_noStepsLabel->setVisible(steps.isEmpty());
+    m_noStepsLabel->setVisible(bsl->isEmpty());
+    m_noStepsLabel->setText(tr("No %1 Steps").arg(m_buildStepList->displayName()));
+
+    m_addButton->setText(tr("Add %1 Step").arg(m_buildStepList->displayName()));
 
     // make sure widget is updated
     foreach(BuildStepsWidgetStruct s, m_buildSteps) {
@@ -132,13 +121,13 @@ void BuildStepsPage::init(BuildConfiguration *bc)
     setStyleSheet(buttonStyle);
 }
 
-void BuildStepsPage::updateAddBuildStepMenu()
+void BuildStepListWidget::updateAddBuildStepMenu()
 {
     QMap<QString, QPair<QString, IBuildStepFactory *> > map;
     //Build up a list of possible steps and save map the display names to the (internal) name and factories.
     QList<IBuildStepFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildStepFactory>();
     foreach (IBuildStepFactory *factory, factories) {
-        QStringList ids = factory->availableCreationIds(m_configuration, m_type);
+        QStringList ids = factory->availableCreationIds(m_buildStepList);
         foreach (const QString &id, ids) {
             map.insert(factory->displayNameForId(id), QPair<QString, IBuildStepFactory *>(id, factory));
         }
@@ -160,7 +149,7 @@ void BuildStepsPage::updateAddBuildStepMenu()
     }
 }
 
-void BuildStepsPage::addBuildStepWidget(int pos, BuildStep *step)
+void BuildStepListWidget::addBuildStepWidget(int pos, BuildStep *step)
 {
     // create everything
     BuildStepsWidgetStruct s;
@@ -222,13 +211,13 @@ void BuildStepsPage::addBuildStepWidget(int pos, BuildStep *step)
             m_removeMapper, SLOT(map()));
 }
 
-void BuildStepsPage::addBuildStep()
+void BuildStepListWidget::addBuildStep()
 {
     if (QAction *action = qobject_cast<QAction *>(sender())) {
         QPair<QString, IBuildStepFactory *> pair = m_addBuildStepHash.value(action);
-        BuildStep *newStep = pair.second->create(m_configuration, m_type, pair.first);
-        int pos = m_configuration->steps(m_type).count();
-        m_configuration->insertStep(m_type, pos, newStep);
+        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);
@@ -239,9 +228,9 @@ void BuildStepsPage::addBuildStep()
     updateBuildStepButtonsState();
 }
 
-void BuildStepsPage::stepMoveUp(int pos)
+void BuildStepListWidget::stepMoveUp(int pos)
 {
-    m_configuration->moveStepUp(m_type, pos);
+    m_buildStepList->moveStepUp(pos);
 
     m_vbox->insertWidget(pos - 1, m_buildSteps.at(pos).detailsWidget);
 
@@ -250,14 +239,14 @@ void BuildStepsPage::stepMoveUp(int pos)
     updateBuildStepButtonsState();
 }
 
-void BuildStepsPage::stepMoveDown(int pos)
+void BuildStepListWidget::stepMoveDown(int pos)
 {
     stepMoveUp(pos + 1);
 }
 
-void BuildStepsPage::stepRemove(int pos)
+void BuildStepListWidget::stepRemove(int pos)
 {
-    if (m_configuration->removeStep(m_type, pos)) {
+    if (m_buildStepList->removeStep(pos)) {
         BuildStepsWidgetStruct s = m_buildSteps.at(pos);
         delete s.widget;
         delete s.detailsWidget;
@@ -265,7 +254,7 @@ void BuildStepsPage::stepRemove(int pos)
 
         updateBuildStepButtonsState();
 
-        bool hasSteps = m_configuration->steps(m_type).isEmpty();
+        bool hasSteps = m_buildStepList->isEmpty();
         m_noStepsLabel->setVisible(hasSteps);
     } else {
         QMessageBox::warning(Core::ICore::instance()->mainWindow(),
@@ -275,7 +264,7 @@ void BuildStepsPage::stepRemove(int pos)
     }
 }
 
-void BuildStepsPage::setupUi()
+void BuildStepListWidget::setupUi()
 {
     if (0 != m_addButton)
         return;
@@ -301,19 +290,6 @@ void BuildStepsPage::setupUi()
     QHBoxLayout *hboxLayout = new QHBoxLayout();
     hboxLayout->setContentsMargins(0, 4, 0, 0);
     m_addButton = new QPushButton(this);
-    switch (m_type) {
-    case BuildStep::Clean:
-        m_addButton->setText(tr("Add Clean Step"));
-        break;
-    case BuildStep::Build:
-        m_addButton->setText(tr("Add Build Step"));
-        break;
-    case BuildStep::Deploy:
-        m_addButton->setText(tr("Add Deploy Step"));
-        break;
-    default:
-        m_addButton->setText(tr("Add Step"));
-    }
     m_addButton->setMenu(new QMenu(this));
     hboxLayout->addWidget(m_addButton);
 
@@ -329,21 +305,69 @@ void BuildStepsPage::setupUi()
             this, SLOT(updateAddBuildStepMenu()));
 }
 
-void BuildStepsPage::updateBuildStepButtonsState()
+void BuildStepListWidget::updateBuildStepButtonsState()
 {
-    const QList<BuildStep *> &steps = m_configuration->steps(m_type);
     for(int i = 0; i < m_buildSteps.count(); ++i) {
         BuildStepsWidgetStruct s = m_buildSteps.at(i);
-        s.removeButton->setEnabled(!steps.at(i)->immutable());
+        s.removeButton->setEnabled(!m_buildStepList->at(i)->immutable());
         m_removeMapper->setMapping(s.removeButton, i);
 
-        s.upButton->setEnabled((i > 0) && !(steps.at(i)->immutable() && steps.at(i - 1)));
+        s.upButton->setEnabled((i > 0)
+                               && !(m_buildStepList->at(i)->immutable()
+                               && m_buildStepList->at(i - 1)));
         m_upMapper->setMapping(s.upButton, i);
-        s.downButton->setEnabled((i + 1 < steps.count()) && !(steps.at(i)->immutable() && steps.at(i + 1)->immutable()));
+        s.downButton->setEnabled((i + 1 < m_buildStepList->count())
+                                 && !(m_buildStepList->at(i)->immutable()
+                                      && m_buildStepList->at(i + 1)->immutable()));
         m_downMapper->setMapping(s.downButton, i);
 
         // Only show buttons when needed
-        s.downButton->setVisible(steps.count() != 1);
-        s.upButton->setVisible(steps.count() != 1);
+        s.downButton->setVisible(m_buildStepList->count() != 1);
+        s.upButton->setVisible(m_buildStepList->count() != 1);
     }
 }
+
+BuildStepsPage::BuildStepsPage(Target *target, const QString &id) :
+    BuildConfigWidget(),
+    m_id(id),
+    m_widget(new BuildStepListWidget(this))
+{
+    Q_UNUSED(target);
+    QVBoxLayout *layout = new QVBoxLayout(this);
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(m_widget);
+}
+
+BuildStepsPage::~BuildStepsPage()
+{ }
+
+QString BuildStepsPage::displayName() const
+{
+    if (m_id == QLatin1String(Constants::BUILDSTEPS_BUILD))
+        return tr("Build Steps");
+    if (m_id == QLatin1String(Constants::BUILDSTEPS_CLEAN))
+        return tr("Clean Steps");
+    return QString();
+}
+
+void BuildStepsPage::init(BuildConfiguration *bc)
+{
+    m_widget->init(bc->stepList(m_id));
+}
+
+DeployConfigurationStepsWidget::DeployConfigurationStepsWidget(QWidget *parent) :
+    DeployConfigurationWidget(parent),
+    m_widget(new BuildStepListWidget(this))
+{
+    QVBoxLayout *layout = new QVBoxLayout(this);
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(m_widget);
+}
+
+void DeployConfigurationStepsWidget::init(DeployConfiguration *dc)
+{
+    m_widget->init(dc->stepList());
+    setDisplayName(m_widget->displayName());
+}
diff --git a/src/plugins/projectexplorer/buildstepspage.h b/src/plugins/projectexplorer/buildstepspage.h
index 58be605c0a6a6267102144b796ad03db5e62491b..dea421dfb3c8a5c2836db3c2ebf374067a3947e3 100644
--- a/src/plugins/projectexplorer/buildstepspage.h
+++ b/src/plugins/projectexplorer/buildstepspage.h
@@ -31,7 +31,9 @@
 #define BUILDSTEPSPAGE_H
 
 #include "buildstep.h"
-#include "buildconfiguration.h"
+#include "deployconfiguration.h"
+#include "namedwidget.h"
+
 #include <utils/detailswidget.h>
 
 QT_BEGIN_NAMESPACE
@@ -49,10 +51,6 @@ class BuildConfiguration;
 
 namespace Internal {
 
-namespace Ui {
-    class BuildStepsPage;
-}
-
 struct BuildStepsWidgetStruct
 {
     BuildStepConfigWidget *widget;
@@ -62,16 +60,15 @@ struct BuildStepsWidgetStruct
     QToolButton *removeButton;
 };
 
-class BuildStepsPage : public BuildConfigWidget
+class BuildStepListWidget : public NamedWidget
 {
     Q_OBJECT
 
 public:
-    explicit BuildStepsPage(Target *target, BuildStep::Type type);
-    virtual ~BuildStepsPage();
+    BuildStepListWidget(QWidget *parent = 0);
+    virtual ~BuildStepListWidget();
 
-    QString displayName() const;
-    void init(BuildConfiguration *bc);
+    void init(BuildStepList *bsl);
 
 private slots:
     void updateAddBuildStepMenu();
@@ -86,11 +83,10 @@ private:
     void updateBuildStepButtonsState();
     void addBuildStepWidget(int pos, BuildStep *step);
 
-    BuildConfiguration * m_configuration;
+    BuildStepList *m_buildStepList;
     QHash<QAction *, QPair<QString, ProjectExplorer::IBuildStepFactory *> > m_addBuildStepHash;
-    BuildStep::Type m_type;
 
-    QList<BuildStepsWidgetStruct> m_buildSteps;
+    QList<Internal::BuildStepsWidgetStruct> m_buildSteps;
 
     QVBoxLayout *m_vbox;
 
@@ -104,6 +100,37 @@ private:
     int m_leftMargin;
 };
 
+namespace Ui {
+    class BuildStepsPage;
+}
+
+class BuildStepsPage : public BuildConfigWidget
+{
+    Q_OBJECT
+
+public:
+    BuildStepsPage(Target *target, const QString &id);
+    virtual ~BuildStepsPage();
+
+    QString displayName() const;
+    void init(BuildConfiguration *bc);
+
+private:
+    QString m_id;
+    BuildStepListWidget *m_widget;
+};
+
+class DeployConfigurationStepsWidget : public DeployConfigurationWidget
+{
+public:
+    explicit DeployConfigurationStepsWidget(QWidget *parent = 0);
+
+    void init(DeployConfiguration *dc);
+
+private:
+    BuildStepListWidget *m_widget;
+};
+
 } // Internal
 } // ProjectExplorer
 
diff --git a/src/plugins/projectexplorer/deployconfiguration.cpp b/src/plugins/projectexplorer/deployconfiguration.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..175ff45fcf4d1ab860a0e66484563cb28a58728c
--- /dev/null
+++ b/src/plugins/projectexplorer/deployconfiguration.cpp
@@ -0,0 +1,203 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "deployconfiguration.h"
+
+#include "buildmanager.h"
+#include "buildsteplist.h"
+#include "buildstepspage.h"
+#include "projectexplorer.h"
+#include "projectexplorerconstants.h"
+#include "target.h"
+
+using namespace ProjectExplorer;
+
+namespace {
+
+const char * const BUILD_STEP_LIST_COUNT("ProjectExplorer.BuildConfiguration.BuildStepListCount");
+const char * const BUILD_STEP_LIST_PREFIX("ProjectExplorer.BuildConfiguration.BuildStepList.");
+
+} // namespace
+
+DeployConfiguration::DeployConfiguration(Target *target, const QString &id) :
+    ProjectConfiguration(target, id),
+    m_stepList(0)
+{
+    Q_ASSERT(target);
+    m_stepList = new BuildStepList(this, QLatin1String(Constants::BUILDSTEPS_DEPLOY));
+    //: Display name of the deploy build step list. Used as part of the labels in the project window.
+    m_stepList->setDisplayName(tr("Deploy"));
+    setDisplayName(tr("No deployment"));
+}
+
+DeployConfiguration::DeployConfiguration(Target *target, DeployConfiguration *source) :
+    ProjectConfiguration(target, source)
+{
+    Q_ASSERT(target);
+    // Do not clone stepLists here, do that in the derived constructor instead
+    // otherwise BuildStepFactories might reject to set up a BuildStep for us
+    // since we are not yet the derived class!
+}
+
+DeployConfiguration::~DeployConfiguration()
+{
+    delete m_stepList;
+}
+
+BuildStepList *DeployConfiguration::stepList() const
+{
+    return m_stepList;
+}
+
+QVariantMap DeployConfiguration::toMap() const
+{
+    QVariantMap map(ProjectConfiguration::toMap());
+    map.insert(QLatin1String(BUILD_STEP_LIST_COUNT), 1);
+    map.insert(QLatin1String(BUILD_STEP_LIST_PREFIX) % QLatin1String("0"), m_stepList->toMap());
+
+    return map;
+}
+
+DeployConfigurationWidget *DeployConfiguration::configurationWidget() const
+{
+    return 0;
+}
+
+bool DeployConfiguration::fromMap(const QVariantMap &map)
+{
+    if (!ProjectConfiguration::fromMap(map))
+        return false;
+
+    int maxI = map.value(QLatin1String(BUILD_STEP_LIST_COUNT), 0).toInt();
+    Q_ASSERT(maxI == 1);
+    QVariantMap data = map.value(QLatin1String(BUILD_STEP_LIST_PREFIX) % QLatin1String("0")).toMap();
+    if (!data.isEmpty()) {
+        m_stepList = new BuildStepList(this, data);
+        if (m_stepList->isNull()) {
+            qWarning() << "Failed to restore deploy step list";
+            delete m_stepList;
+            m_stepList = 0;
+            return false;
+        }
+    } else {
+        qWarning() << "No data for deploy step list found!";
+    }
+
+    // TODO: We assume that we have hold the deploy list
+    Q_ASSERT(m_stepList && m_stepList->id() == QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY));
+
+    return true;
+}
+
+Target *DeployConfiguration::target() const
+{
+    return static_cast<Target *>(parent());
+}
+
+void DeployConfiguration::cloneSteps(DeployConfiguration *source)
+{
+    if (source == this)
+        return;
+    delete m_stepList;
+    m_stepList = new BuildStepList(this, source->stepList());
+}
+
+///
+// DeployConfigurationFactory
+///
+
+DeployConfigurationFactory::DeployConfigurationFactory(QObject *parent) :
+    QObject(parent)
+{ }
+
+DeployConfigurationFactory::~DeployConfigurationFactory()
+{ }
+
+QStringList DeployConfigurationFactory::availableCreationIds(Target *parent) const
+{
+    Q_UNUSED(parent);
+    return QStringList() << QLatin1String(Constants::DEFAULT_DEPLOYCONFIGURATION_ID);
+}
+
+QString DeployConfigurationFactory::displayNameForId(const QString &id) const
+{
+    if (id == QLatin1String(Constants::DEFAULT_DEPLOYCONFIGURATION_ID))
+        //: Display name of the default deploy configuration
+        return tr("Deploy Configuration");
+    return QString();
+}
+
+bool DeployConfigurationFactory::canCreate(Target *parent, const QString &id) const
+{
+    Q_UNUSED(parent);
+    return id == QLatin1String(Constants::DEFAULT_DEPLOYCONFIGURATION_ID);
+}
+
+DeployConfiguration *DeployConfigurationFactory::create(Target *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+    return new DeployConfiguration(parent, id);
+}
+
+bool DeployConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
+{
+    return canCreate(parent, idFromMap(map));
+}
+
+DeployConfiguration *DeployConfigurationFactory::restore(Target *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+    DeployConfiguration *dc = new DeployConfiguration(parent, idFromMap(map));
+    if (!dc->fromMap(map)) {
+        delete dc;
+        return 0;
+    }
+    return dc;
+}
+
+bool DeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *product) const
+{
+    return canCreate(parent, product->id());
+}
+
+DeployConfiguration *DeployConfigurationFactory::clone(Target *parent, DeployConfiguration *product)
+{
+    if (!canClone(parent, product))
+        return 0;
+    return new DeployConfiguration(parent, product);
+}
+
+///
+// DeployConfigurationWidget
+///
+
+DeployConfigurationWidget::DeployConfigurationWidget(QWidget *parent) : NamedWidget(parent)
+{ }
diff --git a/src/plugins/projectexplorer/deployconfiguration.h b/src/plugins/projectexplorer/deployconfiguration.h
new file mode 100644
index 0000000000000000000000000000000000000000..95dca80f8d8e60856fb2534b7312b955f01e51db
--- /dev/null
+++ b/src/plugins/projectexplorer/deployconfiguration.h
@@ -0,0 +1,122 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef PROJECTEXPLORER_DEPLOYCONFIGURATION_H
+#define PROJECTEXPLORER_DEPLOYCONFIGURATION_H
+
+#include "projectexplorer_export.h"
+#include "environment.h"
+#include "namedwidget.h"
+
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QList>
+#include <QtCore/QObject>
+
+#include "projectconfiguration.h"
+
+namespace ProjectExplorer {
+
+class BuildStepList;
+class Target;
+class DeployConfigurationFactory;
+class DeployConfigurationWidget;
+
+class PROJECTEXPLORER_EXPORT DeployConfiguration : public ProjectConfiguration
+{
+    Q_OBJECT
+
+public:
+    // ctors are protected
+    virtual ~DeployConfiguration();
+
+    BuildStepList *stepList() const;
+
+    virtual QVariantMap toMap() const;
+
+    virtual DeployConfigurationWidget *configurationWidget() const;
+
+    Target *target() const;
+
+protected:
+    DeployConfiguration(Target *target, const QString &id);
+    DeployConfiguration(Target *target, DeployConfiguration *source);
+
+    void cloneSteps(DeployConfiguration *source);
+
+    virtual bool fromMap(const QVariantMap &map);
+
+private:
+    friend class DeployConfigurationFactory;
+
+    BuildStepList *m_stepList;
+};
+
+class PROJECTEXPLORER_EXPORT DeployConfigurationFactory :
+    public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit DeployConfigurationFactory(QObject *parent = 0);
+    virtual ~DeployConfigurationFactory();
+
+    // used to show the list of possible additons to a target, returns a list of types
+    virtual QStringList availableCreationIds(Target *parent) const;
+    // used to translate the types to names to display to the user
+    virtual QString displayNameForId(const QString &id) const;
+
+    virtual bool canCreate(Target *parent, const QString &id) const;
+    virtual DeployConfiguration *create(Target *parent, const QString &id);
+    // used to recreate the runConfigurations when restoring settings
+    virtual bool canRestore(Target *parent, const QVariantMap &map) const;
+    virtual DeployConfiguration *restore(Target *parent, const QVariantMap &map);
+    virtual bool canClone(Target *parent, DeployConfiguration *product) const;
+    virtual DeployConfiguration *clone(Target *parent, DeployConfiguration *product);
+
+signals:
+    void availableCreationIdsChanged();
+};
+
+class PROJECTEXPLORER_EXPORT DeployConfigurationWidget : public NamedWidget
+{
+    Q_OBJECT
+
+public:
+    explicit DeployConfigurationWidget(QWidget *parent = 0);
+
+    // This is called to set up the config widget before showing it
+    virtual void init(DeployConfiguration *dc) = 0;
+};
+
+} // namespace ProjectExplorer
+
+Q_DECLARE_METATYPE(ProjectExplorer::DeployConfiguration *);
+
+#endif // PROJECTEXPLORER_DEPLOYCONFIGURATION_H
diff --git a/src/plugins/projectexplorer/deployconfigurationmodel.cpp b/src/plugins/projectexplorer/deployconfigurationmodel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..301364f2fd9b81d9522a1aa273d85668c45aad9e
--- /dev/null
+++ b/src/plugins/projectexplorer/deployconfigurationmodel.cpp
@@ -0,0 +1,181 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "deployconfigurationmodel.h"
+#include "target.h"
+#include "deployconfiguration.h"
+
+using namespace ProjectExplorer;
+
+///
+/// DeployConfigurationsModel
+///
+
+class DeployConfigurationComparer
+{
+public:
+    bool operator()(DeployConfiguration *a, DeployConfiguration *b)
+    {
+        return a->displayName() < b->displayName();
+    }
+};
+
+DeployConfigurationModel::DeployConfigurationModel(Target *target, QObject *parent)
+    : QAbstractListModel(parent),
+      m_target(target)
+{
+    m_deployConfigurations = m_target->deployConfigurations();
+    qSort(m_deployConfigurations.begin(), m_deployConfigurations.end(), DeployConfigurationComparer());
+
+    connect(target, SIGNAL(addedDeployConfiguration(ProjectExplorer::DeployConfiguration*)),
+            this, SLOT(addedDeployConfiguration(ProjectExplorer::DeployConfiguration*)));
+    connect(target, SIGNAL(removedDeployConfiguration(ProjectExplorer::DeployConfiguration*)),
+            this, SLOT(removedDeployConfiguration(ProjectExplorer::DeployConfiguration*)));
+
+    foreach (DeployConfiguration *dc, m_deployConfigurations)
+        connect(dc, SIGNAL(displayNameChanged()),
+                this, SLOT(displayNameChanged()));
+}
+
+int DeployConfigurationModel::rowCount(const QModelIndex &parent) const
+{
+    return parent.isValid() ? 0 : m_deployConfigurations.size();
+}
+
+int DeployConfigurationModel::columnCount(const QModelIndex &parent) const
+{
+    return parent.isValid() ? 0 : 1;
+}
+
+void DeployConfigurationModel::displayNameChanged()
+{
+    DeployConfiguration *dc = qobject_cast<DeployConfiguration *>(sender());
+    if (!dc)
+        return;
+
+    DeployConfigurationComparer compare;
+    // Find the old position
+    int oldPos = m_deployConfigurations.indexOf(dc);
+
+    if (oldPos >= 1 && compare(m_deployConfigurations.at(oldPos), m_deployConfigurations.at(oldPos - 1))) {
+        // We need to move up
+        int newPos = oldPos - 1;
+        while (newPos >= 0 && compare(m_deployConfigurations.at(oldPos), m_deployConfigurations.at(newPos))) {
+            --newPos;
+        }
+        ++newPos;
+
+        beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos);
+        m_deployConfigurations.insert(newPos, dc);
+        m_deployConfigurations.removeAt(oldPos + 1);
+        endMoveRows();
+        // Not only did we move, we also changed...
+        emit dataChanged(index(newPos, 0), index(newPos,0));
+    } else if (oldPos < m_deployConfigurations.size() - 1
+               && compare(m_deployConfigurations.at(oldPos + 1), m_deployConfigurations.at(oldPos))) {
+        // We need to move down
+        int newPos = oldPos + 1;
+        while (newPos < m_deployConfigurations.size()
+            && compare(m_deployConfigurations.at(newPos), m_deployConfigurations.at(oldPos))) {
+            ++newPos;
+        }
+        beginMoveRows(QModelIndex(), oldPos, oldPos, QModelIndex(), newPos);
+        m_deployConfigurations.insert(newPos, dc);
+        m_deployConfigurations.removeAt(oldPos);
+        endMoveRows();
+
+        // We need to subtract one since removing at the old place moves the newIndex down
+        emit dataChanged(index(newPos - 1, 0), index(newPos - 1, 0));
+    } else {
+        emit dataChanged(index(oldPos, 0), index(oldPos, 0));
+    }
+}
+
+QVariant DeployConfigurationModel::data(const QModelIndex &index, int role) const
+{
+    if (role == Qt::DisplayRole) {
+        const int row = index.row();
+        if (row < m_deployConfigurations.size()) {
+            return m_deployConfigurations.at(row)->displayName();
+        }
+    }
+
+    return QVariant();
+}
+
+DeployConfiguration *DeployConfigurationModel::deployConfigurationAt(int i)
+{
+    if (i > m_deployConfigurations.size() || i < 0)
+        return 0;
+    return m_deployConfigurations.at(i);
+}
+
+DeployConfiguration *DeployConfigurationModel::deployConfigurationFor(const QModelIndex &idx)
+{
+    if (idx.row() > m_deployConfigurations.size() || idx.row() < 0)
+        return 0;
+    return m_deployConfigurations.at(idx.row());
+}
+
+QModelIndex DeployConfigurationModel::indexFor(DeployConfiguration *rc)
+{
+    int idx = m_deployConfigurations.indexOf(rc);
+    if (idx == -1)
+        return QModelIndex();
+    return index(idx, 0);
+}
+
+void DeployConfigurationModel::addedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc)
+{
+    // Find the right place to insert
+    DeployConfigurationComparer compare;
+    int i = 0;
+    for (; i < m_deployConfigurations.size(); ++i) {
+        if (compare(dc, m_deployConfigurations.at(i))) {
+            break;
+        }
+    }
+
+    beginInsertRows(QModelIndex(), i, i);
+    m_deployConfigurations.insert(i, dc);
+    endInsertRows();
+
+    connect(dc, SIGNAL(displayNameChanged()),
+            this, SLOT(displayNameChanged()));
+}
+
+void DeployConfigurationModel::removedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc)
+{
+    int i = m_deployConfigurations.indexOf(dc);
+    if (i < 0)
+        return;
+    beginRemoveRows(QModelIndex(), i, i);
+    m_deployConfigurations.removeAt(i);
+    endRemoveRows();
+}
diff --git a/src/plugins/projectexplorer/deployconfigurationmodel.h b/src/plugins/projectexplorer/deployconfigurationmodel.h
new file mode 100644
index 0000000000000000000000000000000000000000..26f553470995ec420998dfc0d92bfe0b8b7a1e6e
--- /dev/null
+++ b/src/plugins/projectexplorer/deployconfigurationmodel.h
@@ -0,0 +1,68 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef PROJECTEXPLORER_DEPLOYCONFIGURATIONMODEL_H
+#define PROJECTEXPLORER_DEPLOYCONFIGURATIONMODEL_H
+
+#include <QtCore/QAbstractItemModel>
+
+namespace ProjectExplorer {
+
+class Target;
+class DeployConfiguration;
+
+/*! A model to represent the run configurations of a target.
+    To be used in for the drop down of comboboxes
+    Does automatically adjust itself to added and removed RunConfigurations
+*/
+class DeployConfigurationModel : public QAbstractListModel
+{
+    Q_OBJECT
+public:
+    DeployConfigurationModel(Target *target, QObject *parent = 0);
+
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    int columnCount(const QModelIndex &parent = QModelIndex()) const;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+    DeployConfiguration *deployConfigurationAt(int i);
+    DeployConfiguration *deployConfigurationFor(const QModelIndex &idx);
+    QModelIndex indexFor(DeployConfiguration *rc);
+private slots:
+    void addedDeployConfiguration(ProjectExplorer::DeployConfiguration*);
+    void removedDeployConfiguration(ProjectExplorer::DeployConfiguration*);
+    void displayNameChanged();
+private:
+    Target *m_target;
+    QList<DeployConfiguration *> m_deployConfigurations;
+};
+
+} // namespace ProjectExplorer
+
+#endif // PROJECTEXPLORER_DEPLOYCONFIGURATIONMODEL_H
diff --git a/src/plugins/projectexplorer/namedwidget.cpp b/src/plugins/projectexplorer/namedwidget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c1b3f565621efdc6a906be3c0034caa38042e679
--- /dev/null
+++ b/src/plugins/projectexplorer/namedwidget.cpp
@@ -0,0 +1,52 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "namedwidget.h"
+
+using namespace ProjectExplorer;
+
+///
+// NamedWidget
+///
+
+NamedWidget::NamedWidget(QWidget *parent) : QWidget(parent)
+{ }
+
+QString NamedWidget::displayName() const
+{
+    return m_displayName;
+}
+
+void NamedWidget::setDisplayName(const QString &displayName)
+{
+    if (m_displayName == displayName)
+        return;
+    m_displayName = displayName;
+    emit displayNameChanged(m_displayName);
+}
diff --git a/src/plugins/projectexplorer/namedwidget.h b/src/plugins/projectexplorer/namedwidget.h
new file mode 100644
index 0000000000000000000000000000000000000000..5e7947c354ba73c9b54f5d433209ec7aeacc7fac
--- /dev/null
+++ b/src/plugins/projectexplorer/namedwidget.h
@@ -0,0 +1,60 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef PROJECTEXPLORER_NAMEDWIDGET_H
+#define PROJECTEXPLORER_NAMEDWIDGET_H
+
+#include "projectexplorer_export.h"
+
+#include <QtGui/QWidget>
+
+namespace ProjectExplorer {
+
+class PROJECTEXPLORER_EXPORT NamedWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    NamedWidget(QWidget *parent = 0);
+
+    QString displayName() const;
+
+signals:
+    void displayNameChanged(const QString &);
+
+protected:
+    void setDisplayName(const QString &displayName);
+
+private:
+    QString m_displayName;
+};
+
+} // namespace ProjectExplorer
+
+#endif // PROJECTEXPLORER_NAMEDWIDGET_H
diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp
index 7254dc59c7c3869f52d7332a87e45adc8bf82a8f..d47a83266d5fc8c10dccc3eeda1ab260d1bf58aa 100644
--- a/src/plugins/projectexplorer/processstep.cpp
+++ b/src/plugins/projectexplorer/processstep.cpp
@@ -50,20 +50,20 @@ const char * const PROCESS_ARGUMENTS_KEY("ProjectExplorer.ProcessStep.Arguments"
 const char * const PROCESS_ENABLED_KEY("ProjectExplorer.ProcessStep.Enabled");
 }
 
-ProcessStep::ProcessStep(BuildConfiguration *bc) :
-    AbstractProcessStep(bc, QLatin1String(PROCESS_STEP_ID))
+ProcessStep::ProcessStep(BuildStepList *bsl) :
+    AbstractProcessStep(bsl, QLatin1String(PROCESS_STEP_ID))
 {
     ctor();
 }
 
-ProcessStep::ProcessStep(BuildConfiguration *bc, const QString &id) :
-    AbstractProcessStep(bc, id)
+ProcessStep::ProcessStep(BuildStepList *bsl, const QString &id) :
+    AbstractProcessStep(bsl, id)
 {
     ctor();
 }
 
-ProcessStep::ProcessStep(BuildConfiguration *bc, ProcessStep *bs) :
-    AbstractProcessStep(bc, bs),
+ProcessStep::ProcessStep(BuildStepList *bsl, ProcessStep *bs) :
+    AbstractProcessStep(bsl, bs),
     m_name(bs->m_name),
     m_command(bs->m_command),
     m_arguments(bs->m_arguments),
@@ -85,16 +85,17 @@ ProcessStep::~ProcessStep()
 
 bool ProcessStep::init()
 {
-    setEnvironment(buildConfiguration()->environment());
+    BuildConfiguration *bc = buildConfiguration();
+    setEnvironment(bc->environment());
     QString wd = workingDirectory();
     if (wd.isEmpty())
         wd = "$BUILDDIR";
 
-    AbstractProcessStep::setWorkingDirectory(wd.replace("$BUILDDIR", buildConfiguration()->buildDirectory()));
+    AbstractProcessStep::setWorkingDirectory(wd.replace("$BUILDDIR", bc->buildDirectory()));
     AbstractProcessStep::setCommand(m_command);
     AbstractProcessStep::setEnabled(m_enabled);
     AbstractProcessStep::setArguments(m_arguments);
-    setOutputParser(buildConfiguration()->createOutputParser());
+    setOutputParser(bc->createOutputParser());
     return AbstractProcessStep::init();
 }
 
@@ -185,41 +186,40 @@ ProcessStepFactory::~ProcessStepFactory()
 {
 }
 
-bool ProcessStepFactory::canCreate(BuildConfiguration *parent, BuildStep::Type type, const QString &id) const
+bool ProcessStepFactory::canCreate(BuildStepList *parent, const QString &id) const
 {
     Q_UNUSED(parent);
-    Q_UNUSED(type);
     return id == QLatin1String(PROCESS_STEP_ID);
 }
 
-BuildStep *ProcessStepFactory::create(BuildConfiguration *parent, BuildStep::Type type, const QString &id)
+BuildStep *ProcessStepFactory::create(BuildStepList *parent, const QString &id)
 {
-    if (!canCreate(parent, type, id))
+    if (!canCreate(parent, id))
         return 0;
     return new ProcessStep(parent);
 }
 
-bool ProcessStepFactory::canClone(BuildConfiguration *parent, BuildStep::Type type, BuildStep *bs) const
+bool ProcessStepFactory::canClone(BuildStepList *parent, BuildStep *bs) const
 {
-    return canCreate(parent, type, bs->id());
+    return canCreate(parent, bs->id());
 }
 
-BuildStep *ProcessStepFactory::clone(BuildConfiguration *parent, BuildStep::Type type, BuildStep *bs)
+BuildStep *ProcessStepFactory::clone(BuildStepList *parent, BuildStep *bs)
 {
-    if (!canClone(parent, type, bs))
+    if (!canClone(parent, bs))
         return 0;
     return new ProcessStep(parent, static_cast<ProcessStep *>(bs));
 }
 
-bool ProcessStepFactory::canRestore(BuildConfiguration *parent, BuildStep::Type type, const QVariantMap &map) const
+bool ProcessStepFactory::canRestore(BuildStepList *parent, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-BuildStep *ProcessStepFactory::restore(BuildConfiguration *parent, BuildStep::Type type, const QVariantMap &map)
+BuildStep *ProcessStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
 {
-    if (!canRestore(parent, type, map))
+    if (!canRestore(parent, map))
         return 0;
 
     ProcessStep *bs(new ProcessStep(parent));
@@ -229,10 +229,9 @@ BuildStep *ProcessStepFactory::restore(BuildConfiguration *parent, BuildStep::Ty
     return 0;
 }
 
-QStringList ProcessStepFactory::availableCreationIds(BuildConfiguration *parent, BuildStep::Type type) const
+QStringList ProcessStepFactory::availableCreationIds(BuildStepList *parent) const
 {
     Q_UNUSED(parent);
-    Q_UNUSED(type);
     return QStringList() << QLatin1String(PROCESS_STEP_ID);
 }
 QString ProcessStepFactory::displayNameForId(const QString &id) const
diff --git a/src/plugins/projectexplorer/processstep.h b/src/plugins/projectexplorer/processstep.h
index 62358cbf80b222d4e9b971550a666593e6e2c1bb..b2525d024ffa169e1b83324b516ab6d09a6a6f9a 100644
--- a/src/plugins/projectexplorer/processstep.h
+++ b/src/plugins/projectexplorer/processstep.h
@@ -46,15 +46,15 @@ public:
     ProcessStepFactory();
     ~ProcessStepFactory();
 
-    virtual QStringList availableCreationIds(BuildConfiguration *parent, BuildStep::Type type) const;
+    virtual QStringList availableCreationIds(BuildStepList *parent) const;
     virtual QString displayNameForId(const QString &id) const;
 
-    virtual bool canCreate(BuildConfiguration *parent, BuildStep::Type type, const QString &id) const;
-    virtual BuildStep *create(BuildConfiguration *parent, BuildStep::Type type, const QString &id);
-    virtual bool canRestore(BuildConfiguration *parent, BuildStep::Type type, const QVariantMap &map) const;
-    virtual BuildStep *restore(BuildConfiguration *parent, BuildStep::Type type, const QVariantMap &map);
-    virtual bool canClone(BuildConfiguration *parent, BuildStep::Type type, BuildStep *product) const;
-    virtual BuildStep *clone(BuildConfiguration *parent, BuildStep::Type type, BuildStep *product);
+    virtual bool canCreate(BuildStepList *parent, const QString &id) const;
+    virtual BuildStep *create(BuildStepList *parent, const QString &id);
+    virtual bool canRestore(BuildStepList *parent, const QVariantMap &map) const;
+    virtual BuildStep *restore(BuildStepList *parent, const QVariantMap &map);
+    virtual bool canClone(BuildStepList *parent, BuildStep *product) const;
+    virtual BuildStep *clone(BuildStepList *parent, BuildStep *product);
 };
 
 class ProcessStep : public ProjectExplorer::AbstractProcessStep
@@ -63,7 +63,7 @@ class ProcessStep : public ProjectExplorer::AbstractProcessStep
     friend class ProcessStepFactory;
 
 public:
-    explicit ProcessStep(BuildConfiguration *bc);
+    explicit ProcessStep(BuildStepList *bsl);
     virtual ~ProcessStep();
 
     virtual bool init();
@@ -85,8 +85,8 @@ public:
     QVariantMap toMap() const;
 
 protected:
-    ProcessStep(BuildConfiguration *bc, ProcessStep *bs);
-    ProcessStep(BuildConfiguration *bc, const QString &id);
+    ProcessStep(BuildStepList *bsl, ProcessStep *bs);
+    ProcessStep(BuildStepList *bsl, const QString &id);
 
     bool fromMap(const QVariantMap &map);
 
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 12c47ee454bcf6fd0e197efe9df62cef204a1808..ae819f35041047bd89e229a3d630b255f4e75712 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -40,8 +40,6 @@
 #include <extensionsystem/pluginmanager.h>
 #include <utils/qtcassert.h>
 
-#include <QtCore/QDebug>
-
 using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
@@ -51,6 +49,7 @@ const char * const TARGET_KEY_PREFIX("ProjectExplorer.Project.Target.");
 const char * const TARGET_COUNT_KEY("ProjectExplorer.Project.TargetCount");
 
 const char * const EDITOR_SETTINGS_KEY("ProjectExplorer.Project.EditorSettings");
+
 } // namespace
 
 // -------------------------------------------------------------------------
diff --git a/src/plugins/projectexplorer/projectconfiguration.cpp b/src/plugins/projectexplorer/projectconfiguration.cpp
index ca8c0f7c1aff66600ed00940646084e1fa57fff3..4c76cf953101728f9596ec25175fd0336a01426f 100644
--- a/src/plugins/projectexplorer/projectconfiguration.cpp
+++ b/src/plugins/projectexplorer/projectconfiguration.cpp
@@ -36,23 +36,23 @@ const char * const CONFIGURATION_ID_KEY("ProjectExplorer.ProjectConfiguration.Id
 const char * const DISPLAY_NAME_KEY("ProjectExplorer.ProjectConfiguration.DisplayName");
 }
 
-ProjectConfiguration::ProjectConfiguration(const QString &id) :
+ProjectConfiguration::ProjectConfiguration(QObject *parent, const QString &id) :
+    QObject(parent),
     m_id(id)
 {
     Q_ASSERT(!m_id.isEmpty());
 }
 
-ProjectConfiguration::ProjectConfiguration(ProjectConfiguration *config)
+ProjectConfiguration::ProjectConfiguration(QObject *parent, const ProjectConfiguration *source) :
+    QObject(parent)
 {
-    Q_ASSERT(config);
-    m_id = config->m_id;
-    m_displayName = tr("Clone of %1").arg(config->displayName());
-    Q_ASSERT(!m_id.isEmpty());
+    Q_ASSERT(source);
+    m_id = source->m_id;
+    m_displayName = tr("Clone of %1").arg(source->displayName());
 }
 
 ProjectConfiguration::~ProjectConfiguration()
-{
-}
+{ }
 
 QString ProjectConfiguration::id() const
 {
diff --git a/src/plugins/projectexplorer/projectconfiguration.h b/src/plugins/projectexplorer/projectconfiguration.h
index 21bb41d39a930df4d3c3b1f003e630a0787ce90c..4de8fcc8698e654457986e890785eb1400ee9325 100644
--- a/src/plugins/projectexplorer/projectconfiguration.h
+++ b/src/plugins/projectexplorer/projectconfiguration.h
@@ -59,13 +59,15 @@ signals:
     void displayNameChanged();
 
 protected:
-    ProjectConfiguration(const QString &id);
-    ProjectConfiguration(ProjectConfiguration *config);
+    ProjectConfiguration(QObject *parent, const QString &id);
+    ProjectConfiguration(QObject *parent, const ProjectConfiguration *source);
 
     // Note: Make sure subclasses call the superclasses toMap() method!
     virtual bool fromMap(const QVariantMap &map);
 
 private:
+    Q_DISABLE_COPY(ProjectConfiguration)
+
     QString m_id;
     QString m_displayName;
 };
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 2b5a1ea591ac1768a07c0961a23da49f83aa76d9..64ae1cb37820080389cb0d930f6bdc554d29928c 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -29,6 +29,8 @@
 
 #include "projectexplorer.h"
 
+#include "buildsteplist.h"
+#include "deployconfiguration.h"
 #include "project.h"
 #include "projectexplorersettings.h"
 #include "target.h"
@@ -1482,221 +1484,141 @@ bool ProjectExplorerPlugin::saveModifiedFiles()
 //NBS handle case where there is no activeBuildConfiguration
 // because someone delete all build configurations
 
-void ProjectExplorerPlugin::buildProjectOnly()
+void ProjectExplorerPlugin::deploy(QList<Project *> projects)
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::buildProjectOnly";
-
-    if (saveModifiedFiles())
-        buildManager()->buildProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
+    QStringList steps;
+    if (d->m_projectExplorerSettings.buildBeforeDeploy)
+        steps << Constants::BUILDSTEPS_BUILD;
+    steps << Constants::BUILDSTEPS_DEPLOY;
+    queue(projects, steps);
 }
 
-void ProjectExplorerPlugin::buildProject()
+int ProjectExplorerPlugin::queue(QList<Project *> projects, QStringList stepIds)
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::buildProject";
+    if (debug) {
+        QStringList projectNames;
+        foreach (Project *p, projects)
+            projectNames << p->displayName();
+        qDebug() << "Building" << stepIds << "for projects" << projectNames;
+    }
 
-    if (saveModifiedFiles()) {
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, d->m_session->projectOrder(session()->startupProject()))
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
+    if (!saveModifiedFiles())
+        return -1;
 
-        d->m_buildManager->buildProjects(configurations);
+    QList<BuildStepList *> stepLists;
+    foreach (Project *pro, projects) {
+        if (!pro || !pro->activeTarget())
+            continue;
+        foreach (const QString id, stepIds) {
+            BuildStepList *bsl = 0;
+            if (id == QLatin1String(Constants::BUILDSTEPS_DEPLOY)
+                && pro->activeTarget()->activeDeployConfiguration())
+                bsl = pro->activeTarget()->activeDeployConfiguration()->stepList();
+            else if (pro->activeTarget()->activeBuildConfiguration())
+                bsl = pro->activeTarget()->activeBuildConfiguration()->stepList(id);
+
+            if (!bsl || bsl->isEmpty())
+                continue;
+            stepLists << bsl;
+        }
     }
+
+    if (stepLists.isEmpty())
+        return 0;
+    if (!d->m_buildManager->buildLists(stepLists))
+        return -1;
+    return stepLists.count();
 }
 
-void ProjectExplorerPlugin::buildProjectContextMenu()
+void ProjectExplorerPlugin::buildProjectOnly()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::buildProjectContextMenu";
+    queue(QList<Project *>() << session()->startupProject(), QStringList() << Constants::BUILDSTEPS_BUILD);
+}
 
-    if (saveModifiedFiles()) {
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, d->m_session->projectOrder(d->m_currentProject))
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
+void ProjectExplorerPlugin::buildProject()
+{
+    queue(d->m_session->projectOrder(session()->startupProject()),
+          QStringList() << Constants::BUILDSTEPS_BUILD);
+}
 
-        d->m_buildManager->buildProjects(configurations);
-    }
+void ProjectExplorerPlugin::buildProjectContextMenu()
+{
+    queue(d->m_session->projectOrder(d->m_currentProject),
+          QStringList() << Constants::BUILDSTEPS_BUILD);
 }
 
 void ProjectExplorerPlugin::buildSession()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::buildSession";
-
-    if (saveModifiedFiles()) {
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, d->m_session->projectOrder())
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
-        d->m_buildManager->buildProjects(configurations);
-    }
+    queue(d->m_session->projectOrder(),
+          QStringList() << Constants::BUILDSTEPS_BUILD);
 }
 
 void ProjectExplorerPlugin::rebuildProjectOnly()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::rebuildProjectOnly";
-
-    if (saveModifiedFiles()) {
-        d->m_buildManager->cleanProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
-        d->m_buildManager->buildProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
-    }
+    queue(QList<Project *>() << session()->startupProject(),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_BUILD);
 }
 
 void ProjectExplorerPlugin::rebuildProject()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::rebuildProject";
-
-    if (saveModifiedFiles()) {
-        const QList<Project *> &projects = d->m_session->projectOrder(session()->startupProject());
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, projects)
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
-
-        d->m_buildManager->cleanProjects(configurations);
-        d->m_buildManager->buildProjects(configurations);
-    }
+    queue(d->m_session->projectOrder(session()->startupProject()),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_BUILD);
 }
 
 void ProjectExplorerPlugin::rebuildProjectContextMenu()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::rebuildProjectContextMenu";
-
-    if (saveModifiedFiles()) {
-        const QList<Project *> &projects = d->m_session->projectOrder(d->m_currentProject);
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, projects)
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
-
-        d->m_buildManager->cleanProjects(configurations);
-        d->m_buildManager->buildProjects(configurations);
-    }
+    queue(d->m_session->projectOrder(d->m_currentProject),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_BUILD);
 }
 
 void ProjectExplorerPlugin::rebuildSession()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::rebuildSession";
-
-    if (saveModifiedFiles()) {
-        const QList<Project *> & projects = d->m_session->projectOrder();
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, projects)
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
-
-        d->m_buildManager->cleanProjects(configurations);
-        d->m_buildManager->buildProjects(configurations);
-    }
+    queue(d->m_session->projectOrder(),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_BUILD);
 }
 
 void ProjectExplorerPlugin::deployProjectOnly()
 {
-    if (!saveModifiedFiles())
-        return;
-    d->m_buildManager->deployProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
+    deploy(QList<Project *>() << session()->startupProject());
 }
 
 void ProjectExplorerPlugin::deployProject()
 {
-    if (!saveModifiedFiles())
-        return;
-
-    const QList<Project *> &projects = d->m_session->projectOrder(session()->startupProject());
-    QList<BuildConfiguration *> configurations;
-    foreach (Project *pro, projects)
-        if (pro->activeTarget()->activeBuildConfiguration())
-            configurations << pro->activeTarget()->activeBuildConfiguration();
-
-    d->m_buildManager->deployProjects(configurations);
+    deploy(d->m_session->projectOrder(session()->startupProject()));
 }
 
 void ProjectExplorerPlugin::deployProjectContextMenu()
 {
-    if (!saveModifiedFiles())
-        return;
-
-    QList<BuildConfiguration *> configurations;
-    foreach (Project *pro, d->m_session->projectOrder(d->m_currentProject))
-        if (pro->activeTarget()->activeBuildConfiguration())
-            configurations << pro->activeTarget()->activeBuildConfiguration();
-
-    d->m_buildManager->deployProjects(configurations);
+    deploy(d->m_session->projectOrder(d->m_currentProject));
 }
 
 void ProjectExplorerPlugin::deploySession()
 {
-    if (!saveModifiedFiles())
-        return;
-
-    const QList<Project *> & projects = d->m_session->projectOrder();
-    QList<BuildConfiguration *> configurations;
-    foreach (Project *pro, projects)
-        if (pro->activeTarget()->activeBuildConfiguration())
-            configurations << pro->activeTarget()->activeBuildConfiguration();
-
-    d->m_buildManager->deployProjects(configurations);
+    deploy(d->m_session->projectOrder());
 }
 
 void ProjectExplorerPlugin::cleanProjectOnly()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::cleanProjectOnly";
-
-    if (saveModifiedFiles())
-        d->m_buildManager->cleanProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
+    queue(QList<Project *>() << session()->startupProject(),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_CLEAN);
 }
 
 void ProjectExplorerPlugin::cleanProject()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::cleanProject";
-
-    if (saveModifiedFiles()) {
-        const QList<Project *> & projects = d->m_session->projectOrder(session()->startupProject());
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, projects)
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
-        d->m_buildManager->cleanProjects(configurations);
-    }
+    queue(d->m_session->projectOrder(session()->startupProject()),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_CLEAN);
 }
 
 void ProjectExplorerPlugin::cleanProjectContextMenu()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::cleanProjectContextMenu";
-
-    if (saveModifiedFiles()) {
-        const QList<Project *> & projects = d->m_session->projectOrder(d->m_currentProject);
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, projects)
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
-        d->m_buildManager->cleanProjects(configurations);
-    }
+    queue(d->m_session->projectOrder(d->m_currentProject),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_CLEAN);
 }
 
 void ProjectExplorerPlugin::cleanSession()
 {
-    if (debug)
-        qDebug() << "ProjectExplorerPlugin::cleanSession";
-
-    if (saveModifiedFiles()) {
-        const QList<Project *> & projects = d->m_session->projectOrder();
-        QList<BuildConfiguration *> configurations;
-        foreach (Project *pro, projects)
-            if (pro->activeTarget()->activeBuildConfiguration())
-                configurations << pro->activeTarget()->activeBuildConfiguration();
-        d->m_buildManager->cleanProjects(configurations);
-    }
+    queue(d->m_session->projectOrder(),
+          QStringList() << Constants::BUILDSTEPS_CLEAN << Constants::BUILDSTEPS_CLEAN);
 }
 
 void ProjectExplorerPlugin::runProject()
@@ -1722,8 +1644,8 @@ bool ProjectExplorerPlugin::hasDeploySettings(Project *pro)
 {
     const QList<Project *> & projects = d->m_session->projectOrder(pro);
     foreach(Project *project, projects)
-        if (project->activeTarget()->activeBuildConfiguration() &&
-            !project->activeTarget()->activeBuildConfiguration()->steps(BuildStep::Deploy).isEmpty())
+        if (project->activeTarget()->activeDeployConfiguration() &&
+                !project->activeTarget()->activeDeployConfiguration()->stepList()->isEmpty())
             return true;
     return false;
 }
@@ -1738,32 +1660,20 @@ void ProjectExplorerPlugin::runProjectImpl(Project *pro, QString mode)
             return;
     }
 
-    if (!saveModifiedFiles())
-        return;
-
-    bool delayRun = false;
-    // Deploy/build first?
+    QStringList stepIds;
     if (d->m_projectExplorerSettings.deployBeforeRun) {
-        const QList<Project *> & projects = d->m_session->projectOrder(pro);
-        QList<BuildConfiguration *> configurations;
-        foreach(Project *project, projects)
-            if (project->activeTarget()->activeBuildConfiguration())
-                configurations << project->activeTarget()->activeBuildConfiguration();
-
-        if (d->m_projectExplorerSettings.buildBeforeDeploy && hasBuildSettings(pro)) {
-            if (!d->m_buildManager->buildProjects(configurations))
-                return;
-            delayRun = true;
-        }
-        if (hasDeploySettings(pro)) {
-            if (!d->m_buildManager->deployProjects(configurations))
-                return;
-            delayRun = true;
-        }
+        if (d->m_projectExplorerSettings.buildBeforeDeploy)
+            stepIds << Constants::BUILDSTEPS_BUILD;
+        stepIds << Constants::BUILDSTEPS_DEPLOY;
     }
+    const QList<Project *> &projects = d->m_session->projectOrder(pro);
+    int queueCount = queue(projects, stepIds);
+
+    if (queueCount < 0) // something went wrong
+        return;
 
-    // Actually run (delayed)
-    if (delayRun) {
+    if (queueCount > 0) {
+        // delay running till after our queued steps were processed
         d->m_runMode = mode;
         d->m_delayedRunConfiguration = pro->activeTarget()->activeRunConfiguration();
     } else {
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 973dc53535adfc192a33b76c186d06b0aa2c71d9..20f0098968f1fe3dc416538c5e3dc429a325fe5d 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -207,6 +207,8 @@ private slots:
 #endif
 
 private:
+    void deploy(QList<Project *>);
+    int queue(QList<Project *>, QStringList stepIds);
     void updateContextMenuActions(Node *node);
     bool parseArguments(const QStringList &arguments, QString *error);
     void runProjectImpl(Project *pro, QString mode);
diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro
index d20089a7ee59fae0d32491827a57a7f6283c4b69..42d142824c52677eaa7ec7442f881fad79f3508b 100644
--- a/src/plugins/projectexplorer/projectexplorer.pro
+++ b/src/plugins/projectexplorer/projectexplorer.pro
@@ -13,7 +13,11 @@ HEADERS += projectexplorer.h \
     projectexplorer_export.h \
     projectwindow.h \
     buildmanager.h \
+    buildsteplist.h \
     compileoutputwindow.h \
+    deployconfiguration.h \
+    deployconfigurationmodel.h \
+    namedwidget.h \
     target.h \
     targetsettingspanel.h \
     task.h \
@@ -93,7 +97,11 @@ HEADERS += projectexplorer.h \
 SOURCES += projectexplorer.cpp \
     projectwindow.cpp \
     buildmanager.cpp \
+    buildsteplist.cpp \
     compileoutputwindow.cpp \
+    deployconfiguration.cpp \
+    deployconfigurationmodel.cpp \
+    namedwidget.cpp \
     target.cpp \
     targetsettingspanel.cpp \
     ioutputparser.cpp \
diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h
index e25693ca974ffdef2d7a4b21e749ee580df49a7b..7a5a644492c762bef71ff9009f202bae608c6abb 100644
--- a/src/plugins/projectexplorer/projectexplorerconstants.h
+++ b/src/plugins/projectexplorer/projectexplorerconstants.h
@@ -207,6 +207,14 @@ const char * const PROJECT_WIZARD_CATEGORY = "I.Projects"; // (after Qt)
 const char * const PROJECT_WIZARD_TR_SCOPE = "ProjectExplorer";
 const char * const PROJECT_WIZARD_TR_CATEGORY = QT_TRANSLATE_NOOP("ProjectExplorer", "Other Project");
 
+// Build step lists ids:
+const char * const BUILDSTEPS_CLEAN = "ProjectExplorer.BuildSteps.Clean";
+const char * const BUILDSTEPS_BUILD = "ProjectExplorer.BuildSteps.Build";
+const char * const BUILDSTEPS_DEPLOY = "ProjectExplorer.BuildSteps.Deploy";
+
+// Deploy Configuration id:
+const char * const DEFAULT_DEPLOYCONFIGURATION_ID = "ProjectExplorer.DefaultDeployConfiguration";
+
 } // namespace Constants
 } // namespace ProjectExplorer
 
diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp
index d411ce67cc1ef312430721165ea3665cae2f16a3..7d52e7bdfe197d90f41564238bbf72178ce6773a 100644
--- a/src/plugins/projectexplorer/runconfiguration.cpp
+++ b/src/plugins/projectexplorer/runconfiguration.cpp
@@ -136,17 +136,15 @@ IRunConfigurationFactory * findRunConfigurationFactory(RunConfigurationFactoryMa
 
 // RunConfiguration
 RunConfiguration::RunConfiguration(Target *target, const QString &id) :
-    ProjectConfiguration(id),
-    m_target(target)
+    ProjectConfiguration(target, id)
 {
-    Q_ASSERT(m_target);
+    Q_ASSERT(target);
 }
 
 RunConfiguration::RunConfiguration(Target *target, RunConfiguration *source) :
-    ProjectConfiguration(source),
-    m_target(target)
+    ProjectConfiguration(target, source)
 {
-    Q_ASSERT(m_target);
+    Q_ASSERT(target);
 }
 
 RunConfiguration::~RunConfiguration()
@@ -176,7 +174,7 @@ BuildConfiguration *RunConfiguration::activeBuildConfiguration() const
 
 Target *RunConfiguration::target() const
 {
-    return m_target;
+    return static_cast<Target *>(parent());
 }
 
 ProjectExplorer::OutputFormatter *RunConfiguration::createOutputFormatter() const
diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h
index c1532590f65135d8a0beac9837e16f6e5c4b3e2d..352d6326d28d8cd297414eff488aaf5c2fbfce61 100644
--- a/src/plugins/projectexplorer/runconfiguration.h
+++ b/src/plugins/projectexplorer/runconfiguration.h
@@ -96,9 +96,6 @@ protected:
 
     /// convenience method to get current build configuration.
     BuildConfiguration *activeBuildConfiguration() const;
-
-private:
-    Target *m_target;
 };
 
 /**
diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp
index 624b623ed5dc7ab1885e83c7f73d1b4eb9d8139e..9528b0c644a55d5ac7aa9abf39822809310dd634 100644
--- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp
@@ -28,6 +28,10 @@
 **************************************************************************/
 
 #include "runsettingspropertiespage.h"
+
+#include "buildstepspage.h"
+#include "deployconfiguration.h"
+#include "deployconfigurationmodel.h"
 #include "runconfigurationmodel.h"
 #include "runconfiguration.h"
 #include "target.h"
@@ -39,7 +43,6 @@
 #include <extensionsystem/pluginmanager.h>
 #include <utils/qtcassert.h>
 
-#include <QtCore/QDebug>
 #include <QtCore/QPair>
 #include <QtGui/QMenu>
 
@@ -123,31 +126,64 @@ QIcon RunSettingsPanel::icon() const
 RunSettingsWidget::RunSettingsWidget(Target *target)
     : m_target(target),
       m_runConfigurationsModel(new RunConfigurationModel(target, this)),
+      m_deployConfigurationModel(new DeployConfigurationModel(target, this)),
       m_runConfigurationWidget(0),
+      m_deployConfigurationWidget(0),
+      m_deployLayout(0),
+      m_deploySteps(0),
       m_ignoreChange(false)
 {
     Q_ASSERT(m_target);
 
     m_ui = new Ui::RunSettingsPropertiesPage;
     m_ui->setupUi(this);
-    m_addMenu = new QMenu(m_ui->addToolButton);
-    m_ui->addToolButton->setMenu(m_addMenu);
-    m_ui->addToolButton->setText(tr("Add"));
-    m_ui->removeToolButton->setText(tr("Remove"));
+    m_ui->deployWidget->setContentsMargins(0, 0, 0, 25);
+
+    m_deployLayout = new QVBoxLayout(m_ui->deployWidget);
+    m_deployLayout->setMargin(0);
+    m_deployLayout->setSpacing(5);
+
+    m_ui->deployConfigurationCombo->setModel(m_deployConfigurationModel);
+    m_addDeployMenu = new QMenu(m_ui->addDeployToolButton);
+    m_ui->addDeployToolButton->setMenu(m_addDeployMenu);
+
+    // deploy part
+    updateDeployConfiguration(m_target->activeDeployConfiguration());
+
+    m_ui->addDeployToolButton->setEnabled(m_target->activeDeployConfiguration());
+    m_ui->deployConfigurationCombo->setEnabled(m_target->activeDeployConfiguration());
+    m_ui->removeDeployToolButton->setEnabled(m_target->deployConfigurations().count() > 1);
+
+    connect(m_addDeployMenu, SIGNAL(aboutToShow()),
+            this, SLOT(aboutToShowDeployMenu()));
+    connect(m_ui->deployConfigurationCombo, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(currentDeployConfigurationChanged(int)));
+    connect(m_ui->removeDeployToolButton, SIGNAL(clicked(bool)),
+            this, SLOT(removeDeployConfiguration()));
+
+    connect(m_target, SIGNAL(activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration*)),
+            this, SLOT(activeDeployConfigurationChanged()));
+
+    // run part
+    m_addRunMenu = new QMenu(m_ui->addRunToolButton);
+    m_ui->addRunToolButton->setMenu(m_addRunMenu);
     m_ui->runConfigurationCombo->setModel(m_runConfigurationsModel);
     m_ui->runConfigurationCombo->setCurrentIndex(
             m_runConfigurationsModel->indexFor(m_target->activeRunConfiguration()).row());
 
-    m_ui->removeToolButton->setEnabled(m_target->runConfigurations().size() > 1);
+    m_ui->removeRunToolButton->setEnabled(m_target->runConfigurations().size() > 1);
 
     m_runConfigurationWidget = m_target->activeRunConfiguration()->createConfigurationWidget();
-    layout()->addWidget(m_runConfigurationWidget);
+    QVBoxLayout *runLayout = new QVBoxLayout(m_ui->runWidget);
+    runLayout->setMargin(0);
+    runLayout->setSpacing(0);
+    runLayout->addWidget(m_runConfigurationWidget);
 
-    connect(m_addMenu, SIGNAL(aboutToShow()),
+    connect(m_addRunMenu, SIGNAL(aboutToShow()),
             this, SLOT(aboutToShowAddMenu()));
     connect(m_ui->runConfigurationCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(currentRunConfigurationChanged(int)));
-    connect(m_ui->removeToolButton, SIGNAL(clicked(bool)),
+    connect(m_ui->removeRunToolButton, SIGNAL(clicked(bool)),
             this, SLOT(removeRunConfiguration()));
 
     connect(m_target, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
@@ -170,13 +206,13 @@ RunSettingsWidget::~RunSettingsWidget()
 
 void RunSettingsWidget::aboutToShowAddMenu()
 {
-    m_addMenu->clear();
+    m_addRunMenu->clear();
     QList<IRunConfigurationFactory *> factories =
         ExtensionSystem::PluginManager::instance()->getObjects<IRunConfigurationFactory>();
     foreach (IRunConfigurationFactory *factory, factories) {
         QStringList ids = factory->availableCreationIds(m_target);
         foreach (const QString &id, ids) {
-            QAction *action = m_addMenu->addAction(factory->displayNameForId(id));;
+            QAction *action = m_addRunMenu->addAction(factory->displayNameForId(id));;
             FactoryAndId fai;
             fai.factory = factory;
             fai.id = id;
@@ -200,14 +236,14 @@ void RunSettingsWidget::addRunConfiguration()
         return;
     m_target->addRunConfiguration(newRC);
     m_target->setActiveRunConfiguration(newRC);
-    m_ui->removeToolButton->setEnabled(m_target->runConfigurations().size() > 1);
+    m_ui->removeRunToolButton->setEnabled(m_target->runConfigurations().size() > 1);
 }
 
 void RunSettingsWidget::removeRunConfiguration()
 {
     RunConfiguration *rc = m_target->activeRunConfiguration();
     m_target->removeRunConfiguration(rc);
-    m_ui->removeToolButton->setEnabled(m_target->runConfigurations().size() > 1);
+    m_ui->removeRunToolButton->setEnabled(m_target->runConfigurations().size() > 1);
 }
 
 void RunSettingsWidget::activeRunConfigurationChanged()
@@ -245,3 +281,76 @@ void RunSettingsWidget::currentRunConfigurationChanged(int index)
     m_runConfigurationWidget = selectedRunConfiguration->createConfigurationWidget();
     layout()->addWidget(m_runConfigurationWidget);
 }
+
+void RunSettingsWidget::currentDeployConfigurationChanged(int index)
+{
+    if (index == -1)
+        updateDeployConfiguration(0);
+    else
+        m_target->setActiveDeployConfiguration(m_deployConfigurationModel->deployConfigurationAt(index));
+}
+
+void RunSettingsWidget::aboutToShowDeployMenu()
+{
+    m_addDeployMenu->clear();
+    DeployConfigurationFactory *factory = m_target->deployConfigurationFactory();
+    QStringList ids = factory->availableCreationIds(m_target);
+    foreach (const QString &id, ids) {
+        QAction *action = m_addDeployMenu->addAction(factory->displayNameForId(id));;
+        action->setData(QVariant(id));
+        connect(action, SIGNAL(triggered()),
+                this, SLOT(addDeployConfiguration()));
+    }
+}
+
+void RunSettingsWidget::addDeployConfiguration()
+{
+    QAction *act = qobject_cast<QAction *>(sender());
+    if (!act)
+        return;
+    QString id = act->data().toString();
+    DeployConfiguration *newDc = m_target->deployConfigurationFactory()->create(m_target, id);
+    if (!newDc)
+        return;
+    m_target->addDeployConfiguration(newDc);
+    m_target->setActiveDeployConfiguration(newDc);
+    m_ui->removeDeployToolButton->setEnabled(m_target->deployConfigurations().size() > 1);
+}
+
+void RunSettingsWidget::removeDeployConfiguration()
+{
+    DeployConfiguration *dc = m_target->activeDeployConfiguration();
+    m_target->removeDeployConfiguration(dc);
+    m_ui->removeDeployToolButton->setEnabled(m_target->deployConfigurations().size() > 1);
+}
+
+void RunSettingsWidget::activeDeployConfigurationChanged()
+{
+    updateDeployConfiguration(m_target->activeDeployConfiguration());
+}
+
+void RunSettingsWidget::updateDeployConfiguration(DeployConfiguration *dc)
+{
+    delete m_deployConfigurationWidget;
+    m_deployConfigurationWidget = 0;
+    delete m_deploySteps;
+    m_deploySteps = 0;
+
+    m_ui->deployConfigurationCombo->setCurrentIndex(-1);
+
+    if (!dc)
+        return;
+
+    QModelIndex actDc = m_deployConfigurationModel->indexFor(dc);
+    m_ui->deployConfigurationCombo->setCurrentIndex(actDc.row());
+
+    m_deployConfigurationWidget = dc->configurationWidget();
+    if (m_deployConfigurationWidget) {
+        m_deployConfigurationWidget->init(dc);
+        m_deployLayout->addWidget(m_deployConfigurationWidget);
+    }
+
+    m_deploySteps = new BuildStepListWidget;
+    m_deploySteps->init(dc->stepList());
+    m_deployLayout->addWidget(m_deploySteps);
+}
diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.h b/src/plugins/projectexplorer/runsettingspropertiespage.h
index 5491a2afbdf30cc7b7858358e63147377711c3ba..1ce5c2f5399763c7d6a881fc86070cb1a302b1b7 100644
--- a/src/plugins/projectexplorer/runsettingspropertiespage.h
+++ b/src/plugins/projectexplorer/runsettingspropertiespage.h
@@ -37,11 +37,14 @@
 QT_BEGIN_NAMESPACE
 class QMenu;
 class QLabel;
+class QVBoxLayout;
 QT_END_NAMESPACE
 
 namespace ProjectExplorer {
 
-class RunConfiguration;
+class DeployConfiguration;
+class DeployConfigurationWidget;
+class DeployConfigurationModel;
 class RunConfigurationModel;
 
 namespace Internal {
@@ -53,6 +56,7 @@ class RunSettingsPropertiesPage;
 }
 
 class RunSettingsWidget;
+class BuildStepListWidget;
 
 class RunSettingsPanelFactory : public ITargetPanelFactory
 {
@@ -91,12 +95,24 @@ private slots:
     void addRunConfiguration();
     void removeRunConfiguration();
     void activeRunConfigurationChanged();
+    void currentDeployConfigurationChanged(int index);
+    void aboutToShowDeployMenu();
+    void addDeployConfiguration();
+    void removeDeployConfiguration();
+    void activeDeployConfigurationChanged();
+
 private:
+    void updateDeployConfiguration(DeployConfiguration *);
     Target *m_target;
     RunConfigurationModel *m_runConfigurationsModel;
+    DeployConfigurationModel *m_deployConfigurationModel;
     Ui::RunSettingsPropertiesPage *m_ui;
     QWidget *m_runConfigurationWidget;
-    QMenu *m_addMenu;
+    DeployConfigurationWidget *m_deployConfigurationWidget;
+    QVBoxLayout *m_deployLayout;
+    BuildStepListWidget *m_deploySteps;
+    QMenu *m_addRunMenu;
+    QMenu *m_addDeployMenu;
     bool m_ignoreChange;
 };
 
diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.ui b/src/plugins/projectexplorer/runsettingspropertiespage.ui
index dbd7386597672e538ab6ae039909c450b9080ddd..8b2d408e20c06f8abbd41726c5deda1dd24997c0 100644
--- a/src/plugins/projectexplorer/runsettingspropertiespage.ui
+++ b/src/plugins/projectexplorer/runsettingspropertiespage.ui
@@ -6,79 +6,109 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>480</width>
-    <height>32</height>
+    <width>474</width>
+    <height>191</height>
    </rect>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
+  <layout class="QGridLayout" name="gridLayout">
    <property name="margin">
     <number>0</number>
    </property>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QLabel" name="label">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="text">
-        <string>Run configuration:</string>
-       </property>
-       <property name="buddy">
-        <cstring>runConfigurationCombo</cstring>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QComboBox" name="runConfigurationCombo">
-       <property name="maximumSize">
-        <size>
-         <width>500</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="sizeAdjustPolicy">
-        <enum>QComboBox::AdjustToContents</enum>
-       </property>
-       <property name="minimumContentsLength">
-        <number>15</number>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="addToolButton">
-       <property name="text">
-        <string>+</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QPushButton" name="removeToolButton">
-       <property name="text">
-        <string>-</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>39</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-    </layout>
+   <property name="spacing">
+    <number>6</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QLabel" name="deployLabel">
+     <property name="text">
+      <string>Deployment:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QComboBox" name="deployConfigurationCombo"/>
+   </item>
+   <item row="0" column="2">
+    <widget class="QPushButton" name="addDeployToolButton">
+     <property name="text">
+      <string>Add</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="3">
+    <widget class="QPushButton" name="removeDeployToolButton">
+     <property name="text">
+      <string>Remove</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" colspan="5">
+    <widget class="QWidget" name="deployWidget" native="true"/>
+   </item>
+   <item row="2" column="0">
+    <widget class="QLabel" name="runLabel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Run configuration:</string>
+     </property>
+     <property name="buddy">
+      <cstring>runConfigurationCombo</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <widget class="QComboBox" name="runConfigurationCombo">
+     <property name="maximumSize">
+      <size>
+       <width>500</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="sizeAdjustPolicy">
+      <enum>QComboBox::AdjustToContents</enum>
+     </property>
+     <property name="minimumContentsLength">
+      <number>15</number>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QPushButton" name="addRunToolButton">
+     <property name="text">
+      <string>Add</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3">
+    <widget class="QPushButton" name="removeRunToolButton">
+     <property name="text">
+      <string>Remove</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="4">
+    <spacer name="runHorizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>17</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="3" column="0" colspan="5">
+    <widget class="QWidget" name="runWidget" native="true"/>
    </item>
   </layout>
  </widget>
+ <layoutdefault spacing="0" margin="0"/>
  <resources/>
  <connections/>
 </ui>
diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp
index d12354ae95c26c586f7a7d78e94306f7b03b41fa..e35bf3452a020ee812d6deb1c24109ed459e14ad 100644
--- a/src/plugins/projectexplorer/target.cpp
+++ b/src/plugins/projectexplorer/target.cpp
@@ -30,6 +30,7 @@
 #include "target.h"
 
 #include "buildconfiguration.h"
+#include "deployconfiguration.h"
 #include "project.h"
 #include "runconfiguration.h"
 
@@ -42,6 +43,10 @@ const char * const ACTIVE_BC_KEY("ProjectExplorer.Target.ActiveBuildConfiguratio
 const char * const BC_KEY_PREFIX("ProjectExplorer.Target.BuildConfiguration.");
 const char * const BC_COUNT_KEY("ProjectExplorer.Target.BuildConfigurationCount");
 
+const char * const ACTIVE_DC_KEY("ProjectExplorer.Target.ActiveDeployConfiguration");
+const char * const DC_KEY_PREFIX("ProjectExplorer.Target.DeployConfiguration.");
+const char * const DC_COUNT_KEY("ProjectExplorer.Target.DeployConfigurationCount");
+
 const char * const ACTIVE_RC_KEY("ProjectExplorer.Target.ActiveRunConfiguration");
 const char * const RC_KEY_PREFIX("ProjectExplorer.Target.RunConfiguration.");
 const char * const RC_COUNT_KEY("ProjectExplorer.Target.RunConfigurationCount");
@@ -53,10 +58,10 @@ const char * const RC_COUNT_KEY("ProjectExplorer.Target.RunConfigurationCount");
 // -------------------------------------------------------------------------
 
 Target::Target(Project *project, const QString &id) :
-    ProjectConfiguration(id),
-    m_project(project),
+    ProjectConfiguration(project, id),
     m_isEnabled(true),
     m_activeBuildConfiguration(0),
+    m_activeDeployConfiguration(0),
     m_activeRunConfiguration(0)
 {
 }
@@ -76,7 +81,7 @@ void Target::changeEnvironment()
 
 Project *Target::project() const
 {
-    return m_project;
+    return static_cast<Project *>(parent());
 }
 
 void Target::addBuildConfiguration(BuildConfiguration *configuration)
@@ -148,6 +153,72 @@ void Target::setActiveBuildConfiguration(BuildConfiguration *configuration)
     }
 }
 
+void Target::addDeployConfiguration(DeployConfiguration *dc)
+{
+    QTC_ASSERT(dc && !m_deployConfigurations.contains(dc), return);
+    Q_ASSERT(dc->target() == this);
+
+    if (!deployConfigurationFactory())
+        return;
+
+    // Check that we don't have a configuration with the same displayName
+    QString configurationDisplayName = dc->displayName();
+    QStringList displayNames;
+    foreach (const DeployConfiguration *bc, m_deployConfigurations)
+        displayNames << bc->displayName();
+    configurationDisplayName = Project::makeUnique(configurationDisplayName, displayNames);
+    dc->setDisplayName(configurationDisplayName);
+
+    // add it
+    m_deployConfigurations.push_back(dc);
+
+    emit addedDeployConfiguration(dc);
+
+    if (!m_activeDeployConfiguration)
+        setActiveDeployConfiguration(dc);
+    Q_ASSERT(activeDeployConfiguration());
+}
+
+void Target::removeDeployConfiguration(DeployConfiguration *dc)
+{
+    //todo: this might be error prone
+    if (!m_deployConfigurations.contains(dc))
+        return;
+
+    m_deployConfigurations.removeOne(dc);
+
+    emit removedDeployConfiguration(dc);
+
+    if (activeDeployConfiguration() == dc) {
+        if (m_deployConfigurations.isEmpty())
+            setActiveDeployConfiguration(0);
+        else
+            setActiveDeployConfiguration(m_deployConfigurations.at(0));
+    }
+
+    delete dc;
+}
+
+QList<DeployConfiguration *> Target::deployConfigurations() const
+{
+    return m_deployConfigurations;
+}
+
+DeployConfiguration *Target::activeDeployConfiguration() const
+{
+    return m_activeDeployConfiguration;
+}
+
+void Target::setActiveDeployConfiguration(DeployConfiguration *dc)
+{
+    if ((!dc && m_deployConfigurations.isEmpty()) ||
+        (dc && m_deployConfigurations.contains(dc) &&
+         dc != m_activeDeployConfiguration)) {
+        m_activeDeployConfiguration = dc;
+        emit activeDeployConfigurationChanged(m_activeDeployConfiguration);
+    }
+}
+
 QList<RunConfiguration *> Target::runConfigurations() const
 {
     return m_runConfigurations;
@@ -245,6 +316,12 @@ QVariantMap Target::toMap() const
     for (int i = 0; i < bcs.size(); ++i)
         map.insert(QString::fromLatin1(BC_KEY_PREFIX) + QString::number(i), bcs.at(i)->toMap());
 
+    const QList<DeployConfiguration *> dcs = deployConfigurations();
+    map.insert(QLatin1String(ACTIVE_DC_KEY), dcs.indexOf(m_activeDeployConfiguration));
+    map.insert(QLatin1String(DC_COUNT_KEY), dcs.size());
+    for (int i = 0; i < dcs.size(); ++i)
+        map.insert(QString::fromLatin1(DC_KEY_PREFIX) + QString::number(i), dcs.at(i)->toMap());
+
     const QList<RunConfiguration *> rcs = runConfigurations();
     map.insert(QLatin1String(ACTIVE_RC_KEY), rcs.indexOf(m_activeRunConfiguration));
     map.insert(QLatin1String(RC_COUNT_KEY), rcs.size());
@@ -292,6 +369,29 @@ bool Target::fromMap(const QVariantMap &map)
     if (buildConfigurations().isEmpty() && buildConfigurationFactory())
         return false;
 
+    int dcCount(map.value(QLatin1String(DC_COUNT_KEY), 0).toInt(&ok));
+    if (!ok || dcCount < 0)
+        dcCount = 0;
+    activeConfiguration = map.value(QLatin1String(ACTIVE_DC_KEY), 0).toInt(&ok);
+    if (!ok || activeConfiguration < 0)
+        activeConfiguration = 0;
+    if (0 > activeConfiguration || dcCount < activeConfiguration)
+        activeConfiguration = 0;
+
+    for (int i = 0; i < dcCount; ++i) {
+        const QString key(QString::fromLatin1(DC_KEY_PREFIX) + QString::number(i));
+        if (!map.contains(key))
+            return false;
+        DeployConfiguration *dc(deployConfigurationFactory()->restore(this, map.value(key).toMap()));
+        if (!dc)
+            continue;
+        addDeployConfiguration(dc);
+        if (i == activeConfiguration)
+            setActiveDeployConfiguration(dc);
+    }
+    if (deployConfigurations().isEmpty() && deployConfigurationFactory())
+        return false;
+
     int rcCount(map.value(QLatin1String(RC_COUNT_KEY), 0).toInt(&ok));
     if (!ok || rcCount < 0)
         rcCount = 0;
@@ -330,9 +430,7 @@ bool Target::fromMap(const QVariantMap &map)
 
 ITargetFactory::ITargetFactory(QObject *parent) :
     QObject(parent)
-{
-}
+{ }
 
 ITargetFactory::~ITargetFactory()
-{
-}
+{ }
diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h
index c6c9e722de93bf65067d8278480c571c399154d5..486d80a8b5383dc7b09ae17f7ca2fccec8a6dffd 100644
--- a/src/plugins/projectexplorer/target.h
+++ b/src/plugins/projectexplorer/target.h
@@ -40,7 +40,9 @@ namespace ProjectExplorer {
 class RunConfiguration;
 class Environment;
 class BuildConfiguration;
+class DeployConfiguration;
 class IBuildConfigurationFactory;
+class DeployConfigurationFactory;
 class IRunConfigurationFactory;
 class Project;
 
@@ -63,6 +65,16 @@ public:
 
     virtual IBuildConfigurationFactory *buildConfigurationFactory() const = 0;
 
+    // DeployConfiguration
+    void addDeployConfiguration(DeployConfiguration *dc);
+    void removeDeployConfiguration(DeployConfiguration *dc);
+
+    QList<DeployConfiguration *> deployConfigurations() const;
+    virtual DeployConfiguration *activeDeployConfiguration() const;
+    void setActiveDeployConfiguration(DeployConfiguration *configuration);
+
+    virtual DeployConfigurationFactory *deployConfigurationFactory() const = 0;
+
     // Running
     QList<RunConfiguration *> runConfigurations() const;
     void addRunConfiguration(RunConfiguration *runConfiguration);
@@ -105,6 +117,10 @@ signals:
     void addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc);
     void activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration *);
 
+    void removedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc);
+    void addedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc);
+    void activeDeployConfigurationChanged(ProjectExplorer::DeployConfiguration *dc);
+
     /// convenience signal, emitted if either the active buildconfiguration emits
     /// environmentChanged() or if the active build configuration changes
     void environmentChanged();
@@ -120,7 +136,6 @@ private slots:
     void changeEnvironment();
 
 private:
-    Project *m_project;
     bool m_isEnabled;
     QIcon m_icon;
     QIcon m_overlayIcon;
@@ -128,6 +143,8 @@ private:
 
     QList<BuildConfiguration *> m_buildConfigurations;
     BuildConfiguration *m_activeBuildConfiguration;
+    QList<DeployConfiguration *> m_deployConfigurations;
+    DeployConfiguration *m_activeDeployConfiguration;
     QList<RunConfiguration *> m_runConfigurations;
     RunConfiguration* m_activeRunConfiguration;
 };
diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp
index 2ac2798c6b818740371461b89c1b2dfefbd797da..8ab124ef963111a56d6a462d5a51c957c688daab 100644
--- a/src/plugins/projectexplorer/userfileaccessor.cpp
+++ b/src/plugins/projectexplorer/userfileaccessor.cpp
@@ -184,6 +184,23 @@ public:
     QVariantMap update(Project *project, const QVariantMap &map);
 };
 
+// Version 5 reflects the introduction of new deploy steps for Symbian/Maemo
+class Version6Handler : public UserFileVersionHandler
+{
+public:
+    int userFileVersion() const
+    {
+        return 6;
+    }
+
+    QString displayUserFileVersion() const
+    {
+        return QLatin1String("2.2pre3");
+    }
+
+    QVariantMap update(Project *project, const QVariantMap &map);
+};
+
 //
 // Helper functions:
 //
@@ -256,6 +273,7 @@ UserFileAccessor::UserFileAccessor() :
     addVersionHandler(new Version3Handler);
     addVersionHandler(new Version4Handler);
     addVersionHandler(new Version5Handler);
+    addVersionHandler(new Version6Handler);
 }
 
 UserFileAccessor::~UserFileAccessor()
@@ -1188,3 +1206,109 @@ QVariantMap Version5Handler::update(Project *, const QVariantMap &map)
     }
     return result;
 }
+
+// -------------------------------------------------------------------------
+// Version6Handler
+// -------------------------------------------------------------------------
+
+// Introduce DeployConfiguration and BuildStepLists
+QVariantMap Version6Handler::update(Project *, const QVariantMap &map)
+{
+    QVariantMap result;
+    QMapIterator<QString, QVariant> it(map);
+    while (it.hasNext()) {
+        it.next();
+        const QString &globalKey = it.key();
+        // check for target info
+        if (!globalKey.startsWith(QLatin1String("ProjectExplorer.Project.Target."))) {
+            result.insert(globalKey, it.value());
+            continue;
+        }
+
+        QVariantMap newDc;
+        const QVariantMap &originalTarget = it.value().toMap();
+        QVariantMap newTarget;
+        QVariantMap deploySteps;
+        QString deploymentName = QCoreApplication::translate("ProjectExplorer::UserFileHandler", "No deployment");
+
+        QMapIterator<QString, QVariant> targetIt(originalTarget);
+        while (targetIt.hasNext()) {
+            targetIt.next();
+            const QString &targetKey = targetIt.key();
+
+            if (targetKey == QLatin1String("ProjectExplorer.ProjectConfiguration.Id")) {
+                if (targetIt.value().toString() == QLatin1String("Qt4ProjectManager.Target.MaemoDeviceTarget"))
+                    deploymentName = QCoreApplication::translate("ProjectExplorer::UserFileHandler", "Deploy to Maemo device");
+                else if (targetIt.value().toString() == QLatin1String("Qt4ProjectManager.Target.S60DeviceTarget"))
+                    deploymentName = QCoreApplication::translate("ProjectExplorer::UserFileHandler", "Deploy to Symbian device");
+            }
+
+            if (!targetKey.startsWith(QLatin1String("ProjectExplorer.Target.BuildConfiguration."))) {
+                newTarget.insert(targetKey, targetIt.value());
+                continue;
+            }
+
+            QVariantMap buildSteps;
+            QVariantMap cleanSteps;
+            QVariantMap &originalBc = targetIt.value().toMap();
+            QVariantMap newBc;
+
+            QMapIterator<QString, QVariant> bcIt(originalBc);
+            while (bcIt.hasNext())
+            {
+                bcIt.next();
+                const QString &bcKey = bcIt.key();
+                if (bcKey.startsWith(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStep."))) {
+                    QString position = bcKey.mid(45);
+                    buildSteps.insert(QString::fromLatin1("ProjectExplorer.BuildStepList.Step.") + position, bcIt.value());
+                    continue;
+                }
+                if (bcKey.startsWith(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepsCount"))) {
+                    buildSteps.insert(QLatin1String("ProjectExplorer.BuildStepList.StepsCount"), bcIt.value());
+                    continue;
+                }
+                if (bcKey.startsWith(QLatin1String("ProjectExplorer.BuildConfiguration.CleanStep."))) {
+                    QString position = bcKey.mid(45);
+                    cleanSteps.insert(QString::fromLatin1("ProjectExplorer.BuildStepList.Step.") + position, bcIt.value());
+                    continue;
+                }
+                if (bcKey.startsWith(QLatin1String("ProjectExplorer.BuildConfiguration.CleanStepsCount"))) {
+                    cleanSteps.insert(QLatin1String("ProjectExplorer.BuildStepList.StepsCount"), bcIt.value());
+                    continue;
+                }
+                if (bcKey.startsWith(QLatin1String("ProjectExplorer.BuildConfiguration.DeployStep."))) {
+                    QString position = bcKey.mid(46);
+                    deploySteps.insert(QString::fromLatin1("ProjectExplorer.BuildStepList.Step.") + position, bcIt.value());
+                    continue;
+                }
+                if (bcKey.startsWith(QLatin1String("ProjectExplorer.BuildConfiguration.DeployStepsCount"))) {
+                    deploySteps.insert(QLatin1String("ProjectExplorer.BuildStepList.StepsCount"), bcIt.value());
+                    continue;
+                }
+                newBc.insert(bcKey, bcIt.value());
+            }
+            buildSteps.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"), QLatin1String("Build"));
+            buildSteps.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), QLatin1String("ProjectExplorer.BuildSteps.Build"));
+            cleanSteps.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"), QLatin1String("Clean"));
+            cleanSteps.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), QLatin1String("ProjectExplorer.BuildSteps.Clean"));
+            newBc.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepList.0"), buildSteps);
+            newBc.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepList.1"), cleanSteps);
+            newBc.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepListCount"), 2);
+            newTarget.insert(targetKey, newBc);
+        }
+
+        // Only insert one deploy configuration:
+        deploySteps.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"), QLatin1String("Deploy"));
+        deploySteps.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), QLatin1String("ProjectExplorer.BuildSteps.Deploy"));
+        newDc.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepList.0"), deploySteps);
+        newDc.insert(QLatin1String("ProjectExplorer.BuildConfiguration.BuildStepListCount"), 1);
+        newDc.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName"), deploymentName);
+        newDc.insert(QLatin1String("ProjectExplorer.ProjectConfiguration.Id"), QLatin1String("ProjectExplorer.DefaultDeployConfiguration"));
+
+        newTarget.insert(QLatin1String("ProjectExplorer.Target.DeployConfigurationCount"), 1);
+        newTarget.insert(QLatin1String("ProjectExplorer.Target.ActiveDeployConfiguration"), 0);
+        newTarget.insert(QLatin1String("ProjectExplorer.Target.DeployConfiguration.0"), newDc);
+        result.insert(globalKey, newTarget);
+    }
+    return result;
+}
diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp
index dded039454933c608f6d7c59fedf2b1f2756836a..429a65a9d8310d16daf47183517cae4911b96d29 100644
--- a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp
@@ -63,6 +63,11 @@ ProjectExplorer::IBuildConfigurationFactory *QmlProjectTarget::buildConfiguratio
     return 0;
 }
 
+ProjectExplorer::DeployConfigurationFactory *QmlProjectTarget::deployConfigurationFactory() const
+{
+    return 0;
+}
+
 bool QmlProjectTarget::fromMap(const QVariantMap &map)
 {
     if (!Target::fromMap(map))
diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.h b/src/plugins/qmlprojectmanager/qmlprojecttarget.h
index 83a0e899fb4677d7d07d92d40dbaf1b75863d737..1722a1742b2dc59aeabc2169a78672fcde12ced4 100644
--- a/src/plugins/qmlprojectmanager/qmlprojecttarget.h
+++ b/src/plugins/qmlprojectmanager/qmlprojecttarget.h
@@ -55,6 +55,7 @@ public:
     QmlProject *qmlProject() const;
 
     ProjectExplorer::IBuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
 
 protected:
     bool fromMap(const QVariantMap &map);
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index 94f6500981d51f482c01b6015720e472138afa38..26c6128ea59265426fa878e6cb7d8933ba3383d3 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -35,6 +35,7 @@
 #include "qt4buildconfiguration.h"
 #include "qt4projectmanagerconstants.h"
 
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/gnumakeparser.h>
 #include <projectexplorer/projectexplorer.h>
 #include <extensionsystem/pluginmanager.h>
@@ -55,15 +56,15 @@ const char * const MAKE_COMMAND_KEY("Qt4ProjectManager.MakeStep.MakeCommand");
 const char * const CLEAN_KEY("Qt4ProjectManager.MakeStep.Clean");
 }
 
-MakeStep::MakeStep(ProjectExplorer::BuildConfiguration *bc) :
-    AbstractProcessStep(bc, QLatin1String(MAKESTEP_BS_ID)),
+MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl) :
+    AbstractProcessStep(bsl, QLatin1String(MAKESTEP_BS_ID)),
     m_clean(false)
 {
     ctor();
 }
 
-MakeStep::MakeStep(ProjectExplorer::BuildConfiguration *bc, MakeStep *bs) :
-    AbstractProcessStep(bc, bs),
+MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl, MakeStep *bs) :
+    AbstractProcessStep(bsl, bs),
     m_clean(bs->m_clean),
     m_userArgs(bs->m_userArgs),
     m_makeCmd(bs->m_makeCmd)
@@ -71,8 +72,8 @@ MakeStep::MakeStep(ProjectExplorer::BuildConfiguration *bc, MakeStep *bs) :
     ctor();
 }
 
-MakeStep::MakeStep(ProjectExplorer::BuildConfiguration *bc, const QString &id) :
-    AbstractProcessStep(bc, id),
+MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl, const QString &id) :
+    AbstractProcessStep(bsl, id),
     m_clean(false)
 {
     ctor();
@@ -354,42 +355,41 @@ MakeStepFactory::~MakeStepFactory()
 {
 }
 
-bool MakeStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const
+bool MakeStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const
 {
-    Q_UNUSED(type)
-    if (!qobject_cast<Qt4BuildConfiguration *>(parent))
+    if (parent->target()->project()->id() != QLatin1String(Constants::QT4PROJECT_ID))
         return false;
     return (id == QLatin1String(MAKESTEP_BS_ID));
 }
 
-ProjectExplorer::BuildStep *MakeStepFactory::create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id)
+ProjectExplorer::BuildStep *MakeStepFactory::create(ProjectExplorer::BuildStepList *parent, const QString &id)
 {
-    if (!canCreate(parent, type, id))
+    if (!canCreate(parent, id))
         return 0;
     return new MakeStep(parent);
 }
 
-bool MakeStepFactory::canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source) const
+bool MakeStepFactory::canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) const
 {
-    return canCreate(parent, type, source->id());
+    return canCreate(parent, source->id());
 }
 
-ProjectExplorer::BuildStep *MakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source)
+ProjectExplorer::BuildStep *MakeStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, type, source))
+    if (!canClone(parent, source))
         return 0;
     return new MakeStep(parent, static_cast<MakeStep *>(source));
 }
 
-bool MakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const
+bool MakeStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map)
+ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map)
 {
-    if (!canRestore(parent, type, map))
+    if (!canRestore(parent, map))
         return 0;
     MakeStep *bs(new MakeStep(parent));
     if (bs->fromMap(map))
@@ -398,10 +398,9 @@ ProjectExplorer::BuildStep *MakeStepFactory::restore(ProjectExplorer::BuildConfi
     return 0;
 }
 
-QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const
+QStringList MakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
 {
-    Q_UNUSED(type)
-    if (qobject_cast<Qt4BuildConfiguration *>(parent))
+    if (parent->target()->project()->id() == QLatin1String(Constants::QT4PROJECT_ID))
         return QStringList() << QLatin1String(MAKESTEP_BS_ID);
     return QStringList();
 }
diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h
index cc6eed8ea2f8fed0f36939950747bb06f3bdb9ce..388125bc5d9d727a2e675caf6011f431074a4756 100644
--- a/src/plugins/qt4projectmanager/makestep.h
+++ b/src/plugins/qt4projectmanager/makestep.h
@@ -57,14 +57,14 @@ public:
     explicit MakeStepFactory(QObject *parent = 0);
     virtual ~MakeStepFactory();
 
-    bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const;
-    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id);
-    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source) const;
-    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source);
-    bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const;
-    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map);
-
-    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const;
+    bool canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const;
+    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, const QString &id);
+    bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) const;
+    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source);
+    bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
+    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
+
+    QStringList availableCreationIds(ProjectExplorer::BuildStepList *parent) const;
     QString displayNameForId(const QString &id) const;
 };
 } //namespace Internal
@@ -79,7 +79,7 @@ class MakeStep : public ProjectExplorer::AbstractProcessStep
     // used to access internal stuff
 
 public:
-    explicit MakeStep(ProjectExplorer::BuildConfiguration *bc);
+    explicit MakeStep(ProjectExplorer::BuildStepList *bsl);
     virtual ~MakeStep();
 
     Internal::Qt4BuildConfiguration *qt4BuildConfiguration() const;
@@ -100,8 +100,8 @@ signals:
     void userArgumentsChanged();
 
 protected:
-    MakeStep(ProjectExplorer::BuildConfiguration *bc, MakeStep *bs);
-    MakeStep(ProjectExplorer::BuildConfiguration *bc, const QString &id);
+    MakeStep(ProjectExplorer::BuildStepList *bsl, MakeStep *bs);
+    MakeStep(ProjectExplorer::BuildStepList *bsl, const QString &id);
     virtual bool fromMap(const QVariantMap &map);
 
 private:
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index ca97410d735ad28e2571d73a69d1ef0adcf7b866..da43b4160577374e5d124938b2754cae681b370d 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -38,6 +38,8 @@
 #include "qt4target.h"
 #include "qtversionmanager.h"
 
+#include <projectexplorer/buildsteplist.h>
+
 #include <coreplugin/icore.h>
 #include <utils/qtcassert.h>
 
@@ -54,22 +56,22 @@ const char * const QMAKE_BS_ID("QtProjectManager.QMakeBuildStep");
 const char * const QMAKE_ARGUMENTS_KEY("QtProjectManager.QMakeBuildStep.QMakeArguments");
 }
 
-QMakeStep::QMakeStep(Qt4BuildConfiguration *bc) :
-    AbstractProcessStep(bc, QLatin1String(QMAKE_BS_ID)),
+QMakeStep::QMakeStep(BuildStepList *bsl) :
+    AbstractProcessStep(bsl, QLatin1String(QMAKE_BS_ID)),
     m_forced(false)
 {
     ctor();
 }
 
-QMakeStep::QMakeStep(Qt4BuildConfiguration *bc, const QString &id) :
-    AbstractProcessStep(bc, id),
+QMakeStep::QMakeStep(BuildStepList *bsl, const QString &id) :
+    AbstractProcessStep(bsl, id),
     m_forced(false)
 {
     ctor();
 }
 
-QMakeStep::QMakeStep(Qt4BuildConfiguration *bc, QMakeStep *bs) :
-    AbstractProcessStep(bc, bs),
+QMakeStep::QMakeStep(BuildStepList *bsl, QMakeStep *bs) :
+    AbstractProcessStep(bsl, bs),
     m_forced(false),
     m_userArgs(bs->m_userArgs)
 {
@@ -423,61 +425,55 @@ QMakeStepFactory::~QMakeStepFactory()
 {
 }
 
-bool QMakeStepFactory::canCreate(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const
+bool QMakeStepFactory::canCreate(BuildStepList *parent, const QString &id) const
 {
-    if (type != ProjectExplorer::BuildStep::Build)
+    if (parent->id() != QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_BUILD))
         return false;
-    if (!qobject_cast<Qt4BuildConfiguration *>(parent))
+    if (!qobject_cast<Qt4BuildConfiguration *>(parent->parent()))
         return false;
     return (id == QLatin1String(QMAKE_BS_ID));
 }
 
-ProjectExplorer::BuildStep *QMakeStepFactory::create(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type,const QString &id)
+ProjectExplorer::BuildStep *QMakeStepFactory::create(BuildStepList *parent, const QString &id)
 {
-    if (!canCreate(parent, type, id))
+    if (!canCreate(parent, id))
         return 0;
-    Qt4BuildConfiguration *bc(qobject_cast<Qt4BuildConfiguration *>(parent));
-    Q_ASSERT(bc);
-    return new QMakeStep(bc);
+    return new QMakeStep(parent);
 }
 
-bool QMakeStepFactory::canClone(BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, BuildStep *source) const
+bool QMakeStepFactory::canClone(BuildStepList *parent, BuildStep *source) const
 {
-    return canCreate(parent, type, source->id());
+    return canCreate(parent, source->id());
 }
 
-ProjectExplorer::BuildStep *QMakeStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source)
+ProjectExplorer::BuildStep *QMakeStepFactory::clone(BuildStepList *parent, ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, type, source))
+    if (!canClone(parent, source))
         return 0;
-    Qt4BuildConfiguration *bc(qobject_cast<Qt4BuildConfiguration *>(parent));
-    Q_ASSERT(bc);
-    return new QMakeStep(bc, qobject_cast<QMakeStep *>(source));
+    return new QMakeStep(parent, qobject_cast<QMakeStep *>(source));
 }
 
-bool QMakeStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const
+bool QMakeStepFactory::canRestore(BuildStepList *parent, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-ProjectExplorer::BuildStep *QMakeStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map)
+ProjectExplorer::BuildStep *QMakeStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
 {
-    if (!canRestore(parent, type, map))
+    if (!canRestore(parent, map))
         return 0;
-    Qt4BuildConfiguration *bc(qobject_cast<Qt4BuildConfiguration *>(parent));
-    Q_ASSERT(bc);
-    QMakeStep *bs(new QMakeStep(bc));
+    QMakeStep *bs = new QMakeStep(parent);
     if (bs->fromMap(map))
         return bs;
     delete bs;
     return 0;
 }
 
-QStringList QMakeStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const
+QStringList QMakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
 {
-    if (type == ProjectExplorer::BuildStep::Build)
-        if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(parent))
+    if (parent->id() == QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_BUILD))
+        if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(parent->parent()))
             if (!bc->qmakeStep())
                 return QStringList() << QLatin1String(QMAKE_BS_ID);
     return QStringList();
diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h
index 2d262dbebca99d3b99206d1d5b2fe040d3590a2f..5c34e5da61870568254e2c9b8bf4dfe30f265aa1 100644
--- a/src/plugins/qt4projectmanager/qmakestep.h
+++ b/src/plugins/qt4projectmanager/qmakestep.h
@@ -55,13 +55,13 @@ class QMakeStepFactory : public ProjectExplorer::IBuildStepFactory
 public:
     explicit QMakeStepFactory(QObject *parent = 0);
     virtual ~QMakeStepFactory();
-    bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type,const QString & id) const;
-    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type,const QString &id);
-    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type,ProjectExplorer::BuildStep *bs) const;
-    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type,ProjectExplorer::BuildStep *bs);
-    bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type,const QVariantMap &map) const;
-    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type,const QVariantMap &map);
-    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *bc, ProjectExplorer::BuildStep::Type type) const;
+    bool canCreate(ProjectExplorer::BuildStepList *parent, const QString & id) const;
+    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, const QString &id);
+    bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *bs) const;
+    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *bs);
+    bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
+    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
+    QStringList availableCreationIds(ProjectExplorer::BuildStepList *parent) const;
     QString displayNameForId(const QString &id) const;
 };
 
@@ -74,7 +74,7 @@ class QMakeStep : public ProjectExplorer::AbstractProcessStep
     friend class Internal::QMakeStepFactory;
 
 public:
-    explicit QMakeStep(Internal::Qt4BuildConfiguration *parent);
+    explicit QMakeStep(ProjectExplorer::BuildStepList *parent);
     virtual ~QMakeStep();
 
     Internal::Qt4BuildConfiguration *qt4BuildConfiguration() const;
@@ -95,8 +95,8 @@ signals:
     void userArgumentsChanged();
 
 protected:
-    QMakeStep(Internal::Qt4BuildConfiguration *parent, QMakeStep *source);
-    QMakeStep(Internal::Qt4BuildConfiguration *parent, const QString &id);
+    QMakeStep(ProjectExplorer::BuildStepList *parent, QMakeStep *source);
+    QMakeStep(ProjectExplorer::BuildStepList *parent, const QString &id);
     virtual bool fromMap(const QVariantMap &map);
 
     virtual void processStartupFailed();
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp
index bfd5895ac4b8c3c051f0ccf3813347b92085caf0..61bbcc82e21f6b3c82c83b39a033db924932c6b3 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp
@@ -58,15 +58,15 @@ namespace Internal {
 
 const QLatin1String MaemoDeployStep::Id("Qt4ProjectManager.MaemoDeployStep");
 
-MaemoDeployStep::MaemoDeployStep(ProjectExplorer::BuildConfiguration *bc)
-    : BuildStep(bc, Id), m_deployables(new MaemoDeployables(this))
+MaemoDeployStep::MaemoDeployStep(ProjectExplorer::BuildStepList *parent)
+    : BuildStep(parent, Id), m_deployables(new MaemoDeployables(this))
 {
     ctor();
 }
 
-MaemoDeployStep::MaemoDeployStep(ProjectExplorer::BuildConfiguration *bc,
+MaemoDeployStep::MaemoDeployStep(ProjectExplorer::BuildStepList *parent,
     MaemoDeployStep *other)
-    : BuildStep(bc, other), m_deployables(new MaemoDeployables(this)),
+    : BuildStep(parent, other), m_deployables(new MaemoDeployables(this)),
       m_lastDeployed(other->m_lastDeployed)
 {
     ctor();
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.h
index 0307614aeca3090a8c2ea24e5f63065c3844a87a..6b98721b143b640face4a0d6998f8d4187cf9e3a 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.h
@@ -63,7 +63,7 @@ class MaemoDeployStep : public ProjectExplorer::BuildStep
     Q_OBJECT
     friend class MaemoDeployStepFactory;
 public:
-    MaemoDeployStep(ProjectExplorer::BuildConfiguration *bc);
+    MaemoDeployStep(ProjectExplorer::BuildStepList *bc);
     virtual ~MaemoDeployStep();
     MaemoDeviceConfig deviceConfig() const;
     MaemoDeviceConfigListModel *deviceConfigModel() const;
@@ -90,7 +90,7 @@ private slots:
     void handleInstallerErrorOutput(const QByteArray &output);
 
 private:
-    MaemoDeployStep(ProjectExplorer::BuildConfiguration *bc,
+    MaemoDeployStep(ProjectExplorer::BuildStepList *bc,
         MaemoDeployStep *other);
     virtual bool init();
     virtual void run(QFutureInterface<bool> &fi);
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.cpp
index 2d1e712e1a84fb2445a55a773fdb306660a286c9..ebef6d6288bbcec76c054cd72209beb7068a997a 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.cpp
@@ -3,6 +3,8 @@
 #include "maemodeploystep.h"
 
 #include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/target.h>
 #include <qt4projectmanager/qt4projectmanagerconstants.h>
 
@@ -16,40 +18,44 @@ MaemoDeployStepFactory::MaemoDeployStepFactory(QObject *parent)
 {
 }
 
-QStringList MaemoDeployStepFactory::availableCreationIds(BuildConfiguration *,
-    BuildStep::Type) const
+QStringList MaemoDeployStepFactory::availableCreationIds(BuildStepList *parent) const
 {
+    if (parent->id() == QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)
+        && parent->target()->id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)
+        && !parent->contains(MaemoDeployStep::Id))
+        return QStringList() << MaemoDeployStep::Id;
     return QStringList();
 }
 
-QString MaemoDeployStepFactory::displayNameForId(const QString &) const
+QString MaemoDeployStepFactory::displayNameForId(const QString &id) const
 {
+    if (id == MaemoDeployStep::Id)
+        return(tr("Deploy to device"));
     return QString();
 }
 
-bool MaemoDeployStepFactory::canCreate(BuildConfiguration *,
-    BuildStep::Type, const QString &) const
+bool MaemoDeployStepFactory::canCreate(BuildStepList *parent, const QString &id) const
 {
-    return false;
+    return parent->id() == QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)
+            && id == QLatin1String(MaemoDeployStep::Id)
+            && parent->target()->id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)
+            && !parent->contains(MaemoDeployStep::Id);
 }
 
-BuildStep *MaemoDeployStepFactory::create(BuildConfiguration *,
-    BuildStep::Type, const QString &)
+BuildStep *MaemoDeployStepFactory::create(BuildStepList *parent, const QString &id)
 {
-    Q_ASSERT(false);
-    return 0;
+    Q_ASSERT(canCreate(parent, id));
+    return new MaemoDeployStep(parent);
 }
 
-bool MaemoDeployStepFactory::canRestore(BuildConfiguration *parent,
-    BuildStep::Type type, const QVariantMap &map) const
+bool MaemoDeployStepFactory::canRestore(BuildStepList *parent, const QVariantMap &map) const
 {
-    return canCreateInternally(parent, type, idFromMap(map));
+    return canCreate(parent, idFromMap(map));
 }
 
-BuildStep *MaemoDeployStepFactory::restore(BuildConfiguration *parent,
-    BuildStep::Type type, const QVariantMap &map)
+BuildStep *MaemoDeployStepFactory::restore(BuildStepList *parent, const QVariantMap &map)
 {
-    Q_ASSERT(canRestore(parent, type, map));
+    Q_ASSERT(canRestore(parent, map));
     MaemoDeployStep * const step = new MaemoDeployStep(parent);
     if (!step->fromMap(map)) {
         delete step;
@@ -58,25 +64,16 @@ BuildStep *MaemoDeployStepFactory::restore(BuildConfiguration *parent,
     return step;
 }
 
-bool MaemoDeployStepFactory::canClone(BuildConfiguration *parent,
-    BuildStep::Type type, BuildStep *product) const
+bool MaemoDeployStepFactory::canClone(BuildStepList *parent, BuildStep *product) const
 {
-    return canCreateInternally(parent, type, product->id());
+    return canCreate(parent, product->id());
 }
 
-BuildStep *MaemoDeployStepFactory::clone(BuildConfiguration *parent,
-    BuildStep::Type type, BuildStep *product)
+BuildStep *MaemoDeployStepFactory::clone(BuildStepList *parent, BuildStep *product)
 {
-    Q_ASSERT(canClone(parent, type, product));
+    Q_ASSERT(canClone(parent, product));
     return new MaemoDeployStep(parent, static_cast<MaemoDeployStep*>(product));
 }
 
-bool MaemoDeployStepFactory::canCreateInternally(BuildConfiguration *parent,
-    BuildStep::Type type, const QString &id) const
-{
-    return type == BuildStep::Deploy && id == MaemoDeployStep::Id
-        && parent->target()->id() == Constants::MAEMO_DEVICE_TARGET_ID;
-}
-
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.h
index 0516578673e66a0da19143a9295410b9a29a7928..4ea79c430cb691c7dd3ef82d80255f5b1ae854da 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystepfactory.h
@@ -11,36 +11,24 @@ class MaemoDeployStepFactory : public ProjectExplorer::IBuildStepFactory
 public:
     MaemoDeployStepFactory(QObject *parent);
 
-    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *parent,
-                                             ProjectExplorer::BuildStep::Type type) const;
+    virtual QStringList availableCreationIds(ProjectExplorer::BuildStepList *parent) const;
     virtual QString displayNameForId(const QString &id) const;
 
-    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent,
-                           ProjectExplorer::BuildStep::Type type,
+    virtual bool canCreate(ProjectExplorer::BuildStepList *parent,
                            const QString &id) const;
     virtual ProjectExplorer::BuildStep *
-            create(ProjectExplorer::BuildConfiguration *parent,
-                   ProjectExplorer::BuildStep::Type type, const QString &id);
+            create(ProjectExplorer::BuildStepList *parent, const QString &id);
 
-    virtual bool canRestore(ProjectExplorer::BuildConfiguration *parent,
-                            ProjectExplorer::BuildStep::Type type,
+    virtual bool canRestore(ProjectExplorer::BuildStepList *parent,
                             const QVariantMap &map) const;
     virtual ProjectExplorer::BuildStep *
-            restore(ProjectExplorer::BuildConfiguration *parent,
-                    ProjectExplorer::BuildStep::Type type, const QVariantMap &map);
+            restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
 
-    virtual bool canClone(ProjectExplorer::BuildConfiguration *parent,
-                          ProjectExplorer::BuildStep::Type type,
+    virtual bool canClone(ProjectExplorer::BuildStepList *parent,
                           ProjectExplorer::BuildStep *product) const;
     virtual ProjectExplorer::BuildStep *
-            clone(ProjectExplorer::BuildConfiguration *parent,
-                  ProjectExplorer::BuildStep::Type type,
+            clone(ProjectExplorer::BuildStepList *parent,
                   ProjectExplorer::BuildStep *product);
-
-private:
-    bool canCreateInternally(ProjectExplorer::BuildConfiguration *parent,
-                             ProjectExplorer::BuildStep::Type type,
-                             const QString &id) const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h b/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h
index 7d07c0f420f701a8924a2c3c12a6bc0fcf2d7569..cd98d3bfc340f89328a3407d685957250657476e 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemoglobal.h
@@ -32,6 +32,8 @@
 
 #include <projectexplorer/buildconfiguration.h>
 #include <projectexplorer/environment.h>
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/projectexplorerconstants.h>
 
 #include <QtCore/QList>
 
@@ -53,8 +55,10 @@ public:
 
     template<class T> static T *buildStep(const ProjectExplorer::BuildConfiguration *bc)
     {
-        const QList<ProjectExplorer::BuildStep *> &buildSteps
-                = bc->steps(ProjectExplorer::BuildStep::Deploy);
+        ProjectExplorer::BuildStepList *bsl = bc->stepList(QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY));
+        if (!bsl)
+            return 0;
+        const QList<ProjectExplorer::BuildStep *> &buildSteps = bsl->steps();
         for (int i = buildSteps.count() - 1; i >= 0; --i) {
             if (T * const step = qobject_cast<T *>(buildSteps.at(i)))
                 return step;
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp
index 157e92fa86a4187379c274e34b8bce929875164c..d6e1873f6963249e746ec4c62f3cb727284ee162 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.cpp
@@ -44,10 +44,13 @@
 #include "maemopackagecreationstep.h"
 
 #include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/deployconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/target.h>
 #include <qt4projectmanagerconstants.h>
 
-using ProjectExplorer::BuildConfiguration;
+using ProjectExplorer::BuildStepList;
 using ProjectExplorer::BuildStep;
 
 namespace Qt4ProjectManager {
@@ -56,45 +59,48 @@ namespace Internal {
 MaemoPackageCreationFactory::MaemoPackageCreationFactory(QObject *parent)
     : ProjectExplorer::IBuildStepFactory(parent)
 {
-
 }
 
-QStringList MaemoPackageCreationFactory::availableCreationIds(BuildConfiguration *,
-                                                              BuildStep::Type) const
+QStringList MaemoPackageCreationFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
 {
+    if (parent->id() == QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)
+        && parent->target()->id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)
+        && !parent->contains(MaemoPackageCreationStep::CreatePackageId))
+        return QStringList() << MaemoPackageCreationStep::CreatePackageId;
     return QStringList();
 }
 
-QString MaemoPackageCreationFactory::displayNameForId(const QString &) const
+QString MaemoPackageCreationFactory::displayNameForId(const QString &id) const
 {
+    if (id == MaemoPackageCreationStep::CreatePackageId)
+        return tr("Create Debian Package");
     return QString();
 }
 
-bool MaemoPackageCreationFactory::canCreate(BuildConfiguration *,
-                                            BuildStep::Type, const QString &) const
+bool MaemoPackageCreationFactory::canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const
 {
-    return false;
+    return parent->id() == QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)
+        && id == QLatin1String(MaemoPackageCreationStep::CreatePackageId)
+        && parent->target()->id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)
+        && !parent->contains(MaemoPackageCreationStep::CreatePackageId);
 }
 
-BuildStep *MaemoPackageCreationFactory::create(BuildConfiguration *,
-                                               BuildStep::Type, const QString &)
+BuildStep *MaemoPackageCreationFactory::create(ProjectExplorer::BuildStepList *parent, const QString &id)
 {
-    Q_ASSERT(false);
-    return 0;
+    Q_ASSERT(canCreate(parent, id));
+    return new MaemoPackageCreationStep(parent);
 }
 
-bool MaemoPackageCreationFactory::canRestore(BuildConfiguration *parent,
-                                             BuildStep::Type type,
+bool MaemoPackageCreationFactory::canRestore(ProjectExplorer::BuildStepList *parent,
                                              const QVariantMap &map) const
 {
-    return canCreateInternally(parent, type, ProjectExplorer::idFromMap(map));
+    return canCreate(parent, ProjectExplorer::idFromMap(map));
 }
 
-BuildStep *MaemoPackageCreationFactory::restore(BuildConfiguration *parent,
-                                                BuildStep::Type type,
+BuildStep *MaemoPackageCreationFactory::restore(ProjectExplorer::BuildStepList *parent,
                                                 const QVariantMap &map)
 {
-    Q_ASSERT(canRestore(parent, type, map));
+    Q_ASSERT(canRestore(parent, map));
     MaemoPackageCreationStep * const step
         = new MaemoPackageCreationStep(parent);
     if (!step->fromMap(map)) {
@@ -104,29 +110,18 @@ BuildStep *MaemoPackageCreationFactory::restore(BuildConfiguration *parent,
     return step;
 }
 
-bool MaemoPackageCreationFactory::canClone(BuildConfiguration *parent,
-                                           ProjectExplorer::BuildStep::Type type,
-                                           BuildStep *product) const
+bool MaemoPackageCreationFactory::canClone(ProjectExplorer::BuildStepList *parent,
+                                           ProjectExplorer::BuildStep *product) const
 {
-    return canCreateInternally(parent, type, product->id());
+    return canCreate(parent, product->id());
 }
 
-BuildStep *MaemoPackageCreationFactory::clone(BuildConfiguration *parent,
-                                              ProjectExplorer::BuildStep::Type type,
-                                              BuildStep *product)
+BuildStep *MaemoPackageCreationFactory::clone(ProjectExplorer::BuildStepList *parent,
+                                              ProjectExplorer::BuildStep *product)
 {
-    Q_ASSERT(canClone(parent, type, product));
+    Q_ASSERT(canClone(parent, product));
     return new MaemoPackageCreationStep(parent, static_cast<MaemoPackageCreationStep *>(product));
 }
 
-bool MaemoPackageCreationFactory::canCreateInternally(BuildConfiguration *parent,
-                                                      ProjectExplorer::BuildStep::Type type,
-                                                      const QString &id) const
-{
-    return type == ProjectExplorer::BuildStep::Deploy
-        && id == MaemoPackageCreationStep::CreatePackageId
-        && parent->target()->id() == Constants::MAEMO_DEVICE_TARGET_ID;
-}
-
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.h b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.h
index 128c43d5a317a4e3010cd6a50215db5c41deb78e..67fd4bbfc07f7dc696d211c58e9a7aba056c95da 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationfactory.h
@@ -52,36 +52,24 @@ class MaemoPackageCreationFactory : public ProjectExplorer::IBuildStepFactory
 public:
     MaemoPackageCreationFactory(QObject *parent);
 
-    virtual QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *parent,
-                                             ProjectExplorer::BuildStep::Type type) const;
+    virtual QStringList availableCreationIds(ProjectExplorer::BuildStepList *parent) const;
     virtual QString displayNameForId(const QString &id) const;
 
-    virtual bool canCreate(ProjectExplorer::BuildConfiguration *parent,
-                           ProjectExplorer::BuildStep::Type type,
+    virtual bool canCreate(ProjectExplorer::BuildStepList *parent,
                            const QString &id) const;
     virtual ProjectExplorer::BuildStep *
-            create(ProjectExplorer::BuildConfiguration *parent,
-                   ProjectExplorer::BuildStep::Type type, const QString &id);
+            create(ProjectExplorer::BuildStepList *parent, const QString &id);
 
-    virtual bool canRestore(ProjectExplorer::BuildConfiguration *parent,
-                            ProjectExplorer::BuildStep::Type type,
+    virtual bool canRestore(ProjectExplorer::BuildStepList *parent,
                             const QVariantMap &map) const;
     virtual ProjectExplorer::BuildStep *
-            restore(ProjectExplorer::BuildConfiguration *parent,
-                    ProjectExplorer::BuildStep::Type type, const QVariantMap &map);
+            restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
 
-    virtual bool canClone(ProjectExplorer::BuildConfiguration *parent,
-                          ProjectExplorer::BuildStep::Type type,
+    virtual bool canClone(ProjectExplorer::BuildStepList *parent,
                           ProjectExplorer::BuildStep *product) const;
     virtual ProjectExplorer::BuildStep *
-            clone(ProjectExplorer::BuildConfiguration *parent,
-                  ProjectExplorer::BuildStep::Type type,
+            clone(ProjectExplorer::BuildStepList *parent,
                   ProjectExplorer::BuildStep *product);
-
-private:
-    bool canCreateInternally(ProjectExplorer::BuildConfiguration *parent,
-                             ProjectExplorer::BuildStep::Type type,
-                             const QString &id) const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp
index 6734d2058bc24db1d54623bfec192377194608ae..f3da6f1c1119943779717df121d9dc88e73c5b1e 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp
@@ -49,6 +49,7 @@
 #include "maemoprofilewrapper.h"
 #include "maemotoolchain.h"
 
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/projectexplorerconstants.h>
 #include <qt4buildconfiguration.h>
 #include <qt4project.h>
@@ -66,24 +67,24 @@ namespace {
 }
 
 using namespace ProjectExplorer::Constants;
-using ProjectExplorer::BuildConfiguration;
+using ProjectExplorer::BuildStepList;
 using ProjectExplorer::BuildStepConfigWidget;
 using ProjectExplorer::Task;
 
 namespace Qt4ProjectManager {
 namespace Internal {
 
-MaemoPackageCreationStep::MaemoPackageCreationStep(BuildConfiguration *buildConfig)
-    : ProjectExplorer::BuildStep(buildConfig, CreatePackageId),
+MaemoPackageCreationStep::MaemoPackageCreationStep(BuildStepList *bsl)
+    : ProjectExplorer::BuildStep(bsl, CreatePackageId),
       m_packagingEnabled(true),
       m_versionString(DefaultVersionNumber)
 {
     ctor();
 }
 
-MaemoPackageCreationStep::MaemoPackageCreationStep(BuildConfiguration *buildConfig,
+MaemoPackageCreationStep::MaemoPackageCreationStep(BuildStepList *bsl,
     MaemoPackageCreationStep *other)
-    : BuildStep(buildConfig, other),
+    : BuildStep(bsl, other),
       m_packagingEnabled(other->m_packagingEnabled),
       m_versionString(other->m_versionString)
 {
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h
index fe140b88d1e25f720283f1dbdbdc45db7ed87483..a569136a0f3c2a1cfaf37cfe675b675222ab11e5 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.h
@@ -64,7 +64,7 @@ class MaemoPackageCreationStep : public ProjectExplorer::BuildStep
     Q_OBJECT
     friend class MaemoPackageCreationFactory;
 public:
-    MaemoPackageCreationStep(ProjectExplorer::BuildConfiguration *buildConfig);
+    MaemoPackageCreationStep(ProjectExplorer::BuildStepList *bsl);
     ~MaemoPackageCreationStep();
 
     QString packageFilePath() const;
@@ -82,7 +82,7 @@ private slots:
     void handleBuildOutput();
 
 private:
-    MaemoPackageCreationStep(ProjectExplorer::BuildConfiguration *buildConfig,
+    MaemoPackageCreationStep(ProjectExplorer::BuildStepList *buildConfig,
                              MaemoPackageCreationStep *other);
 
     void ctor();
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
index be6f6585ad0a5297a96d6fd05ccca3d68bf987bb..7ea037b61659ef73296d6d71552b04d67758b244 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp
@@ -38,6 +38,8 @@
 #include "passphraseforkeydialog.h"
 
 #include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/gnumakeparser.h>
@@ -64,8 +66,8 @@ namespace {
     const char * const MAKE_CERTIFICATE_ARGUMENT("QT_SIS_CERTIFICATE=");
 }
 
-S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildConfiguration *bc) :
-    BuildStep(bc, QLatin1String(SIGN_BS_ID)),
+S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildStepList *bsl) :
+    BuildStep(bsl, QLatin1String(SIGN_BS_ID)),
     m_signingMode(SignSelf),
     m_createSmartInstaller(false),
     m_outputParserChain(0),
@@ -79,8 +81,8 @@ S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildConfiguration *
     ctor_package();
 }
 
-S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildConfiguration *bc, S60CreatePackageStep *bs) :
-    BuildStep(bc, bs),
+S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildStepList *bsl, S60CreatePackageStep *bs) :
+    BuildStep(bsl, bs),
     m_signingMode(bs->m_signingMode),
     m_customSignaturePath(bs->m_customSignaturePath),
     m_customKeyPath(bs->m_customKeyPath),
@@ -96,8 +98,8 @@ S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildConfiguration *
     ctor_package();
 }
 
-S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildConfiguration *bc, const QString &id) :
-    BuildStep(bc, id),
+S60CreatePackageStep::S60CreatePackageStep(ProjectExplorer::BuildStepList *bsl, const QString &id) :
+    BuildStep(bsl, id),
     m_signingMode(SignSelf),
     m_createSmartInstaller(false),
     m_outputParserChain(0),
@@ -564,43 +566,43 @@ S60CreatePackageStepFactory::~S60CreatePackageStepFactory()
 {
 }
 
-bool S60CreatePackageStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const
+bool S60CreatePackageStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const
 {
-    if (type != ProjectExplorer::BuildStep::Deploy)
+    if (parent->id() != QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY))
         return false;
-    if (parent->target()->id() != Constants::S60_DEVICE_TARGET_ID)
+    if (parent->target()->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return false;
     return (id == QLatin1String(SIGN_BS_ID));
 }
 
-ProjectExplorer::BuildStep *S60CreatePackageStepFactory::create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id)
+ProjectExplorer::BuildStep *S60CreatePackageStepFactory::create(ProjectExplorer::BuildStepList *parent, const QString &id)
 {
-    if (!canCreate(parent, type, id))
+    if (!canCreate(parent, id))
         return 0;
     return new S60CreatePackageStep(parent);
 }
 
-bool S60CreatePackageStepFactory::canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source) const
+bool S60CreatePackageStepFactory::canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) const
 {
-    return canCreate(parent, type, source->id());
+    return canCreate(parent, source->id());
 }
 
-ProjectExplorer::BuildStep *S60CreatePackageStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source)
+ProjectExplorer::BuildStep *S60CreatePackageStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, type, source))
+    if (!canClone(parent, source))
         return 0;
     return new S60CreatePackageStep(parent, static_cast<S60CreatePackageStep *>(source));
 }
 
-bool S60CreatePackageStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const
+bool S60CreatePackageStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-ProjectExplorer::BuildStep *S60CreatePackageStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map)
+ProjectExplorer::BuildStep *S60CreatePackageStepFactory::restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map)
 {
-    if (!canRestore(parent, type, map))
+    if (!canRestore(parent, map))
         return 0;
     S60CreatePackageStep *bs(new S60CreatePackageStep(parent));
     if (bs->fromMap(map))
@@ -609,11 +611,11 @@ ProjectExplorer::BuildStep *S60CreatePackageStepFactory::restore(ProjectExplorer
     return 0;
 }
 
-QStringList S60CreatePackageStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const
+QStringList S60CreatePackageStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
 {
-    if (type != ProjectExplorer::BuildStep::Deploy)
+    if (parent->id() != QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY))
         return QStringList();
-    if (parent->target()->id() == Constants::S60_DEVICE_TARGET_ID)
+    if (parent->target()->id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return QStringList() << QLatin1String(SIGN_BS_ID);
     return QStringList();
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h
index 2cc031861a71c3603dbc242676617d72597fa02c..e69c8a8044d1870e46cfbcb9640559a168ccd0b1 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h
@@ -53,17 +53,17 @@ public:
     ~S60CreatePackageStepFactory();
 
     // used to show the list of possible additons to a target, returns a list of types
-    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const;
+    QStringList availableCreationIds(ProjectExplorer::BuildStepList *parent) const;
     // used to translate the types to names to display to the user
     QString displayNameForId(const QString &id) const;
 
-    bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const;
-    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id);
+    bool canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const;
+    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, const QString &id);
     // used to recreate the runConfigurations when restoring settings
-    bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const;
-    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map);
-    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *product) const;
-    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *product);
+    bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
+    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
+    bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) const;
+    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product);
 };
 
 
@@ -77,7 +77,7 @@ public:
         SignCustom = 1
     };
 
-    explicit S60CreatePackageStep(ProjectExplorer::BuildConfiguration *bc);
+    explicit S60CreatePackageStep(ProjectExplorer::BuildStepList *bsl);
     virtual ~S60CreatePackageStep();
 
     virtual bool init();
@@ -106,8 +106,8 @@ signals:
     void badPassphrase();
 
 protected:
-    S60CreatePackageStep(ProjectExplorer::BuildConfiguration *bc, S60CreatePackageStep *bs);
-    S60CreatePackageStep(ProjectExplorer::BuildConfiguration *bc, const QString &id);
+    S60CreatePackageStep(ProjectExplorer::BuildStepList *bsl, S60CreatePackageStep *bs);
+    S60CreatePackageStep(ProjectExplorer::BuildStepList *bsl, const QString &id);
     bool fromMap(const QVariantMap &map);
 
     Qt4BuildConfiguration *qt4BuildConfiguration() const;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp
index 8a1c47bd95c7aae6d1239708c34e4ba51f8de22c..5a2d947f9d2bad97c58f7902d2dc75cb3558f674 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.cpp
@@ -27,7 +27,6 @@
 **
 **************************************************************************/
 
-
 #include "s60deploystep.h"
 
 #include "qt4buildconfiguration.h"
@@ -45,9 +44,10 @@
 #include <QDir>
 
 #include <coreplugin/icore.h>
-#include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/ioutputparser.h>
+#include <projectexplorer/projectexplorerconstants.h>
 #include <qt4projectmanagerconstants.h>
 
 using namespace ProjectExplorer;
@@ -85,14 +85,7 @@ static inline bool renameFile(const QString &sourceName, const QString &targetNa
 
 // #pragma mark -- S60DeployStep
 
-S60DeployStep::S60DeployStep(ProjectExplorer::BuildConfiguration *bc, const QString &id) :
-        BuildStep(bc, id), m_timer(0),
-        m_releaseDeviceAfterLauncherFinish(true), m_handleDeviceRemoval(true),
-        m_launcher(0), m_eventLoop(0)
-{
-}
-
-S60DeployStep::S60DeployStep(ProjectExplorer::BuildConfiguration *bc,
+S60DeployStep::S60DeployStep(ProjectExplorer::BuildStepList *bc,
                              S60DeployStep *bs):
         BuildStep(bc, bs), m_timer(0),
         m_releaseDeviceAfterLauncherFinish(bs->m_releaseDeviceAfterLauncherFinish),
@@ -101,7 +94,7 @@ S60DeployStep::S60DeployStep(ProjectExplorer::BuildConfiguration *bc,
 {
 }
 
-S60DeployStep::S60DeployStep(ProjectExplorer::BuildConfiguration *bc):
+S60DeployStep::S60DeployStep(ProjectExplorer::BuildStepList *bc):
         BuildStep(bc, QLatin1String(S60_DEPLOY_STEP_ID)), m_timer(0),
         m_releaseDeviceAfterLauncherFinish(true),
         m_handleDeviceRemoval(true), m_launcher(0), m_eventLoop(0)
@@ -415,12 +408,12 @@ void S60DeployStepWidget::init()
 
 QString S60DeployStepWidget::summaryText() const
 {
-    return tr("<b>Deploy SIS Package</b>");
+    return QString("<b>%1</b>").arg(displayName());
 }
 
 QString S60DeployStepWidget::displayName() const
 {
-    return QString("S60DeployStepWidget::displayName");
+    return tr("Deploy SIS Package");
 }
 
 // #pragma mark -- S60DeployStepFactory
@@ -434,43 +427,47 @@ S60DeployStepFactory::~S60DeployStepFactory()
 {
 }
 
-bool S60DeployStepFactory::canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const
+bool S60DeployStepFactory::canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const
 {
-    if (type != ProjectExplorer::BuildStep::Deploy)
+    if (parent->id() != QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY))
         return false;
     if (parent->target()->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return false;
     return (id == QLatin1String(S60_DEPLOY_STEP_ID));
 }
 
-ProjectExplorer::BuildStep *S60DeployStepFactory::create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id)
+ProjectExplorer::BuildStep *S60DeployStepFactory::create(ProjectExplorer::BuildStepList *parent, const QString &id)
 {
-    if (!canCreate(parent, type, id))
+    if (!canCreate(parent, id))
         return 0;
-    return new S60DeployStep(parent, id);
+    return new S60DeployStep(parent);
 }
 
-bool S60DeployStepFactory::canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source) const
+bool S60DeployStepFactory::canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source) const
 {
-    return canCreate(parent, type, source->id());
+    if (!canCreate(parent, source->id()))
+        return false;
+    if (!qobject_cast<S60DeployStep *>(source))
+        return false;
+    return true;
 }
 
-ProjectExplorer::BuildStep *S60DeployStepFactory::clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *source)
+ProjectExplorer::BuildStep *S60DeployStepFactory::clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source)
 {
-    if (!canClone(parent, type, source))
+    if (!canClone(parent, source))
         return 0;
     return new S60DeployStep(parent, static_cast<S60DeployStep *>(source));
 }
 
-bool S60DeployStepFactory::canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const
+bool S60DeployStepFactory::canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const
 {
     QString id(ProjectExplorer::idFromMap(map));
-    return canCreate(parent, type, id);
+    return canCreate(parent, id);
 }
 
-ProjectExplorer::BuildStep *S60DeployStepFactory::restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map)
+ProjectExplorer::BuildStep *S60DeployStepFactory::restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map)
 {
-    if (!canRestore(parent, type, map))
+    if (!canRestore(parent, map))
         return 0;
     S60DeployStep *bs = new S60DeployStep(parent);
     if (bs->fromMap(map))
@@ -479,11 +476,10 @@ ProjectExplorer::BuildStep *S60DeployStepFactory::restore(ProjectExplorer::Build
     return 0;
 }
 
-QStringList S60DeployStepFactory::availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const
+QStringList S60DeployStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
 {
-    if (type != ProjectExplorer::BuildStep::Deploy)
-        return QStringList();
-    if (parent->target()->id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
+    if (parent->id() == QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY)
+        && parent->target()->id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return QStringList() << QLatin1String(S60_DEPLOY_STEP_ID);
     return QStringList();
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h
index e3c324669dc7c78686d73d61f8841a1375a70761..297a25be0973a6508a9fb8d7eb30f74296d9f68f 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deploystep.h
@@ -60,17 +60,17 @@ public:
     ~S60DeployStepFactory();
 
     // used to show the list of possible additons to a target, returns a list of types
-    QStringList availableCreationIds(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type) const;
+    QStringList availableCreationIds(ProjectExplorer::BuildStepList *parent) const;
     // used to translate the types to names to display to the user
     QString displayNameForId(const QString &id) const;
 
-    bool canCreate(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id) const;
-    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QString &id);
+    bool canCreate(ProjectExplorer::BuildStepList *parent, const QString &id) const;
+    ProjectExplorer::BuildStep *create(ProjectExplorer::BuildStepList *parent, const QString &id);
     // used to recreate the runConfigurations when restoring settings
-    bool canRestore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map) const;
-    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, const QVariantMap &map);
-    bool canClone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *product) const;
-    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildConfiguration *parent, ProjectExplorer::BuildStep::Type type, ProjectExplorer::BuildStep *product);
+    bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
+    ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
+    bool canClone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product) const;
+    ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *product);
 };
 
 class S60DeployStep : public ProjectExplorer::BuildStep
@@ -79,10 +79,7 @@ class S60DeployStep : public ProjectExplorer::BuildStep
 public:
     friend class S60DeployStepFactory;
 
-    S60DeployStep(ProjectExplorer::BuildConfiguration *bc, const QString &id);
-    S60DeployStep(ProjectExplorer::BuildConfiguration *bc,
-                  S60DeployStep *bs);
-    explicit S60DeployStep(ProjectExplorer::BuildConfiguration *bc);
+    explicit S60DeployStep(ProjectExplorer::BuildStepList *parent);
 
     virtual ~S60DeployStep();
 
@@ -97,14 +94,6 @@ public:
 protected:
     virtual bool fromMap(const QVariantMap &map);
 
-private:
-    void start();
-    void stop();
-    void startDeployment();
-    bool processPackageName(QString &errorMessage);
-    void setupConnections();
-    void appendMessage(const QString &error, bool isError);
-
 protected slots:
     void deviceRemoved(const SymbianUtils::SymbianDevice &);
 
@@ -127,6 +116,16 @@ signals:
     void finishNow();
 
 private:
+    S60DeployStep(ProjectExplorer::BuildStepList *parent,
+                  S60DeployStep *bs);
+
+    void start();
+    void stop();
+    void startDeployment();
+    bool processPackageName(QString &errorMessage);
+    void setupConnections();
+    void appendMessage(const QString &error, bool isError);
+
     QString m_serialPortName;
     QString m_serialPortFriendlyName;
     QStringList m_packageFileNamesWithTarget; // Support for 4.6.1
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index 8bb36a1982385ee23c00591e6fbce2aef0f61f32..311f2c320353bb6fb8ac1efa8389db871d0962ad 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -48,6 +48,7 @@
 #include <coreplugin/progressmanager/progressmanager.h>
 #include <utils/qtcassert.h>
 #include <utils/pathchooser.h>
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/buildconfiguration.h>
@@ -413,7 +414,9 @@ bool S60DeviceRunConfiguration::runSmartInstaller() const
 {
     BuildConfiguration *bc = target()->activeBuildConfiguration();
     QTC_ASSERT(bc, return false);
-    QList<BuildStep *> steps = bc->steps(ProjectExplorer::BuildStep::Build);
+    BuildStepList *bsl = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY);
+    QTC_ASSERT(bsl, return false);
+    QList<BuildStep *> steps = bsl->steps();
     foreach (const BuildStep *step, steps) {
         if (const S60CreatePackageStep *packageStep = qobject_cast<const S60CreatePackageStep *>(step)) {
             return packageStep->createsSmartInstaller();
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index b8807d8eef701b93f27dba1740983ed40bd8a8ab..bb5c5d0c4f388e7f59fe219cffd1a8fee617563c 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -37,6 +37,8 @@
 #include "makestep.h"
 
 #include <utils/qtcassert.h>
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/projectexplorerconstants.h>
 
 #include <QtCore/QDebug>
 
@@ -398,18 +400,22 @@ void Qt4BuildConfiguration::getConfigCommandLineArguments(QStringList *addedUser
 QMakeStep *Qt4BuildConfiguration::qmakeStep() const
 {
     QMakeStep *qs = 0;
-    foreach(BuildStep *bs, steps(ProjectExplorer::BuildStep::Build))
-        if ((qs = qobject_cast<QMakeStep *>(bs)) != 0)
+    BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    Q_ASSERT(bsl);
+    for (int i = 0; i < bsl->count(); ++i)
+        if ((qs = qobject_cast<QMakeStep *>(bsl->at(i))) != 0)
             return qs;
     return 0;
 }
 
 MakeStep *Qt4BuildConfiguration::makeStep() const
 {
-    MakeStep *qs = 0;
-    foreach(BuildStep *bs, steps(ProjectExplorer::BuildStep::Build))
-        if ((qs = qobject_cast<MakeStep *>(bs)) != 0)
-            return qs;
+    MakeStep *ms = 0;
+    BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    Q_ASSERT(bsl);
+    for (int i = 0; i < bsl->count(); ++i)
+        if ((ms = qobject_cast<MakeStep *>(bsl->at(i))) != 0)
+            return ms;
     return 0;
 }
 
@@ -648,7 +654,7 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target
                           version->displayName(),
                           &ok);
     if (!ok || buildConfigurationName.isEmpty())
-        return false;
+        return 0;
 
     qt4Target->addQt4BuildConfiguration(tr("%1 Debug").arg(buildConfigurationName),
                                         version,
diff --git a/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d3c4e8447a6d0ea28bd271e2552f1e80a62f1f7e
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp
@@ -0,0 +1,65 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4deployconfiguration.h"
+
+#include "qt4projectmanagerconstants.h"
+#include "qt4target.h"
+#include "qt-maemo/maemodeploystep.h"
+#include "qt-maemo/maemopackagecreationstep.h"
+#include "qt-s60/s60createpackagestep.h"
+#include "qt-s60/s60deploystep.h"
+
+#include <projectexplorer/buildsteplist.h>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+
+Qt4DeployConfigurationFactory::Qt4DeployConfigurationFactory(QObject *parent) :
+    ProjectExplorer::DeployConfigurationFactory(parent)
+{ }
+
+ProjectExplorer::DeployConfiguration *Qt4DeployConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id)
+{
+    ProjectExplorer::DeployConfiguration *dc = ProjectExplorer::DeployConfigurationFactory::create(parent, id);
+    if (!dc)
+        return 0;
+
+    if (parent->id() == Constants::S60_DEVICE_TARGET_ID) {
+        dc->setDisplayName(tr("Deploy to Symbian device"));
+        dc->stepList()->insertStep(0, new S60CreatePackageStep(dc->stepList()));
+        dc->stepList()->insertStep(1, new S60DeployStep(dc->stepList()));
+    } else if (parent->id() == Constants::MAEMO_DEVICE_TARGET_ID) {
+        dc->setDisplayName(tr("Deploy to Maemo device"));
+        dc->stepList()->insertStep(0, new MaemoPackageCreationStep(dc->stepList()));
+        dc->stepList()->insertStep(1, new MaemoDeployStep(dc->stepList()));
+    }
+
+    return dc;
+}
diff --git a/src/plugins/qt4projectmanager/qt4deployconfiguration.h b/src/plugins/qt4projectmanager/qt4deployconfiguration.h
new file mode 100644
index 0000000000000000000000000000000000000000..d0dfdfe62ec0fced0344618ed7d828b9610e70ab
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt4deployconfiguration.h
@@ -0,0 +1,51 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
+#define QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
+
+#include <projectexplorer/deployconfiguration.h>
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+class Qt4DeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory
+{
+    Q_OBJECT
+
+public:
+    explicit Qt4DeployConfigurationFactory(QObject *parent = 0);
+
+    ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, const QString &id);
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+
+#endif // QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 202431549185afbebb468d6db477573725b6948a..8e99d6d91dea1923d5af38fa7553259523e7e29d 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -849,7 +849,7 @@ QString Qt4Project::displayName() const
 
 QString Qt4Project::id() const
 {
-    return QLatin1String("Qt4ProjectManager.Qt4Project");
+    return QLatin1String(Constants::QT4PROJECT_ID);
 }
 
 Core::IFile *Qt4Project::file() const
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 3aacc1bde2906589c0ca79e8bdfd7158b6a846b4..dd32f7472e20a74025af785b74878e20103e287c 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -166,7 +166,7 @@ void Qt4ProjectConfigWidget::init(ProjectExplorer::BuildConfiguration *bc)
     QTC_ASSERT(bc, return);
 
     if (debug)
-        qDebug() << "Qt4ProjectConfigWidget::init() for"<<bc->displayName();
+        qDebug() << "Qt4ProjectConfigWidget::init() for" << bc->displayName();
 
     if (m_buildConfiguration) {
         disconnect(m_buildConfiguration, SIGNAL(buildDirectoryChanged()),
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
index 24536e1f60a5f450ec8a57a022624c9a7bedb443..53c4df3e852da66df422d2ff1e2f7401af296eba 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
@@ -298,13 +298,15 @@ void Qt4Manager::handleSubDirContexMenu(Qt4Manager::Action action)
             bc->setSubNodeBuild(profile);
 
     if (projectExplorer()->saveModifiedFiles()) {
-        if (action == BUILD)
-            projectExplorer()->buildManager()->buildProject(bc);
-        else if (action == CLEAN)
-            projectExplorer()->buildManager()->cleanProject(bc);
-        else if (action == REBUILD) {
-            projectExplorer()->buildManager()->cleanProject(bc);
-            projectExplorer()->buildManager()->buildProject(bc);
+        if (action == BUILD) {
+            projectExplorer()->buildManager()->buildList(bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD));
+        } else if (action == CLEAN) {
+            projectExplorer()->buildManager()->buildList(bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN));
+        } else if (action == REBUILD) {
+            QList<ProjectExplorer::BuildStepList *> stepLists;
+            stepLists << bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
+            stepLists << bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+            projectExplorer()->buildManager()->buildLists(stepLists);
         }
     }
 
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro
index 678bd5a9bce8c5b8940db4b49b407b9f8541b65e..2e2ee5083cc4cf40034ac2facb1597dba3063022 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.pro
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro
@@ -3,7 +3,8 @@ TARGET = Qt4ProjectManager
 QT += network
 include(../../qtcreatorplugin.pri)
 include(qt4projectmanager_dependencies.pri)
-HEADERS += qt4projectmanagerplugin.h \
+HEADERS += qt4deployconfiguration.h \
+    qt4projectmanagerplugin.h \
     qt4projectmanager.h \
     qt4project.h \
     qt4nodes.h \
@@ -46,7 +47,8 @@ HEADERS += qt4projectmanagerplugin.h \
     qt4target.h \
     qmakeparser.h \
     qtoutputformatter.h
-SOURCES += qt4projectmanagerplugin.cpp \
+SOURCES += qt4deployconfiguration.cpp \
+    qt4projectmanagerplugin.cpp \
     qt4projectmanager.cpp \
     qt4project.cpp \
     qt4nodes.cpp \
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
index 41ca1944eb0065fffef698d0e9af73279005f468..b80c7dac27c11b53a92a7b55adb23871bafcf437 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
@@ -95,6 +95,9 @@ const char * const QT_APP_WIZARD_TR_CATEGORY = QT_TRANSLATE_NOOP("Qt4ProjectMana
 // Tasks
 const char * const PROFILE_EVALUATE = "Qt4ProjectManager.ProFileEvaluate";
 
+// Project
+const char * const QT4PROJECT_ID("Qt4ProjectManager.Qt4Project");
+
 // Targets
 const char * const DESKTOP_TARGET_ID("Qt4ProjectManager.Target.DesktopTarget");
 const char * const S60_EMULATOR_TARGET_ID("Qt4ProjectManager.Target.S60EmulatorTarget");
diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp
index a5cbb8ce852a97a0d12d48dc411b75d031790566..c32c63641c5b0a35195253a9e3e50dba665e8beb 100644
--- a/src/plugins/qt4projectmanager/qt4target.cpp
+++ b/src/plugins/qt4projectmanager/qt4target.cpp
@@ -32,6 +32,7 @@
 #include "makestep.h"
 #include "profilereader.h"
 #include "qmakestep.h"
+#include "qt4deployconfiguration.h"
 #include "qt4project.h"
 #include "qt4runconfiguration.h"
 #include "qt4projectmanagerconstants.h"
@@ -43,8 +44,10 @@
 #include "qt-s60/s60createpackagestep.h"
 #include "qt-s60/s60deploystep.h"
 
+#include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/customexecutablerunconfiguration.h>
 #include <projectexplorer/toolchain.h>
+#include <projectexplorer/projectexplorerconstants.h>
 #include <coreplugin/coreconstants.h>
 #include <symbianutils/symbiandevicemanager.h>
 
@@ -59,29 +62,29 @@ using namespace Qt4ProjectManager::Internal;
 namespace {
 
 QString displayNameForId(const QString &id) {
-    if (id == QLatin1String(Constants::DESKTOP_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::DESKTOP_TARGET_ID))
         return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Desktop", "Qt4 Desktop target display name");
-    if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_EMULATOR_TARGET_ID))
         return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Symbian Emulator", "Qt4 Symbian Emulator target display name");
-    if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID))
         return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Symbian Device", "Qt4 Symbian Device target display name");
-    if (id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::MAEMO_DEVICE_TARGET_ID))
         return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Maemo", "Qt4 Maemo target display name");
-    if (id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::QT_SIMULATOR_TARGET_ID))
         return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Qt Simulator", "Qt4 Simulator target display name");
     return QString();
 }
 
 QIcon iconForId(const QString &id) {
-    if (id == QLatin1String(Constants::DESKTOP_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::DESKTOP_TARGET_ID))
         return QIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon));
-    if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_EMULATOR_TARGET_ID))
         return QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png"));
-    if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID))
         return QIcon(QLatin1String(":/projectexplorer/images/SymbianDevice.png"));
-    if (id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::MAEMO_DEVICE_TARGET_ID))
         return QIcon(QLatin1String(":/projectexplorer/images/MaemoDevice.png"));
-    if (id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
+    if (id == QLatin1String(Qt4ProjectManager::Constants::QT_SIMULATOR_TARGET_ID))
         return QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png"));
     return QIcon();
 }
@@ -194,6 +197,8 @@ Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QStr
         t->addQt4BuildConfiguration(displayName, info.version, info.buildConfig, info.additionalArguments, info.directory);
     }
 
+    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
+
     // create RunConfigurations:
     QStringList pathes = qt4project->applicationProFilePathes();
     foreach (const QString &path, pathes)
@@ -231,7 +236,8 @@ Qt4Target::Qt4Target(Qt4Project *parent, const QString &id) :
     ProjectExplorer::Target(parent, id),
     m_connectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOn.png")),
     m_disconnectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOff.png")),
-    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this))
+    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)),
+    m_deployConfigurationFactory(new Qt4DeployConfigurationFactory(this))
 {
     connect(project(), SIGNAL(supportedTargetIdsChanged()),
             this, SLOT(updateQtVersion()));
@@ -277,28 +283,21 @@ Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName,
     Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this);
     bc->setDisplayName(displayName);
 
-    QMakeStep *qmakeStep = new QMakeStep(bc);
-    bc->insertStep(ProjectExplorer::BuildStep::Build, 0, qmakeStep);
-
-    MakeStep *makeStep = new MakeStep(bc);
-    bc->insertStep(ProjectExplorer::BuildStep::Build, 1, makeStep);
-
-    if (id() == Constants::S60_DEVICE_TARGET_ID) {
-        S60CreatePackageStep *packageStep = new S60CreatePackageStep(bc);
-        bc->insertStep(ProjectExplorer::BuildStep::Deploy, 2, packageStep);
-        S60DeployStep *deployStep = new S60DeployStep(bc);
-        bc->insertStep(ProjectExplorer::BuildStep::Deploy, 3, deployStep);
-    } else if (id() == Constants::MAEMO_DEVICE_TARGET_ID) {
-        bc->insertStep(ProjectExplorer::BuildStep::Deploy, 2,
-            new MaemoPackageCreationStep(bc));
-        bc->insertStep(ProjectExplorer::BuildStep::Deploy, 3,
-            new MaemoDeployStep(bc));
-    }
+    BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
+    Q_ASSERT(buildSteps);
+    Q_ASSERT(cleanSteps);
+
+    QMakeStep *qmakeStep = new QMakeStep(buildSteps);
+    buildSteps->insertStep(0, qmakeStep);
 
-    MakeStep* cleanStep = new MakeStep(bc);
+    MakeStep *makeStep = new MakeStep(buildSteps);
+    buildSteps->insertStep(1, makeStep);
+
+    MakeStep* cleanStep = new MakeStep(cleanSteps);
     cleanStep->setClean(true);
     cleanStep->setUserArguments(QStringList() << "clean");
-    bc->insertStep(ProjectExplorer::BuildStep::Clean, 0, cleanStep);
+    cleanSteps->insertStep(0, cleanStep);
     if (!additionalArguments.isEmpty())
         qmakeStep->setUserArguments(additionalArguments);
 
@@ -324,6 +323,11 @@ Qt4BuildConfigurationFactory *Qt4Target::buildConfigurationFactory() const
     return m_buildConfigurationFactory;
 }
 
+ProjectExplorer::DeployConfigurationFactory *Qt4Target::deployConfigurationFactory() const
+{
+    return m_deployConfigurationFactory;
+}
+
 void Qt4Target::addRunConfigurationForPath(const QString &proFilePath)
 {
     if (id() == QLatin1String(Constants::DESKTOP_TARGET_ID) ||
diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h
index ae907d663370a3d2f62bf106aa3315dc0ae97312..c1ed7f3b6022fe94b42e5152c3b609ccf032a6e5 100644
--- a/src/plugins/qt4projectmanager/qt4target.h
+++ b/src/plugins/qt4projectmanager/qt4target.h
@@ -43,6 +43,7 @@ namespace Internal {
 class Qt4ProFileNode;
 class Qt4TargetFactory;
 class Qt4BuildConfigurationFactory;
+class Qt4DeployConfigurationFactory;
 
 struct BuildConfigurationInfo {
     explicit BuildConfigurationInfo(QtVersion *v = 0, QtVersion::QmakeBuildConfigs bc = QtVersion::QmakeBuildConfig(0),
@@ -75,6 +76,7 @@ public:
     void addRunConfigurationForPath(const QString &proFilePath);
 
     Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
 
     QList<ProjectExplorer::ToolChain::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChain::ToolChainType> &candidates) const;
     ProjectExplorer::ToolChain::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChain::ToolChainType> &candidates) const;
@@ -105,6 +107,7 @@ private:
     const QPixmap m_disconnectedPixmap;
 
     Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
+    Internal::Qt4DeployConfigurationFactory *m_deployConfigurationFactory;
 };
 
 class Qt4TargetFactory : public ProjectExplorer::ITargetFactory