diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h
index 8515dcff780b106cc646feb8b60e722c5244a0c2..235dcd8cd5524bbdd66a50ea6101c45d21454df4 100644
--- a/src/plugins/coreplugin/coreconstants.h
+++ b/src/plugins/coreplugin/coreconstants.h
@@ -130,6 +130,7 @@ const char * const SAVEASDEFAULT         = "QtCreator.SaveAsDefaultLayout";
 const char * const RESTOREDEFAULT        = "QtCreator.RestoreDefaultLayout";
 const char * const CLOSE                 = "QtCreator.Close";
 const char * const CLOSEALL              = "QtCreator.CloseAll";
+const char * const CLOSEOTHERS           = "QtCreator.CloseOthers";
 const char * const GOTONEXT              = "QtCreator.GotoNext";
 const char * const GOTOPREV              = "QtCreator.GotoPrevious";
 const char * const GOTONEXTINHISTORY     = "QtCreator.GotoNextInHistory";
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index f084f20080e71157f61404d941b918ea4c79266e..3eb7503ac8aed9dbf788b25c91a15524d8173dad 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -149,6 +149,7 @@ struct EditorManagerPrivate {
     QAction *m_saveAsAction;
     QAction *m_closeCurrentEditorAction;
     QAction *m_closeAllEditorsAction;
+    QAction *m_closeOtherEditorsAction;
     QAction *m_gotoNextDocHistoryAction;
     QAction *m_gotoPreviousDocHistoryAction;
     QAction *m_goBackAction;
@@ -187,6 +188,7 @@ EditorManagerPrivate::EditorManagerPrivate(ICore *core, QWidget *parent) :
     m_saveAsAction(new QAction(parent)),
     m_closeCurrentEditorAction(new QAction(EditorManager::tr("Close"), parent)),
     m_closeAllEditorsAction(new QAction(EditorManager::tr("Close All"), parent)),
+    m_closeOtherEditorsAction(new QAction(EditorManager::tr("Close Others"), parent)),
     m_gotoNextDocHistoryAction(new QAction(EditorManager::tr("Next Document in History"), parent)),
     m_gotoPreviousDocHistoryAction(new QAction(EditorManager::tr("Previous Document in History"), parent)),
     m_goBackAction(new QAction(EditorManager::tr("Go back"), parent)),
@@ -292,6 +294,12 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) :
     mfile->addAction(cmd, Constants::G_FILE_CLOSE);
     connect(m_d->m_closeAllEditorsAction, SIGNAL(triggered()), this, SLOT(closeAllEditors()));
 
+    //Close All Others Action
+    cmd = am->registerAction(m_d->m_closeOtherEditorsAction, Constants::CLOSEOTHERS, editManagerContext);
+    mfile->addAction(cmd, Constants::G_FILE_CLOSE);
+    cmd->setAttribute(Core::Command::CA_UpdateText);
+    connect(m_d->m_closeOtherEditorsAction, SIGNAL(triggered()), this, SLOT(closeOtherEditors()));
+
     // Goto Previous In History Action
     cmd = am->registerAction(m_d->m_gotoPreviousDocHistoryAction, Constants::GOTOPREVINHISTORY, editManagerContext);
 #ifdef Q_WS_MAC
@@ -648,6 +656,16 @@ bool EditorManager::closeAllEditors(bool askAboutModifiedEditors)
     return closeEditors(openedEditors(), askAboutModifiedEditors);
 }
 
+void EditorManager::closeOtherEditors()
+{
+    IEditor *current = currentEditor();
+    QTC_ASSERT(current, return);
+    m_d->m_editorModel->removeAllRestoredEditors();
+    QList<IEditor*> editors = openedEditors();
+    editors.removeAll(current);
+    closeEditors(editors, true);
+}
+
 bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askAboutModifiedEditors)
 {
     if (editorsToClose.isEmpty())
@@ -1331,7 +1349,7 @@ void EditorManager::updateActions()
 {
     QString fName;
     IEditor *curEditor = currentEditor();
-    int openedCount = openedEditors().count();
+    int openedCount = openedEditors().count() + m_d->m_editorModel->restoredEditorCount();
     if (curEditor) {
         if (!curEditor->file()->fileName().isEmpty()) {
             QFileInfo fi(curEditor->file()->fileName());
@@ -1367,6 +1385,8 @@ void EditorManager::updateActions()
     m_d->m_closeCurrentEditorAction->setEnabled(curEditor != 0);
     m_d->m_closeCurrentEditorAction->setText(tr("Close %1").arg(quotedName));
     m_d->m_closeAllEditorsAction->setEnabled(openedCount > 0);
+    m_d->m_closeOtherEditorsAction->setEnabled(openedCount > 1);
+    m_d->m_closeOtherEditorsAction->setText((openedCount > 1 ? tr("Close All Except %1").arg(quotedName) : tr("Close Others")));
 
     m_d->m_gotoNextDocHistoryAction->setEnabled(m_d->m_editorHistory.count() > 0);
     m_d->m_gotoPreviousDocHistoryAction->setEnabled(m_d->m_editorHistory.count() > 0);
diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h
index 81a1025a4eef5b9763b165a0dcc0ab7673d38360..18290b6ef516809519fff393b944c2bfcd019d6c 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.h
+++ b/src/plugins/coreplugin/editormanager/editormanager.h
@@ -198,6 +198,7 @@ private slots:
     bool saveFile(Core::IEditor *editor = 0);
     bool saveFileAs(Core::IEditor *editor = 0);
     void closeEditor();
+    void closeOtherEditors();
 
     void gotoNextDocHistory();
     void gotoPreviousDocHistory();
diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp
index b9838a8b59585a4f11e2103973b7f83439b8acc6..e61f0fa890133abc6e4f1b875d635876812c8855 100644
--- a/src/plugins/coreplugin/editormanager/editorview.cpp
+++ b/src/plugins/coreplugin/editormanager/editorview.cpp
@@ -205,6 +205,17 @@ void EditorModel::removeAllRestoredEditors()
     }
 }
 
+int EditorModel::restoredEditorCount() const
+{
+    int count = 0;
+    for (int i = m_editors.count()-1; i >= 0; --i) {
+        if (!m_editors.at(i).editor) {
+            ++count;
+        }
+    }
+    return count;
+}
+
 bool EditorModel::isDuplicate(IEditor *editor) const
 {
     return m_duplicateEditors.contains(editor);
diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h
index b62645baaaf45f67889b9aa2f6729d1cfbac18a0..4c0da55ac3f6fdda99229e3a66a3d88a5bccddac 100644
--- a/src/plugins/coreplugin/editormanager/editorview.h
+++ b/src/plugins/coreplugin/editormanager/editorview.h
@@ -89,6 +89,7 @@ public:
     void removeEditor(const QModelIndex &index);
 
     void removeAllRestoredEditors();
+    int restoredEditorCount() const;
     void emitDataChanged(IEditor *editor);
 
     QList<IEditor *> editors() const;
diff --git a/src/plugins/cppeditor/cppeditor.pro b/src/plugins/cppeditor/cppeditor.pro
index 2fbf3b46e489184f8ea506c52eccbc3f84406215..64ee6631957b7fad38bde663305a48c8962e74f1 100644
--- a/src/plugins/cppeditor/cppeditor.pro
+++ b/src/plugins/cppeditor/cppeditor.pro
@@ -23,4 +23,4 @@ SOURCES += cppplugin.cpp \
     cppclasswizard.cpp
 RESOURCES += cppeditor.qrc
 
-OTHER_FILES += CppEditor.pluginspec
+OTHER_FILES += CppEditor.pluginspec CppEditor.mimetypes.xml
diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h
index 73002aaface593425ddebcf70d1dd8cd71f891f7..7528ddc79e482311dff112080495c13ee3dec529 100644
--- a/src/plugins/cpptools/cpptoolsconstants.h
+++ b/src/plugins/cpptools/cpptoolsconstants.h
@@ -41,6 +41,7 @@ const char * const TASK_INDEX               = "CppTools.Task.Index";
 const char * const C_SOURCE_MIMETYPE = "text/x-csrc";
 const char * const C_HEADER_MIMETYPE = "text/x-chdr";
 const char * const CPP_SOURCE_MIMETYPE = "text/x-c++src";
+const char * const OBJECTIVE_CPP_SOURCE_MIMETYPE = "text/x-objcsrc";
 const char * const CPP_HEADER_MIMETYPE = "text/x-c++hdr";
 
 // QSettings keys for use by the "New Class" wizards.
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index cdfda4c24bd8d2d5fcb584ac542b2d4baf9172dc..4aa16e9e23baafd4ada51a1bb5cd25359f53bd54 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -185,6 +185,7 @@ enum FileType {
     HeaderFile,
     C_SourceFile,
     CPP_SourceFile,
+    ObjectiveCPP_SourceFile,
     UnknownType
 };
 
@@ -198,6 +199,8 @@ static inline FileType fileType(const Core::MimeDatabase *mimeDatase, const  QFi
         return C_SourceFile;
     if (typeName == QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE))
         return CPP_SourceFile;
+    if (typeName == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE))
+        return ObjectiveCPP_SourceFile;
     if (typeName == QLatin1String(CppTools::Constants::C_HEADER_MIMETYPE)
         || typeName == QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE))
         return HeaderFile;
@@ -212,11 +215,13 @@ static QStringList matchingCandidateSuffixes(const Core::MimeDatabase *mimeDatas
     case UnknownType:
         break;
     case HeaderFile: // Note that C/C++ headers are undistinguishable
-        return mimeDatase->findByType(QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE)).suffixes() +
-               mimeDatase->findByType(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE)).suffixes();
+        return mimeDatase->findByType(QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE)).suffixes()
+               + mimeDatase->findByType(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE)).suffixes()
+               + mimeDatase->findByType(QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)).suffixes();
     case C_SourceFile:
         return mimeDatase->findByType(QLatin1String(CppTools::Constants::C_HEADER_MIMETYPE)).suffixes();
     case CPP_SourceFile:
+    case ObjectiveCPP_SourceFile:
         return mimeDatase->findByType(QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE)).suffixes();
     }
     return QStringList();
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 52eb88e9164caa64e43137c32da799c05d7d53b1..6c61fe38e47df2ef8ab84143bc7d41ae6e7e7363 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -698,8 +698,10 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
     } else if (m_submode == ReplaceSubMode) {
         m_submode = NoSubMode;
     } else if (m_submode == IndentSubMode) {
+        recordJump();
         indentRegion();
         m_submode = NoSubMode;
+        updateMiniBuffer();
     } else if (m_submode == ShiftRightSubMode) {
         recordJump();
         shiftRegionRight(1);
@@ -908,7 +910,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         setAnchor();
         moveDown(count() - 1);
         m_moveType = MoveLineWise;
-        setDotCommand("%1>>", count());
+        setDotCommand("%1==", count());
         finishMovement();
     } else if (m_submode == ZSubMode) {
         //qDebug() << "Z_MODE " << cursorLineInDocument() << linesOnScreen();
@@ -2057,8 +2059,13 @@ void FakeVimHandler::Private::indentRegion(QChar typedChar)
     int endLine = lineForPosition(position());
     if (beginLine > endLine)
         qSwap(beginLine, endLine);
+
     int amount = 0;
     emit q->indentRegion(&amount, beginLine, endLine, typedChar);
+
+    setPosition(firstPositionInLine(beginLine));
+    moveToFirstNonBlankOnLine();
+    setTargetColumn();
     setDotCommand("%1==", endLine - beginLine + 1);
 }
 
@@ -2072,8 +2079,6 @@ void FakeVimHandler::Private::shiftRegionRight(int repeat)
     QString indent(len, ' ');
     int firstPos = firstPositionInLine(beginLine);
 
-    //setPosition(firstPos);
-
     for (int line = beginLine; line <= endLine; ++line) {
         setPosition(firstPositionInLine(line));
         m_tc.insertText(indent);
@@ -2081,6 +2086,7 @@ void FakeVimHandler::Private::shiftRegionRight(int repeat)
 
     setPosition(firstPos);
     moveToFirstNonBlankOnLine();
+    setTargetColumn();
     setDotCommand("%1>>", endLine - beginLine + 1);
 }
 
@@ -2094,8 +2100,6 @@ void FakeVimHandler::Private::shiftRegionLeft(int repeat)
     int tab = config(ConfigTabStop).toInt();
     int firstPos = firstPositionInLine(beginLine);
 
-    //setPosition(firstPos);
-
     for (int line = beginLine; line <= endLine; ++line) {
         int pos = firstPositionInLine(line);
         setPosition(pos);
@@ -2118,6 +2122,7 @@ void FakeVimHandler::Private::shiftRegionLeft(int repeat)
 
     setPosition(firstPos);
     moveToFirstNonBlankOnLine();
+    setTargetColumn();
     setDotCommand("%1<<", endLine - beginLine + 1);
 }
 
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 0d990a02e3478f09aa18cdc44f822600df9e85b5..459f8114acffba566e841da0c17031f4564e3da7 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -505,3 +505,18 @@ void Project::setDisplayNameFor(const QString &buildConfiguration, const QString
     }
     emit buildConfigurationDisplayNameChanged(buildConfiguration);
 }
+
+QByteArray Project::predefinedMacros(const QString &fileName) const
+{
+    return QByteArray();
+}
+
+QStringList Project::includePaths(const QString &fileName) const
+{
+    return QStringList();
+}
+
+QStringList Project::frameworkPaths(const QString &fileName) const
+{
+    return QStringList();
+}
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index b4be7fa0c1c4257dec55281cf0197f916c358448..e876db675574e6750bbf73cc4cd6e62b96a51783 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -136,6 +136,12 @@ public:
     enum FilesMode { AllFiles, ExcludeGeneratedFiles };
     virtual QStringList files(FilesMode fileMode) const = 0;
 
+    // C++ specific
+    // TODO do a C++ project as a base ?
+    virtual QByteArray predefinedMacros(const QString &fileName) const;
+    virtual QStringList includePaths(const QString &fileName) const;
+    virtual QStringList frameworkPaths(const QString &fileName) const;
+
 signals:
     void fileListChanged();
     void activeBuildConfigurationChanged();
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 0f08672ebe19d4c644951f80392336d05b184b68..87a75f31bf3632fb2930afbbe176bb5e02d11024 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -46,7 +46,6 @@
 #include <coreplugin/icore.h>
 #include <coreplugin/messagemanager.h>
 #include <coreplugin/coreconstants.h>
-#include <cpptools/cppmodelmanagerinterface.h>
 #include <extensionsystem/pluginmanager.h>
 #include <projectexplorer/nodesvisitor.h>
 #include <projectexplorer/project.h>
@@ -308,7 +307,7 @@ void Qt4Project::restoreSettingsImpl(PersistentSettingsReader &settingsReader)
     connect(m_nodesWatcher, SIGNAL(filesAdded()), this, SLOT(updateFileList()));
     connect(m_nodesWatcher, SIGNAL(filesRemoved()), this, SLOT(updateFileList()));
     connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *)),
-            this, SLOT(scheduleUpdateCodeModel()));
+            this, SLOT(scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *)));
 
     update();
 
@@ -398,9 +397,10 @@ void Qt4Project::addUiFiles()
     m_uiFilesToAdd.clear();
 }
 
-void Qt4Project::scheduleUpdateCodeModel()
+void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *pro)
 {
     m_updateCodeModelTimer.start();
+    m_proFilesForCodeModelUpdate.append(pro);
 }
 
 QString Qt4Project::makeCommand(const QString &buildConfiguration) const
@@ -469,15 +469,11 @@ void Qt4Project::updateCodeModel()
     if (!modelmanager)
         return;
 
-    QStringList allIncludePaths;
-    QStringList allFrameworkPaths;
-
-    const QHash<QString, QString> versionInfo = qtVersion(activeBuildConfiguration())->versionInfo();
-    const QString newQtIncludePath = versionInfo.value(QLatin1String("QT_INSTALL_HEADERS"));
-    const QString newQtLibsPath = versionInfo.value(QLatin1String("QT_INSTALL_LIBS"));
+    QStringList predefinedIncludePaths;
+    QStringList predefinedFrameworkPaths;
+    QByteArray predefinedMacros;
 
     ToolChain *tc = toolChain(activeBuildConfiguration());
-    QByteArray predefinedMacros;
     QList<HeaderPath> allHeaderPaths;
     if (tc) {
         predefinedMacros = tc->predefinedMacros();
@@ -491,17 +487,21 @@ void Qt4Project::updateCodeModel()
     }
     foreach (HeaderPath headerPath, allHeaderPaths) {
         if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
-            allFrameworkPaths.append(headerPath.path());
+            predefinedFrameworkPaths.append(headerPath.path());
         else
-            allIncludePaths.append(headerPath.path());
+            predefinedIncludePaths.append(headerPath.path());
     }
 
-    allIncludePaths.append(newQtIncludePath);
+    const QHash<QString, QString> versionInfo = qtVersion(activeBuildConfiguration())->versionInfo();
+    const QString newQtIncludePath = versionInfo.value(QLatin1String("QT_INSTALL_HEADERS"));
+    const QString newQtLibsPath = versionInfo.value(QLatin1String("QT_INSTALL_LIBS"));
+
+    predefinedIncludePaths.append(newQtIncludePath);
     QDir dir(newQtIncludePath);
     foreach (QFileInfo info, dir.entryInfoList(QDir::Dirs)) {
         if (! info.fileName().startsWith(QLatin1String("Qt")))
             continue;
-        allIncludePaths.append(info.absoluteFilePath());
+        predefinedIncludePaths.append(info.absoluteFilePath());
     }
 
 #ifdef Q_OS_MAC
@@ -517,15 +517,26 @@ void Qt4Project::updateCodeModel()
 
     FindQt4ProFiles findQt4ProFiles;
     QList<Qt4ProFileNode *> proFiles = findQt4ProFiles(rootProjectNode());
-    QByteArray definedMacros;
+    QByteArray definedMacros = predefinedMacros;
+    QStringList allIncludePaths = predefinedIncludePaths;
+    QStringList allFrameworkPaths = predefinedFrameworkPaths;
 
     foreach (Qt4ProFileNode *pro, proFiles) {
+        Internal::CodeModelInfo info;
+        info.defines = predefinedMacros;
+        info.includes = predefinedIncludePaths;
+        info.frameworkPaths = predefinedFrameworkPaths;
+
+        // Add custom defines
         foreach (const QString def, pro->variableValue(DefinesVar)) {
             definedMacros += "#define ";
+            info.defines += "#define ";
             const int index = def.indexOf(QLatin1Char('='));
             if (index == -1) {
                 definedMacros += def.toLatin1();
                 definedMacros += " 1\n";
+                info.defines += def.toLatin1();
+                info.defines += " 1\n";
             } else {
                 const QString name = def.left(index);
                 const QString value = def.mid(index + 1);
@@ -533,21 +544,48 @@ void Qt4Project::updateCodeModel()
                 definedMacros += ' ';
                 definedMacros += value.toLocal8Bit();
                 definedMacros += '\n';
+                info.defines += name.toLatin1();
+                info.defines += ' ';
+                info.defines += value.toLocal8Bit();
+                info.defines += '\n';
             }
         }
 
         const QStringList proIncludePaths = pro->variableValue(IncludePathVar);
         foreach (QString includePath, proIncludePaths) {
-            if (allIncludePaths.contains(includePath))
-                continue;
+            if (!allIncludePaths.contains(includePath))
+                allIncludePaths.append(includePath);
+            if (!info.includes.contains(includePath))
+                info.includes.append(includePath);
+        }
 
-            allIncludePaths.append(includePath);
+        // Add mkspec directory
+        info.includes.append(qtVersion(activeBuildConfiguration())->mkspecPath());
+
+        info.frameworkPaths = allFrameworkPaths;
+
+        foreach (FileNode *fileNode, pro->fileNodes()) {
+            const QString path = fileNode->path();
+            const int type = fileNode->fileType();
+            if (type == HeaderType || type == SourceType) {
+                m_codeModelInfo.insert(path, info);
+            }
         }
     }
 
     // Add mkspec directory
     allIncludePaths.append(qtVersion(activeBuildConfiguration())->mkspecPath());
 
+    // Dump things out
+    // This is debugging output...
+//    qDebug()<<"CodeModel stuff:";
+//    QMap<QString, CodeModelInfo>::const_iterator it, end;
+//    end = m_codeModelInfo.constEnd();
+//    for(it = m_codeModelInfo.constBegin(); it != end; ++it) {
+//        qDebug()<<"File: "<<it.key()<<"\nIncludes:"<<it.value().includes<<"\nDefines"<<it.value().defines<<"\n";
+//    }
+//    qDebug()<<"----------------------------";
+
     QStringList files;
     files += m_projectFiles->files[HeaderType];
     files += m_projectFiles->generatedFiles[HeaderType];
@@ -562,6 +600,13 @@ void Qt4Project::updateCodeModel()
             pinfo.sourceFiles == files) {
         modelmanager->updateProjectInfo(pinfo);
     } else {
+        if (pinfo.defines != predefinedMacros         ||
+            pinfo.includePaths != allIncludePaths     ||
+            pinfo.frameworkPaths != allFrameworkPaths) {
+            pinfo.sourceFiles.append(QLatin1String("<configuration>"));
+        }
+
+
         pinfo.defines = predefinedMacros;
         // pinfo->defines += definedMacros;   // ### FIXME: me
         pinfo.includePaths = allIncludePaths;
@@ -571,8 +616,41 @@ void Qt4Project::updateCodeModel()
         modelmanager->updateProjectInfo(pinfo);
         modelmanager->updateSourceFiles(pinfo.sourceFiles);
     }
+
+    // TODO use this information
+    // These are the pro files that were actually changed
+    // if the list is empty we are at the initial stage
+    // TODO check that this also works if pro files get added
+    // and removed
+    m_proFilesForCodeModelUpdate.clear();
+}
+
+QByteArray Qt4Project::predefinedMacros(const QString &fileName) const
+{
+    QMap<QString, CodeModelInfo>::const_iterator it = m_codeModelInfo.constFind(fileName);
+    if (it == m_codeModelInfo.constEnd())
+        return QByteArray();
+    else
+        return (*it).defines;
 }
 
+QStringList Qt4Project::includePaths(const QString &fileName) const
+{
+    QMap<QString, CodeModelInfo>::const_iterator it = m_codeModelInfo.constFind(fileName);
+    if (it == m_codeModelInfo.constEnd())
+        return QStringList();
+    else
+        return (*it).includes;
+}
+
+QStringList Qt4Project::frameworkPaths(const QString &fileName) const
+{
+    QMap<QString, CodeModelInfo>::const_iterator it = m_codeModelInfo.constFind(fileName);
+    if (it == m_codeModelInfo.constEnd())
+        return QStringList();
+    else
+        return (*it).frameworkPaths;
+}
 
 ///*!
 //  Updates complete project
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index fc1feac3f2970440d932110603ba7aee837bf5ef..7a8ae6d67a2b05744e18758bfa7f5c7b991c2f55 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -39,6 +39,7 @@
 #include <projectexplorer/applicationrunconfiguration.h>
 #include <projectexplorer/projectnodes.h>
 #include <projectexplorer/toolchain.h>
+#include <cpptools/cppmodelmanagerinterface.h>
 
 #include <QtCore/QObject>
 #include <QtCore/QList>
@@ -69,6 +70,14 @@ namespace Internal {
     class Qt4RunConfiguration;
     class GCCPreprocessor;
     struct Qt4ProjectFiles;
+
+    class CodeModelInfo
+    {
+    public:
+        QByteArray defines;
+        QStringList includes;
+        QStringList frameworkPaths;
+    };
 }
 
 class QMakeStep;
@@ -185,10 +194,14 @@ public:
     // the Qt4RunConfigurations will update as soon as asked
     void invalidateCachedTargetInformation();
 
+    virtual QByteArray predefinedMacros(const QString &fileName) const;
+    virtual QStringList includePaths(const QString &fileName) const;
+    virtual QStringList frameworkPaths(const QString &fileName) const;
+
 public slots:
     void update();
     void proFileParseError(const QString &errorMessage);
-    void scheduleUpdateCodeModel();
+    void scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *);
 
 private slots:
     void updateCodeModel();
@@ -242,6 +255,9 @@ private:
     QTimer m_updateCodeModelTimer;
     QTimer m_addUiFilesTimer;
     QStringList m_uiFilesToAdd;
+    QList<Qt4ProjectManager::Internal::Qt4ProFileNode *> m_proFilesForCodeModelUpdate;
+
+    QMap<QString, Internal::CodeModelInfo> m_codeModelInfo;
 
     friend class Qt4ProjectFile;
 };
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
index a76543e725373af7a8732332be7b89e51c93583b..e7a19f59311c1e2d5a3136901c861692461e98df 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
@@ -332,6 +332,13 @@ void Qt4RunConfiguration::updateTarget()
     //qDebug()<<"updateTarget";
     Qt4Project *pro = static_cast<Qt4Project *>(project());
     Qt4PriFileNode * priFileNode = static_cast<Qt4Project *>(project())->rootProjectNode()->findProFileFor(m_proFilePath);
+    if (!priFileNode) {
+        m_workingDir = QString::null;
+        m_executable = QString::null;
+        m_cachedTargetInformationValid = true;
+        emit effectiveTargetInformationChanged();
+        return;
+    }
     ProFileReader *reader = priFileNode->createProFileReader();
     reader->setCumulative(false);
     reader->setQtVersion(pro->qtVersion(pro->activeBuildConfiguration()));
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 35376bac9921c868b4db801a1d26e2be2d5eb4b4..12adff1b83337e3d4f53083c0550f9e30f76f0fd 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -76,10 +76,10 @@ uint qHash(const double & f)
 }
 
 
-class  Foo
+class Foo
 {
 public:
-    Foo(int i=0)
+    Foo(int i = 0)
         : a(i), b(2)
     {
         int s = 1;