diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index a27fa68b20d0887f3b985c1ccd2ed6cce10acb39..0d78fb428d750e13ade961248056bacb2e2bb8a4 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -115,18 +115,7 @@ QStringList QMakeStep::allArguments()
         arguments << "-spec" << bc->qtVersion()->mkspec();
 
     // Find out what flags we pass on to qmake
-    QStringList addedUserConfigArguments;
-    QStringList removedUserConfigArguments;
-    bc->getConfigCommandLineArguments(&addedUserConfigArguments, &removedUserConfigArguments);
-    if (!removedUserConfigArguments.isEmpty()) {
-        foreach (const QString &removedConfig, removedUserConfigArguments)
-            arguments.append("CONFIG-=" + removedConfig);
-    }
-    if (!addedUserConfigArguments.isEmpty()) {
-        foreach (const QString &addedConfig, addedUserConfigArguments)
-            arguments.append("CONFIG+=" + addedConfig);
-    }
-
+    arguments << bc->configCommandLineArguments();
     arguments << moreArguments();
 
     if (!additonalArguments.isEmpty())
@@ -286,6 +275,17 @@ void QMakeStep::setUserArguments(const QStringList &arguments)
     emit userArgumentsChanged();
 
     qt4BuildConfiguration()->emitQMakeBuildConfigurationChanged();
+    qt4BuildConfiguration()->emitProFileEvaluteNeeded();
+}
+
+QStringList QMakeStep::parserArguments()
+{
+    QStringList result;
+    foreach (const QString &str, allArguments()) {
+        if (str.contains("="))
+            result << str;
+    }
+    return result;
 }
 
 QStringList QMakeStep::userArguments()
diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h
index daa25f204e48a36cc1b87ed1146f11fee9aeb335..4a5936dde0a87e123829d244d8e8cfca44f2ba5e 100644
--- a/src/plugins/qt4projectmanager/qmakestep.h
+++ b/src/plugins/qt4projectmanager/qmakestep.h
@@ -88,6 +88,7 @@ public:
     // TODO clean up those functions
     QStringList allArguments();
     QStringList moreArguments();
+    QStringList parserArguments();
     QStringList userArguments();
     void setUserArguments(const QStringList &arguments);
 
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index eb42cd9bc422ebb66c735e0dc93e675dd2706e4c..5696ccef07bc07f31e53219ac784a49d6fe322ea 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -363,6 +363,11 @@ void Qt4BuildConfiguration::setQMakeBuildConfiguration(QtVersion::QmakeBuildConf
     emit qmakeBuildConfigurationChanged();
 }
 
+void Qt4BuildConfiguration::emitProFileEvaluteNeeded()
+{
+    emit proFileEvaluateNeeded(this);
+}
+
 void Qt4BuildConfiguration::emitQMakeBuildConfigurationChanged()
 {
     emit qmakeBuildConfigurationChanged();
@@ -379,26 +384,25 @@ void Qt4BuildConfiguration::emitS60CreatesSmartInstallerChanged()
 }
 
 
-void Qt4BuildConfiguration::getConfigCommandLineArguments(QStringList *addedUserConfigs, QStringList *removedUserConfigs) const
+QStringList Qt4BuildConfiguration::configCommandLineArguments() const
 {
+    QStringList result;
     QtVersion::QmakeBuildConfigs defaultBuildConfiguration = qtVersion()->defaultBuildConfig();
     QtVersion::QmakeBuildConfigs userBuildConfiguration = m_qmakeBuildConfiguration;
-    if (removedUserConfigs) {
-        if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(userBuildConfiguration & QtVersion::BuildAll))
-            (*removedUserConfigs) << "debug_and_release";
-    }
-    if (addedUserConfigs) {
-        if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (userBuildConfiguration & QtVersion::BuildAll))
-            (*addedUserConfigs) << "debug_and_release";
-        if ((defaultBuildConfiguration & QtVersion::DebugBuild)
-             && !(userBuildConfiguration & QtVersion::DebugBuild)
-             && !(userBuildConfiguration & QtVersion::BuildAll))
-            (*addedUserConfigs) << "release";
-        if (!(defaultBuildConfiguration & QtVersion::DebugBuild)
+    if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(userBuildConfiguration & QtVersion::BuildAll))
+        result << "CONFIG-=debug_and_release";
+
+    if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (userBuildConfiguration & QtVersion::BuildAll))
+        result << "CONFIG+=debug_and_release";
+    if ((defaultBuildConfiguration & QtVersion::DebugBuild)
+            && !(userBuildConfiguration & QtVersion::DebugBuild)
+            && !(userBuildConfiguration & QtVersion::BuildAll))
+        result << "CONFIG+=release";
+    if (!(defaultBuildConfiguration & QtVersion::DebugBuild)
             && (userBuildConfiguration & QtVersion::DebugBuild)
             && !(userBuildConfiguration & QtVersion::BuildAll))
-            (*addedUserConfigs) << "debug";
-    }
+        result << "CONFIG+=debug";
+    return result;
 }
 
 QMakeStep *Qt4BuildConfiguration::qmakeStep() const
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index 2b2ac67fc37bbeb1e49a21077e01703188ebec34..849e0852eee8790e5be393a347f022670d98bd5a 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -76,6 +76,9 @@ public:
 
     QtVersion::QmakeBuildConfigs qmakeBuildConfiguration() const;
     void setQMakeBuildConfiguration(QtVersion::QmakeBuildConfigs config);
+
+    /// \internal for qmakestep
+    void emitProFileEvaluteNeeded();
     // used by qmake step to notify that the qmake args have changed
     // not really nice, the build configuration should save the arguments
     // since they are needed for reevaluation
@@ -87,7 +90,7 @@ public:
     // not really nice
     void emitS60CreatesSmartInstallerChanged();
 
-    void getConfigCommandLineArguments(QStringList *addedUserConfigs, QStringList *removedUserConfigs) const;
+    QStringList configCommandLineArguments() const;
 
     // Those functions are used in a few places.
     // The drawback is that we shouldn't actually depend on them being always there
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index d6d2f769650981c9168deea5eb50ec7798a64b30..a2f5f951edcc7f37b5c1ced84ad7bfa0c199dfd9 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -35,6 +35,7 @@
 #include "qt4projectmanagerconstants.h"
 #include "qtuicodemodelsupport.h"
 #include "qt4buildconfiguration.h"
+#include "qmakestep.h"
 
 #include <projectexplorer/nodesvisitor.h>
 
@@ -1311,12 +1312,13 @@ void Qt4ProFileNode::setupReader()
     m_readerCumulative = m_project->createProFileReader(this);
 
     // Find out what flags we pass on to qmake
-    QStringList addedUserConfigArguments;
-    QStringList removedUserConfigArguments;
-    m_project->activeTarget()->activeBuildConfiguration()->getConfigCommandLineArguments(&addedUserConfigArguments, &removedUserConfigArguments);
-
-    m_readerExact->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
-    m_readerCumulative->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
+    QStringList args;
+    if (QMakeStep *qs = m_project->activeTarget()->activeBuildConfiguration()->qmakeStep())
+        args = qs->parserArguments();
+    else
+        args = m_project->activeTarget()->activeBuildConfiguration()->configCommandLineArguments();
+    m_readerExact->setCommandLineArguments(args);
+    m_readerCumulative->setCommandLineArguments(args);
 }
 
 bool Qt4ProFileNode::evaluate()
diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index a319edb438daf68631768aa32262e70c6e77d04b..bed1b6a5866296fcab3e31199f59c89c4f6bb12a 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -224,8 +224,7 @@ public:
     QHash<const ProFile*, QHash<ProString, ProStringList> > m_filevaluemap; // Variables per include file
     QString m_tmp1, m_tmp2, m_tmp3, m_tmp[2]; // Temporaries for efficient toQString
 
-    QStringList m_addUserConfigCmdArgs;
-    QStringList m_removeUserConfigCmdArgs;
+    QStringList m_cmdArgs;
 
     ProFileOption *m_option;
     ProFileParser *m_parser;
@@ -1274,11 +1273,13 @@ ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile(
             if (tgt.isEmpty())
                 tgt.append(ProString(QFileInfo(pro->fileName()).baseName(), NoHash));
 
-            ProStringList &tmp = m_valuemapStack.top()[ProString("CONFIG")];
-            foreach (const QString &add, m_addUserConfigCmdArgs)
-                tmp.append(ProString(add, NoHash));
-            foreach (const QString &remove, m_removeUserConfigCmdArgs)
-                removeAll(&tmp, ProString(remove, NoHash));
+            if (ProFile *pro = m_parser->parsedProFile(
+                    fL1S("(command line)"), false, m_cmdArgs.join(fL1S("\n")))) {
+                m_locationStack.push(m_current);
+                visitProBlock(pro, pro->tokPtr());
+                m_current = m_locationStack.pop();
+                pro->deref();
+            }
     }
 
     visitProBlock(pro, pro->tokPtr());
@@ -3217,10 +3218,9 @@ void ProFileEvaluator::setOutputDir(const QString &dir)
     d->m_outputDir = dir;
 }
 
-void ProFileEvaluator::setConfigCommandLineArguments(const QStringList &addUserConfigCmdArgs, const QStringList &removeUserConfigCmdArgs)
+void ProFileEvaluator::setCommandLineArguments(const QStringList &args)
 {
-    d->m_addUserConfigCmdArgs = addUserConfigCmdArgs;
-    d->m_removeUserConfigCmdArgs = removeUserConfigCmdArgs;
+    d->m_cmdArgs = args;
 }
 
 QT_END_NAMESPACE
diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h
index a011780e5b9cceea016a5ad3b349319712659cc1..0442e2e72a5b8ef24b4493b1ca5126b1b294536e 100644
--- a/src/shared/proparser/profileevaluator.h
+++ b/src/shared/proparser/profileevaluator.h
@@ -112,7 +112,7 @@ public:
 
     // -nocache, -cache, -spec, QMAKESPEC
     // -set persistent value
-    void setConfigCommandLineArguments(const QStringList &addUserConfigCmdArgs, const QStringList &removeUserConfigCmdArgs);
+    void setCommandLineArguments(const QStringList &args);
 
     enum LoadFlag {
         LoadProOnly = 0,