diff --git a/src/libs/clangsupport/refactoringserverinterface.h b/src/libs/clangsupport/refactoringserverinterface.h
index a4a3b1e6f4ac0355b3fd8765d2677cba34e86e7a..09634802dae48ca7167f1ff157d520e8ffddb73d 100644
--- a/src/libs/clangsupport/refactoringserverinterface.h
+++ b/src/libs/clangsupport/refactoringserverinterface.h
@@ -51,17 +51,17 @@ public:
     virtual void requestSourceRangesForQueryMessage(RequestSourceRangesForQueryMessage &&message) = 0;
     virtual void cancel() = 0;
 
-    bool isUsable() const
+    bool isAvailable() const
     {
-        return isUsable_;
+        return isAvailable_;
     }
-    void setUsable(bool isUsable)
+    void setAvailable(bool isAvailable)
     {
-        isUsable_ = isUsable;
+        isAvailable_ = isAvailable;
     }
 
 private:
-    bool isUsable_ = false;
+    bool isAvailable_ = false;
 };
 
 } // namespace ClangBackEnd
diff --git a/src/libs/clangsupport/sourcelocationcontainer.h b/src/libs/clangsupport/sourcelocationcontainer.h
index 80971e8ee8fed945d0b722d90cc40c7853dd5100..ffccc2a82a6ebf1fefe70aded500cc75b1cba891 100644
--- a/src/libs/clangsupport/sourcelocationcontainer.h
+++ b/src/libs/clangsupport/sourcelocationcontainer.h
@@ -27,7 +27,7 @@
 
 #include "clangsupport_global.h"
 
-#include <utf8string.h>
+#include <sqlite/utf8string.h>
 
 namespace ClangBackEnd {
 
diff --git a/src/libs/utils/smallstringfwd.h b/src/libs/utils/smallstringfwd.h
index f3b343f961609b11bf67a23be1690655ea5eafe1..05a8a9efb4fe70d371570026c55021aea1b80dbc 100644
--- a/src/libs/utils/smallstringfwd.h
+++ b/src/libs/utils/smallstringfwd.h
@@ -25,10 +25,10 @@
 
 #pragma once
 
-namespace Utils {
-
 using uint = unsigned int;
 
+namespace Utils {
+
 class SmallStringView;
 template <uint Size>
 class BasicSmallString;
diff --git a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp
index 14d8a1620ec857e7bf72606e5b1078bbe04a7e23..b3d52949bdcaa863ea769630a0bcc6c367b909ad 100644
--- a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp
+++ b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp
@@ -127,14 +127,14 @@ void ClangQueryProjectsFindFilter::setProjectParts(const std::vector<CppTools::P
     this->m_projectParts = projectParts;
 }
 
-bool ClangQueryProjectsFindFilter::isUsable() const
+bool ClangQueryProjectsFindFilter::isAvailable() const
 {
-    return m_server.isUsable();
+    return m_server.isAvailable();
 }
 
-void ClangQueryProjectsFindFilter::setUsable(bool isUsable)
+void ClangQueryProjectsFindFilter::setAvailable(bool isAvailable)
 {
-    m_server.setUsable(isUsable);
+    m_server.setAvailable(isAvailable);
 }
 
 SearchHandle *ClangQueryProjectsFindFilter::searchHandleForTestOnly() const
diff --git a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h
index 73608557eca2e784a26ec9271bfc5a9776b8a790..a92c994f0d224c97f00e3b5c6015f21a442971b6 100644
--- a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h
+++ b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h
@@ -66,8 +66,8 @@ public:
 
     void setProjectParts(const std::vector<CppTools::ProjectPart::Ptr> &m_projectParts);
 
-    bool isUsable() const;
-    void setUsable(bool isUsable);
+    bool isAvailable() const;
+    void setAvailable(bool isAvailable);
 
     SearchHandle* searchHandleForTestOnly() const;
 
diff --git a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp
index ac5a96ee88941ffd0a65628dbc6af21c18a5c798..7ca01459c22909fb775fbc4c1b9b045bc0622c4b 100644
--- a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp
+++ b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp
@@ -100,13 +100,15 @@ bool ClangRefactoringPlugin::initialize(const QStringList & /*arguments*/, QStri
 
 void ClangRefactoringPlugin::extensionsInitialized()
 {
-    CppTools::CppModelManager::setRefactoringEngine(&refactoringEngine());
+    CppTools::CppModelManager::addRefactoringEngine(
+                CppTools::RefactoringEngineType::ClangRefactoring, &refactoringEngine());
 }
 
 ExtensionSystem::IPlugin::ShutdownFlag ClangRefactoringPlugin::aboutToShutdown()
 {
     ExtensionSystem::PluginManager::removeObject(&d->qtCreatorfindFilter);
-    CppTools::CppModelManager::setRefactoringEngine(nullptr);
+    CppTools::CppModelManager::removeRefactoringEngine(
+                CppTools::RefactoringEngineType::ClangRefactoring);
     d->refactoringClient.setRefactoringConnectionClient(nullptr);
     d->refactoringClient.setRefactoringEngine(nullptr);
 
@@ -137,7 +139,7 @@ void ClangRefactoringPlugin::connectBackend()
 
 void ClangRefactoringPlugin::backendIsConnected()
 {
-    d->engine.setUsable(true);
+    d->engine.setRefactoringEngineAvailable(true);
 }
 
 } // namespace ClangRefactoring
diff --git a/src/plugins/clangrefactoring/refactoringclient.cpp b/src/plugins/clangrefactoring/refactoringclient.cpp
index 5c544e5a22060d85c139760bd3d11c1e08f8d981..1bbc01aa02b189547fc89fd651883755319118c4 100644
--- a/src/plugins/clangrefactoring/refactoringclient.cpp
+++ b/src/plugins/clangrefactoring/refactoringclient.cpp
@@ -47,7 +47,7 @@ void RefactoringClient::sourceLocationsForRenamingMessage(
                             message.sourceLocations(),
                             message.textDocumentRevision());
 
-    m_refactoringEngine->setUsable(true);
+    m_refactoringEngine->setRefactoringEngineAvailable(true);
 }
 
 void RefactoringClient::sourceRangesAndDiagnosticsForQueryMessage(
diff --git a/src/plugins/clangrefactoring/refactoringengine.cpp b/src/plugins/clangrefactoring/refactoringengine.cpp
index bc9ec9ab68752944f5c06c164677121c5fe8a921..174254253cd9c6063652474044c6d3e2100c8086 100644
--- a/src/plugins/clangrefactoring/refactoringengine.cpp
+++ b/src/plugins/clangrefactoring/refactoringengine.cpp
@@ -60,7 +60,7 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data,
 {
     using CppTools::ClangCompilerOptionsBuilder;
 
-    setUsable(false);
+    setRefactoringEngineAvailable(false);
 
     m_client.setLocalRenamingCallback(std::move(renameSymbolsCallback));
 
@@ -89,14 +89,14 @@ void RefactoringEngine::startGlobalRenaming(const CppTools::CursorInEditor &)
     // TODO: implement
 }
 
-bool RefactoringEngine::isUsable() const
+bool RefactoringEngine::isRefactoringEngineAvailable() const
 {
-    return m_server.isUsable();
+    return m_server.isAvailable();
 }
 
-void RefactoringEngine::setUsable(bool isUsable)
+void RefactoringEngine::setRefactoringEngineAvailable(bool isAvailable)
 {
-    m_server.setUsable(isUsable);
+    m_server.setAvailable(isAvailable);
 }
 
 } // namespace ClangRefactoring
diff --git a/src/plugins/clangrefactoring/refactoringengine.h b/src/plugins/clangrefactoring/refactoringengine.h
index b64a2c8eebb58082ebaf756f82d3ac5e3217a78e..eaa15ad7d542d4f7d31d9700434f7ab2b4410c65 100644
--- a/src/plugins/clangrefactoring/refactoringengine.h
+++ b/src/plugins/clangrefactoring/refactoringengine.h
@@ -48,8 +48,8 @@ public:
                             RenameCallback &&renameSymbolsCallback) override;
     void startGlobalRenaming(const CppTools::CursorInEditor &data) override;
 
-    bool isUsable() const override;
-    void setUsable(bool isUsable);
+    bool isRefactoringEngineAvailable() const override;
+    void setRefactoringEngineAvailable(bool isAvailable);
 
     ClangBackEnd::FilePathCachingInterface &filePathCache()
     {
diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp
index c14bb541bef17256637ad367b6b8c22ed5135930..cd3da7d7ee2004752e83bf63f93d7916e35a2e7f 100644
--- a/src/plugins/cppeditor/cppeditorwidget.cpp
+++ b/src/plugins/cppeditor/cppeditorwidget.cpp
@@ -524,7 +524,7 @@ void CppEditorWidget::renameSymbolUnderCursor()
     using ClangBackEnd::SourceLocationsContainer;
 
     ProjectPart *projPart = projectPart();
-    if (!refactoringEngine().isUsable() || !projPart)
+    if (!projPart)
         return;
 
     d->m_useSelectionsUpdater.abortSchedule();
@@ -686,7 +686,7 @@ RefactorMarkers CppEditorWidget::refactorMarkersWithoutClangMarkers() const
 
 RefactoringEngineInterface &CppEditorWidget::refactoringEngine() const
 {
-    return CppTools::CppModelManager::refactoringEngine();
+    return *CppTools::CppModelManager::instance();
 }
 
 CppTools::FollowSymbolInterface &CppEditorWidget::followSymbolInterface() const
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index da45301782227095efac1233beb16c2127fbf92a..633ad7a747020449c92c72ad651fe4f62b21989c 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -119,6 +119,9 @@ protected:
 #endif // QTCREATOR_WITH_DUMP_AST
 
 namespace CppTools {
+
+using REType = RefactoringEngineType;
+
 namespace Internal {
 
 static QMutex m_instanceMutex;
@@ -167,7 +170,8 @@ public:
 
     // Refactoring
     CppRefactoringEngine m_builtInRefactoringEngine;
-    RefactoringEngineInterface *m_refactoringEngine { &m_builtInRefactoringEngine };
+    using REHash = QMap<REType, RefactoringEngineInterface *>;
+    REHash m_refactoringEngines {{REType::BuiltIn, &m_builtInRefactoringEngine}};
 };
 
 } // namespace Internal
@@ -267,17 +271,44 @@ QString CppModelManager::editorConfigurationFileName()
     return QLatin1String("<per-editor-defines>");
 }
 
-void CppModelManager::setRefactoringEngine(RefactoringEngineInterface *refactoringEngine)
+static RefactoringEngineInterface *getRefactoringEngine(
+        CppModelManagerPrivate::REHash &engines, bool excludeClangCodeModel = true)
+{
+    RefactoringEngineInterface *currentEngine = engines[REType::BuiltIn];
+    if (!excludeClangCodeModel && engines.find(REType::ClangCodeModel) != engines.end()) {
+        currentEngine = engines[REType::ClangCodeModel];
+    } else if (engines.find(REType::ClangRefactoring) != engines.end()) {
+        RefactoringEngineInterface *engine = engines[REType::ClangRefactoring];
+        if (engine->isRefactoringEngineAvailable())
+            currentEngine = engine;
+    }
+    return currentEngine;
+}
+
+void CppModelManager::startLocalRenaming(const CursorInEditor &data,
+                                         CppTools::ProjectPart *projectPart,
+                                         RenameCallback &&renameSymbolsCallback)
+{
+    RefactoringEngineInterface *engine = getRefactoringEngine(instance()->d->m_refactoringEngines,
+                                                              false);
+    engine->startLocalRenaming(data, projectPart, std::move(renameSymbolsCallback));
+}
+
+void CppModelManager::startGlobalRenaming(const CursorInEditor &data)
+{
+    RefactoringEngineInterface *engine = getRefactoringEngine(instance()->d->m_refactoringEngines);
+    engine->startGlobalRenaming(data);
+}
+
+void CppModelManager::addRefactoringEngine(RefactoringEngineType type,
+                                           RefactoringEngineInterface *refactoringEngine)
 {
-    if (refactoringEngine)
-        instance()->d->m_refactoringEngine = refactoringEngine;
-    else
-        instance()->d->m_refactoringEngine = &instance()->d->m_builtInRefactoringEngine;
+    instance()->d->m_refactoringEngines[type] = refactoringEngine;
 }
 
-RefactoringEngineInterface &CppModelManager::refactoringEngine()
+void CppModelManager::removeRefactoringEngine(RefactoringEngineType type)
 {
-    return *instance()->d->m_refactoringEngine;
+    instance()->d->m_refactoringEngines.remove(type);
 }
 
 FollowSymbolInterface &CppModelManager::followSymbolInterface() const
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index df04beec3a1ce6d58c5a5192aed07c9f5931ca3e..0a66e63badbc968362f72913e2e8f2d916ea42ae 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -27,6 +27,7 @@
 
 #include "cpptools_global.h"
 
+#include "refactoringengineinterface.h"
 #include "projectinfo.h"
 #include "projectpart.h"
 #include "projectpartheaderpath.h"
@@ -53,7 +54,6 @@ class CppCompletionAssistProvider;
 class CppEditorDocumentHandle;
 class CppIndexingSupport;
 class ModelManagerSupportProvider;
-class RefactoringEngineInterface;
 class FollowSymbolInterface;
 class SymbolFinder;
 class WorkingCopy;
@@ -67,7 +67,15 @@ namespace Tests {
 class ModelManagerTestHelper;
 }
 
-class CPPTOOLS_EXPORT CppModelManager : public CPlusPlus::CppModelManagerBase
+enum class RefactoringEngineType : int
+{
+    BuiltIn = 0,
+    ClangCodeModel = 1,
+    ClangRefactoring = 2
+};
+
+class CPPTOOLS_EXPORT CppModelManager final : public CPlusPlus::CppModelManagerBase,
+        public RefactoringEngineInterface
 {
     Q_OBJECT
 
@@ -140,6 +148,11 @@ public:
 
     QList<int> references(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
 
+    void startLocalRenaming(const CursorInEditor &data,
+                            CppTools::ProjectPart *projectPart,
+                            RenameCallback &&renameSymbolsCallback) final;
+    void startGlobalRenaming(const CursorInEditor &data) final;
+
     void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context,
                       const QString &replacement = QString());
     void findUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
@@ -179,8 +192,9 @@ public:
     static QString configurationFileName();
     static QString editorConfigurationFileName();
 
-    static void setRefactoringEngine(RefactoringEngineInterface *refactoringEngine);
-    static RefactoringEngineInterface &refactoringEngine();
+    static void addRefactoringEngine(RefactoringEngineType type,
+                                     RefactoringEngineInterface *refactoringEngine);
+    static void removeRefactoringEngine(RefactoringEngineType type);
 
     void renameIncludes(const QString &oldFileName, const QString &newFileName);
 
diff --git a/src/plugins/cpptools/cpprefactoringengine.h b/src/plugins/cpptools/cpprefactoringengine.h
index acbf02e5e657f52773c967370e2981a5e407f4d5..9ea61ec29ad466b032e9fac95544fa815872fe62 100644
--- a/src/plugins/cpptools/cpprefactoringengine.h
+++ b/src/plugins/cpptools/cpprefactoringengine.h
@@ -36,8 +36,6 @@ public:
                             CppTools::ProjectPart *projectPart,
                             RenameCallback &&renameSymbolsCallback) override;
     void startGlobalRenaming(const CppTools::CursorInEditor &data) override;
-
-    bool isUsable() const override { return true; }
 };
 
 } // namespace CppEditor
diff --git a/src/plugins/cpptools/refactoringengineinterface.h b/src/plugins/cpptools/refactoringengineinterface.h
index afb6025c036efafd65f8eef5fdc6c451a96ef47d..f18b6ba466c2fe056eb6f915311318fb91f88c9f 100644
--- a/src/plugins/cpptools/refactoringengineinterface.h
+++ b/src/plugins/cpptools/refactoringengineinterface.h
@@ -57,8 +57,7 @@ public:
                                     CppTools::ProjectPart *projectPart,
                                     RenameCallback &&renameSymbolsCallback) = 0;
     virtual void startGlobalRenaming(const CursorInEditor &data) = 0;
-
-    virtual bool isUsable() const = 0;
+    virtual bool isRefactoringEngineAvailable() const { return true; }
 };
 
 } // namespace CppTools
diff --git a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp
index c33b8ab38a28e6f7718c4fa1b6f55eea7cd89960..5ffc382e18701181f7125e3bc336f1b61ed5e707 100644
--- a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp
+++ b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp
@@ -82,25 +82,25 @@ TEST_F(ClangQueryProjectFindFilter, SupportedFindFlags)
 
 TEST_F(ClangQueryProjectFindFilter, IsNotUsableForUnusableServer)
 {
-    auto isUsable = findFilter.isUsable();
+    auto isUsable = findFilter.isAvailable();
 
     ASSERT_FALSE(isUsable);
 }
 
 TEST_F(ClangQueryProjectFindFilter, IsUsableForUsableServer)
 {
-    mockRefactoringServer.setUsable(true);
+    mockRefactoringServer.setAvailable(true);
 
-    auto isUsable = findFilter.isUsable();
+    auto isUsable = findFilter.isAvailable();
 
     ASSERT_TRUE(isUsable);
 }
 
 TEST_F(ClangQueryProjectFindFilter, ServerIsUsableForUsableFindFilter)
 {
-    findFilter.setUsable(true);
+    findFilter.setAvailable(true);
 
-    auto isUsable = mockRefactoringServer.isUsable();
+    auto isUsable = mockRefactoringServer.isAvailable();
 
     ASSERT_TRUE(isUsable);
 }
diff --git a/tests/unit/unittest/refactoringclient-test.cpp b/tests/unit/unittest/refactoringclient-test.cpp
index f159c424009e4c5f1aa3c74deb0f976eae522d2d..c562e832dbd470bd6fe5fb8ef6c40af00e32e401 100644
--- a/tests/unit/unittest/refactoringclient-test.cpp
+++ b/tests/unit/unittest/refactoringclient-test.cpp
@@ -123,7 +123,7 @@ TEST_F(RefactoringClient, AfterSourceLocationsForRenamingEngineIsUsableAgain)
 
     client.sourceLocationsForRenamingMessage(std::move(renameMessage));
 
-    ASSERT_TRUE(engine.isUsable());
+    ASSERT_TRUE(engine.isRefactoringEngineAvailable());
 }
 
 TEST_F(RefactoringClient, AfterStartLocalRenameHasValidCallback)
diff --git a/tests/unit/unittest/refactoringengine-test.cpp b/tests/unit/unittest/refactoringengine-test.cpp
index c1363bf7d889d6e75c8893b0fe5458eddd80938a..db6eaf86d472c8256b0cb0b996533002188c5aa0 100644
--- a/tests/unit/unittest/refactoringengine-test.cpp
+++ b/tests/unit/unittest/refactoringengine-test.cpp
@@ -99,26 +99,26 @@ TEST_F(RefactoringEngine, AfterSendRequestSourceLocationsForRenamingMessageIsUnu
     engine.startLocalRenaming(CppTools::CursorInEditor{cursor, filePath},
                               projectPart.data(), {});
 
-    ASSERT_FALSE(engine.isUsable());
+    ASSERT_FALSE(engine.isRefactoringEngineAvailable());
 }
 
 TEST_F(RefactoringEngine, EngineIsNotUsableForUnusableServer)
 {
-    ASSERT_FALSE(engine.isUsable());
+    ASSERT_FALSE(engine.isRefactoringEngineAvailable());
 }
 
 TEST_F(RefactoringEngine, EngineIsUsableForUsableServer)
 {
-    mockRefactoringServer.setUsable(true);
+    mockRefactoringServer.setAvailable(true);
 
-    ASSERT_TRUE(engine.isUsable());
+    ASSERT_TRUE(engine.isRefactoringEngineAvailable());
 }
 
 TEST_F(RefactoringEngine, ServerIsUsableForUsableEngine)
 {
-    engine.setUsable(true);
+    engine.setRefactoringEngineAvailable(true);
 
-    ASSERT_TRUE(mockRefactoringServer.isUsable());
+    ASSERT_TRUE(mockRefactoringServer.isAvailable());
 }
 
 void RefactoringEngine::SetUp()