diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 68001dd2ba5f44da443ae68163ef881b8a3a0bba..08c54b19a9d79b667fee0ef694c30b330808c5de 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -407,10 +407,13 @@ void LookupContext::expandClass(Scope *scope,
             Name *baseClassName = baseClass->name();
             const QList<Symbol *> baseClassCandidates = resolveClass(baseClassName,
                                                                      classVisibleScopes);
+
+#if 0
             if (baseClassCandidates.isEmpty()) {
                 Overview overview;
                 qDebug() << "unresolved base class:" << overview.prettyName(baseClassName);
             }
+#endif
 
             for (int j = 0; j < baseClassCandidates.size(); ++j) {
                 if (Class *baseClassSymbol = baseClassCandidates.at(j)->asClass())
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index d3ffabe34161d9f3bec9af41b10d82bf87666f22..107ed20b9071b07210117f564e549e42f69682ab 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -530,7 +530,8 @@ Preprocessor::Preprocessor(Client *client, Environment *env)
     : client(client),
       env(env),
       _expand(env),
-      _result(0)
+      _result(0),
+      _markGeneratedTokens(false)
 {
     resetIfLevel ();
 }
@@ -603,12 +604,12 @@ Preprocessor::State Preprocessor::createStateFromSource(const QByteArray &source
     return state;
 }
 
-void Preprocessor::processNewline()
+void Preprocessor::processNewline(bool force)
 {
-    if (env->currentLine == _dot->lineno)
+    if (! force && env->currentLine == _dot->lineno)
         return;
 
-    if (env->currentLine > _dot->lineno) {
+    if (force || env->currentLine > _dot->lineno) {
         _result->append("\n# ");
         _result->append(QByteArray::number(_dot->lineno));
         _result->append(' ');
@@ -648,6 +649,50 @@ void Preprocessor::processSkippingBlocks(bool skippingBlocks,
     }
 }
 
+bool Preprocessor::markGeneratedTokens(bool markGeneratedTokens,
+                                       TokenIterator dot)
+{
+    bool previous = _markGeneratedTokens;
+    _markGeneratedTokens = markGeneratedTokens;
+
+    if (previous != _markGeneratedTokens) {
+        if (! dot)
+            dot = _dot;
+
+        if (_markGeneratedTokens)
+            _result->append("\n#pragma push(gen)");
+        else
+            _result->append("\n#pragma pop(gen)");
+
+        processNewline(/*force = */ true);
+
+        const char *begin = _source.constBegin();
+        const char *end   = begin;
+
+        if (markGeneratedTokens)
+            end += dot->begin();
+        else
+            end += (dot - 1)->end();
+
+        const char *it = end - 1;
+        for (; it != begin - 1; --it) {
+            if (*it == '\n')
+                break;
+        }
+        ++it;
+
+        for (; it != end; ++it) {
+            if (! std::isspace(*it))
+                _result->append(' ');
+
+            else
+                _result->append(*it);
+        }
+    }
+
+    return previous;
+}
+
 void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &source,
                               QByteArray *result)
 {
@@ -846,7 +891,9 @@ Macro *Preprocessor::processObjectLikeMacro(TokenIterator identifierToken,
             return m;
     }
 
+    const bool was = markGeneratedTokens(true, identifierToken);
     _result->append(tmp);
+    (void) markGeneratedTokens(was);
     return 0;
 }
 
@@ -859,7 +906,9 @@ void Preprocessor::expandBuiltinMacro(TokenIterator identifierToken,
         client->startExpandingMacro(identifierToken->offset,
                                     trivial, spell);
 
+    const bool was = markGeneratedTokens(true, identifierToken);
     expand(spell, _result);
+    (void) markGeneratedTokens(was);
 
     if (client)
         client->stopExpandingMacro(_dot->offset, trivial);
@@ -899,7 +948,9 @@ void Preprocessor::expandFunctionLikeMacro(TokenIterator identifierToken,
                                     *m, text, actuals);
     }
 
+    const bool was = markGeneratedTokens(true, identifierToken);
     expand(beginOfText, endOfText, _result);
+    (void) markGeneratedTokens(was);
 
     if (client)
         client->stopExpandingMacro(_dot->offset, *m);
diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h
index eb0ddea66d6e92164a7270502ec83230d1c5eb02..3b0e0d1b22617b6fa7a567c6c1d9f32abb2868ab 100644
--- a/src/libs/cplusplus/pp-engine.h
+++ b/src/libs/cplusplus/pp-engine.h
@@ -97,6 +97,8 @@ private:
         TokenIterator dot;
     };
 
+    bool markGeneratedTokens(bool markGeneratedTokens, TokenIterator dot = 0);
+
     void preprocess(const QByteArray &filename,
                     const QByteArray &source,
                     QByteArray *result);
@@ -133,7 +135,7 @@ private:
     void collectActualArguments(QVector<MacroArgumentReference> *actuals);
     MacroArgumentReference collectOneActualArgument();
 
-    void processNewline();
+    void processNewline(bool force = false);
 
     void processSkippingBlocks(bool skippingBlocks,
                                TokenIterator dot, TokenIterator lastToken);
@@ -179,6 +181,7 @@ private:
     TokenIterator _dot;
 
     QByteArray *_result;
+    bool _markGeneratedTokens;
 };
 
 } // namespace CPlusPlus
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 505e97ab7d5a981daccef2154d27ffaf34a1d25a..a5c5ffb38e28200b8cb77d879af27a193d9755f5 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -370,8 +370,7 @@ void CPPEditor::jumpToMethod(int)
         return;
 
     Core::EditorManager::instance()->addCurrentPositionToNavigationHistory(true);
-    int line = symbol->line();
-    gotoLine(line);
+    openEditorAt(symbol);
     Core::EditorManager::instance()->addCurrentPositionToNavigationHistory();
     setFocus();
 }