diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp
index 0058ee4023b86b37aa4fd38400ca87e9db164b83..90abd59e95bee43b2fe6b7056a6c328a04fe6408 100644
--- a/src/plugins/clangcodemodel/clangutils.cpp
+++ b/src/plugins/clangcodemodel/clangutils.cpp
@@ -31,7 +31,7 @@
 #include <coreplugin/icore.h>
 #include <coreplugin/idocument.h>
 #include <cpptools/baseeditordocumentparser.h>
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/cppmodelmanager.h>
 #include <cpptools/editordocumenthandle.h>
 #include <cpptools/projectpart.h>
@@ -70,21 +70,53 @@ QStringList createClangOptions(const ProjectPart::Ptr &pPart, const QString &fil
     return createClangOptions(pPart, fileKind);
 }
 
-class LibClangOptionsBuilder final : public ClangCompilerOptionsBuilder
+static QString creatorResourcePath()
+{
+#ifndef UNIT_TESTS
+    return Core::ICore::instance()->resourcePath();
+#else
+    return QString();
+#endif
+}
+
+class LibClangOptionsBuilder final : public CompilerOptionsBuilder
 {
 public:
     LibClangOptionsBuilder(const ProjectPart &projectPart)
-        : ClangCompilerOptionsBuilder(projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR)
+        : CompilerOptionsBuilder(projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR)
     {
     }
 
+    void addPredefinedHeaderPathsOptions() final
+    {
+        CompilerOptionsBuilder::addPredefinedHeaderPathsOptions();
+        addWrappedQtHeadersIncludePath();
+    }
+
     void addExtraOptions() final
     {
         addDummyUiHeaderOnDiskIncludePath();
-        ClangCompilerOptionsBuilder::addExtraOptions();
+        add("-fmessage-length=0");
+        add("-fdiagnostics-show-note-include-stack");
+        add("-fmacro-backtrace-limit=0");
+        add("-fretain-comments-from-system-headers");
+        add("-ferror-limit=1000");
     }
 
 private:
+    void addWrappedQtHeadersIncludePath()
+    {
+        static const QString resourcePath = creatorResourcePath();
+        static QString wrappedQtHeadersPath = resourcePath + "/cplusplus/wrappedQtHeaders";
+        QTC_ASSERT(QDir(wrappedQtHeadersPath).exists(), return;);
+
+        if (m_projectPart.qtVersion != CppTools::ProjectPart::NoQt) {
+            const QString wrappedQtCoreHeaderPath = wrappedQtHeadersPath + "/QtCore";
+            add(includeDirOption() + QDir::toNativeSeparators(wrappedQtHeadersPath));
+            add(includeDirOption() + QDir::toNativeSeparators(wrappedQtCoreHeaderPath));
+        }
+    }
+
     void addDummyUiHeaderOnDiskIncludePath()
     {
         const QString path = ModelManagerSupportClang::instance()->dummyUiHeaderOnDiskDirPath();
diff --git a/src/plugins/clangpchmanager/projectupdater.cpp b/src/plugins/clangpchmanager/projectupdater.cpp
index 8327f85a2211700aa7f5c271b08a91dc43b6fb1d..09c56cc79ba6193e4f8b104dfd0564367831b320 100644
--- a/src/plugins/clangpchmanager/projectupdater.cpp
+++ b/src/plugins/clangpchmanager/projectupdater.cpp
@@ -31,7 +31,7 @@
 #include <removepchprojectpartsmessage.h>
 #include <updatepchprojectpartsmessage.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/projectpart.h>
 
 #include <algorithm>
@@ -108,9 +108,9 @@ HeaderAndSources ProjectUpdater::headerAndSourcesFromProjectPart(
 
 QStringList ProjectUpdater::compilerArguments(CppTools::ProjectPart *projectPart)
 {
-    using ClangCOBuilder = CppTools::ClangCompilerOptionsBuilder;
-    ClangCOBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR);
-    return builder.build(CppTools::ProjectFile::CXXHeader, ClangCOBuilder::PchUsage::None);
+    using CppTools::CompilerOptionsBuilder;
+    CompilerOptionsBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR);
+    return builder.build(CppTools::ProjectFile::CXXHeader, CompilerOptionsBuilder::PchUsage::None);
 }
 
 ClangBackEnd::V2::ProjectPartContainer ProjectUpdater::toProjectPartContainer(
diff --git a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp
index b3d52949bdcaa863ea769630a0bcc6c367b909ad..7f8c7ed92caa4ed656c6573f927649669acbeacb 100644
--- a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp
+++ b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp
@@ -32,7 +32,7 @@
 #include <refactoringserverinterface.h>
 #include <clangrefactoringservermessages.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 
 #include <QPointer>
 
@@ -151,12 +151,12 @@ void ClangQueryProjectsFindFilter::setUnsavedContent(
 Utils::SmallStringVector ClangQueryProjectsFindFilter::compilerArguments(CppTools::ProjectPart *projectPart,
                                                                          CppTools::ProjectFile::Kind fileKind)
 {
-    using CppTools::ClangCompilerOptionsBuilder;
+    using CppTools::CompilerOptionsBuilder;
 
-    ClangCompilerOptionsBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR);
+    CompilerOptionsBuilder builder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR);
 
     return Utils::SmallStringVector(builder.build(fileKind,
-                                                  ClangCompilerOptionsBuilder::PchUsage::None));
+                                                  CompilerOptionsBuilder::PchUsage::None));
 }
 
 QWidget *ClangQueryProjectsFindFilter::widget() const
@@ -170,7 +170,7 @@ Utils::SmallStringVector createCommandLine(CppTools::ProjectPart *projectPart,
                                            const QString &documentFilePath,
                                            CppTools::ProjectFile::Kind fileKind)
 {
-    using CppTools::ClangCompilerOptionsBuilder;
+    using CppTools::CompilerOptionsBuilder;
 
     Utils::SmallStringVector commandLine = ClangQueryProjectsFindFilter::compilerArguments(projectPart, fileKind);
 
diff --git a/src/plugins/clangrefactoring/refactoringengine.cpp b/src/plugins/clangrefactoring/refactoringengine.cpp
index 174254253cd9c6063652474044c6d3e2100c8086..083b0089ff3f9df22a729b7b574eac9d7fa27c21 100644
--- a/src/plugins/clangrefactoring/refactoringengine.cpp
+++ b/src/plugins/clangrefactoring/refactoringengine.cpp
@@ -31,7 +31,7 @@
 #include <refactoringserverinterface.h>
 #include <requestsourcelocationforrenamingmessage.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/cpptoolsreuse.h>
 
 #include <texteditor/textdocument.h>
@@ -58,7 +58,7 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data,
                                            CppTools::ProjectPart *projectPart,
                                            RenameCallback &&renameSymbolsCallback)
 {
-    using CppTools::ClangCompilerOptionsBuilder;
+    using CppTools::CompilerOptionsBuilder;
 
     setRefactoringEngineAvailable(false);
 
@@ -66,8 +66,8 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data,
 
     QString filePath = data.filePath().toString();
     QTextCursor textCursor = data.cursor();
-    ClangCompilerOptionsBuilder clangCOBuilder{*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR};
-    Utils::SmallStringVector commandLine{clangCOBuilder.build(
+    CompilerOptionsBuilder optionsBuilder{*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR};
+    Utils::SmallStringVector commandLine{optionsBuilder.build(
                     fileKindInProjectPart(projectPart, filePath),
                     CppTools::getPchUsage())};
 
diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
index ef1c79b7bb13b6ca5ba099e66402c6d1d7522a8b..1e26c408a2440c2164f8316efd4616b85a8bbb5a 100644
--- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
+++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
@@ -39,7 +39,7 @@
 #include <coreplugin/progressmanager/futureprogress.h>
 #include <coreplugin/progressmanager/progressmanager.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/cppmodelmanager.h>
 #include <cpptools/cppprojectfile.h>
 #include <cpptools/cpptoolsreuse.h>
@@ -191,45 +191,32 @@ QStringList inputAndOutputArgumentsRemoved(const QString &inputFile, const QStri
     return newArguments;
 }
 
-class ClangStaticAnalyzerOptionsBuilder final : public ClangCompilerOptionsBuilder
+class ClangStaticAnalyzerOptionsBuilder final : public CompilerOptionsBuilder
 {
 public:
     ClangStaticAnalyzerOptionsBuilder(const CppTools::ProjectPart &projectPart)
-        : ClangCompilerOptionsBuilder(projectPart)
-        , m_isMsvcToolchain(m_projectPart.toolchainType
-                            == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
-        , m_isMinGWToolchain(m_projectPart.toolchainType
-                            == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID)
+        : CompilerOptionsBuilder(projectPart)
     {
     }
 
     bool excludeHeaderPath(const QString &headerPath) const final
     {
-        if (m_isMinGWToolchain && headerPath.contains(m_projectPart.toolChainTargetTriple))
+        if (m_projectPart.toolchainType == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID
+                && headerPath.contains(m_projectPart.toolChainTargetTriple)) {
             return true;
-        return ClangCompilerOptionsBuilder::excludeHeaderPath(headerPath);
+        }
+        return CompilerOptionsBuilder::excludeHeaderPath(headerPath);
     }
 
     void addPredefinedHeaderPathsOptions() final
     {
         add("-undef");
-        if (m_isMsvcToolchain) {
+        if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
             // exclude default clang path to use msvc includes
             add("-nostdinc");
             add("-nostdlibinc");
         }
     }
-
-    void addExtraOptions() final {}
-
-    void addWrappedQtHeadersIncludePath() final
-    {
-        // Empty, analyzer doesn't need them
-    }
-
-private:
-    bool m_isMsvcToolchain;
-    bool m_isMinGWToolchain;
 };
 
 static QStringList createMsCompatibilityVersionOption(const ProjectPart &projectPart)
diff --git a/src/plugins/cpptools/clangcompileroptionsbuilder.cpp b/src/plugins/cpptools/clangcompileroptionsbuilder.cpp
deleted file mode 100644
index 40f40df8c7d19fddedb7220e87ab38d8d9291d05..0000000000000000000000000000000000000000
--- a/src/plugins/cpptools/clangcompileroptionsbuilder.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-****************************************************************************/
-
-#include "clangcompileroptionsbuilder.h"
-
-#include <coreplugin/icore.h>
-#include <projectexplorer/projectexplorerconstants.h>
-
-#include <utils/qtcassert.h>
-
-#include <QDir>
-
-namespace CppTools {
-
-static QString creatorResourcePath()
-{
-#ifndef UNIT_TESTS
-    return Core::ICore::instance()->resourcePath();
-#else
-    return QString();
-#endif
-}
-
-static QString creatorLibexecPath()
-{
-#ifndef UNIT_TESTS
-    return Core::ICore::instance()->libexecPath();
-#else
-    return QString();
-#endif
-}
-
-QStringList ClangCompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind,
-                                               PchUsage pchUsage)
-{
-    addWordWidth();
-    addTargetTriple();
-    addLanguageOption(fileKind);
-    addOptionsForLanguage(/*checkForBorlandExtensions*/ true);
-    enableExceptions();
-
-    addDefineFloat128ForMingw();
-    addToolchainAndProjectMacros();
-    undefineClangVersionMacrosForMsvc();
-    undefineCppLanguageFeatureMacrosForMsvc2015();
-
-    addPredefinedHeaderPathsOptions();
-    addWrappedQtHeadersIncludePath();
-    addPrecompiledHeaderOptions(pchUsage);
-    addHeaderPathOptions();
-    addProjectConfigFileInclude();
-
-    addMsvcCompatibilityVersion();
-
-    addExtraOptions();
-
-    return options();
-}
-
-ClangCompilerOptionsBuilder::ClangCompilerOptionsBuilder(const CppTools::ProjectPart &projectPart,
-                                                         const QString &clangVersion,
-                                                         const QString &clangResourceDirectory)
-    : CompilerOptionsBuilder(projectPart),
-      m_clangVersion(clangVersion),
-      m_clangResourceDirectory(clangResourceDirectory)
-{
-}
-
-bool ClangCompilerOptionsBuilder::excludeHeaderPath(const QString &path) const
-{
-    if (m_projectPart.toolchainType == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID
-            && path.contains("lib/gcc/i686-apple-darwin")) {
-        return true;
-    }
-
-    return CompilerOptionsBuilder::excludeHeaderPath(path);
-}
-
-void ClangCompilerOptionsBuilder::addPredefinedHeaderPathsOptions()
-{
-    add("-undef");
-    add("-nostdinc");
-    add("-nostdlibinc");
-
-    if (m_projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
-        add(includeDirOption() + clangIncludeDirectory());
-}
-
-void ClangCompilerOptionsBuilder::addWrappedQtHeadersIncludePath()
-{
-    static const QString resourcePath = creatorResourcePath();
-    static QString wrappedQtHeadersPath = resourcePath + "/cplusplus/wrappedQtHeaders";
-    QTC_ASSERT(QDir(wrappedQtHeadersPath).exists(), return;);
-
-    if (m_projectPart.qtVersion != CppTools::ProjectPart::NoQt) {
-        const QString wrappedQtCoreHeaderPath = wrappedQtHeadersPath + "/QtCore";
-        add(includeDirOption() + QDir::toNativeSeparators(wrappedQtHeadersPath));
-        add(includeDirOption() + QDir::toNativeSeparators(wrappedQtCoreHeaderPath));
-    }
-}
-
-void ClangCompilerOptionsBuilder::addProjectConfigFileInclude()
-{
-    if (!m_projectPart.projectConfigFile.isEmpty()) {
-        add("-include");
-        add(QDir::toNativeSeparators(m_projectPart.projectConfigFile));
-    }
-}
-
-void ClangCompilerOptionsBuilder::addExtraOptions()
-{
-    add("-fmessage-length=0");
-    add("-fdiagnostics-show-note-include-stack");
-    add("-fmacro-backtrace-limit=0");
-    add("-fretain-comments-from-system-headers");
-    add("-ferror-limit=1000");
-}
-
-QString ClangCompilerOptionsBuilder::clangIncludeDirectory() const
-{
-    QDir dir(creatorLibexecPath() + "/clang/lib/clang/" + m_clangVersion + "/include");
-    if (!dir.exists() || !QFileInfo(dir, "stdint.h").exists())
-        dir = QDir(m_clangResourceDirectory);
-    return QDir::toNativeSeparators(dir.canonicalPath());
-}
-
-void ClangCompilerOptionsBuilder::undefineClangVersionMacrosForMsvc()
-{
-    if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
-        static QStringList macroNames {
-            "__clang__",
-            "__clang_major__",
-            "__clang_minor__",
-            "__clang_patchlevel__",
-            "__clang_version__"
-        };
-
-        foreach (const QString &macroName, macroNames)
-            add(undefineOption() + macroName);
-    }
-}
-
-} // namespace CppTools
diff --git a/src/plugins/cpptools/clangcompileroptionsbuilder.h b/src/plugins/cpptools/clangcompileroptionsbuilder.h
deleted file mode 100644
index fbe2a5baad21ca7e34e7367ae1691e366b97e743..0000000000000000000000000000000000000000
--- a/src/plugins/cpptools/clangcompileroptionsbuilder.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-****************************************************************************/
-
-#pragma once
-
-#include "cpptools_global.h"
-
-#include <cpptools/compileroptionsbuilder.h>
-
-namespace CppTools {
-
-class CPPTOOLS_EXPORT ClangCompilerOptionsBuilder : public CompilerOptionsBuilder
-{
-public:
-    QStringList build(ProjectFile::Kind fileKind,
-                      PchUsage pchUsage);
-
-    ClangCompilerOptionsBuilder(const ProjectPart &projectPart,
-                                const QString &clangVersion = QString(),
-                                const QString &clangResourceDirectory = QString());
-
-    virtual void addPredefinedHeaderPathsOptions();
-    virtual void addExtraOptions();
-
-    bool excludeHeaderPath(const QString &path) const override;
-
-    virtual void addWrappedQtHeadersIncludePath();
-    void addProjectConfigFileInclude();
-
-    void undefineClangVersionMacrosForMsvc();
-private:
-    QString clangIncludeDirectory() const;
-    QString m_clangVersion;
-    QString m_clangResourceDirectory;
-};
-
-} // namespace CppTools
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp
index fc1aa534d0b265decb843cd155ad0cb957249bf8..72498021c6b297c8e00ecc4f0c8aa1791f1ad5b6 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.cpp
+++ b/src/plugins/cpptools/compileroptionsbuilder.cpp
@@ -25,7 +25,10 @@
 
 #include "compileroptionsbuilder.h"
 
+#include <coreplugin/icore.h>
+
 #include <projectexplorer/projectexplorerconstants.h>
+
 #include <utils/qtcfallthrough.h>
 
 #include <QDir>
@@ -33,9 +36,40 @@
 
 namespace CppTools {
 
-CompilerOptionsBuilder::CompilerOptionsBuilder(const ProjectPart &projectPart)
+CompilerOptionsBuilder::CompilerOptionsBuilder(const ProjectPart &projectPart,
+                                               const QString &clangVersion,
+                                               const QString &clangResourceDirectory)
     : m_projectPart(projectPart)
+    , m_clangVersion(clangVersion)
+    , m_clangResourceDirectory(clangResourceDirectory)
+{
+}
+
+QStringList CompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind, PchUsage pchUsage)
 {
+    m_options.clear();
+
+    addWordWidth();
+    addTargetTriple();
+    addLanguageOption(fileKind);
+    addOptionsForLanguage(/*checkForBorlandExtensions*/ true);
+    enableExceptions();
+
+    addDefineFloat128ForMingw();
+    addToolchainAndProjectMacros();
+    undefineClangVersionMacrosForMsvc();
+    undefineCppLanguageFeatureMacrosForMsvc2015();
+
+    addPredefinedHeaderPathsOptions();
+    addPrecompiledHeaderOptions(pchUsage);
+    addHeaderPathOptions();
+    addProjectConfigFileInclude();
+
+    addMsvcCompatibilityVersion();
+
+    addExtraOptions();
+
+    return options();
 }
 
 QStringList CompilerOptionsBuilder::options() const
@@ -438,6 +472,8 @@ bool CompilerOptionsBuilder::excludeHeaderPath(const QString &headerPath) const
     // intrinsics path from that version will lead to errors (unknown
     // intrinsics, unfavorable order with regard to include_next).
     if (m_projectPart.toolchainType == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID) {
+        if (headerPath.contains("lib/gcc/i686-apple-darwin"))
+            return true;
         static QRegularExpression clangIncludeDir(
                     QLatin1String("\\A.*/lib/clang/\\d+\\.\\d+(\\.\\d+)?/include\\z"));
         return clangIncludeDir.match(headerPath).hasMatch();
@@ -446,4 +482,57 @@ bool CompilerOptionsBuilder::excludeHeaderPath(const QString &headerPath) const
     return false;
 }
 
+void CompilerOptionsBuilder::addPredefinedHeaderPathsOptions()
+{
+    add("-undef");
+    add("-nostdinc");
+    add("-nostdlibinc");
+
+    if (!m_clangVersion.isEmpty()
+            && m_projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
+        add(includeDirOption() + clangIncludeDirectory());
+    }
+}
+
+void CompilerOptionsBuilder::addProjectConfigFileInclude()
+{
+    if (!m_projectPart.projectConfigFile.isEmpty()) {
+        add("-include");
+        add(QDir::toNativeSeparators(m_projectPart.projectConfigFile));
+    }
+}
+
+static QString creatorLibexecPath()
+{
+#ifndef UNIT_TESTS
+    return Core::ICore::instance()->libexecPath();
+#else
+    return QString();
+#endif
+}
+
+QString CompilerOptionsBuilder::clangIncludeDirectory() const
+{
+    QDir dir(creatorLibexecPath() + "/clang/lib/clang/" + m_clangVersion + "/include");
+    if (!dir.exists() || !QFileInfo(dir, "stdint.h").exists())
+        dir = QDir(m_clangResourceDirectory);
+    return QDir::toNativeSeparators(dir.canonicalPath());
+}
+
+void CompilerOptionsBuilder::undefineClangVersionMacrosForMsvc()
+{
+    if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
+        static QStringList macroNames {
+            "__clang__",
+            "__clang_major__",
+            "__clang_minor__",
+            "__clang_patchlevel__",
+            "__clang_version__"
+        };
+
+        foreach (const QString &macroName, macroNames)
+            add(undefineOption() + macroName);
+    }
+}
+
 } // namespace CppTools
diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h
index 8ca985dc28c7f2f3785803e1e00e8bbfabc9a668..5f5e3d5e8d064fa20eed1cb784544c8c6ab29265 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.h
+++ b/src/plugins/cpptools/compileroptionsbuilder.h
@@ -39,9 +39,21 @@ public:
         Use
     };
 
-    CompilerOptionsBuilder(const ProjectPart &projectPart);
+    CompilerOptionsBuilder(const ProjectPart &projectPart,
+                           const QString &clangVersion = QString(),
+                           const QString &clangResourceDirectory = QString());
     virtual ~CompilerOptionsBuilder() {}
 
+    virtual void addTargetTriple();
+    virtual void enableExceptions();
+    virtual void addPredefinedHeaderPathsOptions();
+    virtual void addLanguageOption(ProjectFile::Kind fileKind);
+    virtual void addOptionsForLanguage(bool checkForBorlandExtensions = true);
+
+    virtual void addExtraOptions() {}
+
+    QStringList build(ProjectFile::Kind fileKind,
+                      PchUsage pchUsage);
     QStringList options() const;
 
     // Add custom options
@@ -50,19 +62,17 @@ public:
 
     // Add options based on project part
     void addWordWidth();
-    virtual void addTargetTriple();
-    virtual void enableExceptions();
     void addHeaderPathOptions();
     void addPrecompiledHeaderOptions(PchUsage pchUsage);
     void addToolchainAndProjectMacros();
     void addMacros(const ProjectExplorer::Macros &macros);
-    virtual void addLanguageOption(ProjectFile::Kind fileKind);
-    virtual void addOptionsForLanguage(bool checkForBorlandExtensions = true);
 
     void addMsvcCompatibilityVersion();
     void undefineCppLanguageFeatureMacrosForMsvc2015();
 
     void addDefineFloat128ForMingw();
+    void addProjectConfigFileInclude();
+    void undefineClangVersionMacrosForMsvc();
 
 protected:
     virtual bool excludeDefineDirective(const ProjectExplorer::Macro &macro) const;
@@ -79,8 +89,11 @@ private:
     QByteArray macroOption(const ProjectExplorer::Macro &macro) const;
     QByteArray toDefineOption(const ProjectExplorer::Macro &macro) const;
     QString defineDirectiveToDefineOption(const ProjectExplorer::Macro &marco) const;
+    QString clangIncludeDirectory() const;
 
     QStringList m_options;
+    QString m_clangVersion;
+    QString m_clangResourceDirectory;
 };
 
 } // namespace CppTools
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index c9ca4e4c18d6ab7474cb110aeba02216a6616b2e..d73f185378b71d73eb4ef16a0bda9e071c06e5a3 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -91,7 +91,6 @@ HEADERS += \
     compileroptionsbuilder.h \
     refactoringengineinterface.h \
     cppprojectfilecategorizer.h \
-    clangcompileroptionsbuilder.h \
     cppprojectpartchooser.h \
     cppsymbolinfo.h \
     cursorineditor.h \
@@ -176,7 +175,6 @@ SOURCES += \
     cppprojectinfogenerator.cpp \
     compileroptionsbuilder.cpp \
     cppprojectfilecategorizer.cpp \
-    clangcompileroptionsbuilder.cpp \
     cppprojectpartchooser.cpp \
     wrappablelineedit.cpp \
 
diff --git a/src/plugins/cpptools/cpptools.qbs b/src/plugins/cpptools/cpptools.qbs
index cad4da41a56bdb0af8bf91e74c48d9fde67b4a4f..b65ce1cb95e26cbe68ea138674c57932ef98f6ec 100644
--- a/src/plugins/cpptools/cpptools.qbs
+++ b/src/plugins/cpptools/cpptools.qbs
@@ -42,8 +42,6 @@ Project {
             "builtinindexingsupport.h",
             "builtincursorinfo.cpp",
             "builtincursorinfo.h",
-            "clangcompileroptionsbuilder.cpp",
-            "clangcompileroptionsbuilder.h",
             "clangdiagnosticconfig.cpp",
             "clangdiagnosticconfig.h",
             "clangdiagnosticconfigsmodel.cpp",
diff --git a/src/plugins/cpptools/cpptoolsunittestfiles.pri b/src/plugins/cpptools/cpptoolsunittestfiles.pri
index 48c70fce6e2ffb6a2304fad444a91fb799dcb453..be04ec7948add3cb64749d80a5564e3e27b0d733 100644
--- a/src/plugins/cpptools/cpptoolsunittestfiles.pri
+++ b/src/plugins/cpptools/cpptoolsunittestfiles.pri
@@ -10,7 +10,6 @@ HEADERS += \
     $$PWD/projectpart.h \
     $$PWD/compileroptionsbuilder.h \
     $$PWD/cppprojectfilecategorizer.h \
-    $$PWD/clangcompileroptionsbuilder.h \
     $$PWD/projectinfo.h \
     $$PWD/cppprojectinfogenerator.cpp \
     $$PWD/cppprojectpartchooser.h \
@@ -21,7 +20,6 @@ SOURCES += \
     $$PWD/projectpart.cpp \
     $$PWD/compileroptionsbuilder.cpp \
     $$PWD/cppprojectfilecategorizer.cpp \
-    $$PWD/clangcompileroptionsbuilder.cpp \
     $$PWD/projectinfo.cpp \
     $$PWD/cppprojectinfogenerator.cpp \
     $$PWD/cppprojectpartchooser.cpp \
diff --git a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp
index 5ffc382e18701181f7125e3bc336f1b61ed5e707..fb7b63741dcc00d7ccc4e7cb20778b7bdc259de4 100644
--- a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp
+++ b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp
@@ -34,7 +34,7 @@
 
 #include <clangrefactoringservermessages.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/projectpart.h>
 
 namespace {
@@ -49,7 +49,7 @@ using testing::ReturnNew;
 using testing::DefaultValue;
 using testing::ByMove;
 
-using CppTools::ClangCompilerOptionsBuilder;
+using CppTools::CompilerOptionsBuilder;
 using ClangBackEnd::V2::FileContainer;
 
 class ClangQueryProjectFindFilter : public ::testing::Test
diff --git a/tests/unit/unittest/projectupdater-test.cpp b/tests/unit/unittest/projectupdater-test.cpp
index 071f9ea5db2e6f1221c7fb185378968b8df663ec..0589115901ff4a16a2eca106e107e35c1c3b27be 100644
--- a/tests/unit/unittest/projectupdater-test.cpp
+++ b/tests/unit/unittest/projectupdater-test.cpp
@@ -36,7 +36,7 @@
 #include <removepchprojectpartsmessage.h>
 #include <updatepchprojectpartsmessage.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/projectpart.h>
 
 namespace {
@@ -49,7 +49,7 @@ using testing::AnyNumber;
 
 using ClangBackEnd::V2::FileContainer;
 using ClangBackEnd::V2::ProjectPartContainer;
-using CppTools::ClangCompilerOptionsBuilder;
+using CppTools::CompilerOptionsBuilder;
 
 class ProjectUpdater : public testing::Test
 {
diff --git a/tests/unit/unittest/refactoringclient-test.cpp b/tests/unit/unittest/refactoringclient-test.cpp
index c562e832dbd470bd6fe5fb8ef6c40af00e32e401..9d81d73b689bb09bd152c1af71808bf73af15e22 100644
--- a/tests/unit/unittest/refactoringclient-test.cpp
+++ b/tests/unit/unittest/refactoringclient-test.cpp
@@ -35,7 +35,7 @@
 
 #include <clangrefactoringclientmessages.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/projectpart.h>
 
 #include <utils/smallstringvector.h>
@@ -45,7 +45,7 @@
 
 namespace {
 
-using CppTools::ClangCompilerOptionsBuilder;
+using CppTools::CompilerOptionsBuilder;
 
 using ClangRefactoring::RefactoringEngine;
 
diff --git a/tests/unit/unittest/refactoringengine-test.cpp b/tests/unit/unittest/refactoringengine-test.cpp
index db6eaf86d472c8256b0cb0b996533002188c5aa0..83fe1085c6f21c012506d06df08915fa24dafaa4 100644
--- a/tests/unit/unittest/refactoringengine-test.cpp
+++ b/tests/unit/unittest/refactoringengine-test.cpp
@@ -33,7 +33,7 @@
 
 #include <clangrefactoringmessages.h>
 
-#include <cpptools/clangcompileroptionsbuilder.h>
+#include <cpptools/compileroptionsbuilder.h>
 #include <cpptools/projectpart.h>
 
 #include <utils/smallstringvector.h>
@@ -45,7 +45,7 @@ namespace {
 
 using testing::_;
 
-using CppTools::ClangCompilerOptionsBuilder;
+using CppTools::CompilerOptionsBuilder;
 
 using ClangBackEnd::RequestSourceLocationsForRenamingMessage;
 
@@ -126,12 +126,10 @@ void RefactoringEngine::SetUp()
     projectPart = CppTools::ProjectPart::Ptr(new CppTools::ProjectPart);
     projectPart->files.push_back(projectFile);
 
-    ClangCompilerOptionsBuilder clangCOBuilder(*projectPart,
-                                               CLANG_VERSION,
-                                               CLANG_RESOURCE_DIR);
-    commandLine = Utils::SmallStringVector(clangCOBuilder.build(
+    CompilerOptionsBuilder optionsBuilder(*projectPart, CLANG_VERSION, CLANG_RESOURCE_DIR);
+    commandLine = Utils::SmallStringVector(optionsBuilder.build(
                                                projectFile.kind,
-                                               CppTools::CompilerOptionsBuilder::PchUsage::None));
+                                               CompilerOptionsBuilder::PchUsage::None));
     commandLine.push_back(qStringFilePath);
 }