diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 3a280416d9b881631dac42e8486f7a9834a1ec0d..45ad1f569a5f6d1f3a190fdb76d4ce19a78accfe 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -138,19 +138,9 @@ void Document::addIncludeFile(const QString &fileName)
     _includedFiles.append(fileName);
 }
 
-QByteArray Document::definedMacros() const
+void Document::appendMacro(const Macro &macro)
 {
-    return _definedMacros;
-}
-
-void Document::appendMacro(const QByteArray &macroName, const QByteArray &text)
-{
-    int index = macroName.indexOf('(');
-    if (index == -1)
-        _macroNames.insert(macroName);
-    else
-        _macroNames.insert(macroName.left(index));
-    _definedMacros += text;
+    _definedMacros.append(macro);
 }
 
 void Document::addMacroUse(unsigned offset, unsigned length)
@@ -251,11 +241,6 @@ void Document::stopSkippingBlocks(unsigned stop)
         _skippedBlocks.back() = Block(start, stop);
 }
 
-QSet<QByteArray> Document::macroNames() const
-{
-    return _macroNames;
-}
-
 bool Document::parse(ParseMode mode)
 {
     TranslationUnit::ParseMode m = TranslationUnit::ParseTranlationUnit;
diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index e952913a07b7d75e37648b7af0117e180845f4cb..d289c579e9c6fddc2d4c0a0fbd31247c47a77e01 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -36,6 +36,8 @@
 
 #include <CPlusPlusForwardDeclarations.h>
 
+#include "pp-macro.h"
+
 #include <QByteArray>
 #include <QList>
 #include <QSet>
@@ -45,6 +47,8 @@
 
 namespace CPlusPlus {
 
+class Macro;
+
 class CPLUSPLUS_EXPORT Document
 {
     Document(const Document &other);
@@ -63,10 +67,7 @@ public:
     QStringList includedFiles() const;
     void addIncludeFile(const QString &fileName);
 
-    QByteArray definedMacros() const;
-    QSet<QByteArray> macroNames() const;
-
-    void appendMacro(const QByteArray &macroName, const QByteArray &text);
+    void appendMacro(const Macro &macro);
 
     void addMacroUse(unsigned offset, unsigned length);
 
@@ -81,6 +82,9 @@ public:
     Scope *globalSymbols() const; // ### deprecate?
     Namespace *globalNamespace() const;
 
+    QList<Macro> definedMacros() const
+    { return _definedMacros; }
+
     Symbol *findSymbolAt(unsigned line, unsigned column) const;
 
     void setSource(const QByteArray &source);
@@ -191,8 +195,7 @@ private:
     TranslationUnit *_translationUnit;
     Namespace *_globalNamespace;
     QList<DiagnosticMessage> _diagnosticMessages;
-    QByteArray _definedMacros;
-    QSet<QByteArray> _macroNames;
+    QList<Macro> _definedMacros;
     QList<Block> _skippedBlocks;
     QList<Block> _macroUses;
 };
diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp
index 7dd669365fc3ec8bf3be89b6cf5e7c8ca8210759..487c9f8a46969d1c28b2b6c1fe84cb2020f7ce7c 100644
--- a/src/libs/cplusplus/TypeOfExpression.cpp
+++ b/src/libs/cplusplus/TypeOfExpression.cpp
@@ -48,6 +48,7 @@ TypeOfExpression::TypeOfExpression():
 void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &documents)
 {
     m_documents = documents;
+    m_lookupContext = LookupContext();
 }
 
 QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression,
diff --git a/src/libs/cplusplus/TypeOfExpression.h b/src/libs/cplusplus/TypeOfExpression.h
index ecdfac7b2907c1ea7563ed1ee3d54d36b95856de..cd7a23441fde133111e5f987951d0bcbb2bc51e2 100644
--- a/src/libs/cplusplus/TypeOfExpression.h
+++ b/src/libs/cplusplus/TypeOfExpression.h
@@ -54,6 +54,9 @@ public:
     /**
      * Sets the documents used to evaluate expressions. Should be set before
      * calling this functor.
+     *
+     * Also clears the lookup context, so can be used to make sure references
+     * to the documents previously used are removed.
      */
     void setDocuments(const QMap<QString, Document::Ptr> &documents);
 
diff --git a/src/libs/cplusplus/cplusplus.pro b/src/libs/cplusplus/cplusplus.pro
index 1a2b5326623927b3854057c33d3874e51fff012b..49d78fda8b36d4def16fdfab74c3158cace20339 100644
--- a/src/libs/cplusplus/cplusplus.pro
+++ b/src/libs/cplusplus/cplusplus.pro
@@ -21,7 +21,16 @@ HEADERS += \
     TypeOfExpression.h \
     TypePrettyPrinter.h \
     ResolveExpression.h \
-    LookupContext.h
+    LookupContext.h \
+    pp-cctype.h \
+    pp-engine.h \
+    pp-fwd.h \
+    pp-macro-expander.h \
+    pp-scanner.h \
+    pp-client.h \
+    pp-environment.h \
+    pp-internal.h \
+    pp-macro.h
 
 SOURCES += \
     SimpleLexer.cpp \
@@ -35,6 +44,9 @@ SOURCES += \
     TypeOfExpression.cpp \
     TypePrettyPrinter.cpp \
     ResolveExpression.cpp \
-    LookupContext.cpp
+    LookupContext.cpp \
+    pp-engine.cpp \
+    pp-environment.cpp \
+    pp-macro-expander.cpp
 
 RESOURCES += cplusplus.qrc
diff --git a/src/plugins/cpptools/rpp/pp-cctype.h b/src/libs/cplusplus/pp-cctype.h
similarity index 89%
rename from src/plugins/cpptools/rpp/pp-cctype.h
rename to src/libs/cplusplus/pp-cctype.h
index 62b44f0bf4c4bae72080f836c0074a7e4fe56620..b7558ae5050a1a717b2dc3d1fe72b9b8c92a59dd 100644
--- a/src/plugins/cpptools/rpp/pp-cctype.h
+++ b/src/libs/cplusplus/pp-cctype.h
@@ -53,22 +53,24 @@
 #ifndef PP_CCTYPE_H
 #define PP_CCTYPE_H
 
+#include <CPlusPlusForwardDeclarations.h>
+
 #include <cctype>
 
-namespace rpp {
+namespace CPlusPlus {
 
-inline bool pp_isalpha (int __ch)
+inline bool CPLUSPLUS_EXPORT pp_isalpha (int __ch)
 { return std::isalpha ((unsigned char) __ch) != 0; }
 
-inline bool pp_isalnum (int __ch)
+inline bool CPLUSPLUS_EXPORT pp_isalnum (int __ch)
 { return std::isalnum ((unsigned char) __ch) != 0; }
 
-inline bool pp_isdigit (int __ch)
+inline bool CPLUSPLUS_EXPORT pp_isdigit (int __ch)
 { return std::isdigit ((unsigned char) __ch) != 0; }
 
-inline bool pp_isspace (int __ch)
+inline bool CPLUSPLUS_EXPORT pp_isspace (int __ch)
 { return std::isspace ((unsigned char) __ch) != 0; }
 
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_CCTYPE_H
diff --git a/src/plugins/cpptools/rpp/pp-client.h b/src/libs/cplusplus/pp-client.h
similarity index 92%
rename from src/plugins/cpptools/rpp/pp-client.h
rename to src/libs/cplusplus/pp-client.h
index 974004a6ce50ec85aeb2df035d63c686df19b444..2fc781f22f559a60cea8595cc7ab1c3690649b55 100644
--- a/src/plugins/cpptools/rpp/pp-client.h
+++ b/src/libs/cplusplus/pp-client.h
@@ -34,15 +34,17 @@
 #ifndef PP_CLIENT_H
 #define PP_CLIENT_H
 
+#include <CPlusPlusForwardDeclarations.h>
+
 #include <QByteArray>
 #include <QString>
 #include <QFile>
 
-namespace rpp {
+namespace CPlusPlus {
 
 class Macro;
 
-class Client
+class CPLUSPLUS_EXPORT Client
 {
   Client(const Client &other);
   void operator=(const Client &other);
@@ -60,7 +62,7 @@ public:
   virtual ~Client()
   { }
 
-  virtual void macroAdded(const QByteArray &macroId, const QByteArray &text) = 0;
+  virtual void macroAdded(const Macro &macro) = 0;
   virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
 
   virtual void startExpandingMacro(unsigned offset,
@@ -74,6 +76,6 @@ public:
   virtual void stopSkippingBlocks(unsigned offset) = 0;
 };
 
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_CLIENT_H
diff --git a/src/plugins/cpptools/rpp/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
similarity index 98%
rename from src/plugins/cpptools/rpp/pp-engine.cpp
rename to src/libs/cplusplus/pp-engine.cpp
index 66e8957f355e5dc28c25c755b4d86e83d49f5a04..7bdc9b95d69106790cc8650b7abe7c4c632a426b 100644
--- a/src/plugins/cpptools/rpp/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -57,7 +57,6 @@
 #include <QtDebug>
 #include <algorithm>
 
-using namespace rpp;
 using namespace CPlusPlus;
 
 namespace {
@@ -907,16 +906,8 @@ void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken)
 
     env.bind(macro);
 
-    QByteArray macroText;
-    macroText.reserve(64);
-    macroText += "#define ";
-
-    macroText += macroId;
-    macroText += ' ';
-    macroText += macro.definition;
-    macroText += '\n';
-
-    client->macroAdded(macroId, macroText);
+    if (client)
+        client->macroAdded(macro);
 }
 
 void pp::processIf(TokenIterator firstToken, TokenIterator lastToken)
@@ -1020,13 +1011,10 @@ void pp::processUndef(TokenIterator firstToken, TokenIterator lastToken)
 
     if (tk->is(T_IDENTIFIER)) {
         const QByteArray macroName = tokenText(*tk);
-        env.remove(macroName);
+        const Macro *macro = env.remove(macroName);
 
-        QByteArray macroText;
-        macroText += "#undef ";
-        macroText += macroName;
-        macroText += '\n';
-        client->macroAdded(macroName, macroText);
+        if (client && macro)
+            client->macroAdded(*macro);
     }
 }
 
diff --git a/src/plugins/cpptools/rpp/pp-engine.h b/src/libs/cplusplus/pp-engine.h
similarity index 98%
rename from src/plugins/cpptools/rpp/pp-engine.h
rename to src/libs/cplusplus/pp-engine.h
index 13135f6a3102f45fab3fdbb5901c83fb1d75afc0..c909ffab3a72f7b26abf454c3f5c1b09f03af24c 100644
--- a/src/plugins/cpptools/rpp/pp-engine.h
+++ b/src/libs/cplusplus/pp-engine.h
@@ -62,7 +62,7 @@ namespace CPlusPlus {
     class Token;
 }
 
-namespace rpp {
+namespace CPlusPlus {
 
     struct Value
     {
@@ -134,7 +134,7 @@ namespace rpp {
 #undef PP_DEFINE_BIN_OP
     };
 
-    class pp
+    class CPLUSPLUS_EXPORT pp
     {
         Client *client;
         Environment &env;
@@ -200,7 +200,7 @@ namespace rpp {
 
         Value evalExpression(TokenIterator firstToken,
                              TokenIterator lastToken,
-			     const QByteArray &source) const;
+                             const QByteArray &source) const;
 
         QVector<CPlusPlus::Token> tokenize(const QByteArray &text) const;
 
@@ -226,6 +226,6 @@ namespace rpp {
         bool isQtReservedWord(const QByteArray &name) const;
     };
 
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_ENGINE_H
diff --git a/src/plugins/cpptools/rpp/pp-environment.cpp b/src/libs/cplusplus/pp-environment.cpp
similarity index 98%
rename from src/plugins/cpptools/rpp/pp-environment.cpp
rename to src/libs/cplusplus/pp-environment.cpp
index 85e432ae5b5ae49c70557cfd835b7db4eddc60d5..a1ade3b189a6b7a6e639aa0716ae5330c0f46bc9 100644
--- a/src/plugins/cpptools/rpp/pp-environment.cpp
+++ b/src/libs/cplusplus/pp-environment.cpp
@@ -54,7 +54,7 @@
 #include "pp.h"
 #include <cstring>
 
-using namespace rpp;
+using namespace CPlusPlus;
 
 Environment::Environment ()
     : currentLine(0),
@@ -115,12 +115,12 @@ Macro *Environment::bind(const Macro &__macro)
     return m;
 }
 
-void Environment::remove (const QByteArray &name)
+Macro *Environment::remove (const QByteArray &name)
 {
     Macro macro;
     macro.name = name;
     macro.hidden = true;
-    bind(macro);
+    return bind(macro);
 }
 
 bool Environment::isBuiltinMacro(const QByteArray &s) const
diff --git a/src/plugins/cpptools/rpp/pp-environment.h b/src/libs/cplusplus/pp-environment.h
similarity index 94%
rename from src/plugins/cpptools/rpp/pp-environment.h
rename to src/libs/cplusplus/pp-environment.h
index 5b97c492d799a07d79e20adbef1f74d937e63b73..e2a75d29b819f4990b649ac428e8bd928e30c83f 100644
--- a/src/plugins/cpptools/rpp/pp-environment.h
+++ b/src/libs/cplusplus/pp-environment.h
@@ -53,14 +53,16 @@
 #ifndef PP_ENVIRONMENT_H
 #define PP_ENVIRONMENT_H
 
+#include "CPlusPlusForwardDeclarations.h"
+
 #include <QVector>
 #include <QByteArray>
 
-namespace rpp {
+namespace CPlusPlus {
 
-struct Macro;
+class Macro;
 
-class Environment
+class CPLUSPLUS_EXPORT Environment
 {
 public:
     Environment();
@@ -70,7 +72,7 @@ public:
     Macro *macroAt(unsigned index) const;
 
     Macro *bind(const Macro &macro);
-    void remove(const QByteArray &name);
+    Macro *remove(const QByteArray &name);
 
     Macro *resolve(const QByteArray &name) const;
     bool isBuiltinMacro(const QByteArray &name) const;
@@ -104,6 +106,6 @@ private:
     int _hash_count;
 };
 
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_ENVIRONMENT_H
diff --git a/src/plugins/cpptools/rpp/pp-fwd.h b/src/libs/cplusplus/pp-fwd.h
similarity index 100%
rename from src/plugins/cpptools/rpp/pp-fwd.h
rename to src/libs/cplusplus/pp-fwd.h
diff --git a/src/plugins/cpptools/rpp/pp-internal.h b/src/libs/cplusplus/pp-internal.h
similarity index 98%
rename from src/plugins/cpptools/rpp/pp-internal.h
rename to src/libs/cplusplus/pp-internal.h
index 13bc7c17e84499f304976e46d94a7730605233b4..c11de37453a24fa960a123ecff8c749f76dfb43d 100644
--- a/src/plugins/cpptools/rpp/pp-internal.h
+++ b/src/libs/cplusplus/pp-internal.h
@@ -55,7 +55,7 @@
 
 #include <QByteArray>
 
-namespace rpp {
+namespace CPlusPlus {
 namespace _PP_internal {
 
 inline bool comment_p (const char *__first, const char *__last)
@@ -73,6 +73,6 @@ inline bool comment_p (const char *__first, const char *__last)
 }
 
 } // _PP_internal
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_INTERNAL_H
diff --git a/src/plugins/cpptools/rpp/pp-macro-expander.cpp b/src/libs/cplusplus/pp-macro-expander.cpp
similarity index 99%
rename from src/plugins/cpptools/rpp/pp-macro-expander.cpp
rename to src/libs/cplusplus/pp-macro-expander.cpp
index 6b569eb132feea2bbde069809ca9e293666be378..9ae9702fe18fa21dcd240b0f6c4d59ee21fbf5aa 100644
--- a/src/plugins/cpptools/rpp/pp-macro-expander.cpp
+++ b/src/libs/cplusplus/pp-macro-expander.cpp
@@ -35,7 +35,7 @@
 #include "pp-macro-expander.h"
 #include <QDateTime>
 
-using namespace rpp;
+using namespace CPlusPlus;
 
 MacroExpander::MacroExpander (Environment &env, pp_frame *frame)
     : env(env), frame(frame),
diff --git a/src/plugins/cpptools/rpp/pp-macro-expander.h b/src/libs/cplusplus/pp-macro-expander.h
similarity index 98%
rename from src/plugins/cpptools/rpp/pp-macro-expander.h
rename to src/libs/cplusplus/pp-macro-expander.h
index dd11540c33629ac3c391112188d7445a821b6288..c2f636c1385fba0606f17b73dad40c0549f61448 100644
--- a/src/plugins/cpptools/rpp/pp-macro-expander.h
+++ b/src/libs/cplusplus/pp-macro-expander.h
@@ -53,7 +53,7 @@
 #ifndef PP_MACRO_EXPANDER_H
 #define PP_MACRO_EXPANDER_H
 
-namespace rpp {
+namespace CPlusPlus {
 
     struct pp_frame
     {
@@ -97,7 +97,7 @@ namespace rpp {
         int generated_lines;
     };
 
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_MACRO_EXPANDER_H
 
diff --git a/src/plugins/cpptools/rpp/pp-macro.h b/src/libs/cplusplus/pp-macro.h
similarity index 82%
rename from src/plugins/cpptools/rpp/pp-macro.h
rename to src/libs/cplusplus/pp-macro.h
index a7bbe35e1d5995488ea78a0f9d86c0740271d040..494b7a4de7ff7df6a7567a88dd5367208848f921 100644
--- a/src/plugins/cpptools/rpp/pp-macro.h
+++ b/src/libs/cplusplus/pp-macro.h
@@ -53,43 +53,44 @@
 #ifndef PP_MACRO_H
 #define PP_MACRO_H
 
+#include <CPlusPlusForwardDeclarations.h>
+
 #include <QByteArray>
 #include <QVector>
 
-namespace rpp {
+namespace CPlusPlus {
+
+class CPLUSPLUS_EXPORT Macro
+{
+public:
+    QByteArray name;
+    QByteArray definition;
+    QVector<QByteArray> formals;
+    QByteArray fileName;
+    int line;
+    Macro *next;
+    unsigned hashcode;
 
-    struct Macro
+    union
     {
-        QByteArray name;
-        QByteArray definition;
-        QVector<QByteArray> formals;
-        QByteArray fileName;
-        int line;
-        int lines;
-        Macro *next;
-        unsigned hashcode;
+        unsigned state;
 
-        union
+        struct
         {
-            unsigned state;
-
-            struct
-            {
-                unsigned hidden: 1;
-                unsigned function_like: 1;
-                unsigned variadics: 1;
-            };
+            unsigned hidden: 1;
+            unsigned function_like: 1;
+            unsigned variadics: 1;
         };
+    };
 
-        inline Macro():
+    inline Macro():
             line(0),
-            lines(0),
             next(0),
             hashcode(0),
             state(0)
-        { }
-    };
+    { }
+};
 
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_MACRO_H
diff --git a/src/plugins/cpptools/rpp/pp-scanner.h b/src/libs/cplusplus/pp-scanner.h
similarity index 99%
rename from src/plugins/cpptools/rpp/pp-scanner.h
rename to src/libs/cplusplus/pp-scanner.h
index 53fea70b52fd7fbaf4dd5219e0d610ec1ed0ffec..85b65403b0bdf750252d877029bc56ffce51bf7e 100644
--- a/src/plugins/cpptools/rpp/pp-scanner.h
+++ b/src/libs/cplusplus/pp-scanner.h
@@ -53,7 +53,7 @@
 #ifndef PP_SCANNER_H
 #define PP_SCANNER_H
 
-namespace rpp {
+namespace CPlusPlus {
 
 struct pp_skip_blanks
 {
@@ -373,7 +373,7 @@ struct pp_skip_argument
   }
 };
 
-} // namespace rpp
+} // namespace CPlusPlus
 
 #endif // PP_SCANNER_H
 
diff --git a/src/plugins/cpptools/rpp/pp.h b/src/libs/cplusplus/pp.h
similarity index 100%
rename from src/plugins/cpptools/rpp/pp.h
rename to src/libs/cplusplus/pp.h
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 9c6c3947fa3768a28e9bd41d1e334317630f3fc0..5569c900f2b49dbbe8c269f49a888c4d3f6e4f12 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -34,6 +34,8 @@
 #include "cmakeproject.h"
 #include "cmakeprojectconstants.h"
 #include "cmakeprojectnodes.h"
+#include "cmakestep.h"
+#include "makestep.h"
 
 #include <extensionsystem/pluginmanager.h>
 #include <cpptools/cppmodelmanagerinterface.h>
@@ -188,7 +190,7 @@ QString CMakeProject::buildDirectory(const QString &buildConfiguration) const
 {
     Q_UNUSED(buildConfiguration)
     //TODO
-    return "";
+    return QFileInfo(m_fileName).absolutePath();
 }
 
 ProjectExplorer::BuildStepConfigWidget *CMakeProject::createConfigWidget()
@@ -225,13 +227,29 @@ QStringList CMakeProject::files(FilesMode fileMode) const
 void CMakeProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer)
 {
     // TODO
-    Q_UNUSED(writer)
+    Q_UNUSED(writer);
 }
 
 void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader)
 {
     // TODO
-    Q_UNUSED(reader)
+    Q_UNUSED(reader);
+    if (buildConfigurations().isEmpty()) {
+        // No build configuration, adding those
+
+        // TODO do we want to create one build configuration per target?
+        // or how do we want to handle that?
+
+        CMakeStep *cmakeStep = new CMakeStep(this);
+        MakeStep *makeStep = new MakeStep(this);
+
+        insertBuildStep(0, cmakeStep);
+        insertBuildStep(1, makeStep);
+
+        addBuildConfiguration("all");
+        setActiveBuildConfiguration("all");
+    }
+    // Restoring is fine
 }
 
 
@@ -376,12 +394,36 @@ void CMakeCbpParser::parseBuild()
 
 void CMakeCbpParser::parseTarget()
 {
+    m_targetOutput.clear();
+    m_targetType = false;
     while(!atEnd()) {
         readNext();
         if (isEndElement()) {
+            if (m_targetType && !m_targetOutput.isEmpty()) {
+                qDebug()<<"found target "<<m_targetOutput;
+                m_targets.insert(m_targetOutput);
+            }
             return;
         } else if (name() == "Compiler") {
             parseCompiler();
+        } else if (name() == "Option") {
+            parseTargetOption();
+        } else if (isStartElement()) {
+            parseUnknownElement();
+        }
+    }
+}
+
+void CMakeCbpParser::parseTargetOption()
+{
+    if (attributes().hasAttribute("output"))
+        m_targetOutput = attributes().value("output").toString();
+    else if (attributes().hasAttribute("type") && attributes().value("type") == "1")
+        m_targetType = true;
+    while(!atEnd()) {
+        readNext();
+        if (isEndElement()) {
+            return;
         } else if (isStartElement()) {
             parseUnknownElement();
         }
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index c765c0d38387cbf0e3ce6f9dc47273ae22fcc869..a0c821ada5ebbe5e61267fa3f41824fdbac9d119 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -123,13 +123,18 @@ private:
     void parseProject();
     void parseBuild();
     void parseTarget();
+    void parseTargetOption();
     void parseCompiler();
     void parseAdd();
     void parseUnit();
     void parseUnknownElement();
 
+    QSet<QString> m_targets;
     QList<ProjectExplorer::FileNode *> m_fileList;
     QStringList m_includeFiles;
+
+    QString m_targetOutput;
+    bool m_targetType;
 };
 
 class CMakeFile : public Core::IFile
diff --git a/src/plugins/cmakeprojectmanager/cmakestep.cpp b/src/plugins/cmakeprojectmanager/cmakestep.cpp
index 523741c92ba9e16d838f4747f3dbcf8e1096eed5..0c267ca2c4cea394333b0a6bf4b1bb6d59fbbf47 100644
--- a/src/plugins/cmakeprojectmanager/cmakestep.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakestep.cpp
@@ -54,7 +54,7 @@ bool CMakeStep::init(const QString &buildConfiguration)
     setEnabled(buildConfiguration, true);
     setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration));
     setCommand(buildConfiguration, "cmake"); // TODO give full path here?
-    setArguments(buildConfiguration, QStringList()); // TODO
+    setArguments(buildConfiguration, QStringList() << "-GUnix Makefiles"); // TODO
     setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration));
     return AbstractProcessStep::init(buildConfiguration);
 }
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 7568d2c8877f0d06f0037d4db93bfc2327efa14c..d24f5a5f81d167f82836eff5e1f0af9f5bd72ae4 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -699,7 +699,9 @@ void CppCodeCompletion::addMacros(const LookupContext &context)
             continue;
         processed.insert(fn);
         if (Document::Ptr doc = context.document(fn)) {
-            macroNames += doc->macroNames();
+            foreach (const Macro macro, doc->definedMacros()) {
+                macroNames.insert(macro.name);
+            }
             todo += doc->includedFiles();
         }
     }
@@ -1025,6 +1027,10 @@ bool CppCodeCompletion::partiallyComplete(const QList<TextEditor::CompletionItem
 void CppCodeCompletion::cleanup()
 {
     m_completions.clear();
+
+    // Set empty map in order to avoid referencing old versions of the documents
+    // until the next completion
+    typeOfExpression.setDocuments(QMap<QString, Document::Ptr>());
 }
 
 int CppCodeCompletion::findStartOfName(const TextEditor::ITextEditor *editor)
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 6be28d36252ccab76a06d5ada2dc600a2fbaf341..e8359da2b5b988b254f5d69cdb393993588af1a2 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -31,7 +31,7 @@
 **
 ***************************************************************************/
 
-#include "pp.h"
+#include <cplusplus/pp.h>
 
 #include "cppmodelmanager.h"
 #include "cpphoverhandler.h"
@@ -107,7 +107,7 @@ static const char pp_configuration[] =
 namespace CppTools {
 namespace Internal {
 
-class CppPreprocessor: public rpp::Client
+class CppPreprocessor: public CPlusPlus::Client
 {
 public:
     CppPreprocessor(QPointer<CppModelManager> modelManager);
@@ -129,12 +129,11 @@ protected:
     void mergeEnvironment(CPlusPlus::Document::Ptr doc);
     void mergeEnvironment(CPlusPlus::Document::Ptr doc, QSet<QString> *processed);
 
-    virtual void macroAdded(const QByteArray &macroName,
-                            const QByteArray &macroText);
+    virtual void macroAdded(const Macro &macro);
     virtual void startExpandingMacro(unsigned offset,
-                                     const rpp::Macro &macro,
+                                     const Macro &macro,
                                      const QByteArray &originalText);
-    virtual void stopExpandingMacro(unsigned offset, const rpp::Macro &macro);
+    virtual void stopExpandingMacro(unsigned offset, const Macro &macro);
     virtual void startSkippingBlocks(unsigned offset);
     virtual void stopSkippingBlocks(unsigned offset);
     virtual void sourceNeeded(QString &fileName, IncludeType type);
@@ -142,8 +141,8 @@ protected:
 private:
     QPointer<CppModelManager> m_modelManager;
     CppModelManager::DocumentTable m_documents;
-    rpp::Environment env;
-    rpp::pp m_proc;
+    Environment env;
+    pp m_proc;
     QStringList m_includePaths;
     QStringList m_systemIncludePaths;
     QMap<QString, QByteArray> m_workingCopy;
@@ -295,16 +294,16 @@ QByteArray CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type)
     return QByteArray();
 }
 
-void CppPreprocessor::macroAdded(const QByteArray &macroName, const QByteArray &macroText)
+void CppPreprocessor::macroAdded(const Macro &macro)
 {
     if (! m_currentDoc)
         return;
 
-    m_currentDoc->appendMacro(macroName, macroText);
+    m_currentDoc->appendMacro(macro);
 }
 
 void CppPreprocessor::startExpandingMacro(unsigned offset,
-                                          const rpp::Macro &,
+                                          const Macro &,
                                           const QByteArray &originalText)
 {
     if (! m_currentDoc)
@@ -314,7 +313,7 @@ void CppPreprocessor::startExpandingMacro(unsigned offset,
     m_currentDoc->addMacroUse(offset, originalText.length());
 }
 
-void CppPreprocessor::stopExpandingMacro(unsigned, const rpp::Macro &)
+void CppPreprocessor::stopExpandingMacro(unsigned, const Macro &)
 {
     if (! m_currentDoc)
         return;
@@ -340,14 +339,13 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc, QSet<QString> *process
 
     processed->insert(fn);
 
-    foreach (QString includedFile, doc->includedFiles())
+    foreach (QString includedFile, doc->includedFiles()) {
         mergeEnvironment(m_documents.value(includedFile), processed);
+    }
 
-    const QByteArray macros = doc->definedMacros();
-    QByteArray localFileName = doc->fileName().toUtf8();
-
-    QByteArray dummy;
-    m_proc(localFileName, macros, &dummy);
+    foreach (const Macro macro, doc->definedMacros()) {
+        env.bind(macro);
+    }
 }
 
 void CppPreprocessor::startSkippingBlocks(unsigned offset)
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index 8a096900ebf699ba9f0712eafb670660ebffb113..92905e42ef9af7659dd58358a3fd7c7d50694b3d 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -10,7 +10,7 @@ unix:QMAKE_CXXFLAGS_DEBUG += -O3
 INCLUDEPATH += .
 DEFINES += CPPTOOLS_LIBRARY
 CONFIG += help
-include(rpp/rpp.pri)|error("Can't find RPP")
+
 HEADERS += cpptools_global.h \
     cppquickopenfilter.h \
     cppclassesfilter.h \
diff --git a/src/plugins/cpptools/rpp/rpp.pri b/src/plugins/cpptools/rpp/rpp.pri
deleted file mode 100644
index a79b0028a056faf793ac0b38a4e4bb048a74b15d..0000000000000000000000000000000000000000
--- a/src/plugins/cpptools/rpp/rpp.pri
+++ /dev/null
@@ -1,18 +0,0 @@
-DEPENDPATH += $$PWD
-INCLUDEPATH += $$PWD
-
-HEADERS += $$PWD/pp-cctype.h \
-           $$PWD/pp-engine.h \
-           $$PWD/pp-environment.h \
-           $$PWD/pp-internal.h \
-           $$PWD/pp-macro-expander.h \
-           $$PWD/pp-macro.h \
-           $$PWD/pp-scanner.h \
-           $$PWD/pp.h \
-           $$PWD/pp-client.h
-
-SOURCES += $$PWD/pp-engine.cpp \
-           $$PWD/pp-environment.cpp \
-           $$PWD/pp-macro-expander.cpp
-
-
diff --git a/src/plugins/cpptools/searchsymbols.cpp b/src/plugins/cpptools/searchsymbols.cpp
index 670d0d6d471e892f9e70b3752899d8463ecf3a8b..308449ab581d84738b2c2aff50ae885a6166c78a 100644
--- a/src/plugins/cpptools/searchsymbols.cpp
+++ b/src/plugins/cpptools/searchsymbols.cpp
@@ -194,7 +194,7 @@ QString SearchSymbols::symbolName(const Symbol *symbol) const
 void SearchSymbols::appendItem(const QString &name,
                                const QString &info,
                                ModelItemInfo::ItemType type,
-                               const CPlusPlus::Symbol *symbol)
+                               const Symbol *symbol)
 {
     const QIcon icon = icons.iconForSymbol(symbol);
     items.append(ModelItemInfo(name, info, type,
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index b95d5c19463d46a20a554fa4381b49ef178bf661..f67984f0da8621d9d718d7abaeb23e9720f2e370 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -605,7 +605,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
         }
     }
 
-    connect(m_sessionManagerAction, SIGNAL(triggered()), this, SLOT(sessionManager()));
+    connect(m_sessionManagerAction, SIGNAL(triggered()), this, SLOT(showSessionManager()));
     connect(m_newAction, SIGNAL(triggered()), this, SLOT(newProject()));
 #if 0
     connect(m_loadAction, SIGNAL(triggered()), this, SLOT(loadAction()));
@@ -765,10 +765,10 @@ void ProjectExplorerPlugin::newProject()
     updateActions();
 }
 
-void ProjectExplorerPlugin::sessionManager()
+void ProjectExplorerPlugin::showSessionManager()
 {
     if (debug)
-        qDebug() << "ProjectExplorerPlugin::newSession";
+        qDebug() << "ProjectExplorerPlugin::showSessionManager";
 
     if (m_session->isDefaultVirgin()) {
         // do not save new virgin default sessions
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 6a7f4beb83119b92c5756cd744430a9c720b2b9c..97eb684bb4993faed9c2edf54a894b074778cd08 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -143,7 +143,7 @@ private slots:
     void unloadProject();
     void clearSession();
     void newProject();
-    void sessionManager();
+    void showSessionManager();
     void populateBuildConfigurationMenu();
     void buildConfigurationMenuTriggered(QAction *);
     void populateRunConfigurationMenu();
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 876b8294a377c0ca72f49d88e2823ca8309acd2c..71057473046d4abb52f43ad766f79762ead2681a 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -709,7 +709,7 @@ void SessionManager::editDependencies()
     dlg.exec();
 }
 
-QList<Project *> SessionManager::projects() const
+const QList<Project *> &SessionManager::projects() const
 {
     return m_file->m_projects;
 }
@@ -839,26 +839,26 @@ Project *SessionManager::projectForFile(const QString &fileName) const
     if (debug)
         qDebug() << "SessionManager::projectForFile(" << fileName << ")";
 
-    Project *project = 0;
+    const QList<Project *> &projectList = projects();
 
-    QList<Project *> projectList = projects();
+    // Check current project first
+    Project *currentProject = ProjectExplorerPlugin::instance()->currentProject();
+    if (currentProject && projectContainsFile(currentProject, fileName))
+        return currentProject;
 
-    // Always check current project first
-    if (Project *currentProject = ProjectExplorerPlugin::instance()->currentProject()) {
-        projectList.removeOne(currentProject);
-        projectList.insert(0, currentProject);
-    }
+    foreach (Project *p, projectList)
+        if (p != currentProject && projectContainsFile(p, fileName))
+            return p;
 
-    foreach (Project *p, projectList) {
-        if (!m_projectFileCache.contains(p)) {
-            m_projectFileCache.insert(p, p->files(Project::AllFiles));
-        }
-        if (m_projectFileCache.value(p).contains(fileName)) {
-            project = p;
-            break;
-        }
-    }
-    return project;
+    return 0;
+}
+
+bool SessionManager::projectContainsFile(Project *p, const QString &fileName) const
+{
+    if (!m_projectFileCache.contains(p))
+        m_projectFileCache.insert(p, p->files(Project::AllFiles));
+
+    return m_projectFileCache.value(p).contains(fileName);
 }
 
 void SessionManager::setEditorCodec(Core::IEditor *editor, const QString &fileName)
diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h
index fcf98a23ded2e6386535f181091efd19298e407c..d07316f07a459757782f9ce2bf5e173d0518becf 100644
--- a/src/plugins/projectexplorer/session.h
+++ b/src/plugins/projectexplorer/session.h
@@ -137,7 +137,7 @@ public:
     Core::IFile *file() const;
     Project *startupProject() const;
 
-    QList<Project *> projects() const;
+    const QList<Project *> &projects() const;
 
     bool isDefaultVirgin() const;
     bool isDefaultSession(const QString &session) const;
@@ -182,6 +182,7 @@ private:
     bool loadImpl(const QString &fileName);
     bool createImpl(const QString &fileName);
     QString sessionNameToFileName(const QString &session);
+    bool projectContainsFile(Project *p, const QString &fileName) const;
 
     bool recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const;
     QStringList dependencies(const QString &proName) const;
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index b67535212e755eea1f8704e5b059c4b8a66a53cb..b3950ab63b721581430b0f31d14712bd3a13cae5 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -474,6 +474,9 @@ void Qt4Project::updateCodeModel()
         }
     }
 
+    // Add mkspec directory
+    allIncludePaths.append(qtVersion(activeBuildConfiguration())->mkspecPath());
+
     QStringList files;
     files += m_projectFiles->files[HeaderType];
     files += m_projectFiles->generatedFiles[HeaderType];
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 012e05b858ad0faaa6ba42eb20766121aa89c978..421aa3b77aeeb1c0163144cd632b972fda917bf7 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -728,6 +728,12 @@ QString QtVersion::mkspec() const
     return m_mkspec;
 }
 
+QString QtVersion::mkspecPath() const
+{
+    updateMkSpec();
+    return m_mkspecFullPath;
+}
+
 QHash<QString,QString> QtVersion::versionInfo() const
 {
     updateVersionInfo();
@@ -1023,25 +1029,25 @@ void QtVersion::updateMkSpec() const
     //qDebug()<<"Finding mkspec for"<<path();
 
     QString mkspec;
-    QFile f(path() + "/.qmake.cache");
-    if (f.exists() && f.open(QIODevice::ReadOnly)) {
-        while(!f.atEnd()) {
-            QByteArray line = f.readLine();
-            if(line.startsWith("QMAKESPEC")) {
-                const QList<QByteArray> &temp = line.split('=');
-                if(temp.size() == 2) {
-                    mkspec = temp.at(1).trimmed();
-                    if (mkspec.startsWith("$$QT_BUILD_TREE/mkspecs/"))
-                        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;
-            }
-        }
-        f.close();
-    } else {
+//    QFile f(path() + "/.qmake.cache");
+//    if (f.exists() && f.open(QIODevice::ReadOnly)) {
+//        while(!f.atEnd()) {
+//            QByteArray line = f.readLine();
+//            if(line.startsWith("QMAKESPEC")) {
+//                const QList<QByteArray> &temp = line.split('=');
+//                if(temp.size() == 2) {
+//                    mkspec = temp.at(1).trimmed();
+//                    if (mkspec.startsWith("$$QT_BUILD_TREE/mkspecs/"))
+//                        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;
+//            }
+//        }
+//        f.close();
+//    } else {
         // no .qmake.cache so look at the default mkspec
         QString mkspecPath = versionInfo().value("QMAKE_MKSPECS");
         if (mkspecPath.isEmpty())
@@ -1096,8 +1102,9 @@ void QtVersion::updateMkSpec() const
             mkspec = f2.symLinkTarget();
         }
 #endif
-    }
+//    }
 
+    m_mkspecFullPath = mkspec;
     int index = mkspec.lastIndexOf('/');
     if(index == -1)
         index = mkspec.lastIndexOf('\\');
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index 5810cfa1c2d81bfab5a17776b78336b4a77e457e..a8ca95708959d48710b91491fab86e39617c8880 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -67,6 +67,7 @@ public:
     QString path() const;
     QString sourcePath() const;
     QString mkspec() const;
+    QString mkspecPath() const;
     QString makeCommand() const;
     QString qmakeCommand() const;
     // Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information
@@ -107,6 +108,7 @@ private:
     QString m_path;
     QString m_sourcePath;
     mutable QString m_mkspec; // updated lazily
+    mutable QString m_mkspecFullPath;
     QString m_mingwDirectory;
     QString m_prependPath;
     QString m_msvcVersion;