diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp
index b69366ee4c24d5029cda08031ec194638313fbc6..928b034387f66a9aa4779e36aed091959844f194 100644
--- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp
+++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp
@@ -58,6 +58,11 @@ static void initializeTextMarks()
                                            Utils::Theme::ClangCodeModel_Error_TextMarkColor);
 }
 
+ClangCodeModelPlugin::ClangCodeModelPlugin()
+{
+    qRegisterMetaType<CppTools::ProjectPart::Ptr>();
+}
+
 bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *errorMessage)
 {
     Q_UNUSED(arguments)
diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.h b/src/plugins/clangcodemodel/clangcodemodelplugin.h
index 6a767d5b7109197acef7da6befe6f90d6b8ccf3b..39d4ba6633c4c4e54e49adede57153949e39aa5b 100644
--- a/src/plugins/clangcodemodel/clangcodemodelplugin.h
+++ b/src/plugins/clangcodemodel/clangcodemodelplugin.h
@@ -50,6 +50,8 @@ class ClangCodeModelPlugin: public ExtensionSystem::IPlugin
     Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ClangCodeModel.json")
 
 public:
+    ClangCodeModelPlugin();
+
     bool initialize(const QStringList &arguments, QString *errorMessage);
     void extensionsInitialized();
 
diff --git a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp
index 43a78680176692a7a58957f7f69eca18f1db132f..caeefd2267d4c604a5d66e44daa4390bf7b65fde 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp
+++ b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp
@@ -99,6 +99,7 @@ void ClangEditorDocumentParser::updateHelper(const BaseEditorDocumentParser::InM
     State state_ = state();
     state_.projectPart = determineProjectPart(filePath(), configuration(), state_);
     setState(state_);
+    emit projectPartDetermined(state_.projectPart);
 
     // Determine message line arguments
     const QStringList options = createOptions(filePath(), state_.projectPart, true);
diff --git a/src/plugins/clangcodemodel/clangeditordocumentparser.h b/src/plugins/clangcodemodel/clangeditordocumentparser.h
index 4784d51672c70944b2455210211f3ab9d57eeec8..ef207749c277c22dcc14a5f23e88fc85cd6eb3d6 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentparser.h
+++ b/src/plugins/clangcodemodel/clangeditordocumentparser.h
@@ -50,6 +50,9 @@ public:
     QList<SemanticMarker::Range> ifdefedOutBlocks() const;
     SemanticMarker::Ptr semanticMarker() const;
 
+signals:
+    void projectPartDetermined(CppTools::ProjectPart::Ptr projectPart);
+
 private:
     void updateHelper(const BaseEditorDocumentParser::InMemoryInfo &info) override;
 
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
index 43617439652d947cdd4db3e7b3bda8386d768b7a..c4a75dfbba6af7d275e83f09c7243539a6e6553a 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
@@ -88,6 +88,9 @@ ClangEditorDocumentProcessor::ClangEditorDocumentProcessor(
     , m_semanticHighlighter(document)
     , m_builtinProcessor(document, /*enableSemanticHighlighter=*/ false)
 {
+    connect(m_parser.data(), &ClangEditorDocumentParser::projectPartDetermined,
+            this, &ClangEditorDocumentProcessor::onParserDeterminedProjectPart);
+
     // Forwarding the semantic info from the builtin processor enables us to provide all
     // editor (widget) related features that are not yet implemented by the clang plugin.
     connect(&m_builtinProcessor, &CppTools::BuiltinEditorDocumentProcessor::cppDocumentUpdated,
@@ -231,9 +234,10 @@ static bool isProjectPartLoadedOrIsFallback(CppTools::ProjectPart::Ptr projectPa
         && (projectPart->id().isEmpty() || ClangCodeModel::Utils::isProjectPartLoaded(projectPart));
 }
 
-void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor()
+void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor(
+        CppTools::ProjectPart::Ptr projectPart)
 {
-    const CppTools::ProjectPart::Ptr projectPart = m_parser->projectPart();
+    QTC_ASSERT(projectPart, return);
 
     if (isProjectPartLoadedOrIsFallback(projectPart)) {
         updateTranslationUnitForEditor(projectPart.data());
@@ -243,6 +247,12 @@ void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor(
     }
 }
 
+void ClangEditorDocumentProcessor::onParserDeterminedProjectPart(
+        CppTools::ProjectPart::Ptr projectPart)
+{
+    updateProjectPartAndTranslationUnitForEditor(projectPart);
+}
+
 void ClangEditorDocumentProcessor::onParserFinished()
 {
     if (revision() != m_parserRevision)
@@ -254,8 +264,6 @@ void ClangEditorDocumentProcessor::onParserFinished()
 
     // Run semantic highlighter
     m_semanticHighlighter.run();
-
-    updateProjectPartAndTranslationUnitForEditor();
 }
 
 void ClangEditorDocumentProcessor::updateTranslationUnitForEditor(CppTools::ProjectPart *projectPart)
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
index 4e29265aba7f7f29df8c10545a6b26a5ab597ba1..575725e87382abb432a8d5acd1f6f557a428d9b9 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
@@ -85,10 +85,11 @@ public:
     static ClangEditorDocumentProcessor *get(const QString &filePath);
 
 private slots:
+    void onParserDeterminedProjectPart(CppTools::ProjectPart::Ptr projectPart);
     void onParserFinished();
 
 private:
-    void updateProjectPartAndTranslationUnitForEditor();
+    void updateProjectPartAndTranslationUnitForEditor(CppTools::ProjectPart::Ptr projectPart);
     void updateTranslationUnitForEditor(CppTools::ProjectPart *projectPart);
     void requestDiagnostics(CppTools::ProjectPart *projectPart);
     void requestDiagnostics();
diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
index 84b0dc4d73202905c5384d803451ebafa4a3550a..58a8605193173dd36a1e1f93e52405d247c99f13 100644
--- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
+++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp
@@ -1037,6 +1037,7 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile(
     CppTools::Tests::ProjectOpenerAndCloser projectManager;
     const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true);
     QVERIFY(projectInfo.isValid());
+    QVERIFY(monitorGeneratedUiFile.waitUntilGenerated());
 
     // Open file with ui object
     const QString completionFile = testDir.absolutePath("mainwindow.cpp");
@@ -1046,7 +1047,6 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile(
     QVERIFY(openSource.succeeded());
 
     // ...and check comletions
-    QVERIFY(monitorGeneratedUiFile.waitUntilGenerated());
     ProposalModel proposal = completionResults(openSource.editor());
     QVERIFY(hasItem(proposal, "menuBar"));
     QVERIFY(hasItem(proposal, "statusBar"));
diff --git a/src/plugins/cpptools/cppprojects.h b/src/plugins/cpptools/cppprojects.h
index c994257fa49ab1275b7e2b85d6bcee8ab6d95f5f..dc6c841bf022d5ff9667479e41d62424f1351b2e 100644
--- a/src/plugins/cpptools/cppprojects.h
+++ b/src/plugins/cpptools/cppprojects.h
@@ -247,4 +247,6 @@ private:
 
 } // namespace CppTools
 
+Q_DECLARE_METATYPE(CppTools::ProjectPart::Ptr)
+
 #endif // CPPPROJECTPART_H