diff --git a/src/libs/cplusplus/FastPreprocessor.cpp b/src/libs/cplusplus/FastPreprocessor.cpp
index 1f5838f7a690e1bf97af7c17aad5fb20d7c772e6..1b66ecac79cce40ecee85d683768750b00b50296 100644
--- a/src/libs/cplusplus/FastPreprocessor.cpp
+++ b/src/libs/cplusplus/FastPreprocessor.cpp
@@ -30,39 +30,40 @@
 #include "FastPreprocessor.h"
 #include <Literals.h>
 #include <TranslationUnit.h>
+#include <QtCore/QDebug>
 
 using namespace CPlusPlus;
 
-FastMacroResolver::FastMacroResolver(const Snapshot &snapshot)
-    : _snapshot(snapshot)
-{ }
+    TranslationUnit *_previousUnit;
+FastMacroResolver::FastMacroResolver(TranslationUnit *unit, const Snapshot &snapshot)
+    : _unit(unit), _snapshot(snapshot)
+{
+    const QString fileName = QString::fromUtf8(unit->fileName(), unit->fileNameLength());
+
+    QSet<QString> processed;
+    updateCache(fileName, &processed);
+}
 
 bool FastMacroResolver::isMacro(TranslationUnit *unit, unsigned tokenIndex) const
 {
+    if (unit != _unit){
+        qWarning() << Q_FUNC_INFO << "unexpected translation unit:" << unit->fileName();
+        return false;
+    }
+
     const Token &tk = unit->tokenAt(tokenIndex);
     if (tk.isNot(T_IDENTIFIER))
         return false;
 
     Identifier *id = tk.identifier;
     const QByteArray macroName = QByteArray::fromRawData(id->chars(), id->size());
-    const QString fileName = QString::fromUtf8(unit->fileName(), unit->fileNameLength());
-
-    bool done = false;
-    QSet<QString> processed;
-
-    if (isMacro_helper(macroName, fileName, &processed, &done))
-        return true;
-
-    return false;
+    return _cachedMacros.contains(macroName);
 }
 
-bool FastMacroResolver::isMacro_helper(const QByteArray &macroName,
-                                       const QString &fileName,
-                                       QSet<QString> *processed,
-                                       bool *done) const
+void FastMacroResolver::updateCache(const QString &fileName, QSet<QString> *processed)
 {
     if (processed->contains(fileName))
-        return false;
+        return;
 
     processed->insert(fileName);
 
@@ -72,25 +73,15 @@ bool FastMacroResolver::isMacro_helper(const QByteArray &macroName,
         for (int i = definedMacros.size() - 1; i != -1; --i) {
             const Macro &macro = definedMacros.at(i);
 
-            if (macro.name() == macroName) { // ### handle line numbers.
-                if (macro.isHidden()) {
-                    *done = true;
-                    return false;
-                }
-
-                return true;
-            }
+            if (macro.isHidden())
+                _cachedMacros.remove(macro.name());
+            else
+                _cachedMacros.insert(macro.name());
         }
 
-        foreach (const Document::Include &incl, doc->includes()) {
-            if (isMacro_helper(macroName, incl.fileName(), processed, done))
-                return true;
-            else if (*done)
-                return false;
-        }
+        foreach (const Document::Include &incl, doc->includes())
+            updateCache(incl.fileName(), processed);
     }
-
-    return false;
 }
 
 FastPreprocessor::FastPreprocessor(const Snapshot &snapshot)
diff --git a/src/libs/cplusplus/FastPreprocessor.h b/src/libs/cplusplus/FastPreprocessor.h
index 4db16643d89f04de1dc14f004f763ae196efa5c2..83d1bb257fd4c8fbfb05226f654d1b0086ea4993 100644
--- a/src/libs/cplusplus/FastPreprocessor.h
+++ b/src/libs/cplusplus/FastPreprocessor.h
@@ -44,18 +44,17 @@ namespace CPlusPlus {
 class CPLUSPLUS_EXPORT FastMacroResolver: public MacroResolver
 {
 public:
-    FastMacroResolver(const Snapshot &snapshot);
+    FastMacroResolver(TranslationUnit *unit, const Snapshot &snapshot);
 
     virtual bool isMacro(TranslationUnit *unit, unsigned tokenIndex) const;
 
 private:
-    bool isMacro_helper(const QByteArray &macroName,
-                        const QString &fileName,
-                        QSet<QString> *processed,
-                        bool *done) const;
+    void updateCache(const QString &fileName, QSet<QString> *processed);
 
 private:
+    TranslationUnit *_unit;
     Snapshot _snapshot;
+    QSet<QByteArray> _cachedMacros;
 };
 
 class CPLUSPLUS_EXPORT FastPreprocessor: public Client
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 9a3022c577c02701045851bc0b8f4da2d09d9d2a..c33fc18a01b9b6dd444ad6ffabbb58eb9a363e55 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -2069,7 +2069,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source)
         snapshot = source.snapshot;
         doc = source.snapshot.documentFromSource(preprocessedCode, source.fileName);
 
-        FastMacroResolver fastMacroResolver(snapshot);
+        FastMacroResolver fastMacroResolver(doc->translationUnit(), snapshot);
         doc->control()->setMacroResolver(&fastMacroResolver);
         doc->check();
         doc->control()->setMacroResolver(0);
diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index ad9642f8bcb8b7720d58a4697c90180635ede533..90986543f1b47903f5c53a7c68a5dabeb1986e93 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -171,7 +171,8 @@ protected:
         unsigned line, column;
         getTokenStartPosition(ast->firstToken(), &line, &column);
         Symbol *lastVisibleSymbol = _doc->findSymbolAt(line, column);
-        return LookupContext(lastVisibleSymbol, _exprDoc, _doc, _snapshot);
+        LookupContext ctx(lastVisibleSymbol, _exprDoc, _doc, _snapshot);
+        return ctx;
     }
 
     void ensureNameIsValid(NameAST *ast)
@@ -232,7 +233,7 @@ protected:
         const unsigned end = tokenAt(endToken).end();
 
         const QString expression = _source.mid(begin, end - begin);
-        // qDebug() << "*** expression:" << expression;
+        // qDebug() << "*** check expression:" << expression;
 
         TypeOfExpression typeofExpression;
         typeofExpression.setSnapshot(_snapshot);
@@ -426,16 +427,12 @@ static void find_helper(QFutureInterface<Core::Utils::FileSearchResult> &future,
 
     future.setProgressRange(0, files.size());
 
-    FastMacroResolver fastMacroResolver(snapshot);
-
     for (int i = 0; i < files.size(); ++i) {
         const QString &fileName = files.at(i);
         future.setProgressValueAndText(i, QFileInfo(fileName).fileName());
 
-        Document::Ptr previousDoc = snapshot.value(fileName);
-        if (previousDoc) {
+        if (Document::Ptr previousDoc = snapshot.value(fileName)) {
             Control *control = previousDoc->control();
-            previousDoc->control();
             Identifier *id = control->findIdentifier(symbolId->chars(), symbolId->size());
             if (! id)
                 continue; // skip this document, it's not using symbolId.
@@ -462,6 +459,7 @@ static void find_helper(QFutureInterface<Core::Utils::FileSearchResult> &future,
             TranslationUnit *unit = doc->translationUnit();
             Control *control = doc->control();
 
+            FastMacroResolver fastMacroResolver(unit, snapshot);
             control->setMacroResolver(&fastMacroResolver);
             doc->parse();
             control->setMacroResolver(0);