diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 49b09c3aca88f4215abd15f2de43c9c291459751..49209bc1131476bd6836f677b30a796c586c4886 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -386,3 +386,25 @@ QSharedPointer<NamespaceBinding> Snapshot::globalNamespaceBinding(Document::Ptr
 {
     return CPlusPlus::bind(doc, *this);
 }
+
+Snapshot Snapshot::simplified(Document::Ptr doc) const
+{
+    Snapshot snapshot;
+    simplified_helper(doc, &snapshot);
+    return snapshot;
+}
+
+void Snapshot::simplified_helper(Document::Ptr doc, Snapshot *snapshot) const
+{
+    if (! doc)
+        return;
+
+    if (! snapshot->contains(doc->fileName())) {
+        snapshot->insert(doc);
+
+        foreach (const Document::Include &incl, doc->includes()) {
+            Document::Ptr includedDoc = value(incl.fileName());
+            simplified_helper(includedDoc, snapshot);
+        }
+    }
+}
diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index 486d6d7706ce2d22d977290f558df4d03f140d35..4984ef114a474bf292e1113b4f1fe192f11a3791 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -277,6 +277,8 @@ public:
     Snapshot();
     ~Snapshot();
 
+    Snapshot simplified(Document::Ptr doc) const;
+
     QByteArray preprocessedCode(const QString &source,
                                 const QString &fileName) const;
 
@@ -288,6 +290,9 @@ public:
     void insert(Document::Ptr doc);
 
     using _Base::insert;
+
+private:
+    void simplified_helper(Document::Ptr doc, Snapshot *snapshot) const;
 };
 
 } // end of namespace CPlusPlus
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index b561467db17f5ab60dd7c886e4e9d8c65f0602d1..59c68c2f5b30851f4cdc66e9a70a6c9101446a73 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1727,6 +1727,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source) const
 {
     const QByteArray preprocessedCode = source.snapshot.preprocessedCode(source.code, source.fileName);
     Document::Ptr doc = source.snapshot.documentFromSource(preprocessedCode, source.fileName);
+    const Snapshot snapshot = source.snapshot.simplified(doc);
     doc->check();
 
     Control *control = doc->control();
@@ -1741,6 +1742,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source) const
 
     SemanticInfo semanticInfo;
     semanticInfo.revision = source.revision;
+    semanticInfo.snapshot = snapshot;
     semanticInfo.doc = doc;
     semanticInfo.localUses = useTable.localUses;
     semanticInfo.externalUses = useTable.externalUses;
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index ddec563a094a39cbe9a61cb676f4259967ee447f..8fa991fc8ffadac10f4741337b807c2a0afe7ea4 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -88,6 +88,7 @@ public:
     { }
 
     int revision;
+    CPlusPlus::Snapshot snapshot;
     CPlusPlus::Document::Ptr doc;
     LocalUseMap localUses;
     ExternalUseMap externalUses;