diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc
index 4521b7e2fa4317c8eec094fc53e23be12ebfcc7b..4dd7a5fb53cd06eb302a26c27f78971d0a125540 100644
--- a/doc/qtcreator.qdoc
+++ b/doc/qtcreator.qdoc
@@ -950,24 +950,23 @@
     You can start Qt Creator from a command prompt with an existing session or
     \c{.pro} file by giving the name as argument on the command line.
 
-    \bold{Sidebar}
+    \bold{Show and Hide the Sidebar}
 
-    You can hide/unhide the sidebar in the edit and debug mode
-    by clicking on the corresponding icon on the left bottom.
-    Keyboard shortcut is \key{Alt+0}.
+    You can show and hide the the sidebar in \gui Edit and \gui Debug mode by
+    clicking on the corresponding icon, or by pressing \key{Alt+0}.
 
-    \bold{Display signals and slots}
+    \bold{Display Signals and Slots}
 
-    If you have an instance of a class derived from QObject and 
-    want to find all other objects connected to one of its
-    slots by Qt's signals-and-slots mechanism, enable
-    \gui{Debug} and \gui{Use Custom Display for Qt Objects}.
-    In the \gui{Locals and Watchers View}, expand the object's
-    entry and open the wanted slot in the "slots" subitem. The
-    objects connect to this slot are exposed as children of
-    this slot. The same works with signals.
+    If you have an instance of a class that is derived from QObject, and you
+    you would like to find all other objects connected to one of your object's
+    slots using Qt's signals and slots mechanism -- you can enable
+    \gui{Use Custom Display for Qt Objects} feature under the \gui Debug menu.
 
-    \bold{Low level display}
+    In the \gui{Locals and Watchers} view, expand the object's entry and open
+    the slot in the \e slots subitem. The objects connected to this slot are
+    exposed as children of the slot. This method works with signals too.
+
+    \bold{Display Low Level Data}
 
     If the special debugging of Qt objects fails due to data
     corruption within the debugged objects, you can switch the
@@ -983,33 +982,38 @@
 
     \title Glossary
 
-    \bold{System Qt}
-
-    \target glossary-system-qt
-    The version of Qt installed on your system.
-    This is the one whose \c qmake command is found in the \c PATH.
-
-    \bold{Default Qt}
-
-    \target glossary-default-qt
-    The version of Qt configured in \gui{Tools
-    -> Options -> Qt 4 -> Default Qt Version}. This is the version
-    used by new projects. It defaults to the System Qt.
+    \table
+        \header
+            \o  Term
+            \o  Meaning
 
-    \bold{Project Qt}
+        \row
+            \o  System Qt   \target glossary-system-qt
+            \o  The version of Qt installed on your system. This is the Qt
+                version for the \c qmake command found in your \c PATH.
 
-    \target glossary-project-qt
-    The version of Qt configured in \gui{Build&Run
-    -> Build Settings -> Build Configurations}. This is the version
-    actually used by the project. It defaults to the Default Qt.
+        \row
+            \o  Default Qt  \target glossary-default-qt
+            \o  The version of Qt configured in \gui{Tools -> Options -> Qt 4
+                -> Default Qt Version}. This is the Qt version used by your
+                new projects. It defaults to System Qt.
 
-    \bold{Shadow Build}
+        \row
+            \o  Project Qt  \target glossary-project-qt
+            \o  The version of Qt configured in \gui{Build&Run -> Build
+                Settings -> Build Configurations}. This is the Qt version that
+                is actually used by a particular project. It defaults to
+                Default Qt.
 
-    \target glossary-shadow-build
-    Shadow building means building the project not in the source directory,
-    but in a seperate \bold{build directory}. This has the benefit of keeping
-    the source directory clean. It is also considered "best practice" if 
-    you need many build configurations for a single set of sources.
+        \row
+            \o  Shadow Build    \target glossary-shadow-build
+            \o  Shadow building means building a project in a separate
+                directory, the \e{build directory}. The build directory is
+                different from the source directory. One of the benefits of
+                shadow building is that it keeps your source directory clean.
+                Shadow building is the best practice if you need many build
+                configurations for a single set of source.
+    \endtable
 
 */
 
diff --git a/src/libs/cplusplus/Icons.cpp b/src/libs/cplusplus/Icons.cpp
index 94b6469ea46b74a85b739bc5512f030d63a90ae9..3b7ee24da3cc595af3b13d1336e24612ffa7df18 100644
--- a/src/libs/cplusplus/Icons.cpp
+++ b/src/libs/cplusplus/Icons.cpp
@@ -61,11 +61,11 @@ Icons::Icons()
 {
 }
 
-QIcon Icons::iconForSymbol(Symbol *symbol) const
+QIcon Icons::iconForSymbol(const Symbol *symbol) const
 {
     if (symbol->isFunction() || (symbol->isDeclaration() && symbol->type()->isFunction()))
     {
-        Function *function = symbol->asFunction();
+        const Function *function = symbol->asFunction();
         if (!function)
             function = symbol->type()->asFunction();
 
diff --git a/src/libs/cplusplus/Icons.h b/src/libs/cplusplus/Icons.h
index c49bcde12d145dba778329830f3413846d29f376..6d4e0bb25d66fe6274bf13d1def75f78fac28097 100644
--- a/src/libs/cplusplus/Icons.h
+++ b/src/libs/cplusplus/Icons.h
@@ -47,7 +47,7 @@ class CPLUSPLUS_EXPORT Icons
 public:
     Icons();
 
-    QIcon iconForSymbol(Symbol *symbol) const;
+    QIcon iconForSymbol(const Symbol *symbol) const;
 
     QIcon keywordIcon() const;
     QIcon macroIcon() const;
diff --git a/src/libs/utils/pathchooser.h b/src/libs/utils/pathchooser.h
index 7ae60a255bf17c7d55d24121e3ec823e24cbb93c..ab821d5df1eebffd60f53336c2f43ebb46b782d4 100644
--- a/src/libs/utils/pathchooser.h
+++ b/src/libs/utils/pathchooser.h
@@ -30,6 +30,7 @@
 ** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
 **
 ***************************************************************************/
+
 #ifndef PATHCHOOSER_H
 #define PATHCHOOSER_H
 
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index da52bb3d6016a367647e00aa59197607fa8d19fa..8567f81d75139c74cb413357fc70818beff14260 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -79,6 +79,7 @@
 #include <QtGui/QComboBox>
 #include <QtGui/QTreeView>
 #include <QtGui/QHeaderView>
+#include <QtGui/QStringListModel>
 
 using namespace CPlusPlus;
 using namespace CppEditor::Internal;
@@ -202,7 +203,9 @@ void CPPEditor::createToolBar(CPPEditorEditable *editable)
     m_methodCombo->setMaxVisibleItems(20);
 
     m_overviewModel = new OverviewModel(this);
-    m_methodCombo->setModel(m_overviewModel);
+    m_noSymbolsModel = new QStringListModel(this);
+    m_noSymbolsModel->setStringList(QStringList() << tr("<no symbols>"));
+    m_methodCombo->setModel(m_noSymbolsModel);
 
     connect(m_methodCombo, SIGNAL(activated(int)), this, SLOT(jumpToMethod(int)));
     connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(updateMethodBoxIndex()));
@@ -315,9 +318,16 @@ void CPPEditor::onDocumentUpdated(Document::Ptr doc)
         return;
 
     m_overviewModel->rebuild(doc);
-    OverviewTreeView *treeView = static_cast<OverviewTreeView *>(m_methodCombo->view());
-    treeView->sync();
-    updateMethodBoxIndex();
+    if (m_overviewModel->rowCount() > 0) {
+        if (m_methodCombo->model() != m_overviewModel)
+            m_methodCombo->setModel(m_overviewModel);
+        OverviewTreeView *treeView = static_cast<OverviewTreeView *>(m_methodCombo->view());
+        treeView->sync();
+        updateMethodBoxIndex();
+    } else {
+        if (m_methodCombo->model() != m_noSymbolsModel)
+            m_methodCombo->setModel(m_noSymbolsModel);
+    }
 }
 
 void CPPEditor::updateFileName()
@@ -325,6 +335,8 @@ void CPPEditor::updateFileName()
 
 void CPPEditor::jumpToMethod(int)
 {
+    if (m_methodCombo->model() != m_overviewModel)
+        return;
     QModelIndex index = m_methodCombo->view()->currentIndex();
     Symbol *symbol = m_overviewModel->symbolFromIndex(index);
     if (! symbol)
@@ -339,12 +351,14 @@ void CPPEditor::jumpToMethod(int)
 
 void CPPEditor::updateMethodBoxIndex()
 {
+    if (m_methodCombo->model() != m_overviewModel)
+        return;
     int line = 0, column = 0;
     convertPosition(position(), &line, &column);
 
     QModelIndex lastIndex;
 
-    const int rc = m_overviewModel->rowCount(QModelIndex());
+    const int rc = m_overviewModel->rowCount();
     for (int row = 0; row < rc; ++row) {
         const QModelIndex index = m_overviewModel->index(row, 0, QModelIndex());
         Symbol *symbol = m_overviewModel->symbolFromIndex(index);
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index 2420bcf4e5e441d67834d5d9d0a612dbbad09f06..33745eddef27f9156af2ed062295b24a949e9eca 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -42,6 +42,7 @@
 QT_BEGIN_NAMESPACE
 class QAction;
 class QComboBox;
+class QStringListModel;
 QT_END_NAMESPACE
 
 namespace Core {
@@ -138,6 +139,7 @@ private:
     QList<int> m_contexts;
     QComboBox *m_methodCombo;
     CPlusPlus::OverviewModel *m_overviewModel;
+    QStringListModel *m_noSymbolsModel;
 };
 
 } // namespace Internal
diff --git a/src/plugins/cpptools/cppclassesfilter.cpp b/src/plugins/cpptools/cppclassesfilter.cpp
index 3d8da9a7387a209638c415d55abe3ddeb5fd039e..6aa6734fca90b2c0b2d672e8bdaa532975766f4c 100644
--- a/src/plugins/cpptools/cppclassesfilter.cpp
+++ b/src/plugins/cpptools/cppclassesfilter.cpp
@@ -42,6 +42,7 @@ CppClassesFilter::CppClassesFilter(CppModelManager *manager, Core::EditorManager
     setIncludedByDefault(false);
 
     search.setSymbolsToSearchFor(SearchSymbols::Classes);
+    search.setSeparateScope(true);
 }
 
 CppClassesFilter::~CppClassesFilter()
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index b3f9fb604c3c46e6866f9a03eb6065a63942c13a..042b93cc74d064a0bf007f29f587c79791a9355d 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -683,7 +683,7 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc)
                 sel.cursor = c;
                 selections.append(sel);
             }
-            ed->setExtraExtraSelections(selections);
+            ed->setExtraSelections(TextEditor::BaseTextEditor::CodeWarningsSelection, selections);
             break;
         }
     }
diff --git a/src/plugins/cpptools/searchsymbols.cpp b/src/plugins/cpptools/searchsymbols.cpp
index 4b1e48abdf7e55a3d3326d0ed0ca5b59686aadee..670d0d6d471e892f9e70b3752899d8463ecf3a8b 100644
--- a/src/plugins/cpptools/searchsymbols.cpp
+++ b/src/plugins/cpptools/searchsymbols.cpp
@@ -40,7 +40,8 @@ using namespace CPlusPlus;
 using namespace CppTools::Internal;
 
 SearchSymbols::SearchSymbols():
-    symbolsToSearchFor(Classes | Functions | Enums)
+    symbolsToSearchFor(Classes | Functions | Enums),
+    separateScope(false)
 {
 }
 
@@ -49,6 +50,11 @@ void SearchSymbols::setSymbolsToSearchFor(SymbolTypes types)
     symbolsToSearchFor = types;
 }
 
+void SearchSymbols::setSeparateScope(bool separateScope)
+{
+    this->separateScope = separateScope;
+}
+
 QList<ModelItemInfo> SearchSymbols::operator()(Document::Ptr doc, const QString &scope)
 {
     QString previousScope = switchScope(scope);
@@ -73,13 +79,12 @@ bool SearchSymbols::visit(Enum *symbol)
         return false;
 
     QString name = symbolName(symbol);
-    QString previousScope = switchScope(name);
-    QIcon icon = icons.iconForSymbol(symbol);
+    QString scopedName = scopedSymbolName(name);
+    QString previousScope = switchScope(scopedName);
+    appendItem(separateScope ? name : scopedName,
+               separateScope ? previousScope : QString(),
+               ModelItemInfo::Enum, symbol);
     Scope *members = symbol->members();
-    items.append(ModelItemInfo(name, QString(), ModelItemInfo::Enum,
-                               QString::fromUtf8(symbol->fileName(), symbol->fileNameLength()),
-                               symbol->line(),
-                               icon));
     for (unsigned i = 0; i < members->symbolCount(); ++i) {
         accept(members->symbolAt(i));
     }
@@ -93,18 +98,18 @@ bool SearchSymbols::visit(Function *symbol)
         return false;
 
     QString name = symbolName(symbol);
-    QString type = overview.prettyType(symbol->type());
-    QIcon icon = icons.iconForSymbol(symbol);
-    items.append(ModelItemInfo(name, type, ModelItemInfo::Method,
-                               QString::fromUtf8(symbol->fileName(), symbol->fileNameLength()),
-                               symbol->line(),
-                               icon));
+    QString scopedName = scopedSymbolName(name);
+    QString type = overview.prettyType(symbol->type(),
+                                       separateScope ? symbol->name() : 0);
+    appendItem(separateScope ? type : scopedName,
+               separateScope ? _scope : type,
+               ModelItemInfo::Method, symbol);
     return false;
 }
 
 bool SearchSymbols::visit(Namespace *symbol)
 {
-    QString name = symbolName(symbol);
+    QString name = findOrInsert(scopedSymbolName(symbol));
     QString previousScope = switchScope(name);
     Scope *members = symbol->members();
     for (unsigned i = 0; i < members->symbolCount(); ++i) {
@@ -118,12 +123,9 @@ bool SearchSymbols::visit(Namespace *symbol)
 bool SearchSymbols::visit(Declaration *symbol)
 {
     if (symbol->type()->isFunction()) {
-        QString name = symbolName(symbol);
+        QString name = scopedSymbolName(symbol);
         QString type = overview.prettyType(symbol->type());
-        //QIcon icon = ...;
-        items.append(ModelItemInfo(name, type, ModelItemInfo::Method,
-                                   QString::fromUtf8(symbol->fileName(), symbol->line()),
-                                   symbol->line()));
+        appendItems(name, type, ModelItemInfo::Method, symbol->fileName());
     }
     return false;
 }
@@ -135,12 +137,11 @@ bool SearchSymbols::visit(Class *symbol)
         return false;
 
     QString name = symbolName(symbol);
-    QString previousScope = switchScope(name);
-    QIcon icon = icons.iconForSymbol(symbol);
-    items.append(ModelItemInfo(name, QString(), ModelItemInfo::Class,
-                               QString::fromUtf8(symbol->fileName(), symbol->fileNameLength()),
-                               symbol->line(),
-                               icon));
+    QString scopedName = scopedSymbolName(name);
+    QString previousScope = switchScope(scopedName);
+    appendItem(separateScope ? name : scopedName,
+               separateScope ? previousScope : QString(),
+               ModelItemInfo::Class, symbol);
     Scope *members = symbol->members();
     for (unsigned i = 0; i < members->symbolCount(); ++i) {
         accept(members->symbolAt(i));
@@ -149,11 +150,22 @@ bool SearchSymbols::visit(Class *symbol)
     return false;
 }
 
-QString SearchSymbols::symbolName(const Symbol *symbol) const
+QString SearchSymbols::scopedSymbolName(const QString &symbolName) const
 {
     QString name = _scope;
     if (! name.isEmpty())
         name += QLatin1String("::");
+    name += symbolName;
+    return name;
+}
+
+QString SearchSymbols::scopedSymbolName(const Symbol *symbol) const
+{
+    return scopedSymbolName(symbolName(symbol));
+}
+
+QString SearchSymbols::symbolName(const Symbol *symbol) const
+{
     QString symbolName = overview.prettyName(symbol->name());
     if (symbolName.isEmpty()) {
         QString type;
@@ -176,6 +188,17 @@ QString SearchSymbols::symbolName(const Symbol *symbol) const
         symbolName += type;
         symbolName += QLatin1String(">");
     }
-    name += symbolName;
-    return name;
+    return symbolName;
+}
+
+void SearchSymbols::appendItem(const QString &name,
+                               const QString &info,
+                               ModelItemInfo::ItemType type,
+                               const CPlusPlus::Symbol *symbol)
+{
+    const QIcon icon = icons.iconForSymbol(symbol);
+    items.append(ModelItemInfo(name, info, type,
+                               QString::fromUtf8(symbol->fileName(), symbol->fileNameLength()),
+                               symbol->line(),
+                               icon));
 }
diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h
index 1fe276b6bea8c310f2aed3939109056f4259b823..4997e5cf049bb72d9512c56191bf2d4d0728abcd 100644
--- a/src/plugins/cpptools/searchsymbols.h
+++ b/src/plugins/cpptools/searchsymbols.h
@@ -92,6 +92,7 @@ public:
     SearchSymbols();
 
     void setSymbolsToSearchFor(SymbolTypes types);
+    void setSeparateScope(bool separateScope);
 
     QList<ModelItemInfo> operator()(CPlusPlus::Document::Ptr doc)
     { return operator()(doc, QString()); }
@@ -113,14 +114,27 @@ protected:
     virtual bool visit(CPlusPlus::Declaration *symbol);
 #endif
     virtual bool visit(CPlusPlus::Class *symbol);
+
+    QString scopedSymbolName(const QString &symbolName) const;
+    QString scopedSymbolName(const CPlusPlus::Symbol *symbol) const;
     QString symbolName(const CPlusPlus::Symbol *symbol) const;
+    void appendItem(const QString &name,
+                    const QString &info,
+                    ModelItemInfo::ItemType type,
+                    const CPlusPlus::Symbol *symbol);
 
 private:
+    QString findOrInsert(const QString &s)
+    { return *strings.insert(s); }
+
+    QSet<QString> strings;            // Used to avoid QString duplication
+
     QString _scope;
     CPlusPlus::Overview overview;
     CPlusPlus::Icons icons;
     QList<ModelItemInfo> items;
     SymbolTypes symbolsToSearchFor;
+    bool separateScope;
 };
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(SearchSymbols::SymbolTypes)
diff --git a/src/plugins/projectexplorer/projectwizardpage.ui b/src/plugins/projectexplorer/projectwizardpage.ui
index bc31f8c49e14461349c331e8397241300803197a..7c21ec5a91099229862a773163eec8784be9e8bf 100644
--- a/src/plugins/projectexplorer/projectwizardpage.ui
+++ b/src/plugins/projectexplorer/projectwizardpage.ui
@@ -104,8 +104,9 @@
         <widget class="QLabel" name="filesLabel">
          <property name="text">
           <string>The following files will be added:
-f1
-f2
+
+
+
 </string>
          </property>
          <property name="textInteractionFlags">
diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp
index 0e7dd7ece2ad88e1a746a037e4475c9c0bae0e66..9f65cc890d0da62b194421dfc481cdc4bac07c3d 100644
--- a/src/plugins/qt4projectmanager/profilereader.cpp
+++ b/src/plugins/qt4projectmanager/profilereader.cpp
@@ -61,14 +61,6 @@ void ProFileReader::setQtVersion(QtVersion *qtVersion) {
 bool ProFileReader::readProFile(const QString &fileName)
 {
     //disable caching -> list of include files is not updated otherwise
-//    ProFile *pro = proFileFromCache(fileName);
-//    if (!pro) {
-//        pro = new ProFile(fileName);
-//        if (!queryProFile(pro)) {
-//            delete pro;
-//            return false;
-//        }
-//    }
     QString fn = QFileInfo(fileName).filePath();
     ProFile *pro = new ProFile(fn);
     if (!queryProFile(pro)) {
@@ -82,9 +74,6 @@ bool ProFileReader::readProFile(const QString &fileName)
 
 ProFile *ProFileReader::parsedProFile(const QString &fileName)
 {
-//    ProFile *pro = proFileFromCache(fileName);
-//    if (pro)
-//        return pro;
     QString fn =  QFileInfo(fileName).filePath();
     ProFile *pro = ProFileEvaluator::parsedProFile(fn);
     if (pro) {
@@ -99,16 +88,6 @@ void ProFileReader::releaseParsedProFile(ProFile *)
     return;
 }
 
-ProFile *ProFileReader::proFileFromCache(const QString &fileName) const
-{
-
-    QString fn =  QFileInfo(fileName).filePath();
-    ProFile *pro = 0;
-    if (m_includeFiles.contains(fn))
-        pro = m_includeFiles.value(fn);
-    return pro;
-}
-
 QList<ProFile*> ProFileReader::includeFiles() const
 {
     QString qmakeMkSpecDir = propertyValue("QMAKE_MKSPECS");
@@ -196,3 +175,14 @@ void ProFileReader::errorMessage(const QString &message)
 {
     emit errorFound(message);
 }
+
+ProFile *ProFileReader::proFileFor(const QString &name)
+{
+    qDebug()<<"Asking for "<<name;
+    qDebug()<<"in "<<m_includeFiles.keys();
+    QMap<QString, ProFile *>::const_iterator it = m_includeFiles.constFind(name);
+    if (it == m_includeFiles.constEnd())
+        return 0;
+    else
+        return it.value();
+}
diff --git a/src/plugins/qt4projectmanager/profilereader.h b/src/plugins/qt4projectmanager/profilereader.h
index 46e1f60038651dcd7c1aa0fd5b1977e9712d1d41..ace88866041d144afb0ac215f24d485ab12a7200 100644
--- a/src/plugins/qt4projectmanager/profilereader.h
+++ b/src/plugins/qt4projectmanager/profilereader.h
@@ -63,7 +63,7 @@ public:
                                    const QString &baseDirectory,
                                    PathValuesMode mode,
                                    const ProFile *pro = 0) const;
-    ProFile *proFileFromCache(const QString &fileName) 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 8c4010aac5ea9603646b662d3faed8e80ddba377..73e3620f9bccfbf4e6f54111a9690692be3f07b5 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -79,35 +79,22 @@ namespace {
   Implements abstract ProjectNode class
   */
 
-Qt4PriFileNode::Qt4PriFileNode(Qt4Project *project,
-                               const QString &filePath)
+Qt4PriFileNode::Qt4PriFileNode(Qt4Project *project, Qt4ProFileNode* qt4ProFileNode, const QString &filePath)
         : ProjectNode(filePath),
-          m_core(project->qt4ProjectManager()->core()),
           m_project(project),
+          m_qt4ProFileNode(qt4ProFileNode),
           m_projectFilePath(QDir::fromNativeSeparators(filePath)),
-          m_projectDir(QFileInfo(filePath).absolutePath()),
-          m_includeFile(0),
-          m_saveTimer(new QTimer(this)),
-          m_reader(0)
+          m_projectDir(QFileInfo(filePath).absolutePath())
 {
     Q_ASSERT(project);
     setFolderName(QFileInfo(filePath).baseName());
     setIcon(QIcon(":/qt4projectmanager/images/qt_project.png"));
-
-    // m_saveTimer is used for the delayed saving of the pro file
-    // so that multiple insert/remove calls in one event loop run
-    // trigger just one save call.
-    m_saveTimer->setSingleShot(true);
-    connect(m_saveTimer, SIGNAL(timeout()), this, SLOT(save()));
 }
 
 void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader)
 {
     Q_ASSERT(includeFile);
     Q_ASSERT(reader);
-    m_reader = reader;
-
-    m_includeFile = includeFile;
 
     // add project file node
     if (m_fileNodes.isEmpty())
@@ -175,47 +162,42 @@ void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader)
 QList<ProjectNode::ProjectAction> Qt4PriFileNode::supportedActions() const
 {
     QList<ProjectAction> actions;
-    if (m_includeFile) {
-        const FolderNode *folderNode = this;
-        const Qt4ProFileNode *proFileNode;
-        while (!(proFileNode = qobject_cast<const Qt4ProFileNode*>(folderNode)))
-            folderNode = folderNode->parentFolderNode();
-        Q_ASSERT(proFileNode);
-
-        switch (proFileNode->projectType()) {
-        case ApplicationTemplate:
-        case LibraryTemplate:
-            actions << AddFile << RemoveFile;
-            break;
-        case SubDirsTemplate:
-            actions << AddSubProject << RemoveSubProject;
-            break;
-        default:
-            break;
-        }
+
+    const FolderNode *folderNode = this;
+    const Qt4ProFileNode *proFileNode;
+    while (!(proFileNode = qobject_cast<const Qt4ProFileNode*>(folderNode)))
+        folderNode = folderNode->parentFolderNode();
+    Q_ASSERT(proFileNode);
+
+    switch (proFileNode->projectType()) {
+    case ApplicationTemplate:
+    case LibraryTemplate:
+        actions << AddFile << RemoveFile;
+        break;
+    case SubDirsTemplate:
+        actions << AddSubProject << RemoveSubProject;
+        break;
+    default:
+        break;
     }
     return actions;
 }
 
 bool Qt4PriFileNode::addSubProjects(const QStringList &proFilePaths)
 {
-    if (!m_includeFile)
-        return false;
-    return changeIncludes(m_includeFile, proFilePaths, AddToProFile);
+    Q_UNUSED(proFilePaths);
+    return false; //changeIncludes(m_includeFile, proFilePaths, AddToProFile);
 }
 
 bool Qt4PriFileNode::removeSubProjects(const QStringList &proFilePaths)
 {
-    if (!m_includeFile)
-        return false;
-    return changeIncludes(m_includeFile, proFilePaths, RemoveFromProFile);
+    Q_UNUSED(proFilePaths);
+    return false; //changeIncludes(m_includeFile, proFilePaths, RemoveFromProFile);
 }
 
 bool Qt4PriFileNode::addFiles(const FileType fileType, const QStringList &filePaths,
                            QStringList *notAdded)
 {
-    if (!m_includeFile)
-        return false;
     QStringList failedFiles;
 
     changeFiles(fileType, filePaths, &failedFiles, AddToProFile);
@@ -227,8 +209,6 @@ bool Qt4PriFileNode::addFiles(const FileType fileType, const QStringList &filePa
 bool Qt4PriFileNode::removeFiles(const FileType fileType, const QStringList &filePaths,
                               QStringList *notRemoved)
 {
-    if (!m_includeFile)
-        return false;
     QStringList failedFiles;
     changeFiles(fileType, filePaths, &failedFiles, RemoveFromProFile);
     if (notRemoved)
@@ -239,7 +219,7 @@ bool Qt4PriFileNode::removeFiles(const FileType fileType, const QStringList &fil
 bool Qt4PriFileNode::renameFile(const FileType fileType, const QString &filePath,
                              const QString &newFilePath)
 {
-    if (!m_includeFile || newFilePath.isEmpty())
+    if (newFilePath.isEmpty())
         return false;
 
     if (!QFile::rename(filePath, newFilePath))
@@ -268,18 +248,19 @@ bool Qt4PriFileNode::changeIncludes(ProFile *includeFile, const QStringList &pro
 bool Qt4PriFileNode::priFileWritable(const QString &path)
 {
     const QString dir = QFileInfo(path).dir().path();
-    Core::IVersionControl *versionControl = m_core->vcsManager()->findVersionControlForDirectory(dir);
-    switch (Core::EditorManager::promptReadOnlyFile(path, versionControl, m_core->mainWindow(), false)) {
+    Core::ICore *core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
+    Core::IVersionControl *versionControl = core->vcsManager()->findVersionControlForDirectory(dir);
+    switch (Core::EditorManager::promptReadOnlyFile(path, versionControl, core->mainWindow(), false)) {
     case Core::EditorManager::RO_OpenVCS:
         if (!versionControl->vcsOpen(path)) {
-            QMessageBox::warning(m_core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with SCC."));
+            QMessageBox::warning(core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with SCC."));
             return false;
         }
         break;
     case Core::EditorManager::RO_MakeWriteable: {
         const bool permsOk = QFile::setPermissions(path, QFile::permissions(path) | QFile::WriteUser);
         if (!permsOk) {
-            QMessageBox::warning(m_core->mainWindow(), tr("Failed!"),  tr("Could not set permissions to writable."));
+            QMessageBox::warning(core->mainWindow(), tr("Failed!"),  tr("Could not set permissions to writable."));
             return false;
         }
         break;
@@ -296,11 +277,13 @@ bool Qt4PriFileNode::saveModifiedEditors(const QString &path)
     QList<Core::IFile*> allFileHandles;
     QList<Core::IFile*> modifiedFileHandles;
 
-    foreach (Core::IFile *file, m_core->fileManager()->managedFiles(path)) {
+    Core::ICore *core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
+
+    foreach (Core::IFile *file, core->fileManager()->managedFiles(path)) {
         allFileHandles << file;
     }
 
-    foreach (Core::IEditor *editor, m_core->editorManager()->editorsForFileName(path)) {
+    foreach (Core::IEditor *editor, core->editorManager()->editorsForFileName(path)) {
         if (Core::IFile *editorFile = editor->file()) {
             if (editorFile->isModified())
                 modifiedFileHandles << editorFile;
@@ -309,7 +292,7 @@ bool Qt4PriFileNode::saveModifiedEditors(const QString &path)
 
     if (!modifiedFileHandles.isEmpty()) {
         bool cancelled;
-        m_core->fileManager()->saveModifiedFiles(modifiedFileHandles, &cancelled,
+        core->fileManager()->saveModifiedFiles(modifiedFileHandles, &cancelled,
                                          tr("There are unsaved changes for project file %1.").arg(path));
         if (cancelled)
             return false;
@@ -330,6 +313,18 @@ void Qt4PriFileNode::changeFiles(const FileType fileType,
     if (filePaths.isEmpty())
         return;
 
+    ProFileReader *reader = m_qt4ProFileNode->createProFileReader();
+    if (!reader->readProFile(m_qt4ProFileNode->path())) {
+        m_project->proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath));
+        delete reader;
+        return;
+    }
+
+    ProFile *includeFile = reader->proFileFor(m_projectFilePath);
+    if(!includeFile) {
+        m_project->proFileParseError(tr("Error while changing pro file %1.").arg(m_projectFilePath));
+    }
+
     *notChanged = filePaths;
 
     // Check for modified editors
@@ -338,7 +333,7 @@ void Qt4PriFileNode::changeFiles(const FileType fileType,
 
     // Check if file is readonly
     ProEditorModel proModel;
-    proModel.setProFiles(QList<ProFile*>() << m_includeFile);
+    proModel.setProFiles(QList<ProFile*>() << includeFile);
 
     const QStringList vars = varNames(fileType);
     QDir priFileDir = QDir(m_projectDir);
@@ -413,26 +408,27 @@ void Qt4PriFileNode::changeFiles(const FileType fileType,
     }
 
     // save file
-    if (!m_saveTimer->isActive())
-        m_saveTimer->start();
+    save(includeFile);
+    delete reader;
 }
 
-void Qt4PriFileNode::save()
+void Qt4PriFileNode::save(ProFile *includeFile)
 {
-    Core::FileManager *fileManager = m_core->fileManager();
-    QList<Core::IFile *> allFileHandles = fileManager->managedFiles(m_includeFile->fileName());
+    Core::ICore *core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
+    Core::FileManager *fileManager = core->fileManager();
+    QList<Core::IFile *> allFileHandles = fileManager->managedFiles(includeFile->fileName());
     Core::IFile *modifiedFileHandle = 0;
     foreach(Core::IFile *file, allFileHandles)
-        if (file->fileName() == m_includeFile->fileName())
+        if (file->fileName() == includeFile->fileName())
             modifiedFileHandle = file;
 
     if (modifiedFileHandle)
         fileManager->blockFileChange(modifiedFileHandle);
     ProWriter pw;
-    const bool ok = pw.write(m_includeFile, m_includeFile->fileName());
+    const bool ok = pw.write(includeFile, includeFile->fileName());
     Q_UNUSED(ok)
-    m_includeFile->setModified(false);
-    m_project->qt4ProjectManager()->notifyChanged(m_includeFile->fileName());
+    includeFile->setModified(false);
+    m_project->qt4ProjectManager()->notifyChanged(includeFile->fileName());
     if (modifiedFileHandle)
         fileManager->unblockFileChange(modifiedFileHandle);
 
@@ -487,12 +483,11 @@ QStringList Qt4PriFileNode::varNames(FileType type)
 Qt4ProFileNode::Qt4ProFileNode(Qt4Project *project,
                                const QString &filePath,
                                QObject *parent)
-        : Qt4PriFileNode(project, filePath),
+        : Qt4PriFileNode(project, this, filePath),
           // own stuff
           m_projectType(InvalidProject),
           m_isQBuildProject(false),
-          m_dirWatcher(new DirectoryWatcher(this)),
-          m_reader(0)
+          m_dirWatcher(new DirectoryWatcher(this))
 {
     if (parent)
         setParent(parent);
@@ -507,7 +502,7 @@ Qt4ProFileNode::Qt4ProFileNode(Qt4Project *project,
 
 Qt4ProFileNode::~Qt4ProFileNode()
 {
-    delete m_reader;
+
 }
 
 bool Qt4ProFileNode::hasTargets() const
@@ -527,11 +522,10 @@ QStringList Qt4ProFileNode::variableValue(const Qt4Variable var) const
 
 void Qt4ProFileNode::update()
 {
-    delete m_reader;
-    m_reader = createProFileReader();
-    if (!m_reader->readProFile(m_projectFilePath)) {
+    ProFileReader *reader = createProFileReader();
+    if (!reader->readProFile(m_projectFilePath)) {
         m_project->proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath));
-        delete m_reader;
+        delete reader;
         invalidate();
         return;
     }
@@ -546,7 +540,7 @@ void Qt4ProFileNode::update()
 #endif
 
     Qt4ProjectType projectType = InvalidProject;
-    switch (m_reader->templateType()) {
+    switch (reader->templateType()) {
     case ProFileEvaluator::TT_Unknown:
     case ProFileEvaluator::TT_Application: {
         projectType = ApplicationTemplate;
@@ -585,11 +579,11 @@ void Qt4ProFileNode::update()
     ProFile *fileForCurrentProject = 0;
     {
         if (projectType == SubDirsTemplate) {
-            foreach (const QString &subDirProject, subDirsPaths(m_reader))
+            foreach (const QString &subDirProject, subDirsPaths(reader))
                 newProjectFiles << subDirProject;
         }
 
-        foreach (ProFile *includeFile, m_reader->includeFiles()) {
+        foreach (ProFile *includeFile, reader->includeFiles()) {
             if (includeFile->fileName() == m_projectFilePath) { // this file
                 fileForCurrentProject = includeFile;
             } else {
@@ -616,9 +610,9 @@ void Qt4ProFileNode::update()
         } else if ((*existingNodeIter)->path() > *newProjectFileIter) {
             if (ProFile *file = includeFiles.value(*newProjectFileIter)) {
                 Qt4PriFileNode *priFileNode
-                    = new Qt4PriFileNode(m_project,
+                    = new Qt4PriFileNode(m_project, this,
                                          *newProjectFileIter);
-                priFileNode->update(file, m_reader);
+                priFileNode->update(file, reader);
                 toAdd << priFileNode;
             } else {
                 toAdd << createSubProFileNode(*newProjectFileIter);
@@ -627,7 +621,7 @@ void Qt4ProFileNode::update()
         } else { // *existingNodeIter->path() == *newProjectFileIter
              if (ProFile *file = includeFiles.value(*newProjectFileIter)) {
                 Qt4PriFileNode *priFileNode = static_cast<Qt4PriFileNode*>(*existingNodeIter);
-                priFileNode->update(file, m_reader);
+                priFileNode->update(file, reader);
             }
 
             ++existingNodeIter;
@@ -641,9 +635,9 @@ void Qt4ProFileNode::update()
     while (newProjectFileIter != newProjectFiles.constEnd()) {
         if (ProFile *file = includeFiles.value(*newProjectFileIter)) {
             Qt4PriFileNode *priFileNode
-                    = new Qt4PriFileNode(m_project,
+                    = new Qt4PriFileNode(m_project, this,
                                          *newProjectFileIter);
-            priFileNode->update(file, m_reader);
+            priFileNode->update(file, reader);
             toAdd << priFileNode;
         } else {
             toAdd << createSubProFileNode(*newProjectFileIter);
@@ -656,15 +650,15 @@ void Qt4ProFileNode::update()
     if (!toAdd.isEmpty())
         addProjectNodes(toAdd);
 
-    Qt4PriFileNode::update(fileForCurrentProject, m_reader);
+    Qt4PriFileNode::update(fileForCurrentProject, reader);
 
     // update other variables
     QHash<Qt4Variable, QStringList> newVarValues;
-    newVarValues[CxxCompilerVar] << m_reader->value(QLatin1String("QMAKE_CXX"));
-    newVarValues[DefinesVar] = m_reader->values(QLatin1String("DEFINES"));
-    newVarValues[IncludePathVar] = includePaths(m_reader);
-    newVarValues[UiDirVar] = uiDirPaths(m_reader);
-    newVarValues[MocDirVar] = mocDirPaths(m_reader);
+    newVarValues[CxxCompilerVar] << reader->value(QLatin1String("QMAKE_CXX"));
+    newVarValues[DefinesVar] = reader->values(QLatin1String("DEFINES"));
+    newVarValues[IncludePathVar] = includePaths(reader);
+    newVarValues[UiDirVar] = uiDirPaths(reader);
+    newVarValues[MocDirVar] = mocDirPaths(reader);
 
     if (m_varValues != newVarValues) {
         m_varValues = newVarValues;
@@ -678,12 +672,14 @@ void Qt4ProFileNode::update()
     foreach (NodesWatcher *watcher, watchers())
         if (Qt4NodesWatcher *qt4Watcher = qobject_cast<Qt4NodesWatcher*>(watcher))
             emit qt4Watcher->proFileUpdated(this);
+
+    delete reader;
 }
 
 void Qt4ProFileNode::fileChanged(const QString &filePath)
 {
     CppTools::CppModelManagerInterface *modelManager =
-        m_core->pluginManager()->getObject<CppTools::CppModelManagerInterface>();
+        ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
 
     modelManager->updateSourceFiles(QStringList() << filePath);
 }
@@ -789,7 +785,7 @@ void Qt4ProFileNode::updateGeneratedFiles()
     }
 }
 
-ProFileReader *Qt4ProFileNode::createProFileReader() const
+ProFileReader *Qt4PriFileNode::createProFileReader() const
 {
     ProFileReader *reader = new ProFileReader();
     connect(reader, SIGNAL(errorFound(const QString &)),
@@ -801,7 +797,7 @@ ProFileReader *Qt4ProFileNode::createProFileReader() const
     }
 
     QHash<QString,QStringList> variables;
-    variables.insert(QLatin1String("OUT_PWD"), QStringList(buildDir()));
+    variables.insert(QLatin1String("OUT_PWD"), QStringList(m_qt4ProFileNode->buildDir()));
     reader->addVariables(variables);
 
     return reader;
@@ -916,7 +912,7 @@ QStringList Qt4ProFileNode::qBuildSubDirsPaths(const QString &scanDir) const
     return subProjectPaths;
 }
 
-QString Qt4ProFileNode::buildDir() const
+QString Qt4PriFileNode::buildDir() const
 {
     const QDir srcDirRoot = QFileInfo(m_project->rootProjectNode()->path()).absoluteDir();
     const QString relativeDir = srcDirRoot.relativeFilePath(m_projectDir);
@@ -951,11 +947,6 @@ void Qt4ProFileNode::invalidate()
 }
 
 
-ProFile *Qt4ProFileNode::proFileFromCache(const QString &fileName)
-{
-    return m_reader->proFileFromCache(fileName);
-}
-
 Qt4NodesWatcher::Qt4NodesWatcher(QObject *parent)
         : NodesWatcher(parent)
 {
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index f4d7c9bd17fba5de78eb3dcc2294a177d72784df..97bc06a08f4f264946d5f209c1a812ba5b6986f3 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -102,8 +102,7 @@ class Qt4PriFileNode : public ProjectExplorer::ProjectNode {
     Q_OBJECT
     Q_DISABLE_COPY(Qt4PriFileNode)
 public:
-    Qt4PriFileNode(Qt4Project *project,
-                   const QString &filePath);
+    Qt4PriFileNode(Qt4Project *project, Qt4ProFileNode* qt4ProFileNode, const QString &filePath);
 
     void update(ProFile *includeFile, ProFileReader *reader);
 
@@ -122,9 +121,6 @@ public:
     bool renameFile(const FileType fileType,
                     const QString &filePath, const QString &newFilePath);
 
-private slots:
-    void save();
-
 protected:
     void clear();
     static QStringList varNames(FileType type);
@@ -142,18 +138,20 @@ protected:
                      const QStringList &filePaths,
                      QStringList *notChanged,
                      ChangeType change);
-    
+
+    QString buildDir() const;
+    ProFileReader *createProFileReader() const;
+
 private:
+    void save(ProFile *includeFile);
     bool priFileWritable(const QString &path);
     bool saveModifiedEditors(const QString &path);
 
-    Core::ICore *m_core;
     Qt4Project *m_project;
+    Qt4ProFileNode *m_qt4ProFileNode;
     QString m_projectFilePath;
     QString m_projectDir;
-    ProFile *m_includeFile;
     QTimer *m_saveTimer;
-    ProFileReader *m_reader;
 
     // managed by Qt4ProFileNode
     friend class Qt4ProFileNode;
@@ -174,7 +172,6 @@ public:
     Qt4ProjectType projectType() const;
 
     QStringList variableValue(const Qt4Variable var) const;
-    ProFile *proFileFromCache(const QString &fileName);
 
 public slots:
     void update();
@@ -185,7 +182,6 @@ private slots:
 private:
     void updateGeneratedFiles();
 
-    ProFileReader *createProFileReader() const;
     Qt4ProFileNode *createSubProFileNode(const QString &path);
 
     QStringList uiDirPaths(ProFileReader *reader) const;
@@ -194,7 +190,7 @@ private:
     QStringList subDirsPaths(ProFileReader *reader) const;
     QStringList qBuildSubDirsPaths(const QString &scanDir)  const;
 
-    QString buildDir() const;
+
 
     void invalidate();
 
@@ -203,7 +199,6 @@ private:
     bool m_isQBuildProject;
 
     DirectoryWatcher *m_dirWatcher;
-    ProFileReader *m_reader;
 
     friend class Qt4NodeHierarchy;
 };
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index b07900f9103d8cb6bf7eb10cd8943cc3ddcb544a..501068af0045cff6a2954ebcde6520fcac27a7a5 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -179,12 +179,8 @@ Qt4ProjectFile::Qt4ProjectFile(Qt4Project *project, const QString &filePath, QOb
 
 bool Qt4ProjectFile::save(const QString &)
 {
-    ProFile *file = m_project->proFileFromCache(m_filePath);
-    ProWriter pw;
-    bool ok = pw.write(file, file->fileName());
-    file->setModified(false);
-    m_project->qt4ProjectManager()->notifyChanged(file->fileName());
-    return ok;
+    // This is never used
+    return false;
 }
 
 QString Qt4ProjectFile::fileName() const
@@ -209,7 +205,7 @@ QString Qt4ProjectFile::mimeType() const
 
 bool Qt4ProjectFile::isModified() const
 {
-    return m_project->proFileFromCache(m_filePath)->isModified();
+    return false; // we save after changing anyway
 }
 
 bool Qt4ProjectFile::isReadOnly() const
@@ -895,16 +891,24 @@ MakeStep *Qt4Project::makeStep() const
     return 0;
 }
 
-ProFile *Qt4Project::proFileFromCache(const QString &fileName)
+bool Qt4Project::hasSubNode(Qt4PriFileNode *root, const QString &path)
 {
-    return rootProjectNode()->proFileFromCache(fileName);
+    if (root->path() == path)
+        return true;
+    foreach (FolderNode *fn, root->subFolderNodes()) {
+        if (qobject_cast<Qt4ProFileNode *>(fn)) {
+            // we aren't interested in pro file nodes
+        } else if(Qt4PriFileNode *qt4prifilenode = qobject_cast<Qt4PriFileNode *>(fn)) {
+            if (hasSubNode(qt4prifilenode, path))
+                return true;
+        }
+    }
+    return false;
 }
 
 void Qt4Project::findProFile(const QString& fileName, Qt4ProFileNode *root, QList<Qt4ProFileNode *> &list)
 {
-    if (root->path() == fileName)
-        list.append(root);
-    else if (root->proFileFromCache(fileName))
+    if (hasSubNode(root, fileName))
         list.append(root);
 
     foreach (FolderNode *fn, root->subFolderNodes())
@@ -914,9 +918,10 @@ void Qt4Project::findProFile(const QString& fileName, Qt4ProFileNode *root, QLis
 
 void Qt4Project::notifyChanged(const QString &name)
 {
-    QList<Qt4ProFileNode *> list;
-    findProFile(name, rootProjectNode(), list);
-    foreach(Qt4ProFileNode *node, list)
-        node->update();
-
+    if (files(Qt4Project::ExcludeGeneratedFiles).contains(name)) {
+        QList<Qt4ProFileNode *> list;
+        findProFile(name, rootProjectNode(), list);
+        foreach(Qt4ProFileNode *node, list)
+            node->update();
+    }
 }
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index 18a7bf7f4f56ef88c14ed5af07abeae78976bc44..2a236a84c632bf33f2af3c1e3e35d24393fbd74b 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -180,7 +180,6 @@ public:
     QMakeStep *qmakeStep() const;
     MakeStep *makeStep() const;
 
-    ProFile *proFileFromCache(const QString &fileName);
     void notifyChanged(const QString &name);
 
 public slots:
@@ -209,6 +208,7 @@ protected:
 private:
     static void collectApplicationProFiles(QList<Internal::Qt4ProFileNode *> &list, Internal::Qt4ProFileNode *node);
     static void findProFile(const QString& fileName, Internal::Qt4ProFileNode *root, QList<Internal::Qt4ProFileNode *> &list);
+    static bool hasSubNode(Internal::Qt4PriFileNode *root, const QString &path);
 
     QList<Internal::Qt4ProFileNode *> m_applicationProFileChange;
     ProjectExplorer::ProjectExplorerPlugin *projectExplorer() const;
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 0c68fcd98eb508060e15960a640198fb59870e6c..012e05b858ad0faaa6ba42eb20766121aa89c978 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -963,7 +963,7 @@ void QtVersion::updateVersionInfo() const
                 QString line = stream.readLine();
                 int index = line.indexOf(":");
                 if (index != -1)
-                    m_versionInfo.insert(line.left(index), line.mid(index+1));
+                    m_versionInfo.insert(line.left(index), QDir::fromNativeSeparators(line.mid(index+1)));
             }
         }
 
@@ -1035,6 +1035,7 @@ void QtVersion::updateMkSpec() const
                         mkspec = mkspec.mid(QString("$$QT_BUILD_TREE/mkspecs/").length());
                     else if (mkspec.startsWith("$$QT_BUILD_TREE\\mkspecs\\"))
                         mkspec = mkspec.mid(QString("$$QT_BUILD_TREE\\mkspecs\\").length());
+                    mkspec = QDir::fromNativeSeparators(mkspec);
                 }
                 break;
             }
@@ -1097,10 +1098,11 @@ void QtVersion::updateMkSpec() const
 #endif
     }
 
-    int index =mkspec.lastIndexOf('/');
+    int index = mkspec.lastIndexOf('/');
     if(index == -1)
         index = mkspec.lastIndexOf('\\');
-    if (index >= 0 && QDir(mkspec.left(index)).canonicalPath() == QDir(m_path + "/mkspecs/").canonicalPath())
+    QString mkspecDir = QDir(m_path + "/mkspecs/").canonicalPath();
+    if (index >= 0 && QDir(mkspec.left(index)).canonicalPath() == mkspecDir)
         mkspec = mkspec.mid(index+1).trimmed();
 
     m_mkspec = mkspec;
@@ -1112,7 +1114,7 @@ QString QtVersion::makeCommand() const
 {
 #ifdef Q_OS_WIN
     const QString &spec = mkspec();
-    if (spec.startsWith("win32-msvc") || spec == QLatin1String("win32-icc"))
+    if (spec.contains("win32-msvc") || spec.contains(QLatin1String("win32-icc")))
         return "nmake.exe";
     else if(spec.startsWith("wince"))
         return "nmake.exe";
@@ -1149,7 +1151,7 @@ QtVersion::ToolchainType QtVersion::toolchainType() const
     if (!isValid())
         return INVALID;
     const QString &spec = mkspec();
-    if(spec.startsWith("win32-msvc") || spec == QLatin1String("win32-icc"))
+    if(spec.contains("win32-msvc") || spec.contains(QLatin1String("win32-icc")))
         return MSVC;
     else if(spec == "win32-g++")
         return MinGW;
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index ea9da5cb6bd4b29b263148005e686a67493d111c..49d29b75c93e5f8fe030fb7e6d38de05808c8f8b 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -2477,6 +2477,9 @@ void BaseTextEditor::extraAreaMouseEvent(QMouseEvent *e)
 void BaseTextEditor::slotCursorPositionChanged()
 {
     QList<QTextEdit::ExtraSelection> extraSelections;
+    setExtraSelections(ParenthesesMatchingSelection, extraSelections); // clear
+    if (d->m_parenthesesMatchingEnabled)
+        d->m_parenthesesMatchingTimer->start(50);
 
     if (d->m_highlightCurrentLine) {
         QTextEdit::ExtraSelection sel;
@@ -2487,11 +2490,7 @@ void BaseTextEditor::slotCursorPositionChanged()
         extraSelections.append(sel);
     }
 
-    if (d->m_parenthesesMatchingEnabled)
-        d->m_parenthesesMatchingTimer->start(50);
-
-    d->m_extraSelections = extraSelections;
-    setExtraSelections(d->m_extraSelections + d->m_extraExtraSelections);
+    setExtraSelections(CurrentLineSelection, extraSelections);
 }
 
 QTextBlock TextBlockUserData::testCollapse(const QTextBlock& block)
@@ -3133,7 +3132,7 @@ void BaseTextEditor::_q_matchParentheses()
     if (backwardMatchType == TextBlockUserData::NoMatch && forwardMatchType == TextBlockUserData::NoMatch)
         return;
 
-    QList<QTextEdit::ExtraSelection> extraSelections = d->m_extraSelections;
+    QList<QTextEdit::ExtraSelection> extraSelections;
 
     if (backwardMatch.hasSelection()) {
         QTextEdit::ExtraSelection sel;
@@ -3186,8 +3185,7 @@ void BaseTextEditor::_q_matchParentheses()
         }
         extraSelections.append(sel);
     }
-    d->m_extraSelections = extraSelections;
-    setExtraSelections(d->m_extraSelections + d->m_extraExtraSelections);
+    setExtraSelections(ParenthesesMatchingSelection, extraSelections);
 }
 
 void BaseTextEditor::setActionHack(QObject *hack)
@@ -3234,15 +3232,21 @@ void BaseTextEditor::deleteLine()
     cut();
 }
 
-void BaseTextEditor::setExtraExtraSelections(const QList<QTextEdit::ExtraSelection> &selections)
+void BaseTextEditor::setExtraSelections(ExtraSelectionKind kind, const QList<QTextEdit::ExtraSelection> &selections)
 {
-    d->m_extraExtraSelections = selections;
-    setExtraSelections(d->m_extraSelections + d->m_extraExtraSelections);
+    if (selections.isEmpty() && d->m_extraSelections[kind].isEmpty())
+        return;
+    d->m_extraSelections[kind] = selections;
+
+    QList<QTextEdit::ExtraSelection> all;
+    for (int i = 0; i < NExtraSelectionKinds; ++i)
+        all += d->m_extraSelections[i];
+    QPlainTextEdit::setExtraSelections(all);
 }
 
-QList<QTextEdit::ExtraSelection> BaseTextEditor::extraExtraSelections() const
+QList<QTextEdit::ExtraSelection> BaseTextEditor::extraSelections(ExtraSelectionKind kind) const
 {
-    return d->m_extraExtraSelections;
+    return d->m_extraSelections[kind];
 }
 
 
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index 714b1a507c8a2d6e632ead1e3f38045b1d03e108..40454a9c7d430dc6b188567843a7e13323f98f88 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -369,7 +369,6 @@ private:
     Internal::BaseTextEditorPrivate *d;
     friend class Internal::BaseTextEditorPrivate;
 
-
 public:
     QWidget *extraArea() const;
     virtual int extraAreaWidth(int *markWidthPtr = 0) const;
@@ -385,8 +384,16 @@ public:
 
     void ensureCursorVisible();
 
-    void setExtraExtraSelections(const QList<QTextEdit::ExtraSelection> &selections);
-    QList<QTextEdit::ExtraSelection> extraExtraSelections() const;
+    enum ExtraSelectionKind {
+        CurrentLineSelection,
+        ParenthesesMatchingSelection,
+        CodeWarningsSelection,
+        CodeSemanticsSelection,
+        OtherSelection,
+        NExtraSelectionKinds
+    };
+    void setExtraSelections(ExtraSelectionKind kind, const QList<QTextEdit::ExtraSelection> &selections);
+    QList<QTextEdit::ExtraSelection> extraSelections(ExtraSelectionKind kind) const;
 
     struct BlockRange {
         BlockRange():first(0), last(-1){}
diff --git a/src/plugins/texteditor/basetexteditor_p.h b/src/plugins/texteditor/basetexteditor_p.h
index 56b1071e1c65ae8e3a30d5d209cd0d0740d2d637..9f1e5a7eb67b633e56e67268da701357f64327f0 100644
--- a/src/plugins/texteditor/basetexteditor_p.h
+++ b/src/plugins/texteditor/basetexteditor_p.h
@@ -204,8 +204,7 @@ public:
 
     QObject *m_actionHack;
 
-    QList<QTextEdit::ExtraSelection> m_extraSelections;
-    QList<QTextEdit::ExtraSelection> m_extraExtraSelections;
+    QList<QTextEdit::ExtraSelection> m_extraSelections[BaseTextEditor::NExtraSelectionKinds];
 
     // block selection mode
     bool m_inBlockSelectionMode;
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index dcfe55d195b82650428ce434fef6ab836aee909b..eb65457c1090bacf713cae9b51b5eaf598b8f5fa 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -225,23 +225,12 @@ void VCSBaseEditor::mouseMoveEvent(QMouseEvent *e)
             sel.format.setFontUnderline(true);
             change = changeUnderCursor(cursor);
             sel.format.setProperty(QTextFormat::UserProperty, change);
-            bool found = false;
-            foreach (QTextEdit::ExtraSelection es, extraSelections()) {
-                if (es.format.stringProperty(QTextFormat::UserProperty) == sel.format.stringProperty(QTextFormat::UserProperty)) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                setExtraSelections(QList<QTextEdit::ExtraSelection>() << sel);
-                viewport()->setCursor(Qt::PointingHandCursor);
-            }
-        } else {
-            if (!extraSelections().isEmpty()) {
-                setExtraSelections(QList<QTextEdit::ExtraSelection>());
-                viewport()->setCursor(Qt::IBeamCursor);
-            }
+            setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>() << sel);
+            viewport()->setCursor(Qt::PointingHandCursor);
         }
+    } else {
+        setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>());
+        viewport()->setCursor(Qt::IBeamCursor);
     }
     TextEditor::BaseTextEditor::mouseMoveEvent(e);
 }