diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts
index 4e38da0f5c2fbbcca4d63cfea096cecea873acdf..1b34e8675bf9bd8df1a5efb2b3f963c015167aad 100644
--- a/share/qtcreator/translations/qtcreator_de.ts
+++ b/share/qtcreator/translations/qtcreator_de.ts
@@ -1759,7 +1759,7 @@ Sollen sie überschrieben werden?</translation>
         <location line="+11"/>
         <source>From revision %1&lt;br/&gt;</source>
         <extracomment>This gets conditionally inserted as argument %8 into the description string.</extracomment>
-        <translation>Revision:</translation>
+        <translation>Revision %1&lt;br/&gt;</translation>
     </message>
     <message>
         <location line="+3"/>
diff --git a/share/qtcreator/translations/qtcreator_es.ts b/share/qtcreator/translations/qtcreator_es.ts
index e564f6e1bb81d35eeac4475ca5976cc2009909a6..8e1a7b4b9680a1af0d7327f26e9853f88c81b222 100644
--- a/share/qtcreator/translations/qtcreator_es.ts
+++ b/share/qtcreator/translations/qtcreator_es.ts
@@ -1721,7 +1721,7 @@ Would you like to overwrite them?</source>
         <location line="+11"/>
         <source>From revision %1&lt;br/&gt;</source>
         <extracomment>This gets conditionally inserted as argument %8 into the description string.</extracomment>
-        <translation>Revisión %1</translation>
+        <translation>Revisión %1&lt;br/&gt;</translation>
     </message>
     <message>
         <location line="+3"/>
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 0dad025289470d307017ff6c5bea500dcc89cccc..be6aa86093a9cb2de81657888eb2a2f3bf36b2ae 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -1316,6 +1316,7 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc)
             }
 
             Editor e;
+            e.revision = ed->document()->revision();
             e.textEditor = textEditor;
             e.selections = selections;
             e.ifdefedOutBlocks = blockRanges;
@@ -1340,8 +1341,11 @@ void CppModelManager::updateEditorSelections()
 
         TextEditor::ITextEditor *textEditor = ed.textEditor;
         TextEditor::BaseTextEditor *editor = qobject_cast<TextEditor::BaseTextEditor *>(textEditor->widget());
+
         if (! editor)
             continue;
+        else if (editor->document()->revision() != ed.revision)
+            continue; // outdated
 
         editor->setExtraSelections(TextEditor::BaseTextEditor::CodeWarningsSelection,
                                    ed.selections);
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 0cc98d06a8e9f6b2d2cbfd8a4992b5ec478990a2..40a492b27ca73c3abd0bd1cfcffa9eb824b42e16 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -176,6 +176,9 @@ private:
     mutable QMutex protectSnapshot;
 
     struct Editor {
+        Editor()
+                : revision(-1) {}
+        int revision;
         QPointer<TextEditor::ITextEditor> textEditor;
         QList<QTextEdit::ExtraSelection> selections;
         QList<TextEditor::BaseTextEditor::BlockRange> ifdefedOutBlocks;
diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp
index e8f8e833994b448ce148bc47aa97922fbec028cc..5bef6ecd6ce30aec546715ad820146db2267d339 100644
--- a/src/plugins/qt4projectmanager/profilereader.cpp
+++ b/src/plugins/qt4projectmanager/profilereader.cpp
@@ -107,54 +107,6 @@ QString ProFileReader::value(const QString &variable) const
 }
 
 
-// Construct QFileInfo from path value and base directory
-// Truncate trailing slashs and make absolute
-static inline QFileInfo infoFromPath(QString path,
-                              const QString &baseDirectory)
-{
-    if (path.size() > 1 && path.endsWith(QLatin1Char('/')))
-        path.truncate(path.size() - 1);
-    QFileInfo info(path);
-    if (info.isAbsolute())
-        return info;
-    return QFileInfo(baseDirectory, path);
-}
-
-/*!
-  Returns a list of absolute paths
-  */
-QStringList ProFileReader::absolutePathValues(const QString &variable,
-                                              const QString &baseDirectory,
-                                              PathValuesMode mode,
-                                              const ProFile *pro) const
-{
-    QStringList rawList;
-    if (!pro)
-        rawList = values(variable);
-    else
-        rawList = values(variable, pro);
-
-    if (rawList.isEmpty())
-        return QStringList();
-
-    // Normalize list of paths, kill trailing slashes,
-    // remove duplicates while maintaining order
-    const QChar slash = QLatin1Char('/');
-    QStringList result;
-    const QStringList::const_iterator rcend = rawList.constEnd();
-    for (QStringList::const_iterator it = rawList.constBegin(); it != rcend; ++it) {
-        const QFileInfo info = infoFromPath(*it, baseDirectory);
-        if (mode == AllPaths || info.exists()) {
-            if (mode != ExistingFilePaths || info.isFile()) {
-                const QString absPath = info.absoluteFilePath();
-                if (!result.contains(absPath))
-                    result.push_back(absPath);
-            }
-        }
-    }
-    return result;
-}
-
 void ProFileReader::fileMessage(const QString &message)
 {
     Q_UNUSED(message);
diff --git a/src/plugins/qt4projectmanager/profilereader.h b/src/plugins/qt4projectmanager/profilereader.h
index cded457cdf39288fc7b8268add0ede2cb0862420..74a8745ac6095f4abd37d32e1eb2f4332a70d89f 100644
--- a/src/plugins/qt4projectmanager/profilereader.h
+++ b/src/plugins/qt4projectmanager/profilereader.h
@@ -53,11 +53,6 @@ public:
 
     QString value(const QString &variable) const;
 
-    enum PathValuesMode { AllPaths, ExistingPaths, ExistingFilePaths };
-    QStringList absolutePathValues(const QString &variable,
-                                   const QString &baseDirectory,
-                                   PathValuesMode mode,
-                                   const ProFile *pro = 0) const;
     ProFile *proFileFor(const QString &name);
 signals:
     void errorFound(const QString &error);
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index f1556eb5ff07d55190c5c0b335b068e2a61df2a3..e8b3de829650b183b80bde38e117cc2cbac26e09 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -132,14 +132,30 @@ void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader)
                                   << ProjectExplorer::ResourceType
                                   << ProjectExplorer::UnknownFileType);
 
+    const QString &projectDir = m_qt4ProFileNode->m_projectDir;
+
+    QStringList baseVPaths;
+    baseVPaths += reader->absolutePathValues("VPATH", projectDir);
+    baseVPaths << projectDir; // QMAKE_ABSOLUTE_SOURCE_PATH
+    baseVPaths += reader->absolutePathValues("DEPENDPATH", projectDir);
+    baseVPaths.removeDuplicates();
+
     // update files
-    const QDir projectDir = QFileInfo(m_projectFilePath).dir();
     foreach (FileType type, fileTypes) {
         const QStringList qmakeVariables = varNames(type);
 
         QStringList newFilePaths;
-        foreach (const QString &qmakeVariable, qmakeVariables)
-            newFilePaths += reader->absolutePathValues(qmakeVariable, projectDir.path(), ProFileReader::ExistingFilePaths, includeFile);
+        foreach (const QString &qmakeVariable, qmakeVariables) {
+            QStringList vPaths;
+            if (type == ProjectExplorer::SourceType)
+                vPaths = reader->absolutePathValues("VPATH_" + qmakeVariable, projectDir);
+            vPaths += baseVPaths;
+            if (type == ProjectExplorer::HeaderType)
+                vPaths += reader->absolutePathValues("INCLUDEPATH", projectDir);
+            vPaths.removeDuplicates();
+            newFilePaths += reader->absoluteFileValues(qmakeVariable, projectDir, vPaths, includeFile);
+        }
+        newFilePaths.removeDuplicates();
 
         QList<FileNode*> existingFileNodes;
         foreach (FileNode *fileNode, fileNodes()) {
@@ -896,16 +912,16 @@ Qt4ProFileNode *Qt4ProFileNode::createSubProFileNode(const QString &path)
 QStringList Qt4ProFileNode::uiDirPaths(ProFileReader *reader) const
 {
     QStringList candidates = reader->absolutePathValues(QLatin1String("UI_DIR"),
-                                                        buildDir(),
-                                                        ProFileReader::ExistingPaths);
+                                                        buildDir());
+    candidates.removeDuplicates();
     return candidates;
 }
 
 QStringList Qt4ProFileNode::mocDirPaths(ProFileReader *reader) const
 {
     QStringList candidates = reader->absolutePathValues(QLatin1String("MOC_DIR"),
-                                                        buildDir(),
-                                                        ProFileReader::ExistingPaths);
+                                                        buildDir());
+    candidates.removeDuplicates();
     return candidates;
 }
 
@@ -913,8 +929,7 @@ QStringList Qt4ProFileNode::includePaths(ProFileReader *reader) const
 {
     QStringList paths;
     paths = reader->absolutePathValues(QLatin1String("INCLUDEPATH"),
-                                       m_projectDir,
-                                       ProFileReader::ExistingPaths);
+                                       m_projectDir);
     paths << uiDirPaths(reader) << mocDirPaths(reader);
     paths.removeDuplicates();
     return paths;
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 4e3f28c3aa6e28bc2796b01ae61787425be2f1ed..bff11da668aa0c4c6d01b36f09c72936ff56f94c 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -407,7 +407,7 @@ QString Qt4Project::makeCommand(const QString &buildConfiguration) const
 QString Qt4Project::defaultMakeTarget(const QString &buildConfiguration) const
 {
     ToolChain *tc = toolChain(buildConfiguration);
-    return tc ? toolChain(buildConfiguration)->defaultMakeTarget() : "";
+    return tc ? tc->defaultMakeTarget() : "";
 }
 
 void Qt4Project::updateCodeModel()
diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index 295e094a9ce80e7f3b350a09e302a6d2e9053566..016633006c6be6e4d88e330354a42a952665928a 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -182,9 +182,6 @@ public:
     QString propertyValue(const QString &val) const;
 
     bool isActiveConfig(const QString &config, bool regex = false);
-    QStringList expandPattern(const QString &pattern);
-    void expandPatternHelper(const QString &relName, const QString &absName,
-        QStringList &sources_out);
     QStringList expandVariableReferences(const QString &value);
     void doVariableReplace(QString *str);
     QStringList evaluateExpandFunction(const QString &function, const QString &arguments);
@@ -844,32 +841,6 @@ void ProFileEvaluator::Private::visitProValue(ProValue *value)
     m_prevLineNo = m_lineNo;
     m_prevProFile = currentProFile();
 
-    // The following two blocks fix bug 180128 by making all "interesting"
-    // file name absolute in each .pro file, not just the top most one
-    if (varName == QLatin1String("SOURCES")
-            || varName == QLatin1String("OBJECTIVE_SOURCES")
-            || varName == QLatin1String("HEADERS")
-            || varName == QLatin1String("INTERFACES")
-            || varName == QLatin1String("FORMS")
-            || varName == QLatin1String("FORMS3")
-            || varName == QLatin1String("RESOURCES")
-            || varName == QLatin1String("LEXSOURCES")
-            || varName == QLatin1String("YACCSOURCES")){
-        // matches only existent files, expand certain(?) patterns
-        QStringList vv;
-        for (int i = v.count(); --i >= 0; )
-            vv << expandPattern(v[i]);
-        v = vv;
-    }
-
-    if (varName == QLatin1String("TRANSLATIONS")) {
-        // also matches non-existent files, but does not expand pattern
-        QString dir = QFileInfo(currentFileName()).absolutePath();
-        dir += QLatin1Char('/');
-        for (int i = v.count(); --i >= 0; )
-            v[i] = QFileInfo(dir, v[i]).absoluteFilePath();
-    }
-
     switch (m_variableOperator) {
         case ProVariable::SetOperator:          // =
             if (!m_cumulative) {
@@ -2495,82 +2466,6 @@ bool ProFileEvaluator::Private::evaluateFeatureFile(const QString &fileName)
     return ok;
 }
 
-void ProFileEvaluator::Private::expandPatternHelper(const QString &relName, const QString &absName,
-        QStringList &sources_out)
-{
-    const QStringList vpaths = values(QLatin1String("VPATH"))
-        + values(QLatin1String("QMAKE_ABSOLUTE_SOURCE_PATH"))
-        + values(QLatin1String("DEPENDPATH"))
-        + values(QLatin1String("VPATH_SOURCES"));
-
-    QFileInfo fi(absName);
-    bool found = fi.exists();
-    // Search in all vpaths
-    if (!found) {
-        foreach (const QString &vpath, vpaths) {
-            fi.setFile(vpath + QDir::separator() + relName);
-            if (fi.exists()) {
-                found = true;
-                break;
-            }
-        }
-    }
-
-    if (found) {
-        sources_out += fi.absoluteFilePath(); // Not resolving symlinks
-    } else {
-        QString val = relName;
-        QString dir;
-        QString wildcard = val;
-        QString real_dir;
-        if (wildcard.lastIndexOf(QLatin1Char('/')) != -1) {
-            dir = wildcard.left(wildcard.lastIndexOf(QLatin1Char('/')) + 1);
-            real_dir = dir;
-            wildcard = wildcard.right(wildcard.length() - dir.length());
-        }
-
-        if (real_dir.isEmpty() || QFileInfo(real_dir).exists()) {
-            QStringList files = QDir(real_dir).entryList(QStringList(wildcard));
-            if (files.isEmpty()) {
-                q->logMessage(format("Failure to find %1").arg(val));
-            } else {
-                QString a;
-                for (int i = files.count() - 1; i >= 0; --i) {
-                    if (files[i] == QLatin1String(".") || files[i] == QLatin1String(".."))
-                        continue;
-                    a = dir + files[i];
-                    sources_out += a;
-                }
-            }
-        } else {
-            q->logMessage(format("Cannot match %1/%2, as %3 does not exist.")
-                .arg(real_dir).arg(wildcard).arg(real_dir));
-        }
-    }
-}
-
-
-/*
- * Lookup of files are done in this order:
- *  1. look in pwd
- *  2. look in vpaths
- *  3. expand wild card files relative from the profiles folder
- **/
-
-// FIXME: This code supports something that I'd consider a flaw in .pro file syntax
-// which is not even documented. So arguably this can be ditched completely...
-QStringList ProFileEvaluator::Private::expandPattern(const QString& pattern)
-{
-    if (!currentProFile())
-        return QStringList();
-
-    QStringList sources_out;
-    const QString absName = QDir::cleanPath(QDir::current().absoluteFilePath(pattern));
-
-    expandPatternHelper(pattern, absName, sources_out);
-    return sources_out;
-}
-
 QString ProFileEvaluator::Private::format(const char *fmt) const
 {
     ProFile *pro = currentProFile();
@@ -2621,6 +2516,59 @@ QStringList ProFileEvaluator::values(const QString &variableName, const ProFile
     return fixEnvVariables(d->values(variableName, pro));
 }
 
+QStringList ProFileEvaluator::absolutePathValues(
+        const QString &variable, const QString &baseDirectory) const
+{
+    QStringList result;
+    foreach (const QString &el, values(variable)) {
+        const QFileInfo info = QFileInfo(baseDirectory, el);
+        if (info.isDir())
+            result << QDir::cleanPath(info.absoluteFilePath());
+    }
+    return result;
+}
+
+QStringList ProFileEvaluator::absoluteFileValues(
+        const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,
+        const ProFile *pro) const
+{
+    QStringList result;
+    foreach (const QString &el, pro ? values(variable, pro) : values(variable)) {
+        QFileInfo info(el);
+        if (info.isAbsolute()) {
+            if (info.exists()) {
+                result << QDir::cleanPath(el);
+                goto next;
+            }
+        } else {
+            foreach (const QString &dir, searchDirs) {
+                QFileInfo info(dir, el);
+                if (info.isFile()) {
+                    result << QDir::cleanPath(info.filePath());
+                    goto next;
+                }
+            }
+            if (baseDirectory.isEmpty())
+                goto next;
+            info = QFileInfo(baseDirectory, el);
+        }
+        {
+            QFileInfo baseInfo(info.absolutePath());
+            if (baseInfo.exists()) {
+                QString wildcard = info.fileName();
+                if (wildcard.contains(QLatin1Char('*')) || wildcard.contains(QLatin1Char('?'))) {
+                    QDir theDir(QDir::cleanPath(baseInfo.filePath()));
+                    foreach (const QString &fn, theDir.entryList(QStringList(wildcard)))
+                        if (fn != QLatin1String(".") && fn != QLatin1String(".."))
+                            result << theDir.absoluteFilePath(fn);
+                } // else if (acceptMissing)
+            }
+        }
+      next: ;
+    }
+    return result;
+}
+
 ProFileEvaluator::TemplateType ProFileEvaluator::templateType()
 {
     QStringList templ = values(QLatin1String("TEMPLATE"));
@@ -2723,64 +2671,4 @@ void ProFileEvaluator::setParsePreAndPostFiles(bool on)
     d->m_parsePreAndPostFiles = on;
 }
 
-void evaluateProFile(const ProFileEvaluator &visitor, QHash<QByteArray, QStringList> *varMap)
-{
-    QStringList sourceFiles;
-    QString codecForTr;
-    QString codecForSource;
-    QStringList tsFileNames;
-
-    // app/lib template
-    sourceFiles += visitor.values(QLatin1String("SOURCES"));
-    sourceFiles += visitor.values(QLatin1String("HEADERS"));
-    tsFileNames = visitor.values(QLatin1String("TRANSLATIONS"));
-
-    QStringList trcodec = visitor.values(QLatin1String("CODEC"))
-        + visitor.values(QLatin1String("DEFAULTCODEC"))
-        + visitor.values(QLatin1String("CODECFORTR"));
-    if (!trcodec.isEmpty())
-        codecForTr = trcodec.last();
-
-    QStringList srccodec = visitor.values(QLatin1String("CODECFORSRC"));
-    if (!srccodec.isEmpty())
-        codecForSource = srccodec.last();
-
-    QStringList forms = visitor.values(QLatin1String("INTERFACES"))
-        + visitor.values(QLatin1String("FORMS"))
-        + visitor.values(QLatin1String("FORMS3"));
-    sourceFiles << forms;
-
-    sourceFiles.sort();
-    sourceFiles.removeDuplicates();
-    tsFileNames.sort();
-    tsFileNames.removeDuplicates();
-
-    varMap->insert("SOURCES", sourceFiles);
-    varMap->insert("CODECFORTR", QStringList() << codecForTr);
-    varMap->insert("CODECFORSRC", QStringList() << codecForSource);
-    varMap->insert("TRANSLATIONS", tsFileNames);
-}
-
-bool evaluateProFile(const QString &fileName, bool verbose, QHash<QByteArray, QStringList> *varMap)
-{
-    QFileInfo fi(fileName);
-    if (!fi.exists())
-        return false;
-
-    ProFile pro(fi.absoluteFilePath());
-
-    ProFileEvaluator visitor;
-    visitor.setVerbose(verbose);
-
-    if (!visitor.queryProFile(&pro))
-        return false;
-
-    if (!visitor.accept(&pro))
-        return false;
-
-    evaluateProFile(visitor, varMap);
-
-    return true;
-}
-
 QT_END_NAMESPACE
diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h
index 9bd88c0c03d0dac3a4086aceb4fdd6c53d1183c6..106d3681d8c5dbd163dd295db66dc927f2aeafc3 100644
--- a/src/shared/proparser/profileevaluator.h
+++ b/src/shared/proparser/profileevaluator.h
@@ -40,12 +40,6 @@
 
 QT_BEGIN_NAMESPACE
 
-class ProFile;
-class ProFileEvaluator;
-
-void evaluateProFile(const ProFileEvaluator &visitor, QHash<QByteArray, QStringList> *varMap);
-bool evaluateProFile(const QString &fileName, bool verbose, QHash<QByteArray, QStringList> *varMap);
-
 class ProFileEvaluator
 {
 public:
@@ -76,6 +70,10 @@ public:
     void addProperties(const QHash<QString, QString> &properties);
     QStringList values(const QString &variableName) const;
     QStringList values(const QString &variableName, const ProFile *pro) const;
+    QStringList absolutePathValues(const QString &variable, const QString &baseDirectory) const;
+    QStringList absoluteFileValues(
+            const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,
+            const ProFile *pro) const;
     QString propertyValue(const QString &val) const;
 
     // for our descendents