diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 85f490913876cc646a64895bee0b4e1b07e07b7d..0f973cd71a2cf69ceb51f6f29fc4d09861dea799 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -85,6 +85,7 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName)
 
 CMakeProject::~CMakeProject()
 {
+    m_codeModelFuture.cancel();
     delete m_rootNode;
 }
 
@@ -257,7 +258,8 @@ bool CMakeProject::parseCMakeLists()
             pinfo.defines = activeBC->toolChain()->predefinedMacros(); // TODO this is to simplistic
             pinfo.frameworkPaths = allFrameworkPaths;
             modelmanager->updateProjectInfo(pinfo);
-            modelmanager->updateSourceFiles(pinfo.sourceFiles);
+            m_codeModelFuture.cancel();
+            m_codeModelFuture = modelmanager->updateSourceFiles(pinfo.sourceFiles);
         }
     }
 
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 7242f92905eacc453f91599d015df6160e1c93fc..ffb3cce73a9c2f534e8e518c9a2436a8c43cc66f 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -132,6 +132,7 @@ private:
     bool m_insideFileChanged;
     QSet<QString> m_watchedFiles;
     CMakeTargetFactory *m_targetFactory;
+    QFuture<void> m_codeModelFuture;
 };
 
 class CMakeCbpParser : public QXmlStreamReader
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 66f8145c27d2cf81bfd356a2526ca175c48a19b5..86a297ef01b08e7e71c68b1ab660fde08d48f0b7 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -1209,7 +1209,6 @@ void CppModelManager::onAboutToUnloadSession()
     if (m_core->progressManager()) {
         m_core->progressManager()->cancelTasks(CppTools::Constants::TASK_INDEX);
     }
-
     do {
         QMutexLocker locker(&mutex);
         m_projects.clear();
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index d699c609b2391e24fb2c5d84ede2980353af97db..339a7809e068e90ba07f8f5e4c65b9f2087a3ade 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -82,6 +82,7 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
 
 GenericProject::~GenericProject()
 {
+    m_codeModelFuture.cancel();
     m_manager->unregisterProject(this);
 
     delete m_rootNode;
@@ -238,6 +239,8 @@ void GenericProject::refresh(RefreshOptions options)
         if (options & Configuration) {
             filesToUpdate = pinfo.sourceFiles;
             filesToUpdate.append(QLatin1String("<configuration>")); // XXX don't hardcode configuration file name
+            // Full update, if there's a code model update, cancel it
+            m_codeModelFuture.cancel();
         } else if (options & Files) {
             // Only update files that got added to the list
             QSet<QString> newFileList = m_files.toSet();
@@ -246,7 +249,7 @@ void GenericProject::refresh(RefreshOptions options)
         }
 
         modelManager->updateProjectInfo(pinfo);
-        modelManager->updateSourceFiles(filesToUpdate);
+        m_codeModelFuture = modelManager->updateSourceFiles(filesToUpdate);
     }
 }
 
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 884d7a10f867c3b1f1c1c88f70b6c3cfa20fbc04..8e7b0bd02ba097c6418358416edbdd431ac3ea17 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -41,7 +41,7 @@
 #include <projectexplorer/toolchain.h>
 #include <projectexplorer/buildconfiguration.h>
 #include <coreplugin/ifile.h>
-
+#include <QFuture>
 #include <QtGui/QLineEdit>
 
 namespace Utils {
@@ -140,6 +140,7 @@ private:
     GenericProjectNode *m_rootNode;
     ProjectExplorer::ToolChain *m_toolChain;
     ProjectExplorer::ToolChain::ToolChainType m_toolChainType;
+    QFuture<void> m_codeModelFuture;
 };
 
 class GenericProjectFile : public Core::IFile
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index d4846cadf1bf5cf6cb599d7ef01e157d9e3b9482..e72aca89126bce19db812bfbd25110d83438d844 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -257,6 +257,7 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) :
 
 Qt4Project::~Qt4Project()
 {
+    m_codeModelFuture.cancel();
     m_asyncUpdateState = ShuttingDown;
     m_manager->unregisterProject(this);
     delete m_projectFiles;
@@ -413,8 +414,6 @@ void Qt4Project::updateCodeModel()
     if (debug)
         qDebug()<<"Qt4Project::updateCodeModel()";
 
-    m_codeModelFuture.cancel();
-
     if (!activeTarget() || !activeTarget()->activeBuildConfiguration())
         return;
 
@@ -723,6 +722,9 @@ void Qt4Project::scheduleAsyncUpdate()
     m_partialEvaluate.clear();
     m_asyncUpdateState = AsyncFullUpdatePending;
     m_asyncUpdateTimer.start();
+
+    // Cancel running code model update
+    m_codeModelFuture.cancel();
 }