diff --git a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp
index 3d4975c2455a0842278d6805b40701f7de452e02..41df471be70fe3c27c5d331e88fa4af0a09e013a 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.cpp
@@ -40,6 +40,10 @@
 namespace CMakeProjectManager {
 namespace Internal {
 
+// --------------------------------------------------------------------
+// CMakeKitConfigWidget:
+// --------------------------------------------------------------------
+
 CMakeKitConfigWidget::CMakeKitConfigWidget(ProjectExplorer::Kit *kit,
                                            const ProjectExplorer::KitInformation *ki) :
     ProjectExplorer::KitConfigWidget(kit, ki),
@@ -185,5 +189,76 @@ void CMakeKitConfigWidget::manageCMakeTools()
                                    buttonWidget());
 }
 
+// --------------------------------------------------------------------
+// CMakeGeneratorKitConfigWidget:
+// --------------------------------------------------------------------
+
+
+CMakeGeneratorKitConfigWidget::CMakeGeneratorKitConfigWidget(ProjectExplorer::Kit *kit,
+                                                             const ProjectExplorer::KitInformation *ki) :
+    ProjectExplorer::KitConfigWidget(kit, ki),
+    m_comboBox(new QComboBox)
+{
+    m_comboBox->setToolTip(toolTip());
+
+    refresh();
+    connect(m_comboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+            this, [this](int idx) {
+                m_ignoreChange = true;
+                CMakeGeneratorKitInformation::setGenerator(m_kit, m_comboBox->itemData(idx).toString());
+                m_ignoreChange = false;
+            });
+}
+
+CMakeGeneratorKitConfigWidget::~CMakeGeneratorKitConfigWidget()
+{
+    delete m_comboBox;
+}
+
+QString CMakeGeneratorKitConfigWidget::displayName() const
+{
+    return tr("CMake Generator:");
+}
+
+void CMakeGeneratorKitConfigWidget::makeReadOnly()
+{
+    m_comboBox->setEnabled(false);
+}
+
+void CMakeGeneratorKitConfigWidget::refresh()
+{
+    if (m_ignoreChange)
+        return;
+
+    CMakeTool *const tool = CMakeKitInformation::cmakeTool(m_kit);
+    if (tool != m_currentTool) {
+        m_comboBox->clear();
+        m_comboBox->addItem(tr("<Use Default Generator>"), QString());
+        if (tool && tool->isValid()) {
+            foreach (const QString &g, tool->supportedGenerators())
+                m_comboBox->addItem(g, g);
+        }
+    }
+
+    const QString generator = CMakeGeneratorKitInformation::generator(m_kit);
+    m_comboBox->setCurrentIndex(m_comboBox->findData(generator));
+}
+
+QWidget *CMakeGeneratorKitConfigWidget::mainWidget() const
+{
+    return m_comboBox;
+}
+
+QWidget *CMakeGeneratorKitConfigWidget::buttonWidget() const
+{
+    return nullptr;
+}
+
+QString CMakeGeneratorKitConfigWidget::toolTip() const
+{
+    return tr("CMake generator defines how a project is built when using CMake.<br>"
+              "This setting is ignored when using other build systems.");
+}
+
 } // namespace Internal
 } // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.h b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.h
index fa5e64b45a0b845e230c18e3678582d2f87eb553..8ba37500937f4a0ad761c6fecf351786a097824b 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.h
+++ b/src/plugins/cmakeprojectmanager/cmakekitconfigwidget.h
@@ -41,6 +41,10 @@ class CMakeTool;
 
 namespace Internal {
 
+// --------------------------------------------------------------------
+// CMakeKitConfigWidget:
+// --------------------------------------------------------------------
+
 class CMakeKitConfigWidget : public ProjectExplorer::KitConfigWidget
 {
     Q_OBJECT
@@ -70,5 +74,30 @@ private:
     QPushButton *m_manageButton;
 };
 
+// --------------------------------------------------------------------
+// CMakeGeneratorKitConfigWidget:
+// --------------------------------------------------------------------
+
+class CMakeGeneratorKitConfigWidget : public ProjectExplorer::KitConfigWidget
+{
+    Q_OBJECT
+public:
+    CMakeGeneratorKitConfigWidget(ProjectExplorer::Kit *kit, const ProjectExplorer::KitInformation *ki);
+    ~CMakeGeneratorKitConfigWidget() override;
+
+    // KitConfigWidget interface
+    QString displayName() const override;
+    void makeReadOnly() override;
+    void refresh() override;
+    QWidget *mainWidget() const override;
+    QWidget *buttonWidget() const override;
+    QString toolTip() const override;
+
+private:
+    bool m_ignoreChange = false;
+    QComboBox *m_comboBox;
+    CMakeTool *m_currentTool = nullptr;
+};
+
 } // namespace Internal
 } // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
index c3126d83bee957c5b0abbcee83001da46d83ab00..baa5063f01ad48ffb0c2013f7b675b371de17b0d 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
@@ -50,6 +50,10 @@ static Core::Id defaultCMakeToolId()
 
 static const char TOOL_ID[] = "CMakeProjectManager.CMakeKitInformation";
 
+// --------------------------------------------------------------------
+// CMakeKitInformation:
+// --------------------------------------------------------------------
+
 CMakeKitInformation::CMakeKitInformation()
 {
     setObjectName(QLatin1String("CMakeKitInformation"));
@@ -118,4 +122,120 @@ KitConfigWidget *CMakeKitInformation::createConfigWidget(Kit *k) const
     return new Internal::CMakeKitConfigWidget(k, this);
 }
 
+// --------------------------------------------------------------------
+// CMakeGeneratorKitInformation:
+// --------------------------------------------------------------------
+
+static const char GENERATOR_ID[] = "CMake.GeneratorKitInformation";
+
+CMakeGeneratorKitInformation::CMakeGeneratorKitInformation()
+{
+    setObjectName(QLatin1String("CMakeGeneratorKitInformation"));
+    setId(GENERATOR_ID);
+    setPriority(19000);
+}
+
+QString CMakeGeneratorKitInformation::generator(const Kit *k)
+{
+    if (!k)
+        return QString();
+    return k->value(GENERATOR_ID).toString();
+}
+
+void CMakeGeneratorKitInformation::setGenerator(Kit *k, const QString &generator)
+{
+    if (!k)
+        return;
+    k->setValue(GENERATOR_ID, generator);
+}
+
+QString CMakeGeneratorKitInformation::generatorArgument(const Kit *k)
+{
+    QString tmp = generator(k);
+    if (tmp.isEmpty())
+        return QString::fromLatin1("-G") + tmp;
+    return tmp;
+}
+
+QVariant CMakeGeneratorKitInformation::defaultValue(const Kit *k) const
+{
+    CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
+    if (!tool)
+        return QString();
+    QStringList known = tool->supportedGenerators();
+    auto it = std::find_if(known.constBegin(), known.constEnd(),
+                           [](const QString &s) { return s == QLatin1String("CodeBlocks - Ninja"); });
+    if (it == known.constEnd())
+        it = std::find_if(known.constBegin(), known.constEnd(),
+                          [](const QString &s) { return s == QLatin1String("CodeBlocks - Unix Makefiles"); });
+    if (it == known.constEnd())
+        it = std::find_if(known.constBegin(), known.constEnd(),
+                          [](const QString &s) { return s == QLatin1String("CodeBlocks - NMake Makefiles"); });
+    if (it == known.constEnd())
+        it = known.constBegin(); // Fallback to the first generator...
+    if (it != known.constEnd())
+        return *it;
+    return QString();
+}
+
+QList<Task> CMakeGeneratorKitInformation::validate(const Kit *k) const
+{
+    CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
+    QString generator = CMakeGeneratorKitInformation::generator(k);
+
+    QList<Task> result;
+    if (!tool) {
+        if (!generator.isEmpty()) {
+            result << Task(Task::Warning, tr("No CMake Tool configured, CMake generator will be ignored."),
+                           Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
+        }
+    } else {
+        if (!tool->isValid()) {
+            result << Task(Task::Warning, tr("CMake Tool is unconfigured, CMake generator will be ignored."),
+                           Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
+        } else {
+            QStringList known = tool->supportedGenerators();
+            if (!known.contains(generator)) {
+                result << Task(Task::Error, tr("CMake Tool does not support the configured generator."),
+                               Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
+            }
+            if (!generator.startsWith(QLatin1String("CodeBlocks -"))) {
+                result << Task(Task::Warning, tr("CMake generator does not generate CodeBlocks file. "
+                                                 "Qt Creator will not be able to parse the CMake project."),
+                               Utils::FileName(), -1, Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM));
+            }
+        }
+    }
+    return result;
+}
+
+void CMakeGeneratorKitInformation::setup(Kit *k)
+{
+    CMakeGeneratorKitInformation::setGenerator(k, defaultValue(k).toString());
+}
+
+void CMakeGeneratorKitInformation::fix(Kit *k)
+{
+    const CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
+    const QString generator = CMakeGeneratorKitInformation::generator(k);
+
+    if (!tool)
+        return;
+    QStringList known = tool->supportedGenerators();
+    if (generator.isEmpty() || !known.contains(generator))
+        CMakeGeneratorKitInformation::setGenerator(k, defaultValue(k).toString());
+}
+
+KitInformation::ItemList CMakeGeneratorKitInformation::toUserOutput(const Kit *k) const
+{
+    const QString generator = CMakeGeneratorKitInformation::generator(k);
+    return ItemList() << qMakePair(tr("CMake Generator"),
+                                   generator.isEmpty() ? tr("<Use Default Generator>") : generator);
+}
+
+KitConfigWidget *CMakeGeneratorKitInformation::createConfigWidget(Kit *k) const
+{
+    return new Internal::CMakeGeneratorKitConfigWidget(k, this);
+}
+
 } // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.h b/src/plugins/cmakeprojectmanager/cmakekitinformation.h
index 72832c6ab3c98e48a3e5fd1d815349db3cbdd8ff..99aa6bf129303cb325a397723a849704c334b501 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitinformation.h
+++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.h
@@ -51,4 +51,23 @@ public:
     ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *k) const override;
 };
 
+class CMAKE_EXPORT CMakeGeneratorKitInformation : public ProjectExplorer::KitInformation
+{
+    Q_OBJECT
+public:
+    CMakeGeneratorKitInformation();
+
+    static QString generator(const ProjectExplorer::Kit *k);
+    static void setGenerator(ProjectExplorer::Kit *k, const QString &generator);
+    static QString generatorArgument(const ProjectExplorer::Kit *k);
+
+    // KitInformation interface
+    QVariant defaultValue(const ProjectExplorer::Kit *k) const override;
+    QList<ProjectExplorer::Task> validate(const ProjectExplorer::Kit *k) const override;
+    void setup(ProjectExplorer::Kit *k) override;
+    void fix(ProjectExplorer::Kit *k) override;
+    ItemList toUserOutput(const ProjectExplorer::Kit *k) const override;
+    ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *k) const override;
+};
+
 } // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakepreloadcachekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakepreloadcachekitinformation.cpp
index c21b7e50f552d51720cec33bce0fbc14ca3b8dea..b459eebfb4d68f7a0f65d22c585b81d592c28f3d 100644
--- a/src/plugins/cmakeprojectmanager/cmakepreloadcachekitinformation.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakepreloadcachekitinformation.cpp
@@ -43,7 +43,7 @@ CMakePreloadCacheKitInformation::CMakePreloadCacheKitInformation()
 {
     setObjectName(QLatin1String("CMakePreloadCacheKitInformation"));
     setId(CMakePreloadCacheKitInformation::id());
-    setPriority(19000);
+    setPriority(18000);
 }
 
 Core::Id CMakePreloadCacheKitInformation::id()
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp
index 23c046f1d977aca4e29ccf28289488ab98c6505a..af78a1b5ac172b50b9016158e5fc10e212de4106 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp
@@ -63,6 +63,7 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString *
     new CMakeToolManager(this);
 
     ProjectExplorer::KitManager::registerKitInformation(new CMakeKitInformation);
+    ProjectExplorer::KitManager::registerKitInformation(new CMakeGeneratorKitInformation);
     ProjectExplorer::KitManager::registerKitInformation(new CMakePreloadCacheKitInformation);
 
     return true;