diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp
index 44de7c6e5a58bff454c213d1702832d8df97abfe..61f03aeff2b124da93b93165080fc20c9caa5821 100644
--- a/src/plugins/qt4projectmanager/projectloadwizard.cpp
+++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp
@@ -62,8 +62,10 @@ ProjectLoadWizard::ProjectLoadWizard(Qt4Project *project, QWidget *parent, Qt::W
             m_temporaryVersion = true;
         }
 
-        m_importBuildConfig = m_importVersion->defaultBuildConfig();
-        m_importBuildConfig= QtVersionManager::scanMakefileForQmakeConfig(directory, m_importBuildConfig);
+        QPair<QtVersion::QmakeBuildConfig, QStringList> result =
+                QtVersionManager::scanMakeFile(directory, m_importVersion->defaultBuildConfig());
+        m_importBuildConfig = result.first;
+        m_additionalArguments = result.second;
     }
 
     // So now we have the version and the configuration for that version
@@ -73,7 +75,7 @@ ProjectLoadWizard::ProjectLoadWizard(Qt4Project *project, QWidget *parent, Qt::W
     // Also if the qt version is not yet in the Tools Options dialog we offer to add it there
 
     if (m_importVersion)
-        setupImportPage(m_importVersion, m_importBuildConfig);
+        setupImportPage(m_importVersion, m_importBuildConfig, m_additionalArguments);
 
     setOptions(options() | QWizard::NoCancelButton | QWizard::NoBackButtonOnLastPage);
 }
@@ -93,8 +95,9 @@ ProjectLoadWizard::~ProjectLoadWizard()
 
 }
 
-void ProjectLoadWizard::addBuildConfiguration(QString buildConfigurationName, QtVersion *qtversion, QtVersion::QmakeBuildConfig qmakeBuildConfiguration)
+void ProjectLoadWizard::addBuildConfiguration(QString buildConfigurationName, QtVersion *qtversion, QtVersion::QmakeBuildConfig qmakeBuildConfiguration, QStringList additionalArguments)
 {
+    QMakeStep *qmakeStep = m_project->qmakeStep();
     MakeStep *makeStep = m_project->makeStep();
 
     bool debug = qmakeBuildConfiguration & QtVersion::DebugBuild;
@@ -109,6 +112,7 @@ void ProjectLoadWizard::addBuildConfiguration(QString buildConfigurationName, Qt
 
     // Add the buildconfiguration
     m_project->addBuildConfiguration(buildConfigurationName);
+    qmakeStep->setValue(buildConfigurationName, "qmakeArgs", additionalArguments);
     // set some options for qmake and make
     if (qmakeBuildConfiguration & QtVersion::BuildAll) // debug_and_release => explicit targets
         makeStep->setValue(buildConfigurationName, "makeargs", QStringList() << (debug ? "debug" : "release"));
@@ -139,7 +143,7 @@ void ProjectLoadWizard::done(int result)
         // qDebug()<<"Creating m_buildconfiguration entry from imported stuff";
         // qDebug()<<((m_importBuildConfig& QtVersion::BuildAll)? "debug_and_release" : "")<<((m_importBuildConfig & QtVersion::DebugBuild)? "debug" : "release");
         bool debug = m_importBuildConfig & QtVersion::DebugBuild;
-        addBuildConfiguration(debug ? "Debug" : "Release", m_importVersion, m_importBuildConfig);
+        addBuildConfiguration(debug ? "Debug" : "Release", m_importVersion, m_importBuildConfig, m_additionalArguments);
 
         if (m_importBuildConfig & QtVersion::BuildAll) {
             // Also create the other configuration
@@ -149,7 +153,7 @@ void ProjectLoadWizard::done(int result)
             else
                 otherBuildConfiguration = QtVersion::QmakeBuildConfig(otherBuildConfiguration | QtVersion::DebugBuild);
 
-            addBuildConfiguration(debug ? "Release" : "Debug", m_importVersion, otherBuildConfiguration);
+            addBuildConfiguration(debug ? "Release" : "Debug", m_importVersion, otherBuildConfiguration, m_additionalArguments);
         }
     } else {
         // Not importing
@@ -161,11 +165,11 @@ void ProjectLoadWizard::done(int result)
         if (defaultVersion && defaultVersion->isValid() && (defaultVersion->defaultBuildConfig() & QtVersion::BuildAll))
             buildAll = true;
         if (buildAll) {
-            addBuildConfiguration("Debug", 0, QtVersion::QmakeBuildConfig(QtVersion::BuildAll | QtVersion::DebugBuild));
-            addBuildConfiguration("Release", 0, QtVersion::BuildAll);
+            addBuildConfiguration("Debug", 0, QtVersion::QmakeBuildConfig(QtVersion::BuildAll | QtVersion::DebugBuild), m_additionalArguments);
+            addBuildConfiguration("Release", 0, QtVersion::BuildAll, m_additionalArguments);
         } else {
-            addBuildConfiguration("Debug", 0, QtVersion::DebugBuild);
-            addBuildConfiguration("Release", 0, QtVersion::QmakeBuildConfig(0));
+            addBuildConfiguration("Debug", 0, QtVersion::DebugBuild, m_additionalArguments);
+            addBuildConfiguration("Release", 0, QtVersion::QmakeBuildConfig(0), m_additionalArguments);
         }
     }
 
@@ -179,7 +183,7 @@ int ProjectLoadWizard::nextId() const
     return -1;
 }
 
-void ProjectLoadWizard::setupImportPage(QtVersion *version, QtVersion::QmakeBuildConfig buildConfig)
+void ProjectLoadWizard::setupImportPage(QtVersion *version, QtVersion::QmakeBuildConfig buildConfig, QStringList addtionalArguments)
 {
     resize(605, 490);
     // Import Page
@@ -194,9 +198,11 @@ void ProjectLoadWizard::setupImportPage(QtVersion *version, QtVersion::QmakeBuil
     importLabel->setTextFormat(Qt::RichText);
     importLabel->setText(tr("Qt Creator has found an already existing build in the source directory.<br><br>"
                          "<b>Qt Version:</b> %1<br>"
-                         "<b>Build configuration:</b> %2<br>")
+                         "<b>Build configuration:</b> %2<br>"
+                         "<b>Additional QMake Arguments:</b>%3")
                          .arg(versionString)
-                         .arg(buildConfigString));
+                         .arg(buildConfigString)
+                         .arg(ProjectExplorer::Environment::joinArgumentList(addtionalArguments)));
 
     importLayout->addWidget(importLabel);
 
diff --git a/src/plugins/qt4projectmanager/projectloadwizard.h b/src/plugins/qt4projectmanager/projectloadwizard.h
index a6a7ad55a59e29c67aa789de006035c771626800..773932d2c35b27c29afb14eaf660de4f9acc0ac9 100644
--- a/src/plugins/qt4projectmanager/projectloadwizard.h
+++ b/src/plugins/qt4projectmanager/projectloadwizard.h
@@ -57,14 +57,15 @@ public:
     void execDialog();
 
 private:
-    void addBuildConfiguration(QString name, QtVersion *qtversion, QtVersion::QmakeBuildConfig buildConfiguration);
-    void setupImportPage(QtVersion *version, QtVersion::QmakeBuildConfig buildConfig);
+    void addBuildConfiguration(QString name, QtVersion *qtversion, QtVersion::QmakeBuildConfig buildConfiguration, QStringList additionalArguments);
+    void setupImportPage(QtVersion *version, QtVersion::QmakeBuildConfig buildConfig, QStringList addtionalArguments);
 
     Qt4Project *m_project;
 
     // Only used for imported stuff
     QtVersion *m_importVersion;
     QtVersion::QmakeBuildConfig m_importBuildConfig;
+    QStringList m_additionalArguments;
     // Those that we might add
     bool m_temporaryVersion;
 
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 46be033215315410dc9c1d435b5a9e74abd85e71..cd8be85a9efd4c1ef5011de7abdb0629578ebaeb 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -722,11 +722,7 @@ void Qt4Project::addDefaultBuild()
         wizard.execDialog();
     } else {
         // Migrate settings
-        QMakeStep *qs = 0;
-        foreach(BuildStep *bs, buildSteps())
-            if ( (qs = qobject_cast<QMakeStep *>(bs)) != 0)
-                break;
-
+        QMakeStep *qs = qmakeStep();
         foreach (const QString &buildConfiguration, buildConfigurations()) {
             QVariant v = qs->value(buildConfiguration, "buildConfiguration");
             if (v.isValid()) {
@@ -1044,6 +1040,15 @@ void Qt4Project::proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *nod
     }
 }
 
+QMakeStep *Qt4Project::qmakeStep() const
+{
+    QMakeStep *qs = 0;
+    foreach(BuildStep *bs, buildSteps())
+        if ((qs = qobject_cast<QMakeStep *>(bs)) != 0)
+            return qs;
+    return 0;
+}
+
 MakeStep *Qt4Project::makeStep() const
 {
     MakeStep *qs = 0;
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index 6ed7a64b7d9c424a6746f265ba4c22cfad5f0f75..073728a49231d9ba376b4d4a02cb63f75d6e01fb 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -179,6 +179,7 @@ public:
     // That is generally the stuff that is asked should normally be transfered to
     // Qt4Project *
     // So that we can later enable people to build qt4projects the way they would like
+    QMakeStep *qmakeStep() const;
     MakeStep *makeStep() const;
 
     void notifyChanged(const QString &name);
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index d237cf13d01004f7b991a0f261de74eac7bd1f1f..7ae654abe5bee62bc42c0c9b23e2248a3b396aae 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -227,14 +227,18 @@ void Qt4ProjectConfigWidget::importLabelClicked()
                     version = new QtVersion(QFileInfo(qtPath).baseName(), qtPath);
                     vm->addVersion(version);
                 }
-                QtVersion::QmakeBuildConfig qmakeBuildConfig = version->defaultBuildConfig();
-                qmakeBuildConfig = QtVersionManager::scanMakefileForQmakeConfig(directory, qmakeBuildConfig);
+
+                QPair<QtVersion::QmakeBuildConfig, QStringList> result =
+                        QtVersionManager::scanMakeFile(directory, version->defaultBuildConfig());
+                QtVersion::QmakeBuildConfig qmakeBuildConfig = result.first;
+                QStringList additionalArguments = result.second;
 
                 // So we got all the information now apply it...
                 m_pro->setQtVersion(m_buildConfiguration, version->uniqueId());
                 // Combo box will be updated at the end
 
-                // Find qmakestep...
+                QMakeStep *qmakeStep = m_pro->qmakeStep();
+                qmakeStep->setValue(m_buildConfiguration, "qmakeArgs", additionalArguments);
                 MakeStep *makeStep = m_pro->makeStep();
 
                 m_pro->setValue(m_buildConfiguration, "buildConfiguration", int(qmakeBuildConfig));
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
index bb47b9315ba2f525e62e589c548dfd37a6f3cbfa..88669e28fb64f5d950c2b1968459db931d2eaf67 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp
@@ -256,10 +256,7 @@ void Qt4Manager::runQMakeContextMenu()
 
 void Qt4Manager::runQMake(ProjectExplorer::Project *p)
 {
-    QMakeStep *qs = 0;
-    foreach(BuildStep *bs, p->buildSteps())
-        if ( (qs = qobject_cast<QMakeStep *>(bs)) != 0)
-            break;
+    QMakeStep *qs = qobject_cast<Qt4Project *>(p)->qmakeStep();
     if (!qs)
         return;
     //found qmakeStep, now use it
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index e1f4451dbb6ce5d6ad3a392ce0c038dbca4c3aa7..c16a99614c5a9cbe8b75cf67f8c5da85af58c9a4 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -547,121 +547,194 @@ QtVersion *QtVersionManager::qtVersionForDirectory(const QString &directory)
    return 0;
 }
 
-QtVersion::QmakeBuildConfig QtVersionManager::scanMakefileForQmakeConfig(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig)
+void dumpQMakeAssignments(const QList<QMakeAssignment> &list)
 {
-    bool debugScan = false;
+    foreach(QMakeAssignment qa, list) {
+        qDebug()<<qa.variable<<qa.op<<qa.value;
+    }
+}
+
+// New code
+QPair<QtVersion::QmakeBuildConfig, QStringList> QtVersionManager::scanMakeFile(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig)
+{
+    qDebug()<<"ScanMakeFile, the gory details:";
     QtVersion::QmakeBuildConfig result = QtVersion::NoBuild;
+    QStringList result2;
+
+    QString line = findQMakeLine(directory);
+    if (!line.isEmpty()) {
+        qDebug()<<"Found line"<<line;
+        line = trimLine(line);
+        qDebug()<<"Trimmed to"<<line;
+        QStringList parts = splitLine(line);
+        qDebug()<<"Splitted into"<<parts;
+        QList<QMakeAssignment> assignments;
+        QList<QMakeAssignment> afterAssignments;
+        QStringList additionalArguments;
+        parseParts(parts, &assignments, &afterAssignments, &additionalArguments);
+
+        qDebug()<<"After parseParts";
+        dumpQMakeAssignments(assignments);
+        qDebug()<<"-after";
+        dumpQMakeAssignments(afterAssignments);
+
+        // Search in assignments for CONFIG(+=,-=,=)(debug,release,debug_and_release)
+        // Also remove them from the list
+        result = qmakeBuildConfigFromCmdArgs(&assignments, defaultBuildConfig);
+
+        qDebug()<<"After qmakeBuildConfigFromCmdArgs";
+        dumpQMakeAssignments(assignments);
+
+        result2.append(additionalArguments);
+        foreach(QMakeAssignment qa, assignments)
+            result2.append(qa.variable + qa.op + qa.value);
+        if (!afterAssignments.isEmpty()) {
+            result2.append("-after");
+            foreach(QMakeAssignment qa, afterAssignments)
+                result2.append(qa.variable + qa.op + qa.value);
+        }
+    }
+
+    // Dump the gathered information:
+    qDebug()<<"\n\nDumping information from scanMakeFile";
+    qDebug()<<"QMake CONFIG variable parsing";
+    qDebug()<<"  "<< (result & QtVersion::NoBuild ? "No Build" : QString::number(int(result)));
+    qDebug()<<"  "<< (result & QtVersion::DebugBuild ? "debug" : "release");
+    qDebug()<<"  "<< (result & QtVersion::BuildAll ? "debug_and_release" : "no debug_and_release");
+    qDebug()<<"\nAddtional Arguments";
+    qDebug()<<result2;
+    qDebug()<<"\n\n";
+    return qMakePair(result, result2);
+}
+
+QString QtVersionManager::findQMakeLine(const QString &directory)
+{
     QFile makefile(directory + "/Makefile" );
     if (makefile.exists() && makefile.open(QFile::ReadOnly)) {
         QTextStream ts(&makefile);
         while (!ts.atEnd()) {
             QString line = ts.readLine();
-            if (line.startsWith("# Command:")) {
-                // if nothing is specified
-                result = defaultBuildConfig;
-
-                // Actually parsing that line is not trivial in the general case
-                // There might things like this
-                // # Command: /home/dteske/git/bqt-45/bin/qmake -unix CONFIG+=debug\ release CONFIG\ +=\ debug_and_release\ debug -o Makefile test.pro
-                // which sets debug_and_release and debug
-                // or something like this:
-                //[...] CONFIG+=debug\ release CONFIG\ +=\ debug_and_release\ debug CONFIG\ -=\ debug_and_release CONFIG\ -=\ debug -o Makefile test.pro
-                // which sets -build_all and release
-
-                // To parse that, we search for the first CONFIG, then look for " " which is not after a "\" or the end
-                // And then look at each config individually
-                // we then remove all "\ " with just " "
-                // += sets adding flags
-                // -= sets removing flags
-                // and then split the string after the =
-                // and go over each item separetly
-                // debug sets/removes the flag DebugBuild
-                // release removes/sets the flag DebugBuild
-                // debug_and_release sets/removes the flag BuildAll
-                int pos = line.indexOf("CONFIG");
-                if (pos != -1) {
-                    // Chopped of anything that is not interesting
-                    line = line.mid(pos);
-                    line = line.trimmed();
-                    if (debugScan)
-                        qDebug()<<"chopping line :"<<line;
-
-                    //Now chop into parts that are intresting
-                    QStringList parts;
-                    int lastpos = 0;
-                    for (int i = 1; i < line.size(); ++i) {
-                        if (line.at(i) == QLatin1Char(' ') && line.at(i-1) != QLatin1Char('\\')) {
-                            // found a part
-                            parts.append(line.mid(lastpos, i-lastpos));
-                            if (debugScan)
-                                qDebug()<<"part appended:"<<line.mid(lastpos, i-lastpos);
-                            lastpos = i + 1; // Nex one starts after the space
-                        }
-                    }
-                    parts.append(line.mid(lastpos));
-                    if (debugScan)
-                        qDebug()<<"part appended:"<<line.mid(lastpos);
-
-                    foreach(const QString &part, parts) {
-                        if (debugScan)
-                            qDebug()<<"now interpreting part"<<part;
-                        bool setFlags;
-                        // Now try to understand each part for that we do a rather stupid approach, optimize it if you care
-                        if (part.startsWith("CONFIG")) {
-                            // Yep something interesting
-                            if (part.indexOf("+=") != -1) {
-                                setFlags = true;
-                            } else if (part.indexOf("-=") != -1) {
-                                setFlags = false;
-                            } else {
-                                setFlags = true;
-                                if (debugScan)
-                                    qDebug()<<"This can never happen, except if we can't parse Makefiles...";
-                            }
-                            if (debugScan)
-                                qDebug()<<"part has setFlags:"<<setFlags;
-                            // now loop forward, looking for something that looks like debug, release or debug_and_release
-
-                            for (int i = 0; i < part.size(); ++i) {
-                                int left = part.size() - i;
-                                if (left >= 17  && QStringRef(&part, i, 17) == "debug_and_release") {
-                                        if (setFlags)
-                                            result = QtVersion::QmakeBuildConfig(result | QtVersion::BuildAll);
-                                        else
-                                            result = QtVersion::QmakeBuildConfig(result & ~QtVersion::BuildAll);
-                                        if (debugScan)
-                                            qDebug()<<"found debug_and_release new value"<<result;
-                                        i += 17;
-                                } else if (left >=7 && QStringRef(&part, i, 7) ==  "release") {
-                                        if (setFlags)
-                                            result = QtVersion::QmakeBuildConfig(result & ~QtVersion::DebugBuild);
-                                        else
-                                            result = QtVersion::QmakeBuildConfig(result | QtVersion::DebugBuild);
-                                        if (debugScan)
-                                            qDebug()<<"found release new value"<<result;
-                                        i += 7;
-                                } else if (left >= 5 && QStringRef(&part, i, 5) == "debug") {
-                                        if (setFlags)
-                                            result = QtVersion::QmakeBuildConfig(result  | QtVersion::DebugBuild);
-                                        else
-                                            result = QtVersion::QmakeBuildConfig(result  & ~QtVersion::DebugBuild);
-                                        if (debugScan)
-                                            qDebug()<<"found debug new value"<<result;
-                                        i += 5;
-                                }
-                            }
-                        }
-                    }
+            if (line.startsWith("# Command:"))
+                return line;
+        }
+    }
+    return QString();
+}
+
+/// This function trims the "#Command /path/to/qmake" from the the line
+QString QtVersionManager::trimLine(const QString line)
+{
+
+    // Actually the first space after #Command: /path/to/qmake
+    int firstSpace = line.indexOf(" ", 11);
+    return line.mid(firstSpace).trimmed();
+}
+
+QStringList QtVersionManager::splitLine(const QString &line)
+{
+    // Split on each " ", except on those which are escaped
+    // Also remove all escaping
+    bool escape = false;
+    QString currentWord;
+    QStringList results;
+    int length = line.length();
+    for (int i=0; i<length; ++i) {
+        if (escape) {
+            currentWord += line.at(i);
+            escape = false;
+        } else if (line.at(i) == ' ') {
+            results << currentWord;
+            currentWord.clear();
+        } else if (line.at(i) == '\\') {
+            escape = true;
+        } else {
+            currentWord += line.at(i);
+        }
+    }
+    return results;
+}
+
+void QtVersionManager::parseParts(const QStringList &parts, QList<QMakeAssignment> *assignments, QList<QMakeAssignment> *afterAssignments, QStringList *additionalArguments)
+{
+    QRegExp regExp("([^\\s\\+-]*)\\s*(\\+=|=|-=|~=)(.*)");
+    bool after = false;
+    bool ignoreNext = false;
+    foreach (const QString &part, parts) {
+        if (ignoreNext) {
+            // Ignoring
+            ignoreNext = false;
+        } else if (part == "after") {
+            after = true;
+        } else if(part.contains('=')) {
+            if (regExp.exactMatch(part)) {
+                qDebug()<<regExp.cap(1)<<"|"<<regExp.cap(2)<<"|"<<regExp.cap(3);
+                QMakeAssignment qa;
+                qa.variable = regExp.cap(1);
+                qa.op = regExp.cap(2);
+                qa.value = regExp.cap(3).trimmed();
+                if (after)
+                    afterAssignments->append(qa);
+                else
+                    assignments->append(qa);
+            } else {
+                qDebug()<<"regexp did not match";
+            }
+        } else if (part == "-o") {
+            ignoreNext = true;
+        } else {
+            qDebug()<<"Not parsed"<<part;
+            additionalArguments->append(part);
+        }
+    }
+#if defined(Q_OS_WIN32)
+    additionalArguments->removeAll("-win32");
+#elif defined(Q_OS_MAC)
+    additionalArguments->removeAll("-macx");
+#elif defined(Q_OS_QNX6)
+    additionalArguments->removeAll("-qnx6");
+#else
+    additionalArguments->removeAll("-unix");
+#endif
+}
+
+
+/// This function extracts all the CONFIG+=debug, CONFIG+=release
+QtVersion::QmakeBuildConfig QtVersionManager::qmakeBuildConfigFromCmdArgs(QList<QMakeAssignment> *assignments, QtVersion::QmakeBuildConfig defaultBuildConfig)
+{
+    QtVersion::QmakeBuildConfig result = defaultBuildConfig;
+    QList<QMakeAssignment> oldAssignments = *assignments;
+    assignments->clear();
+    foreach(QMakeAssignment qa, oldAssignments) {
+        if (qa.variable == "CONFIG") {
+            QStringList values = qa.value.split(' ');
+            QStringList newValues;
+            foreach(const QString &value, values) {
+                if (value == "debug") {
+                    if (qa.op == "+=")
+                        result = QtVersion::QmakeBuildConfig(result  | QtVersion::DebugBuild);
+                    else
+                        result = QtVersion::QmakeBuildConfig(result  & ~QtVersion::DebugBuild);
+                } else if (value == "release") {
+                    if (qa.op == "+=")
+                        result = QtVersion::QmakeBuildConfig(result & ~QtVersion::DebugBuild);
+                    else
+                        result = QtVersion::QmakeBuildConfig(result | QtVersion::DebugBuild);
+                } else if (value == "debug_and_release") {
+                    if (qa.op == "+=")
+                        result = QtVersion::QmakeBuildConfig(result | QtVersion::BuildAll);
+                    else
+                        result = QtVersion::QmakeBuildConfig(result & ~QtVersion::BuildAll);
+                } else {
+                    newValues.append(value);
                 }
-                if (debugScan)
-                    qDebug()<<"returning: "<<result;
-                if (debugScan)
-                    qDebug()<<"buildall = "<<bool(result & QtVersion::BuildAll);
-                if (debugScan)
-                    qDebug()<<"debug ="<<bool(result & QtVersion::DebugBuild);
+                QMakeAssignment newQA = qa;
+                newQA.value = newValues.join(" ");
+                if (!newValues.isEmpty())
+                    assignments->append(newQA);
             }
+        } else {
+            assignments->append(qa);
         }
-        makefile.close();
     }
     return result;
 }
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index f76dd602ea95189bed4d2f88abf28b071ce188b5..c1fe58f9f0d02d3c2b517c342a78f4f8a7e1218a 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -167,6 +167,13 @@ private:
     mutable QString m_qmakeCXX;
 };
 
+struct QMakeAssignment
+{
+    QString variable;
+    QString op;
+    QString value;
+};
+
 class QtVersionManager : public QObject
 {
     Q_OBJECT
@@ -189,13 +196,18 @@ public:
     void removeVersion(QtVersion *version);
 
     // Static Methods
-    static QtVersion::QmakeBuildConfig scanMakefileForQmakeConfig(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig);
+    static QPair<QtVersion::QmakeBuildConfig, QStringList> scanMakeFile(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig);
     static QString findQtVersionFromMakefile(const QString &directory);
 signals:
     void defaultQtVersionChanged();
     void qtVersionsChanged();
     void updatedExamples(const QString& examplesPath, const QString& demosPath);
 private:
+    static QString findQMakeLine(const QString &directory);
+    static QString trimLine(const QString line);
+    static QStringList splitLine(const QString &line);
+    static void parseParts(const QStringList &parts, QList<QMakeAssignment> *assignments, QList<QMakeAssignment> *afterAssignments, QStringList *additionalArguments);
+    static QtVersion::QmakeBuildConfig qmakeBuildConfigFromCmdArgs(QList<QMakeAssignment> *assignments, QtVersion::QmakeBuildConfig defaultBuildConfig);
     // Used by QtOptionsPage
     void setNewQtVersions(QList<QtVersion *> newVersions, int newDefaultVersion);
     // Used by QtVersion
diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h
index 106d3681d8c5dbd163dd295db66dc927f2aeafc3..c38923d51f8327760ee96e2d08fb1f486e360599 100644
--- a/src/shared/proparser/profileevaluator.h
+++ b/src/shared/proparser/profileevaluator.h
@@ -59,6 +59,9 @@ public:
     void setVerbose(bool on); // Default is false
     void setCumulative(bool on); // Default is true!
     void setOutputDir(const QString &dir); // Default is empty
+
+    // -nocache, -cache, -spec, QMAKESPEC
+    // -set persistent value
     void setUserConfigCmdArgs(const QStringList &addUserConfigCmdArgs, const QStringList &removeUserConfigCmdArgs);
     void setParsePreAndPostFiles(bool on); // Default is true