diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index d3a60ae9a0e70f248925baa83d809d42d264637e..3440cfac250dfb166c86862cfe406314a7926139 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -667,7 +667,7 @@ bool CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
 
         MakeStep *cleanMakeStep = new MakeStep(this);
         insertCleanStep(0, cleanMakeStep);
-        cleanMakeStep->setValue("clean", true);
+        cleanMakeStep->setClean(true);
         setActiveBuildConfiguration(bc);
     } else {
         // We have a user file, but we could still be missing the cbp file
diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp
index 3a9b975882e92a0e3734f3604d6e13cda9d2f4b3..c102774b75759f4f85bab43c074078303933f12c 100644
--- a/src/plugins/cmakeprojectmanager/makestep.cpp
+++ b/src/plugins/cmakeprojectmanager/makestep.cpp
@@ -42,7 +42,7 @@ using namespace CMakeProjectManager;
 using namespace CMakeProjectManager::Internal;
 
 MakeStep::MakeStep(CMakeProject *pro)
-    : AbstractMakeStep(pro), m_pro(pro)
+    : AbstractMakeStep(pro), m_pro(pro), m_clean(false)
 {
     m_percentProgress = QRegExp("^\\[\\s*(\\d*)%\\]");
 }
@@ -52,27 +52,70 @@ MakeStep::~MakeStep()
 
 }
 
+void MakeStep::setClean(bool clean)
+{
+    m_clean = clean;
+}
+
+void MakeStep::restoreFromMap(const QMap<QString, QVariant> &map)
+{
+    if (map.value("clean").isValid() && map.value("clean").toBool())
+        m_clean = true;
+    ProjectExplorer::AbstractMakeStep::restoreFromMap(map);
+}
+
+void MakeStep::storeIntoMap(QMap<QString, QVariant> &map)
+{
+    if (m_clean)
+        map["clean"] = true;
+    ProjectExplorer::AbstractMakeStep::storeIntoMap(map);
+}
+
+void MakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map)
+{
+    m_values[buildConfiguration].buildTargets = map["buildTargets"].toStringList();
+    m_values[buildConfiguration].additionalArguments = map["additionalArguments"].toStringList();
+    ProjectExplorer::AbstractMakeStep::restoreFromMap(buildConfiguration, map);
+}
+
+void MakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map)
+{
+    map["buildTargets"] = m_values.value(buildConfiguration).buildTargets;
+    map["additionalArguments"] = m_values.value(buildConfiguration).additionalArguments;
+    ProjectExplorer::AbstractMakeStep::storeIntoMap(buildConfiguration, map);
+}
+
+
+void MakeStep::addBuildConfiguration(const QString & name)
+{
+    m_values.insert(name, MakeStepSettings());
+}
+
+void MakeStep::removeBuildConfiguration(const QString & name)
+{
+    m_values.remove(name);
+}
+
+void MakeStep::copyBuildConfiguration(const QString &source, const QString &dest)
+{
+    m_values.insert(dest, m_values.value(source));
+}
+
 bool MakeStep::init(const QString &buildConfiguration)
 {
     ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration);
     setBuildParser(m_pro->buildParser(bc));
 
-    setEnabled(buildConfiguration, true);
-    setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(bc));
+    setEnabled(true);
+    setWorkingDirectory(m_pro->buildDirectory(bc));
 
-    setCommand(buildConfiguration, m_pro->toolChain(bc)->makeCommand());
-
-    if (!value(buildConfiguration, "cleanConfig").isValid() &&value("clean").isValid() && value("clean").toBool()) {
-        // Import old settings
-        setValue(buildConfiguration, "cleanConfig", true);
-        setAdditionalArguments(buildConfiguration, QStringList() << "clean");
-    }
+    setCommand(m_pro->toolChain(bc)->makeCommand());
 
-    QStringList arguments = value(buildConfiguration, "buildTargets").toStringList();
+    QStringList arguments = m_values.value(buildConfiguration).buildTargets;
     arguments << additionalArguments(buildConfiguration);
-    setArguments(buildConfiguration, arguments); // TODO
-    setEnvironment(buildConfiguration, m_pro->environment(bc));
-    setIgnoreReturnValue(buildConfiguration, value(buildConfiguration, "cleanConfig").isValid());
+    setArguments(arguments); // TODO
+    setEnvironment(m_pro->environment(bc));
+    setIgnoreReturnValue(m_clean);
 
     return AbstractMakeStep::init(buildConfiguration);
 }
@@ -125,28 +168,27 @@ CMakeProject *MakeStep::project() const
 
 bool MakeStep::buildsTarget(const QString &buildConfiguration, const QString &target) const
 {
-    return value(buildConfiguration, "buildTargets").toStringList().contains(target);
+    return m_values.value(buildConfiguration).buildTargets.contains(target);
 }
 
 void MakeStep::setBuildTarget(const QString &buildConfiguration, const QString &target, bool on)
 {
-    QStringList old = value(buildConfiguration, "buildTargets").toStringList();
+    QStringList old = m_values.value(buildConfiguration).buildTargets;
     if (on && !old.contains(target))
-        old.append(target);
+        old << target;
     else if(!on && old.contains(target))
         old.removeOne(target);
-
-    setValue(buildConfiguration, "buildTargets", old);
+    m_values[buildConfiguration].buildTargets = old;
 }
 
 QStringList MakeStep::additionalArguments(const QString &buildConfiguration) const
 {
-    return value(buildConfiguration, "additionalArguments").toStringList();
+    return m_values.value(buildConfiguration).additionalArguments;
 }
 
 void MakeStep::setAdditionalArguments(const QString &buildConfiguration, const QStringList &list)
 {
-    setValue(buildConfiguration, "additionalArguments", list);
+    m_values[buildConfiguration].additionalArguments = list;
 }
 
 //
@@ -202,12 +244,6 @@ QString MakeStepConfigWidget::displayName() const
 
 void MakeStepConfigWidget::init(const QString &buildConfiguration)
 {
-    if (!m_makeStep->value(buildConfiguration, "cleanConfig").isValid() && m_makeStep->value("clean").isValid() && m_makeStep->value("clean").toBool()) {
-        // Import old settings
-        m_makeStep->setValue(buildConfiguration, "cleanConfig", true);
-        m_makeStep->setAdditionalArguments(buildConfiguration, QStringList() << "clean");
-    }
-
     // disconnect to make the changes to the items
     disconnect(m_targetsList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*)));
     m_buildConfiguration = buildConfiguration;
@@ -225,7 +261,7 @@ void MakeStepConfigWidget::init(const QString &buildConfiguration)
 
 void MakeStepConfigWidget::updateDetails()
 {
-    QStringList arguments = m_makeStep->value(m_buildConfiguration, "buildTargets").toStringList();
+    QStringList arguments = m_makeStep->m_values.value(m_buildConfiguration).buildTargets;
     arguments << m_makeStep->additionalArguments(m_buildConfiguration);
     m_summaryText = tr("<b>Make:</b> %1 %2")
                     .arg(m_makeStep->project()->toolChain(
diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h
index 404e2bcea9b9f0029e9a27d87d11834d86f74867..05062c90c1f91c416f232bc910c3cfbb5c46cab8 100644
--- a/src/plugins/cmakeprojectmanager/makestep.h
+++ b/src/plugins/cmakeprojectmanager/makestep.h
@@ -43,9 +43,17 @@ namespace Internal {
 
 class CMakeProject;
 
+struct MakeStepSettings
+{
+    QStringList buildTargets;
+    QStringList additionalArguments;
+};
+
 class MakeStep : public ProjectExplorer::AbstractMakeStep
 {
     Q_OBJECT
+    friend class MakeStepConfigWidget; // TODO remove
+    // This is for modifying m_values
 public:
     MakeStep(CMakeProject *pro);
     ~MakeStep();
@@ -62,13 +70,27 @@ public:
     void setBuildTarget(const QString &buildConfiguration, const QString &target, bool on);
     QStringList additionalArguments(const QString &buildConfiguration) const;
     void setAdditionalArguments(const QString &buildConfiguration, const QStringList &list);
+
+    virtual void restoreFromMap(const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(QMap<QString, QVariant> &map);
+
+    void setClean(bool clean);
+
+    virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map);
+
+    virtual void addBuildConfiguration(const QString & name);
+    virtual void removeBuildConfiguration(const QString & name);
+    virtual void copyBuildConfiguration(const QString &source, const QString &dest);
 protected:
     // For parsing [ 76%]
     virtual void stdOut(const QString &line);
 private:
     CMakeProject *m_pro;
+    bool m_clean;
     QRegExp m_percentProgress;
     QFutureInterface<bool> *m_futureInterface;
+    QMap<QString, MakeStepSettings> m_values;
 };
 
 class MakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget
diff --git a/src/plugins/genericprojectmanager/genericmakestep.cpp b/src/plugins/genericprojectmanager/genericmakestep.cpp
index 57e648d455e4c5fa1440526a7c91d9fd2eb39b3c..d418eea038962f57a26d76ae53623cf1232264bc 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.cpp
+++ b/src/plugins/genericprojectmanager/genericmakestep.cpp
@@ -63,24 +63,56 @@ bool GenericMakeStep::init(const QString &buildConfigurationName)
     setBuildParser(buildParser);
     qDebug() << "*** build parser:" << buildParser;
 
-    setEnabled(buildConfigurationName, true);
+    setEnabled(true);
     Core::VariableManager *vm = Core::VariableManager::instance();
     const QString rawBuildDir = m_pro->buildDirectory(bc);
     const QString buildDir = vm->resolve(rawBuildDir);
-    setWorkingDirectory(buildConfigurationName, buildDir);
+    setWorkingDirectory(buildDir);
 
-    setCommand(buildConfigurationName, makeCommand(buildConfigurationName));
-    setArguments(buildConfigurationName, replacedArguments(buildConfigurationName));
+    setCommand(makeCommand(buildConfigurationName));
+    setArguments(replacedArguments(buildConfigurationName));
 
-    setEnvironment(buildConfigurationName, m_pro->environment(bc));
+    setEnvironment(m_pro->environment(bc));
     return AbstractMakeStep::init(buildConfigurationName);
 }
 
+void GenericMakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map)
+{
+    m_values[buildConfiguration].buildTargets = map.value("buildTargets").toStringList();
+    m_values[buildConfiguration].makeArguments = map.value("makeArguments").toStringList();
+    m_values[buildConfiguration].makeCommand = map.value("makeCommand").toString();
+    ProjectExplorer::AbstractMakeStep::restoreFromMap(buildConfiguration, map);
+}
+
+void GenericMakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map)
+{
+    map["buildTargets"] = m_values.value(buildConfiguration).buildTargets;
+    map["makeArguments"] = m_values.value(buildConfiguration).makeArguments;
+    map["makeCommand"] = m_values.value(buildConfiguration).makeCommand;
+    ProjectExplorer::AbstractMakeStep::storeIntoMap(buildConfiguration, map);
+}
+
+void GenericMakeStep::addBuildConfiguration(const QString & name)
+{
+    m_values.insert(name, GenericMakeStepSettings());
+}
+
+void GenericMakeStep::removeBuildConfiguration(const QString & name)
+{
+    m_values.remove(name);
+}
+
+void GenericMakeStep::copyBuildConfiguration(const QString &source, const QString &dest)
+{
+    m_values.insert(dest, m_values.value(source));
+}
+
+
 QStringList GenericMakeStep::replacedArguments(const QString &buildConfiguration) const
 {
     Core::VariableManager *vm = Core::VariableManager::instance();
-    const QStringList targets = value(buildConfiguration, "buildTargets").toStringList();
-    QStringList arguments = value(buildConfiguration, "makeArguments").toStringList();
+    const QStringList targets = m_values.value(buildConfiguration).buildTargets;
+    QStringList arguments = m_values.value(buildConfiguration).makeArguments;
     QStringList replacedArguments;
     foreach (const QString &arg, arguments) {
       replacedArguments.append(vm->resolve(arg));
@@ -93,7 +125,7 @@ QStringList GenericMakeStep::replacedArguments(const QString &buildConfiguration
 
 QString GenericMakeStep::makeCommand(const QString &buildConfiguration) const
 {
-    QString command = value(buildConfiguration, "makeCommand").toString();
+    QString command = m_values.value(buildConfiguration).makeCommand;
     if (command.isEmpty()) {
         if (ProjectExplorer::ToolChain *toolChain = m_pro->toolChain())
             command = toolChain->makeCommand();
@@ -135,17 +167,18 @@ GenericProject *GenericMakeStep::project() const
 
 bool GenericMakeStep::buildsTarget(const QString &buildConfiguration, const QString &target) const
 {
-    return value(buildConfiguration, "buildTargets").toStringList().contains(target);
+    return m_values.value(buildConfiguration).buildTargets.contains(target);
 }
 
 void GenericMakeStep::setBuildTarget(const QString &buildConfiguration, const QString &target, bool on)
 {
-    QStringList old = value(buildConfiguration, "buildTargets").toStringList();
+    QStringList old = m_values.value(buildConfiguration).buildTargets;
     if (on && !old.contains(target))
-        old << target;
+         old << target;
     else if(!on && old.contains(target))
         old.removeOne(target);
-    setValue(buildConfiguration, "buildTargets", old);
+
+    m_values[buildConfiguration].buildTargets = old;
 }
 
 //
@@ -196,11 +229,10 @@ void GenericMakeStepConfigWidget::init(const QString &buildConfiguration)
 
     updateMakeOverrrideLabel();
 
-    QString makeCommand = m_makeStep->value(buildConfiguration, "makeCommand").toString();
+    QString makeCommand = m_makeStep->m_values.value(buildConfiguration).makeCommand;
     m_ui->makeLineEdit->setText(makeCommand);
 
-    const QStringList &makeArguments =
-            m_makeStep->value(buildConfiguration, "makeArguments").toStringList();
+    const QStringList &makeArguments = m_makeStep->m_values.value(buildConfiguration).makeArguments;
     m_ui->makeArgumentsLineEdit->setText(ProjectExplorer::Environment::joinArgumentList(makeArguments));
 
     // Disconnect to make the changes to the items
@@ -240,15 +272,15 @@ void GenericMakeStepConfigWidget::itemChanged(QListWidgetItem *item)
 void GenericMakeStepConfigWidget::makeLineEditTextEdited()
 {
     QTC_ASSERT(!m_buildConfiguration.isNull(), return);
-    m_makeStep->setValue(m_buildConfiguration, "makeCommand", m_ui->makeLineEdit->text());
+    m_makeStep->m_values[m_buildConfiguration].makeCommand = m_ui->makeLineEdit->text();
     updateDetails();
 }
 
 void GenericMakeStepConfigWidget::makeArgumentsLineEditTextEdited()
 {
     QTC_ASSERT(!m_buildConfiguration.isNull(), return);
-    m_makeStep->setValue(m_buildConfiguration, "makeArguments",
-                         ProjectExplorer::Environment::parseCombinedArgString(m_ui->makeArgumentsLineEdit->text()));
+    m_makeStep->m_values[m_buildConfiguration].makeArguments =
+                         ProjectExplorer::Environment::parseCombinedArgString(m_ui->makeArgumentsLineEdit->text());
     updateDetails();
 }
 
diff --git a/src/plugins/genericprojectmanager/genericmakestep.h b/src/plugins/genericprojectmanager/genericmakestep.h
index afcb48ead0c0164cd2d8fd279321a0a3537a91b5..5ec2dc5eaec444b3f3a06a9fce1ed08989b7a7e4 100644
--- a/src/plugins/genericprojectmanager/genericmakestep.h
+++ b/src/plugins/genericprojectmanager/genericmakestep.h
@@ -44,10 +44,20 @@ namespace GenericProjectManager {
 namespace Internal {
 
 class GenericProject;
+class GenericMakeStepConfigWidget;
+
+struct GenericMakeStepSettings
+{
+    QStringList buildTargets;
+    QStringList makeArguments;
+    QString makeCommand;
+};
 
 class GenericMakeStep : public ProjectExplorer::AbstractMakeStep
 {
     Q_OBJECT
+    friend class GenericMakeStepConfigWidget; // TODO remove again?
+    // Currently the ConfigWidget accesses the m_values directly
 public:
     GenericMakeStep(GenericProject *pro);
     ~GenericMakeStep();
@@ -64,8 +74,16 @@ public:
     void setBuildTarget(const QString &buildConfiguration, const QString &target, bool on);
     QStringList replacedArguments(const QString &buildConfiguration) const;
     QString makeCommand(const QString &buildConfiguration) const;
+
+    virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map);
+
+    virtual void addBuildConfiguration(const QString & name);
+    virtual void removeBuildConfiguration(const QString & name);
+    virtual void copyBuildConfiguration(const QString &source, const QString &dest);
 private:
     GenericProject *m_pro;
+    QMap<QString, GenericMakeStepSettings> m_values;
 };
 
 class GenericMakeStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget
diff --git a/src/plugins/projectexplorer/abstractmakestep.cpp b/src/plugins/projectexplorer/abstractmakestep.cpp
index 85f2a45d224139553bc94934f3140bc25a1ec383..3f2d6ee382776d60b5860e2a5a555e4f7580df2e 100644
--- a/src/plugins/projectexplorer/abstractmakestep.cpp
+++ b/src/plugins/projectexplorer/abstractmakestep.cpp
@@ -64,7 +64,7 @@ bool AbstractMakeStep::init(const QString &buildConfiguration)
     m_buildConfiguration = buildConfiguration;
 
     m_openDirectories.clear();
-    addDirectory(workingDirectory(buildConfiguration));
+    addDirectory(workingDirectory());
 
     return AbstractProcessStep::init(buildConfiguration);
 }
diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp
index e3b7757881ea3ab21ea8545db5c4491bb694535f..90b86978b130f2e1fca6ee4e8364d86b8f459f08 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.cpp
+++ b/src/plugins/projectexplorer/abstractprocessstep.cpp
@@ -39,92 +39,54 @@
 
 using namespace ProjectExplorer;
 
-static const char * const PROCESS_COMMAND          = "abstractProcess.command";
-static const char * const PROCESS_WORKINGDIRECTORY = "abstractProcess.workingDirectory";
-static const char * const PROCESS_ARGUMENTS        = "abstractProcess.arguments";
-static const char * const PROCESS_ENABLED          = "abstractProcess.enabled";
-static const char * const PROCESS_ENVIRONMENT      = "abstractProcess.Environment";
-static const char * const PROCESS_IGNORE_RETURN_VALUE = "abstractProcess.IgnoreReturnValue";
-
 AbstractProcessStep::AbstractProcessStep(Project *pro)
   : BuildStep(pro)
 {
 }
 
-void AbstractProcessStep::setCommand(const QString &buildConfiguration, const QString &cmd)
-{
-    setValue(buildConfiguration, PROCESS_COMMAND, cmd);
-}
-
-QString AbstractProcessStep::command(const QString &buildConfiguration) const
-{
-    QString result = value(buildConfiguration, PROCESS_COMMAND).toString();
-    if (QFileInfo(result).isRelative()) {
-        QString searchInPath = environment(buildConfiguration).searchInPath(result);
-        if (!searchInPath.isEmpty())
-            result = searchInPath;
-    }
-    return result;
-}
-
-void AbstractProcessStep::setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory)
-{
-    setValue(buildConfiguration, PROCESS_WORKINGDIRECTORY, workingDirectory);
-}
-
-QString AbstractProcessStep::workingDirectory(const QString &buildConfiguration) const
-{
-    return value(buildConfiguration, PROCESS_WORKINGDIRECTORY).toString();
-}
-
-void AbstractProcessStep::setArguments(const QString &buildConfiguration, const QStringList &arguments)
+void AbstractProcessStep::setCommand(const QString &cmd)
 {
-    setValue(buildConfiguration, PROCESS_ARGUMENTS, arguments);
+    m_command = cmd;
 }
 
-QStringList AbstractProcessStep::arguments(const QString &buildConfiguration) const
+QString AbstractProcessStep::workingDirectory() const
 {
-    return value(buildConfiguration, PROCESS_ARGUMENTS).toStringList();
+    return m_workingDirectory;
 }
 
-void AbstractProcessStep::setEnabled(const QString &buildConfiguration, bool b)
+void AbstractProcessStep::setWorkingDirectory(const QString &workingDirectory)
 {
-    setValue(buildConfiguration, PROCESS_ENABLED, b);
+    m_workingDirectory = workingDirectory;
 }
 
-bool AbstractProcessStep::enabled(const QString &buildConfiguration) const
+void AbstractProcessStep::setArguments(const QStringList &arguments)
 {
-    return value(buildConfiguration, PROCESS_ENABLED).toBool();
+    m_arguments = arguments;
 }
 
-void AbstractProcessStep::setIgnoreReturnValue(const QString &buildConfiguration, bool b)
+void AbstractProcessStep::setEnabled(bool b)
 {
-    setValue(buildConfiguration, PROCESS_IGNORE_RETURN_VALUE, b);
+    m_enabled = b;
 }
 
-bool AbstractProcessStep::ignoreReturnValue(const QString &buildConfiguration) const
+void AbstractProcessStep::setIgnoreReturnValue(bool b)
 {
-    return value(buildConfiguration, PROCESS_IGNORE_RETURN_VALUE).toBool();
+    m_ignoreReturnValue = b;
 }
 
-void AbstractProcessStep::setEnvironment(const QString &buildConfiguration, Environment env)
+void AbstractProcessStep::setEnvironment(Environment env)
 {
-    setValue(buildConfiguration, PROCESS_ENVIRONMENT, env.toStringList());
+    m_environment = env;
 }
 
-Environment AbstractProcessStep::environment(const QString &buildConfiguration) const
+bool AbstractProcessStep::init(const QString &buildConfiguration)
 {
-    return Environment(value(buildConfiguration, PROCESS_ENVIRONMENT).toStringList());
-}
-
-bool AbstractProcessStep::init(const QString &name)
-{
-    m_command = command(name);
-    m_arguments = arguments(name);
-    m_enabled = enabled(name);
-    m_workingDirectory = workingDirectory(name);
-    m_environment = environment(name);
-    m_ignoreReturnValue = ignoreReturnValue(name);
+    Q_UNUSED(buildConfiguration)
+    if (QFileInfo(m_command).isRelative()) {
+        QString searchInPath = m_environment.searchInPath(m_command);
+        if (!searchInPath.isEmpty())
+            m_command = searchInPath;
+    }
     return true;
 }
 
diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h
index 3d7cc5c019fc6a2b23a8943bd36ee7935029a036..fae2a7ad3d2a80c243b4f647dd02e2015f0a99d4 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.h
+++ b/src/plugins/projectexplorer/abstractprocessstep.h
@@ -80,39 +80,34 @@ public:
     virtual bool immutable() const = 0;
 
     /// setCommand() sets the executable to run in the \p buildConfiguration
-    void setCommand(const QString &buildConfiguration, const QString &cmd);
-    /// returns the executable that is run for the \p buildConfiguration
-    QString command(const QString &buildConfiguration) const;
+    /// should be called from init()
+    void setCommand(const QString &cmd);
 
     /// sets the workingDirectory for the process for a buildConfiguration
-    /// if no workingDirectory is set, it falls back to the projects workingDirectory TODO remove that magic, thats bad
-    void setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory);
-    /// returns the workingDirectory for a \p buildConfiguration
-    QString workingDirectory(const QString &buildConfiguration) const;
+    /// should be called from init()
+    void setWorkingDirectory(const QString &workingDirectory);
 
     /// sets the command line arguments used by the process for a \p buildConfiguration
-    void setArguments(const QString &buildConfiguration, const QStringList &arguments);
-    /// returns the arguments used in the \p buildCOnfiguration
-    QStringList arguments(const QString &buildConfiguration) const;
+    /// should be called from init()
+    void setArguments(const QStringList &arguments);
 
     /// enables or disables a BuildStep
     /// Disabled BuildSteps immediately return true from their run method
-    void setEnabled(const QString &buildConfiguration, bool b);
-    /// returns wheter the BuildStep is disabled
-    bool enabled(const QString &buildConfiguration) const;
-
-    /*! If ignoreReturnValue is set to true, then the abstractprocess step will
-        return sucess even if the return value indicates otherwise
-    */
-    void setIgnoreReturnValue(const QString &buildConfiguration,bool b);
-    /*! returns ignoreReturnValue
-    */
-    bool ignoreReturnValue(const QString &buildConfiguration) const;
-
-    void setEnvironment(const QString &buildConfiguration, Environment env);
-    Environment environment(const QString &buildConfiguration) const;
-
+    /// should be called from init()
+    void setEnabled(bool b);
+
+    /// If ignoreReturnValue is set to true, then the abstractprocess step will
+    /// return sucess even if the return value indicates otherwise
+    /// should be called from init
+    void setIgnoreReturnValue(bool b);
+    /// Set the Environment for running the command
+    /// should be called from init()
+    void setEnvironment(Environment env);
+
+    // TODO can I remove this?
+    QString workingDirectory() const;
 protected:
+
     /// Called after the process is started
     /// the default implementation adds a process started message to the output message
     virtual void processStarted();
@@ -122,7 +117,13 @@ protected:
     /// Called if the process could not be started,
     /// by default adds a message to the output window
     virtual void processStartupFailed();
+    /// Called for each line of output on stdOut()
+    /// the default implementation adds the line to the
+    /// application output window
     virtual void stdOut(const QString &line);
+    /// Called for each line of output on StdErrror()
+    /// the default implementation adds the line to the
+    /// application output window
     virtual void stdError(const QString &line);
 private slots:
     void processReadyReadStdOutput();
diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp
index 51d6e83161428d4a3940c81dfb70fcfed5fedb8a..57c45f0bead975db55a0ab360fbcbc99d43454c9 100644
--- a/src/plugins/projectexplorer/buildstep.cpp
+++ b/src/plugins/projectexplorer/buildstep.cpp
@@ -39,94 +39,55 @@ using namespace ProjectExplorer;
 BuildStep::BuildStep(Project * pro)
     : m_project(pro)
 {
-    m_configuration = new BuildConfiguration("");
 }
 
 BuildStep::~BuildStep()
 {
-    qDeleteAll(m_buildConfigurations);
-    delete m_configuration;
-}
-
-Project * BuildStep::project() const
-{
-    return m_project;
-}
 
-void BuildStep::addBuildConfiguration(const QString &name)
-{
-    m_buildConfigurations.push_back(new BuildConfiguration(name));
 }
 
-void BuildStep::removeBuildConfiguration(const QString &name)
-{
-    for (int i = 0; i != m_buildConfigurations.size(); ++i)
-        if (m_buildConfigurations.at(i)->name() == name) {
-            delete m_buildConfigurations.at(i);
-            m_buildConfigurations.removeAt(i);
-            break;
-        }
-}
 
-void BuildStep::copyBuildConfiguration(const QString &source, const QString &dest)
+void BuildStep::restoreFromMap(const QMap<QString, QVariant> &map)
 {
-    for (int i = 0; i != m_buildConfigurations.size(); ++i)
-        if (m_buildConfigurations.at(i)->name() == source)
-            m_buildConfigurations.push_back(new BuildConfiguration(dest, m_buildConfigurations.at(i)));
+    Q_UNUSED(map)
 }
 
-void BuildStep::setValue(const QString &buildConfiguration, const QString &name, const QVariant &value)
+void BuildStep::storeIntoMap(QMap<QString, QVariant> &map)
 {
-    BuildConfiguration *bc = getBuildConfiguration(buildConfiguration);
-    Q_ASSERT(bc);
-    bc->setValue(name, value);
+    Q_UNUSED(map)
 }
 
-void BuildStep::setValue(const QString &name, const QVariant &value)
+void BuildStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map)
 {
-    m_configuration->setValue(name, value);
+    Q_UNUSED(buildConfiguration)
+    Q_UNUSED(map)
 }
 
-QVariant BuildStep::value(const QString &buildConfiguration, const QString &name) const
+void BuildStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map)
 {
-    BuildConfiguration *bc = getBuildConfiguration(buildConfiguration);
-    if (bc)
-        return bc->value(name);
-    else
-        return QVariant();
+    Q_UNUSED(buildConfiguration)
+    Q_UNUSED(map)
 }
 
-QVariant BuildStep::value(const QString &name) const
-{
-    return m_configuration->value(name);
-}
-
-void BuildStep::setValuesFromMap(const QMap<QString, QVariant> & values)
-{
-    m_configuration->setValuesFromMap(values);
-}
-
-void BuildStep::setValuesFromMap(const QString & buildConfiguration, const QMap<QString, QVariant> & values)
+Project * BuildStep::project() const
 {
-    getBuildConfiguration(buildConfiguration)->setValuesFromMap(values);
+    return m_project;
 }
 
-QMap<QString, QVariant> BuildStep::valuesToMap()
+void BuildStep::addBuildConfiguration(const QString &name)
 {
-    return m_configuration->toMap();
+    Q_UNUSED(name)
 }
 
-QMap<QString, QVariant> BuildStep::valuesToMap(const QString & buildConfiguration)
+void BuildStep::removeBuildConfiguration(const QString &name)
 {
-    return getBuildConfiguration(buildConfiguration)->toMap();
+    Q_UNUSED(name)
 }
 
-BuildConfiguration * BuildStep::getBuildConfiguration(const QString & name) const
+void BuildStep::copyBuildConfiguration(const QString &source, const QString &dest)
 {
-    for (int i = 0; i != m_buildConfigurations.size(); ++i)
-        if (m_buildConfigurations.at(i)->name() == name)
-            return m_buildConfigurations.at(i);
-    return 0;
+    Q_UNUSED(source)
+    Q_UNUSED(dest)
 }
 
 bool BuildStep::immutable() const
diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h
index e78f2d7ad9d984d296314c512d3240e34e5d59f6..08a8d1f67a076f67e2925fe76ee5f5acd03c31f6 100644
--- a/src/plugins/projectexplorer/buildstep.h
+++ b/src/plugins/projectexplorer/buildstep.h
@@ -92,17 +92,6 @@ public:
     // The name shown to the user
     virtual QString displayName() = 0;
 
-    // sets a value, which can be retrieved with value()
-    // these values are automatically saved and restored when qt creator is quit and restarted
-    void setValue(const QString &name, const QVariant &value);
-    // sets a value specific to a buildConfiguration
-    void setValue(const QString &buildConfiguration, const QString &name, const QVariant &value);
-
-    // retrieves a value
-    QVariant value(const QString &name) const;
-    // retrieves a value specific to a buildConfiguration
-    QVariant value(const QString &buildConfiguration, const QString & name) const;
-
     // the Widget shown in the project settings dialog for this buildStep
     // ownership is transfered to the caller
     virtual BuildStepConfigWidget *createConfigWidget() = 0;
@@ -112,18 +101,17 @@ public:
     // the default implementation returns false
     virtual bool immutable() const;
 
-    Project *project() const;
+    virtual void restoreFromMap(const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(QMap<QString, QVariant> &map);
 
-protected:
-    // internal function for restoring the configuration
-    void setValuesFromMap(const QMap<QString, QVariant> &values);
-    // internal function for restoring the configuration
-    void setValuesFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &values);
+    virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map);
 
-    // internal function for storing the configuration
-    QMap<QString, QVariant> valuesToMap();
-    // internal function for storing the configuration
-    QMap<QString, QVariant> valuesToMap(const QString & buildConfiguration);
+    virtual void addBuildConfiguration(const QString & name);
+    virtual void removeBuildConfiguration(const QString & name);
+    virtual void copyBuildConfiguration(const QString &source, const QString &dest);
+
+    Project *project() const;
 
 Q_SIGNALS:
     void addToTaskWindow(const ProjectExplorer::TaskWindow::Task &task);
@@ -132,13 +120,6 @@ Q_SIGNALS:
     void addToOutputWindow(const QString &string);
 
 private:
-    void addBuildConfiguration(const QString & name);
-    void removeBuildConfiguration(const QString & name);
-    BuildConfiguration *getBuildConfiguration(const QString & name) const;
-    void copyBuildConfiguration(const QString &source, const QString &dest);
-
-    QList<BuildConfiguration *> m_buildConfigurations;
-    BuildConfiguration *m_configuration;
     Project *m_project;
 };
 
diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp
index 15c5b0d17ac981300423e29b8dfd309379ef7182..d3850455abc4586b33d62ca3de55534010971014 100644
--- a/src/plugins/projectexplorer/processstep.cpp
+++ b/src/plugins/projectexplorer/processstep.cpp
@@ -32,6 +32,7 @@
 #include "project.h"
 
 #include <coreplugin/ifile.h>
+#include <utils/qtcassert.h>
 
 #include <QtCore/QDebug>
 #include <QtGui/QFileDialog>
@@ -39,6 +40,11 @@
 using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
+static const char * const PROCESS_COMMAND          = "abstractProcess.command";
+static const char * const PROCESS_WORKINGDIRECTORY = "abstractProcess.workingDirectory";
+static const char * const PROCESS_ARGUMENTS        = "abstractProcess.arguments";
+static const char * const PROCESS_ENABLED          = "abstractProcess.enabled";
+
 ProcessStep::ProcessStep(Project *pro)
         : AbstractProcessStep(pro)
 {
@@ -48,14 +54,12 @@ ProcessStep::ProcessStep(Project *pro)
 bool ProcessStep::init(const QString &buildConfigurationName)
 {
     BuildConfiguration *bc = project()->buildConfiguration(buildConfigurationName);
-    setEnvironment(buildConfigurationName, project()->environment(bc));
-    QVariant wd = value(buildConfigurationName, "workingDirectory").toString();
-    QString workingDirectory;
-    if (!wd.isValid() || wd.toString().isEmpty())
-        workingDirectory = "$BUILDDIR";
-    else
-        workingDirectory = wd.toString();
-    setWorkingDirectory(buildConfigurationName, workingDirectory.replace("$BUILDDIR", project()->buildDirectory(bc)));
+    setEnvironment(project()->environment(bc));
+    QString wd = workingDirectory(buildConfigurationName);
+    if (wd.isEmpty())
+        wd = "$BUILDDIR";
+
+    AbstractProcessStep::setWorkingDirectory(wd.replace("$BUILDDIR", project()->buildDirectory(bc)));
     return AbstractProcessStep::init(buildConfigurationName);
 }
 
@@ -69,19 +73,52 @@ QString ProcessStep::name()
     return "projectexplorer.processstep";
 }
 
+void ProcessStep::restoreFromMap(const QMap<QString, QVariant> &map)
+{
+    QMap<QString, QVariant>::const_iterator it = map.constFind("ProjectExplorer.ProcessStep.DisplayName");
+    if (it != map.constEnd())
+        m_name = (*it).toString();
+    ProjectExplorer::AbstractProcessStep::restoreFromMap(map);
+}
+
+void ProcessStep::storeIntoMap(QMap<QString, QVariant> &map)
+{
+    map["ProjectExplorer.ProcessStep.DisplayName"] = m_name;
+    ProjectExplorer::AbstractProcessStep::storeIntoMap(map);
+}
+
+void ProcessStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map)
+{
+    // TODO checking for PROCESS_*
+    setCommand(buildConfiguration, map.value(PROCESS_COMMAND).toString());
+    setWorkingDirectory(buildConfiguration, map.value(PROCESS_WORKINGDIRECTORY).toString());
+    setArguments(buildConfiguration, map.value(PROCESS_ARGUMENTS).toStringList());
+    setEnabled(buildConfiguration, map.value(PROCESS_ENABLED).toBool());
+    ProjectExplorer::AbstractProcessStep::restoreFromMap(buildConfiguration, map);
+}
+
+void ProcessStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map)
+{
+    map[PROCESS_COMMAND] = command(buildConfiguration);
+    map[PROCESS_WORKINGDIRECTORY] = workingDirectory(buildConfiguration);
+    map[PROCESS_ARGUMENTS] = arguments(buildConfiguration);
+    map[PROCESS_ENABLED] = enabled(buildConfiguration);
+    ProjectExplorer::AbstractProcessStep::storeIntoMap(buildConfiguration, map);
+}
+
+
 void ProcessStep::setDisplayName(const QString &name)
 {
     if (name.isEmpty())
-        setValue("ProjectExplorer.ProcessStep.DisplayName", QVariant());
+        m_name = QString::null;
     else
-        setValue("ProjectExplorer.ProcessStep.DisplayName", name);
+        m_name = name;
 }
 
 QString ProcessStep::displayName()
 {
-    QVariant displayName = value("ProjectExplorer.ProcessStep.DisplayName");
-    if (displayName.isValid())
-        return displayName.toString();
+    if (!m_name.isNull())
+        return m_name;
     else
         return tr("Custom Process Step");
 }
@@ -96,6 +133,83 @@ bool ProcessStep::immutable() const
     return false;
 }
 
+QString ProcessStep::command(const QString &buildConfiguration) const
+{
+    QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return QString::null);
+    return (*it).command;
+}
+
+QStringList ProcessStep::arguments(const QString &buildConfiguration) const
+{
+    QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return QStringList());
+    return (*it).arguments;
+}
+
+bool ProcessStep::enabled(const QString &buildConfiguration) const
+{
+    QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return false);
+    return (*it).enabled;
+}
+
+QString ProcessStep::workingDirectory(const QString &buildConfiguration) const
+{
+    QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return QString::null);
+    return (*it).workingDirectory;
+}
+
+void ProcessStep::setCommand(const QString &buildConfiguration, const QString &command)
+{
+    QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return);
+    it->command = command;
+}
+
+void ProcessStep::setArguments(const QString &buildConfiguration, const QStringList &arguments)
+{
+    QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return);
+    it->arguments = arguments;
+}
+
+void ProcessStep::setEnabled(const QString &buildConfiguration, bool enabled)
+{
+    QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return);
+    it->enabled = enabled;
+}
+
+void ProcessStep::setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory)
+{
+    QMap<QString, ProcessStepSettings>::iterator it = m_values.find(buildConfiguration);
+    QTC_ASSERT(it != m_values.end(), return);
+    it->workingDirectory = workingDirectory;
+}
+
+void ProcessStep::addBuildConfiguration(const QString & name)
+{
+    QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(name);
+    QTC_ASSERT(it == m_values.constEnd(), return);
+    m_values.insert(name, ProcessStepSettings());
+}
+
+void ProcessStep::removeBuildConfiguration(const QString & name)
+{
+    QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(name);
+    QTC_ASSERT(it != m_values.constEnd(), return);
+    m_values.remove(name);
+}
+
+void ProcessStep::copyBuildConfiguration(const QString &source, const QString &dest)
+{
+    QMap<QString, ProcessStepSettings>::const_iterator it = m_values.constFind(source);
+    QTC_ASSERT(it != m_values.constEnd(), return);
+    m_values.insert(dest, *it);
+}
+
 //*******
 // ProcessStepFactory
 //*******
@@ -173,7 +287,7 @@ void ProcessStepConfigWidget::init(const QString &buildConfiguration)
     if (buildConfiguration != QString::null) {
         m_ui.command->setPath(m_step->command(buildConfiguration));
 
-        QString workingDirectory = m_step->value(buildConfiguration, "workingDirectory").toString();
+        QString workingDirectory = m_step->workingDirectory(buildConfiguration);
         if (workingDirectory.isEmpty())
             workingDirectory = "$BUILDDIR";
         m_ui.workingDirectory->setPath(workingDirectory);
@@ -204,8 +318,7 @@ void ProcessStepConfigWidget::commandLineEditTextEdited()
 
 void ProcessStepConfigWidget::workingDirectoryLineEditTextEdited()
 {
-    QString wd = m_ui.workingDirectory->path();
-    m_step->setValue(m_buildConfiguration, "workingDirectory", wd);
+    m_step->setWorkingDirectory(m_buildConfiguration, m_ui.workingDirectory->path());
 }
 
 void ProcessStepConfigWidget::commandArgumentsLineEditTextEdited()
diff --git a/src/plugins/projectexplorer/processstep.h b/src/plugins/projectexplorer/processstep.h
index b0a7fcb04d67f8cf1e2e41257998125616d5bee9..2ec55fdb71af5fdd11f74a2cf083f31821eef069 100644
--- a/src/plugins/projectexplorer/processstep.h
+++ b/src/plugins/projectexplorer/processstep.h
@@ -50,6 +50,15 @@ public:
     virtual QString displayNameForName(const QString &name) const;
 };
 
+struct ProcessStepSettings
+{
+    QString command;
+    QStringList arguments;
+    QString workingDirectory;
+    Environment env;
+    bool enabled;
+};
+
 class ProcessStep : public ProjectExplorer::AbstractProcessStep
 {
     Q_OBJECT
@@ -63,8 +72,30 @@ public:
     virtual QString displayName();
     virtual BuildStepConfigWidget *createConfigWidget();
     virtual bool immutable() const;
+
+    virtual void restoreFromMap(const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(QMap<QString, QVariant> &map);
+
+    virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map);
+
+    virtual void addBuildConfiguration(const QString & name);
+    virtual void removeBuildConfiguration(const QString & name);
+    virtual void copyBuildConfiguration(const QString &source, const QString &dest);
+
+    QString command(const QString &buildConfiguration) const;
+    QStringList arguments(const QString &buildConfiguration) const;
+    bool enabled(const QString &buildConfiguration) const;
+    QString workingDirectory(const QString &buildConfiguration) const;
+
+    void setCommand(const QString &buildConfiguration, const QString &command);
+    void setArguments(const QString &buildConfiguration, const QStringList &arguments);
+    void setEnabled(const QString &buildConfiguration, bool enabled);
+    void setWorkingDirectory(const QString &buildConfiguration, const QString &workingDirectory);
+
 private:
     QString m_name;
+    QMap<QString, ProcessStepSettings> m_values;
 };
 
 class ProcessStepConfigWidget : public BuildStepConfigWidget
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index d13545c763956d80dfb2be16d365543be9444443..f9d1c389380dc70f0ef7cd42023b80a718458e17 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -66,10 +66,9 @@ Project::~Project()
 void Project::insertBuildStep(int position, BuildStep *step)
 {
     m_buildSteps.insert(position, step);
-    // check that the step has all the configurations
+    // add all BuildConfigurations
     foreach (const BuildConfiguration *bc, buildConfigurations())
-        if (!step->getBuildConfiguration(bc->name()))
-            step->addBuildConfiguration(bc->name());
+        step->addBuildConfiguration(bc->name());
 }
 
 void Project::removeBuildStep(int position)
@@ -87,10 +86,9 @@ void Project::moveBuildStepUp(int position)
 void Project::insertCleanStep(int position, BuildStep *step)
 {
     m_cleanSteps.insert(position, step);
-    // check that the step has all the configurations
+    // add all BuildConfigurations
     foreach (const BuildConfiguration *bc, buildConfigurations())
-        if (!step->getBuildConfiguration(bc->name()))
-            step->addBuildConfiguration(bc->name());
+        step->addBuildConfiguration(bc->name());
 }
 
 void Project::removeCleanStep(int position)
@@ -256,8 +254,9 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
     //save buildstep configuration
     int buildstepnr = 0;
     foreach (BuildStep *buildStep, buildSteps()) {
-        QMap<QString, QVariant> buildConfiguration = buildStep->valuesToMap();
-        writer.saveValue("buildstep" + QString().setNum(buildstepnr), buildConfiguration);
+        QMap<QString, QVariant> buildStepValues;
+        buildStep->storeIntoMap(buildStepValues);
+        writer.saveValue("buildstep" + QString().setNum(buildstepnr), buildStepValues);
         ++buildstepnr;
     }
 
@@ -265,8 +264,8 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
     foreach (const QString &buildConfigurationName, buildConfigurationNames) {
         buildstepnr = 0;
         foreach (BuildStep *buildStep, buildSteps()) {
-            QMap<QString, QVariant> temp =
-                buildStep->valuesToMap(buildConfigurationName);
+            QMap<QString, QVariant> temp;
+            buildStep->storeIntoMap(temp);
             writer.saveValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr), temp);
             ++buildstepnr;
         }
@@ -275,8 +274,9 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
     //save cleansteps buildconfiguration
     int cleanstepnr = 0;
     foreach (BuildStep *cleanStep, cleanSteps()) {
-        QMap<QString, QVariant> buildConfiguration = cleanStep->valuesToMap();
-        writer.saveValue("cleanstep" + QString().setNum(cleanstepnr), buildConfiguration);
+        QMap<QString, QVariant> buildStepValues;
+        cleanStep->storeIntoMap(buildStepValues);
+        writer.saveValue("cleanstep" + QString().setNum(cleanstepnr), buildStepValues);
         ++cleanstepnr;
     }
 
@@ -284,7 +284,8 @@ void Project::saveSettingsImpl(PersistentSettingsWriter &writer)
     foreach (const QString &buildConfigurationName, buildConfigurationNames) {
         cleanstepnr = 0;
         foreach (BuildStep *cleanStep, cleanSteps()) {
-            QMap<QString, QVariant> temp = cleanStep->valuesToMap(buildConfigurationName);
+            QMap<QString, QVariant> temp;
+            cleanStep->storeIntoMap(temp);
             writer.saveValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr), temp);
             ++cleanstepnr;
         }
@@ -344,13 +345,13 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
             }
             // Restoring settings
             if (buildStep) {
-                QMap<QString, QVariant> buildConfiguration = reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap();
-                buildStep->setValuesFromMap(buildConfiguration);
+                QMap<QString, QVariant> buildStepValues = reader.restoreValue("buildstep" + QString().setNum(buildstepnr)).toMap();
+                buildStep->restoreFromMap(buildStepValues);
                 foreach (const QString &buildConfigurationName, buildConfigurationNames) {
                     //get the buildconfiguration for this build step
-                    QMap<QString, QVariant> buildConfiguration =
+                    QMap<QString, QVariant> buildStepValues =
                         reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-buildstep" + QString().setNum(buildstepnr)).toMap();
-                    buildStep->setValuesFromMap(buildConfigurationName, buildConfiguration);
+                    buildStep->restoreFromMap(buildStepValues);
                 }
             }
         }
@@ -374,12 +375,12 @@ bool Project::restoreSettingsImpl(PersistentSettingsReader &reader)
             }
             // Restoring settings
             if (cleanStep) {
-                QMap<QString, QVariant> buildConfiguration = reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap();
-                cleanStep->setValuesFromMap(buildConfiguration);
+                QMap<QString, QVariant> buildStepValues = reader.restoreValue("cleanstep" + QString().setNum(cleanstepnr)).toMap();
+                cleanStep->restoreFromMap(buildStepValues);
                 foreach (const QString &buildConfigurationName, buildConfigurationNames) {
-                    QMap<QString, QVariant> buildConfiguration =
+                    QMap<QString, QVariant> buildStepValues =
                             reader.restoreValue("buildconfiguration-" + buildConfigurationName + "-cleanstep" + QString().setNum(cleanstepnr)).toMap();
-                    cleanStep->setValuesFromMap(buildConfigurationName, buildConfiguration);
+                    cleanStep->restoreFromMap(buildStepValues);
                 }
             }
         }
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index 2201f7fdf9beb477761de455c136a2440d69ca99..8593ccca611fbdfb94a5caaab662abee618edc63 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -45,7 +45,7 @@ using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 
 MakeStep::MakeStep(Qt4Project * project)
-    : AbstractMakeStep(project)
+    : AbstractMakeStep(project), m_clean(false)
 {
 
 }
@@ -55,20 +55,69 @@ MakeStep::~MakeStep()
 
 }
 
+void MakeStep::setClean(bool clean)
+{
+    m_clean = clean;
+}
+
+void MakeStep::restoreFromMap(const QMap<QString, QVariant> &map)
+{
+    if (map.value("clean").isValid() && map.value("clean").toBool())
+        m_clean = true;
+    ProjectExplorer::AbstractMakeStep::restoreFromMap(map);
+}
+
+void MakeStep::storeIntoMap(QMap<QString, QVariant> &map)
+{
+    if (m_clean)
+        map["clean"] = true;
+    ProjectExplorer::AbstractMakeStep::storeIntoMap(map);
+}
+
+void MakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map)
+{
+    m_values[buildConfiguration].makeargs = map.value("makeargs").toStringList();
+    m_values[buildConfiguration].makeCmd = map.value("makeCmd").toString();
+    ProjectExplorer::AbstractMakeStep::restoreFromMap(buildConfiguration, map);
+}
+
+void MakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map)
+{
+    map["makeargs"] = m_values.value(buildConfiguration).makeargs;
+    map["makeCmd"] = m_values.value(buildConfiguration).makeCmd;
+    ProjectExplorer::AbstractMakeStep::storeIntoMap(buildConfiguration, map);
+}
+
+void MakeStep::addBuildConfiguration(const QString & name)
+{
+    m_values.insert(name, MakeStepSettings());
+}
+
+void MakeStep::removeBuildConfiguration(const QString & name)
+{
+    m_values.remove(name);
+}
+
+void MakeStep::copyBuildConfiguration(const QString &source, const QString &dest)
+{
+    m_values.insert(dest, m_values.value(source));
+}
+
+
 bool MakeStep::init(const QString &name)
 {
     m_buildConfiguration = name;
     ProjectExplorer::BuildConfiguration *bc = project()->buildConfiguration(name);
     Environment environment = project()->environment(bc);
-    setEnvironment(name, environment);
+    setEnvironment(environment);
 
     Qt4Project *qt4project = qobject_cast<Qt4Project *>(project());
     QString workingDirectory = qt4project->buildDirectory(bc);
-    setWorkingDirectory(name, workingDirectory);
+    setWorkingDirectory(workingDirectory);
 
     QString makeCmd = qt4project->makeCommand(bc);
-    if (!value(name, "makeCmd").toString().isEmpty())
-        makeCmd = value(name, "makeCmd").toString();
+    if (!m_values.value(name).makeCmd.isEmpty())
+        makeCmd = m_values.value(name).makeCmd;
     if (!QFileInfo(makeCmd).isAbsolute()) {
         // Try to detect command in environment
         QString tmp = environment.searchInPath(makeCmd);
@@ -79,19 +128,14 @@ bool MakeStep::init(const QString &name)
         }
         makeCmd = tmp;
     }
-    setCommand(name, makeCmd);
+    setCommand(makeCmd);
 
-    if (!value(name, "cleanConfig").isValid() && value("clean").isValid() && value("clean").toBool()) {
-        // Import old settings
-        setValue(name, "cleanConfig", true);
-        setValue(name, "makeargs", QStringList() << "clean");
-    }
     // If we are cleaning, then make can fail with a error code, but that doesn't mean
     // we should stop the clean queue
     // That is mostly so that rebuild works on a alrady clean project
-    setIgnoreReturnValue(name, value(name, "cleanConfig").isValid());
-    QStringList args = value(name, "makeargs").toStringList();
-    if (!value(name, "cleanConfig").isValid()) {
+    setIgnoreReturnValue(m_clean);
+    QStringList args = m_values.value(name).makeargs;
+    if (!m_clean) {
         if (!qt4project->defaultMakeTarget(bc).isEmpty())
             args << qt4project->defaultMakeTarget(bc);
     }
@@ -106,12 +150,12 @@ bool MakeStep::init(const QString &name)
     if (toolchain)
         type = toolchain->type();
     if (type != ProjectExplorer::ToolChain::MSVC && type != ProjectExplorer::ToolChain::WINCE) {
-        if (value(name, "makeCmd").toString().isEmpty())
+        if (m_values.value(name).makeCmd.isEmpty())
             args << "-w";
     }
 
-    setEnabled(name, true);
-    setArguments(name, args);
+    setEnabled(true);
+    setArguments(args);
 
     if (type == ProjectExplorer::ToolChain::MSVC || type == ProjectExplorer::ToolChain::WINCE)
         setBuildParser(ProjectExplorer::Constants::BUILD_PARSER_MSVC);
@@ -135,12 +179,6 @@ void MakeStep::run(QFutureInterface<bool> & fi)
         return;
     }
 
-    if (!enabled(m_buildConfiguration)) {
-        emit addToOutputWindow(tr("<font color=\"#0000ff\"><b>No Makefile found, assuming project is clean.</b></font>"));
-        fi.reportResult(true);
-        return;
-    }
-
     AbstractMakeStep::run(fi);
 }
 
@@ -164,9 +202,14 @@ ProjectExplorer::BuildStepConfigWidget *MakeStep::createConfigWidget()
     return new MakeStepConfigWidget(this);
 }
 
+QStringList MakeStep::makeArguments(const QString &buildConfiguration)
+{
+    return m_values.value(buildConfiguration).makeargs;
+}
+
 void MakeStep::setMakeArguments(const QString &buildConfiguration, const QStringList &arguments)
 {
-    setValue(buildConfiguration, "makeargs", arguments);
+    m_values[buildConfiguration].makeargs = arguments;
     emit changed();
 }
 
@@ -204,8 +247,8 @@ void MakeStepConfigWidget::updateDetails()
     QString workingDirectory = pro->buildDirectory(bc);
 
     QString makeCmd = pro->makeCommand(bc);
-    if (!m_makeStep->value(m_buildConfiguration, "makeCmd").toString().isEmpty())
-        makeCmd = m_makeStep->value(m_buildConfiguration, "makeCmd").toString();
+    if (!m_makeStep->m_values.value(m_buildConfiguration).makeCmd.isEmpty())
+        makeCmd = m_makeStep->m_values.value(m_buildConfiguration).makeCmd;
     if (!QFileInfo(makeCmd).isAbsolute()) {
         Environment environment = pro->environment(bc);
         // Try to detect command in environment
@@ -222,13 +265,13 @@ void MakeStepConfigWidget::updateDetails()
     // FIXME doing this without the user having a way to override this is rather bad
     // so we only do it for unix and if the user didn't override the make command
     // but for now this is the least invasive change
-    QStringList args = m_makeStep->value(m_buildConfiguration, "makeargs").toStringList();
+    QStringList args = m_makeStep->makeArguments(m_buildConfiguration);
     ProjectExplorer::ToolChain::ToolChainType t = ProjectExplorer::ToolChain::UNKNOWN;
     ProjectExplorer::ToolChain *toolChain = pro->toolChain(bc);
     if (toolChain)
         t = toolChain->type();
     if (t != ProjectExplorer::ToolChain::MSVC && t != ProjectExplorer::ToolChain::WINCE) {
-        if (m_makeStep->value(m_buildConfiguration, "makeCmd").toString().isEmpty())
+        if (m_makeStep->m_values.value(m_buildConfiguration).makeCmd.isEmpty())
             args << "-w";
     }
     m_summaryText = tr("<b>Make:</b> %1 %2 in %3").arg(QFileInfo(makeCmd).fileName(), args.join(" "),
@@ -255,19 +298,12 @@ void MakeStepConfigWidget::init(const QString &buildConfiguration)
 {
     m_buildConfiguration = buildConfiguration;
 
-    if (!m_makeStep->value(buildConfiguration, "cleanConfig").isValid() && m_makeStep->value("clean").isValid() && m_makeStep->value("clean").toBool()) {
-        // Import old settings
-        m_makeStep->setValue(buildConfiguration, "cleanConfig", true);
-        m_makeStep->setValue(buildConfiguration, "makeargs", QStringList() << "clean");
-    }
-
     updateMakeOverrideLabel();
 
-    const QString &makeCmd = m_makeStep->value(buildConfiguration, "makeCmd").toString();
+    const QString &makeCmd = m_makeStep->m_values.value(buildConfiguration).makeCmd;
     m_ui.makeLineEdit->setText(makeCmd);
 
-    const QStringList &makeArguments =
-            m_makeStep->value(buildConfiguration, "makeargs").toStringList();
+    const QStringList &makeArguments = m_makeStep->makeArguments(buildConfiguration);
     m_ui.makeArgumentsLineEdit->setText(ProjectExplorer::Environment::joinArgumentList(makeArguments));
     updateDetails();
 }
@@ -275,14 +311,14 @@ void MakeStepConfigWidget::init(const QString &buildConfiguration)
 void MakeStepConfigWidget::makeLineEditTextEdited()
 {
     Q_ASSERT(!m_buildConfiguration.isNull());
-    m_makeStep->setValue(m_buildConfiguration, "makeCmd", m_ui.makeLineEdit->text());
+    m_makeStep->m_values[m_buildConfiguration].makeCmd = m_ui.makeLineEdit->text();
     updateDetails();
 }
 
 void MakeStepConfigWidget::makeArgumentsLineEditTextEdited()
 {
     Q_ASSERT(!m_buildConfiguration.isNull());
-    m_makeStep->setValue(m_buildConfiguration, "makeargs",
+    m_makeStep->setMakeArguments(m_buildConfiguration,
                          ProjectExplorer::Environment::parseCombinedArgString(m_ui.makeArgumentsLineEdit->text()));
     updateDetails();
 }
diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h
index be75435311de17104865f8597e2671d819525499..8883573ae09e81270d791f9bdd9802b1be83f623 100644
--- a/src/plugins/qt4projectmanager/makestep.h
+++ b/src/plugins/qt4projectmanager/makestep.h
@@ -60,9 +60,17 @@ public:
 
 class Qt4Project;
 
+struct MakeStepSettings
+{
+    QStringList makeargs;
+    QString makeCmd;
+};
+
 class MakeStep : public ProjectExplorer::AbstractMakeStep
 {
     Q_OBJECT
+    friend class MakeStepConfigWidget; // TODO remove this
+    // currently used to access m_values
 public:
     MakeStep(Qt4Project * project);
     ~MakeStep();
@@ -72,11 +80,26 @@ public:
     virtual QString displayName();
     virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
     virtual bool immutable() const;
+    QStringList makeArguments(const QString &buildConfiguration);
     void setMakeArguments(const QString &buildConfiguration, const QStringList &arguments);
+
+    virtual void restoreFromMap(const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(QMap<QString, QVariant> &map);
+
+    void setClean(bool clean);
+
+    virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map);
+
+    virtual void addBuildConfiguration(const QString & name);
+    virtual void removeBuildConfiguration(const QString & name);
+    virtual void copyBuildConfiguration(const QString &source, const QString &dest);
 signals:
     void changed();
 private:
     QString m_buildConfiguration;
+    bool m_clean;
+    QMap<QString, MakeStepSettings> m_values;
 };
 
 class MakeStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index 51fb62997189e02dd1c72689fcda54dae5fc7fc8..facd9ae3bb947f2ece8a81ea0afc3dcb0c413f30 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -60,7 +60,7 @@ QMakeStep::~QMakeStep()
 
 QStringList QMakeStep::arguments(const QString &buildConfiguration)
 {
-    QStringList additonalArguments = value(buildConfiguration, "qmakeArgs").toStringList();
+    QStringList additonalArguments = m_values.value(buildConfiguration).qmakeArgs;
     ProjectExplorer::BuildConfiguration *bc = m_pro->buildConfiguration(buildConfiguration);
     QStringList arguments;
     arguments << project()->file()->fileName();
@@ -121,24 +121,24 @@ bool QMakeStep::init(const QString &name)
     QString program = qtVersion->qmakeCommand();
 
     // Check wheter we need to run qmake
-    bool needToRunQMake = true;
+    m_needToRunQMake = true;
     if (QDir(workingDirectory).exists(QLatin1String("Makefile"))) {
         QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(workingDirectory);
         if (qtVersion->qmakeCommand() == qmakePath) {
-            needToRunQMake = !m_pro->compareBuildConfigurationToImportFrom(bc, workingDirectory);
+            m_needToRunQMake = !m_pro->compareBuildConfigurationToImportFrom(bc, workingDirectory);
         }
     }
 
     if (m_forced) {
         m_forced = false;
-        needToRunQMake = true;
+        m_needToRunQMake = true;
     }
 
-    setEnabled(name, needToRunQMake);
-    setWorkingDirectory(name, workingDirectory);
-    setCommand(name, program);
-    setArguments(name, args);
-    setEnvironment(name, m_pro->environment(bc));
+    setEnabled(m_needToRunQMake);
+    setWorkingDirectory(workingDirectory);
+    setCommand(program);
+    setArguments(args);
+    setEnvironment(m_pro->environment(bc));
 
     setBuildParser(ProjectExplorer::Constants::BUILD_PARSER_QMAKE);
     return AbstractMakeStep::init(name);
@@ -151,7 +151,7 @@ void QMakeStep::run(QFutureInterface<bool> &fi)
         return;
     }
 
-    if (!enabled(m_buildConfiguration)) {
+    if (!m_needToRunQMake) {
         emit addToOutputWindow(tr("<font color=\"#0000ff\">Configuration unchanged, skipping QMake step.</font>"));
         fi.reportResult(true);
         return;
@@ -205,10 +205,42 @@ bool QMakeStep::processFinished(int exitCode, QProcess::ExitStatus status)
 
 void QMakeStep::setQMakeArguments(const QString &buildConfiguration, const QStringList &arguments)
 {
-    setValue(buildConfiguration, "qmakeArgs", arguments);
+    m_values[buildConfiguration].qmakeArgs = arguments;
     emit changed();
 }
 
+QStringList QMakeStep::qmakeArguments(const QString &buildConfiguration)
+{
+    return m_values[buildConfiguration].qmakeArgs;
+}
+
+void QMakeStep::restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map)
+{
+    m_values[buildConfiguration].qmakeArgs = map.value("qmakeArgs").toStringList();
+    AbstractProcessStep::restoreFromMap(buildConfiguration, map);
+}
+
+void QMakeStep::storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map)
+{
+    map["qmakeArgs"] = m_values.value(buildConfiguration).qmakeArgs;
+    AbstractProcessStep::storeIntoMap(buildConfiguration, map);
+}
+
+void QMakeStep::addBuildConfiguration(const QString & name)
+{
+    m_values.insert(name, QMakeStepSettings());
+}
+
+void QMakeStep::removeBuildConfiguration(const QString & name)
+{
+    m_values.remove(name);
+}
+
+void QMakeStep::copyBuildConfiguration(const QString &source, const QString &dest)
+{
+    m_values.insert(dest, m_values.value(source));
+}
+
 QMakeStepConfigWidget::QMakeStepConfigWidget(QMakeStep *step)
     : BuildStepConfigWidget(), m_step(step)
 {
@@ -261,7 +293,8 @@ void QMakeStepConfigWidget::updateTitleLabel()
 void QMakeStepConfigWidget::qmakeArgumentsLineEditTextEdited()
 {
     Q_ASSERT(!m_buildConfiguration.isNull());
-    m_step->setValue(m_buildConfiguration, "qmakeArgs", ProjectExplorer::Environment::parseCombinedArgString(m_ui.qmakeAdditonalArgumentsLineEdit->text()));
+    m_step->setQMakeArguments(m_buildConfiguration,
+            ProjectExplorer::Environment::parseCombinedArgString(m_ui.qmakeAdditonalArgumentsLineEdit->text()));
 
     static_cast<Qt4Project *>(m_step->project())->invalidateCachedTargetInformation();
     updateTitleLabel();
@@ -300,7 +333,7 @@ void QMakeStepConfigWidget::update()
 void QMakeStepConfigWidget::init(const QString &buildConfiguration)
 {
     m_buildConfiguration = buildConfiguration;
-    QString qmakeArgs = ProjectExplorer::Environment::joinArgumentList(m_step->value(buildConfiguration, "qmakeArgs").toStringList());
+    QString qmakeArgs = ProjectExplorer::Environment::joinArgumentList(m_step->qmakeArguments(buildConfiguration));
     m_ui.qmakeAdditonalArgumentsLineEdit->setText(qmakeArgs);
     ProjectExplorer::BuildConfiguration *bc = m_step->project()->buildConfiguration(buildConfiguration);
     bool debug = QtVersion::QmakeBuildConfig(bc->value("buildConfiguration").toInt()) & QtVersion::DebugBuild;
diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h
index f629c6663888bd45b93eb89a2a010549f9cf0626..0428747ff56ea5e1a5144ae81dc694dddd998a82 100644
--- a/src/plugins/qt4projectmanager/qmakestep.h
+++ b/src/plugins/qt4projectmanager/qmakestep.h
@@ -60,10 +60,16 @@ public:
 
 class Qt4Project;
 
+struct QMakeStepSettings
+{
+    QStringList qmakeArgs;
+};
+
 class QMakeStep : public ProjectExplorer::AbstractMakeStep
 {
     Q_OBJECT
-
+    friend class Qt4Project; // TODO remove
+    // Currently used to access qmakeArgs
 public:
     QMakeStep(Qt4Project * project);
     ~QMakeStep();
@@ -77,8 +83,15 @@ public:
     void setForced(bool b);
     bool forced();
 
+    QStringList qmakeArguments(const QString &buildConfiguration);
     void setQMakeArguments(const QString &buildConfiguraion, const QStringList &arguments);
 
+    virtual void restoreFromMap(const QString &buildConfiguration, const QMap<QString, QVariant> &map);
+    virtual void storeIntoMap(const QString &buildConfiguration, QMap<QString, QVariant> &map);
+
+    virtual void addBuildConfiguration(const QString & name);
+    virtual void removeBuildConfiguration(const QString & name);
+    virtual void copyBuildConfiguration(const QString &source, const QString &dest);
 signals:
     void changed();
 
@@ -92,6 +105,8 @@ private:
     QString m_buildConfiguration;
     QStringList m_lastEnv;
     bool m_forced;
+    bool m_needToRunQMake; // set in init(), read in run()
+    QMap<QString, QMakeStepSettings> m_values;
 };
 
 
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index ede6604bcf0d61f30e15d26fa10bbabcd6e259c8..e00ae90be952256cb3d5bc78ab6bad1261b2e6b9 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -359,7 +359,8 @@ bool Qt4Project::restoreSettingsImpl(PersistentSettingsReader &settingsReader)
 {
     Project::restoreSettingsImpl(settingsReader);
 
-    addDefaultBuild();
+    if (buildConfigurations().isEmpty())
+        addDefaultBuild();
 
     // Ensure that the qt version and tool chain in each build configuration is valid
     // or if not, is reset to the default
@@ -450,11 +451,11 @@ void Qt4Project::addQt4BuildConfiguration(QString buildConfigurationName, QtVers
     addBuildConfiguration(bc);
     const QString &finalBuildConfigurationName = bc->name();
     if (!additionalArguments.isEmpty())
-        qmake->setValue(finalBuildConfigurationName, "qmakeArgs", additionalArguments);
+        qmake->m_values[finalBuildConfigurationName].qmakeArgs = additionalArguments;
 
     // set some options for qmake and make
     if (qmakeBuildConfiguration & QtVersion::BuildAll) // debug_and_release => explicit targets
-        make->setValue(finalBuildConfigurationName, "makeargs", QStringList() << (debug ? "debug" : "release"));
+        make->setMakeArguments(finalBuildConfigurationName, QStringList() << (debug ? "debug" : "release"));
 
     bc->setValue("buildConfiguration", int(qmakeBuildConfiguration));
 
@@ -817,52 +818,26 @@ QList<ProjectExplorer::Project*> Qt4Project::dependsOn()
 
 void Qt4Project::addDefaultBuild()
 {
-    if (buildConfigurations().isEmpty()) {
-        // We don't have any buildconfigurations, so this is a new project
-        // The Project Load Wizard is a work of art
-        // It will ask the user what kind of build setup he want
-        // It will add missing Qt Versions
-        // And get the project into a buildable state
+    // We don't have any buildconfigurations, so this is a new project
+    QMakeStep *qmakeStep = 0;
+    MakeStep *makeStep = 0;
 
-        //TODO have a better check wheter there is already a configuration?
-        QMakeStep *qmakeStep = 0;
-        MakeStep *makeStep = 0;
+    qmakeStep = new QMakeStep(this);
+    insertBuildStep(1, qmakeStep);
 
-        qmakeStep = new QMakeStep(this);
-        qmakeStep->setValue("mkspec", "");
-        insertBuildStep(1, qmakeStep);
+    makeStep = new MakeStep(this);
+    insertBuildStep(2, makeStep);
 
-        makeStep = new MakeStep(this);
-        insertBuildStep(2, makeStep);
+    MakeStep* cleanStep = new MakeStep(this);
+    cleanStep->setClean(true);
+    insertCleanStep(1, cleanStep);
 
-        MakeStep* cleanStep = new MakeStep(this);
-        cleanStep->setValue("clean", true);
-        insertCleanStep(1, cleanStep);
-
-        ProjectLoadWizard wizard(this);
-        wizard.execDialog();
-    } else {
-        // Migrate settings
-        QMakeStep *qs = qmakeStep();
-        foreach (BuildConfiguration *bc, buildConfigurations()) {
-            QVariant v = qs ? qs->value(bc->name(), "buildConfiguration") : QVariant();
-            if (v.isValid()) {
-                qs->setValue(bc->name(), "buildConfiguration", QVariant());
-                bc->setValue("buildConfiguration", v);
-            } else if (!bc->value("buildConfiguration").isValid()) {
-                if (QtVersion *version = qtVersion(bc))
-                    bc->setValue("buildConfiguration", int(version->defaultBuildConfig()));
-                else
-                    bc->setValue("buildConfiguration", int(QtVersion::BuildAll & QtVersion::DebugBuild));
-            }
-        }
-
-
-        // Restoring configuration
-        foreach(BuildConfiguration *bc, buildConfigurations()) {
-            bc->setValue("addQDumper", QVariant());
-        }
-    }
+    // TODO this could probably refactored
+    // That is the ProjectLoadWizard divided into useful bits
+    // and this code then called here, instead of that strange forwarding
+    // to a wizard, which doesn't even show up
+    ProjectLoadWizard wizard(this);
+    wizard.execDialog();
 }
 
 void Qt4Project::proFileParseError(const QString &errorMessage)
@@ -1306,14 +1281,15 @@ bool Qt4Project::compareBuildConfigurationToImportFrom(BuildConfiguration *confi
                 // now compare arguments lists
                 // we have to compare without the spec/platform cmd argument
                 // and compare that on its own
-                QString actualSpec = extractSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList(), workingDirectory, version);
+                QString actualSpec = extractSpecFromArgumentList(qs->m_values.value(configuration->name()).qmakeArgs, workingDirectory, version);
                 if (actualSpec.isEmpty()) {
                     // Easy one the user has choosen not to override the settings
                     actualSpec = version->mkspec();
                 }
 
+
                 QString parsedSpec = extractSpecFromArgumentList(result.second, workingDirectory, version);
-                QStringList actualArgs = removeSpecFromArgumentList(qs->value(configuration->name(), "qmakeArgs").toStringList());
+                QStringList actualArgs = removeSpecFromArgumentList(qs->m_values.value(configuration->name()).qmakeArgs);
                 QStringList parsedArgs = removeSpecFromArgumentList(result.second);
 
                 if (debug) {
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 4c87287958c287a63ddd0362278ed8833e8648a2..e24e3fdb0571e193f7e9abc64f79e707813e4110 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -311,7 +311,7 @@ void Qt4ProjectConfigWidget::importLabelClicked()
             // If we are switching to BuildAll we want "release" in there and no "debug"
             // or "debug" in there and no "release"
             // If we are switching to not BuildAl we want neither "release" nor "debug" in there
-            QStringList makeCmdArguments = makeStep->value(m_buildConfiguration, "makeargs").toStringList();
+            QStringList makeCmdArguments = makeStep->makeArguments(m_buildConfiguration);
             bool debug = qmakeBuildConfig & QtVersion::DebugBuild;
             if (qmakeBuildConfig & QtVersion::BuildAll) {
                 makeCmdArguments.removeAll(debug ? "release" : "debug");