diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index b26bb706e63c9555d20c6ed3a6dadeae8fc40571..b7abbe2d2dc2f45a03df212fa7e0a571ddc43f66 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -556,23 +556,31 @@ void CppModelManager::updateProjectInfo(const ProjectInfo &pinfo)
             return;
 
         ProjectExplorer::Project *project = pinfo.project().data();
+        ProjectInfo oldProjectInfo = m_projects.value(project);
+        if (oldProjectInfo.isValid()) {
+            foreach (const ProjectPart::Ptr &projectPart, oldProjectInfo.projectParts()) {
+                foreach (const ProjectFile &cxxFile, projectPart->files) {
+                    foreach (const QString &fileName,
+                             m_snapshot.allIncludesForDocument(cxxFile.path)) {
+                        m_snapshot.remove(fileName);
+                    }
+                    m_snapshot.remove(cxxFile.path);
+                }
+            }
+        }
+        m_snapshot.remove(configurationFileName());
+
         m_projects.insert(project, pinfo);
         m_dirty = true;
 
         m_srcToProjectPart.clear();
-
         foreach (const ProjectInfo &projectInfo, m_projects) {
             foreach (const ProjectPart::Ptr &projectPart, projectInfo.projectParts()) {
                 foreach (const ProjectFile &cxxFile, projectPart->files) {
                     m_srcToProjectPart[cxxFile.path].append(projectPart);
-                    foreach (const QString &fileName, m_snapshot.allIncludesForDocument(cxxFile.path))
-                        m_snapshot.remove(fileName);
-                    m_snapshot.remove(cxxFile.path);
                 }
             }
         }
-
-        m_snapshot.remove(configurationFileName());
     }
 
     if (!qgetenv("QTCREATOR_DUMP_PROJECT_INFO").isEmpty())
diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp
index 3805f157d229760b45eda936a0fd5e84a96b0011..d01c4ff5ab2f7967c18ec5e1295181c746dcb374 100644
--- a/src/plugins/cpptools/cppmodelmanager_test.cpp
+++ b/src/plugins/cpptools/cppmodelmanager_test.cpp
@@ -96,6 +96,42 @@ private:
     const QString m_testDataDirectory;
 };
 
+
+// TODO: When possible, use this helper class in all tests
+class ProjectCreator
+{
+public:
+    ProjectCreator(ModelManagerTestHelper *modelManagerTestHelper)
+        : modelManagerTestHelper(modelManagerTestHelper)
+    {}
+
+    /// 'files' is expected to be a list of file names that reside in 'dir'.
+    void create(const QString &name, const QString &dir, const QStringList files)
+    {
+        const TestDataDirectory projectDir(dir);
+        foreach (const QString &file, files)
+            projectFiles << projectDir.file(file);
+
+        Project *project = modelManagerTestHelper->createProject(name);
+        projectInfo = CppModelManager::instance()->projectInfo(project);
+        QCOMPARE(projectInfo.project().data(), project);
+
+        ProjectPart::Ptr part(new ProjectPart);
+        projectInfo.appendProjectPart(part);
+        part->cxxVersion = ProjectPart::CXX98;
+        part->qtVersion = ProjectPart::Qt5;
+        foreach (const QString &file, projectFiles) {
+            ProjectFile projectFile(file, ProjectFile::classify(file));
+            part->files.append(projectFile);
+        }
+    }
+
+    ModelManagerTestHelper *modelManagerTestHelper;
+    ProjectInfo projectInfo;
+    QStringList projectFiles;
+};
+
+
 } // anonymous namespace
 
 void CppToolsPlugin::test_modelmanager_paths()
@@ -278,3 +314,49 @@ void CppToolsPlugin::test_modelmanager_refresh_2()
         QVERIFY(document->diagnosticMessages().isEmpty());
     }
 }
+
+void CppToolsPlugin::test_modelmanager_snapshot_after_two_projects()
+{
+    QStringList refreshedFiles;
+    ModelManagerTestHelper helper;
+    ProjectCreator project1(&helper);
+    ProjectCreator project2(&helper);
+    CppModelManager *mm = CppModelManager::instance();
+
+    // Project 1
+    project1.create(QLatin1String("snapshot_after_two_projects.1"),
+                    QLatin1String("testdata_project1"),
+                    QStringList() << QLatin1String("foo.h")
+                                  << QLatin1String("foo.cpp")
+                                  << QLatin1String("main.cpp"));
+
+    mm->updateProjectInfo(project1.projectInfo);
+    mm->updateSourceFiles(project1.projectFiles);
+    refreshedFiles = helper.waitForRefreshedSourceFiles();
+    QCOMPARE(refreshedFiles.toSet(), project1.projectFiles.toSet());
+    const int snapshotSizeAfterProject1 = mm->snapshot().size();
+
+    foreach (const QString &file, project1.projectFiles)
+        QVERIFY(mm->snapshot().contains(file));
+
+    // Project 2
+    project2.create(QLatin1String("snapshot_after_two_projects.2"),
+                    QLatin1String("testdata_project2"),
+                    QStringList() << QLatin1String("bar.h")
+                                  << QLatin1String("bar.cpp")
+                                  << QLatin1String("main.cpp"));
+
+    mm->updateProjectInfo(project2.projectInfo);
+    mm->updateSourceFiles(project2.projectFiles);
+    refreshedFiles = helper.waitForRefreshedSourceFiles();
+    QCOMPARE(refreshedFiles.toSet(), project2.projectFiles.toSet());
+
+    const int snapshotSizeAfterProject2 = mm->snapshot().size();
+    QVERIFY(snapshotSizeAfterProject2 > snapshotSizeAfterProject1);
+    QVERIFY(snapshotSizeAfterProject2 >= snapshotSizeAfterProject1 + project2.projectFiles.size());
+
+    foreach (const QString &file, project1.projectFiles)
+        QVERIFY(mm->snapshot().contains(file));
+    foreach (const QString &file, project2.projectFiles)
+        QVERIFY(mm->snapshot().contains(file));
+}
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index 4c983bab6ce006265044d12904e034ceac83b5af..d10c690221560663c6383bca3e00cdc985db0a54 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -163,6 +163,7 @@ private slots:
     void test_modelmanager_framework_headers();
     void test_modelmanager_refresh_1();
     void test_modelmanager_refresh_2();
+    void test_modelmanager_snapshot_after_two_projects();
 
 private:
     void test_completion();
diff --git a/tests/cppmodelmanager/testdata_project1/foo.cpp b/tests/cppmodelmanager/testdata_project1/foo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cf92d5c5ccbe2d923d5e6a2306489c07a9071f0e
--- /dev/null
+++ b/tests/cppmodelmanager/testdata_project1/foo.cpp
@@ -0,0 +1,7 @@
+// Copyright header
+
+#include "foo.h"
+
+Foo::Foo()
+{
+}
diff --git a/tests/cppmodelmanager/testdata_project1/foo.h b/tests/cppmodelmanager/testdata_project1/foo.h
new file mode 100644
index 0000000000000000000000000000000000000000..b4271076331ba4104857f3c60505e532327fa6c8
--- /dev/null
+++ b/tests/cppmodelmanager/testdata_project1/foo.h
@@ -0,0 +1,12 @@
+// Copyright header
+
+#ifndef FOO_H
+#define FOO_H
+
+class Foo
+{
+public:
+    Foo();
+};
+
+#endif // FOO_H
diff --git a/tests/cppmodelmanager/testdata_project1/main.cpp b/tests/cppmodelmanager/testdata_project1/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..eca708ea3f1d13af4b22f6810e43b5bf2ad64855
--- /dev/null
+++ b/tests/cppmodelmanager/testdata_project1/main.cpp
@@ -0,0 +1,9 @@
+// Copyright header
+
+#include "foo.h"
+
+int main()
+{
+    Foo foo;
+    return 1;
+}
diff --git a/tests/cppmodelmanager/testdata_project2/bar.cpp b/tests/cppmodelmanager/testdata_project2/bar.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..30882cdcd9c0897c6cd948df4aa8e03b8bf616fe
--- /dev/null
+++ b/tests/cppmodelmanager/testdata_project2/bar.cpp
@@ -0,0 +1,7 @@
+// Copyright header
+
+#include "bar.h"
+
+Bar::Bar()
+{
+}
diff --git a/tests/cppmodelmanager/testdata_project2/bar.h b/tests/cppmodelmanager/testdata_project2/bar.h
new file mode 100644
index 0000000000000000000000000000000000000000..abb6e59877fcafd0d624d1b55cd117235dc3d175
--- /dev/null
+++ b/tests/cppmodelmanager/testdata_project2/bar.h
@@ -0,0 +1,12 @@
+// Copyright header
+
+#ifndef BAR_H
+#define BAR_H
+
+class Bar
+{
+public:
+    Bar();
+};
+
+#endif // BAR_H
diff --git a/tests/cppmodelmanager/testdata_project2/main.cpp b/tests/cppmodelmanager/testdata_project2/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d6e00511ebb371662bf6ad70b03fa403cb768087
--- /dev/null
+++ b/tests/cppmodelmanager/testdata_project2/main.cpp
@@ -0,0 +1,9 @@
+// Copyright header
+
+#include "bar.h"
+
+int main()
+{
+    Bar bar;
+    return 1;
+}