diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 3c7504d7ee0ffebfed96122ec93b56882e1e06f1..c85233e0c25dbd47429847a30f32df703d782a52 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -35,6 +35,7 @@
 
 #include <functional>
 #include <QtConcurrentRun>
+#include <QFutureSynchronizer>
 #include <qtconcurrent/runextensions.h>
 
 #include <texteditor/itexteditor.h>
@@ -163,6 +164,7 @@ class CppPreprocessor: public CPlusPlus::Client
 {
 public:
     CppPreprocessor(QPointer<CppModelManager> modelManager);
+    virtual ~CppPreprocessor();
 
     void setWorkingCopy(const QMap<QString, QByteArray> &workingCopy);
     void setIncludePaths(const QStringList &includePaths);
@@ -212,6 +214,7 @@ private:
     Document::Ptr m_currentDoc;
     QSet<QString> m_todo;
     QSet<QString> m_processed;
+    QFutureSynchronizer<void> m_synchronizer;
 };
 
 } // namespace Internal
@@ -221,6 +224,11 @@ CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager)
     : snapshot(modelManager->snapshot()),
       m_modelManager(modelManager),
       preprocess(this, &env)
+{
+    m_synchronizer.setCancelOnWait(true);
+}
+
+CppPreprocessor::~CppPreprocessor()
 { }
 
 void CppPreprocessor::setWorkingCopy(const QMap<QString, QByteArray> &workingCopy)
@@ -502,7 +510,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
     snapshot.insert(doc->fileName(), doc);
     m_todo.remove(fileName);
 
-    QtConcurrent::run(Process(m_modelManager), doc);
+    m_synchronizer.addFuture(QtConcurrent::run(Process(m_modelManager), doc));
 
     (void) switchDocument(previousDoc);
 }
@@ -528,6 +536,8 @@ Document::Ptr CppPreprocessor::switchDocument(Document::Ptr doc)
 CppModelManager::CppModelManager(QObject *parent)
     : CppModelManagerInterface(parent)
 {
+    m_synchronizer.setCancelOnWait(true);
+
     m_core = Core::ICore::instance(); // FIXME
     m_dirty = true;
 
@@ -702,6 +712,8 @@ QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles
         QFuture<void> result = QtConcurrent::run(&CppModelManager::parse,
                                                  preproc, sourceFiles);
 
+        m_synchronizer.addFuture(result);
+
         if (sourceFiles.count() > 1) {
             m_core->progressManager()->addTask(result, tr("Indexing"),
                             CppTools::Constants::TASK_INDEX,
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index f20aa23895c250dda8cfe003801530ed7e7fe26a..9f2c2f221e21d1d9db66eca904f68866d4da521a 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -38,6 +38,7 @@
 
 #include <QMap>
 #include <QFutureInterface>
+#include <QFutureSynchronizer>
 #include <QMutex>
 #include <QTimer>
 #include <QTextEdit>
@@ -174,6 +175,8 @@ private:
     QList<Editor> m_todo;
 
     QTimer *m_updateEditorSelectionsTimer;
+
+    QFutureSynchronizer<void> m_synchronizer;
 };
 
 } // namespace Internal