diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 75f64fea5da9db750abf37ff1de1652a31e7c13e..c7e1d3fc5da50ab54e12e6f32dd07dc9e73b4f0a 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -120,6 +120,9 @@ public:
     void run(QString &fileName);
     void operator()(QString &fileName);
 
+public: // attributes
+    Snapshot snapshot;
+
 protected:
     CPlusPlus::Document::Ptr switchDocument(CPlusPlus::Document::Ptr doc);
 
@@ -141,7 +144,6 @@ protected:
 
 private:
     QPointer<CppModelManager> m_modelManager;
-    Snapshot m_snapshot;
     Environment env;
     Preprocessor m_proc;
     QStringList m_includePaths;
@@ -157,9 +159,9 @@ private:
 } // namespace CppTools
 
 CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager)
-    : m_modelManager(modelManager),
-    m_snapshot(modelManager->snapshot()),
-    m_proc(this, env)
+    : snapshot(modelManager->snapshot()),
+      m_modelManager(modelManager),
+      m_proc(this, env)
 { }
 
 void CppPreprocessor::setWorkingCopy(const QMap<QString, QByteArray> &workingCopy)
@@ -337,8 +339,13 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc, QSet<QString> *process
 
     processed->insert(fn);
 
-    foreach (QString includedFile, doc->includedFiles()) {
-        mergeEnvironment(m_snapshot.value(includedFile), processed);
+    foreach (Document::Include incl, doc->includes()) {
+        QString includedFile = incl.fileName();
+
+        if (Document::Ptr includedDoc = snapshot.value(includedFile))
+            mergeEnvironment(includedDoc, processed);
+        else
+            run(includedFile);
     }
 
     foreach (const Macro macro, doc->definedMacros()) {
@@ -384,7 +391,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
     }
 
     if (! contents.isEmpty()) {
-        Document::Ptr cachedDoc = m_snapshot.value(fileName);
+        Document::Ptr cachedDoc = snapshot.value(fileName);
         if (cachedDoc && m_currentDoc) {
             mergeEnvironment(cachedDoc);
         } else {
@@ -393,8 +400,8 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
             const QByteArray previousFile = env.currentFile;
             const unsigned previousLine = env.currentLine;
 
-            env.currentFile = QByteArray(m_currentDoc->translationUnit()->fileName(),
-                                         m_currentDoc->translationUnit()->fileNameLength());
+            TranslationUnit *unit = m_currentDoc->translationUnit();
+            env.currentFile = QByteArray(unit->fileName(), unit->fileNameLength());
 
             QByteArray preprocessedCode;
             m_proc(contents, &preprocessedCode);
@@ -775,7 +782,12 @@ void CppModelManager::parse(QFutureInterface<void> &future,
                             CppPreprocessor *preproc,
                             QStringList files)
 {
-    QTC_ASSERT(!files.isEmpty(), return);
+    if (files.isEmpty())
+        return;
+
+    foreach (QString file, files) {
+        preproc->snapshot.remove(file);
+    }
 
     // Change the priority of the background parser thread to idle.
     QThread::currentThread()->setPriority(QThread::IdlePriority);