diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
index 18355e7258b8eb7dd9cce18c53ec9ef2a93da844..26bb9f68562bfb7abd98d3380a07fd897da98d15 100644
--- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
@@ -31,6 +31,7 @@
 #include "cmakeprojectmanager.h"
 #include "cmakebuildconfiguration.h"
 #include "cmakebuildinfo.h"
+#include "generatorinfo.h"
 
 #include <coreplugin/icore.h>
 #include <utils/hostosinfo.h>
@@ -70,146 +71,6 @@ using namespace CMakeProjectManager::Internal;
 //                                   |--> Page: Ask for cmd options, run generator
 
 
-namespace CMakeProjectManager {
-namespace Internal {
-    class GeneratorInfo
-    {
-        Q_DECLARE_TR_FUNCTIONS(CMakeProjectManager::Internal::GeneratorInfo)
-    public:
-        enum Ninja { NoNinja, OfferNinja, ForceNinja };
-        static QList<GeneratorInfo> generatorInfosFor(ProjectExplorer::Kit *k, Ninja n, bool preferNinja, bool hasCodeBlocks);
-
-        GeneratorInfo();
-        explicit GeneratorInfo(ProjectExplorer::Kit *kit, bool ninja = false);
-
-        ProjectExplorer::Kit *kit() const;
-        bool isNinja() const;
-
-        QString displayName() const;
-        QByteArray generatorArgument() const;
-        QByteArray generator() const;
-
-    private:
-        ProjectExplorer::Kit *m_kit;
-        bool m_isNinja;
-    };
-}
-}
-
-Q_DECLARE_METATYPE(CMakeProjectManager::Internal::GeneratorInfo);
-
-GeneratorInfo::GeneratorInfo()
-    : m_kit(0), m_isNinja(false)
-{}
-
-GeneratorInfo::GeneratorInfo(ProjectExplorer::Kit *kit, bool ninja)
-    : m_kit(kit), m_isNinja(ninja)
-{}
-
-ProjectExplorer::Kit *GeneratorInfo::kit() const
-{
-    return m_kit;
-}
-
-bool GeneratorInfo::isNinja() const {
-    return m_isNinja;
-}
-
-QByteArray GeneratorInfo::generator() const
-{
-    if (!m_kit)
-        return QByteArray();
-    ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(m_kit);
-    ProjectExplorer::Abi targetAbi = tc->targetAbi();
-    if (m_isNinja) {
-        return "Ninja";
-    } else if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
-        if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
-                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
-                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor
-                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2012Flavor) {
-            return "NMake Makefiles";
-        } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) {
-            if (Utils::HostOsInfo::isWindowsHost())
-                return "MinGW Makefiles";
-            else
-                return "Unix Makefiles";
-        }
-    }
-    return "Unix Makefiles";
-}
-
-QByteArray GeneratorInfo::generatorArgument() const
-{
-    QByteArray tmp = generator();
-    if (tmp.isEmpty())
-        return tmp;
-    return QByteArray("-GCodeBlocks - ") + tmp;
-}
-
-QString GeneratorInfo::displayName() const
-{
-    if (!m_kit)
-        return QString();
-    if (m_isNinja)
-        return tr("Ninja (%1)").arg(m_kit->displayName());
-    ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(m_kit);
-    ProjectExplorer::Abi targetAbi = tc->targetAbi();
-    if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
-        if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
-                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
-                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor
-                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2012Flavor) {
-            return tr("NMake Generator (%1)").arg(m_kit->displayName());
-        } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) {
-            if (Utils::HostOsInfo::isWindowsHost())
-                return tr("MinGW Generator (%1)").arg(m_kit->displayName());
-            else
-                return tr("Unix Generator (%1)").arg(m_kit->displayName());
-        }
-    } else {
-        // Non windows
-        return tr("Unix Generator (%1)").arg(m_kit->displayName());
-    }
-    return QString();
-}
-
-QList<GeneratorInfo> GeneratorInfo::generatorInfosFor(ProjectExplorer::Kit *k, Ninja n, bool preferNinja, bool hasCodeBlocks)
-{
-    QList<GeneratorInfo> results;
-    ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(k);
-    if (!tc)
-        return results;
-    Core::Id deviceType = ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(k);
-    if (deviceType !=  ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE
-            && deviceType != RemoteLinux::Constants::GenericLinuxOsType)
-        return results;
-    ProjectExplorer::Abi targetAbi = tc->targetAbi();
-    if (n != ForceNinja) {
-        if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
-            if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
-                    || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
-                    || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor
-                    || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2012Flavor) {
-                if (hasCodeBlocks)
-                    results << GeneratorInfo(k);
-            } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) {
-                results << GeneratorInfo(k);
-            }
-        } else {
-            // Non windows
-            results << GeneratorInfo(k);
-        }
-    }
-    if (n != NoNinja) {
-        if (preferNinja)
-            results.prepend(GeneratorInfo(k, true));
-        else
-            results.append(GeneratorInfo(k, true));
-    }
-    return results;
-}
-
 //////////////
 /// CMakeOpenProjectWizard
 //////////////
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
index a013af53329369707510d468068953fd9b5d07b6..6b080482a3354e840c8d3f38f1ad3d1269440b3d 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
@@ -46,15 +46,8 @@
 #include <utils/QtConcurrentTools>
 #include <QtConcurrentRun>
 #include <QCoreApplication>
-#include <QSettings>
 #include <QDateTime>
-#include <QFormLayout>
-#include <QBoxLayout>
 #include <QDesktopServices>
-#include <QApplication>
-#include <QLabel>
-#include <QGroupBox>
-#include <QSpacerItem>
 
 using namespace CMakeProjectManager::Internal;
 
@@ -248,145 +241,3 @@ QString CMakeManager::qtVersionForQMake(const QString &qmakePath)
     }
     return QString();
 }
-
-/////
-// CMakeSettingsPage
-////
-
-
-CMakeSettingsPage::CMakeSettingsPage()
-    :  m_pathchooser(0), m_preferNinja(0)
-{
-    setId("Z.CMake");
-    setDisplayName(tr("CMake"));
-    setCategory(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
-    setDisplayCategory(QCoreApplication::translate("ProjectExplorer",
-       ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_TR_CATEGORY));
-    setCategoryIcon(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY_ICON));
-
-    QSettings *settings = Core::ICore::settings();
-    settings->beginGroup(QLatin1String("CMakeSettings"));
-    m_cmakeValidatorForUser.setCMakeExecutable(settings->value(QLatin1String("cmakeExecutable")).toString());
-    settings->endGroup();
-
-    m_cmakeValidatorForSystem.setCMakeExecutable(findCmakeExecutable());
-}
-
-bool CMakeSettingsPage::isCMakeExecutableValid() const
-{
-    if (m_cmakeValidatorForUser.isValid())
-        return true;
-
-    return m_cmakeValidatorForSystem.isValid();
-}
-
-CMakeSettingsPage::~CMakeSettingsPage()
-{
-    m_cmakeValidatorForUser.cancel();
-    m_cmakeValidatorForSystem.cancel();
-}
-
-QString CMakeSettingsPage::findCmakeExecutable() const
-{
-    return Utils::Environment::systemEnvironment().searchInPath(QLatin1String("cmake"));
-}
-
-QWidget *CMakeSettingsPage::widget()
-{
-    if (!m_widget) {
-        m_widget = new QWidget;
-        QFormLayout *formLayout = new QFormLayout(m_widget);
-        formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
-        m_pathchooser = new Utils::PathChooser;
-        m_pathchooser->setExpectedKind(Utils::PathChooser::ExistingCommand);
-        m_pathchooser->setHistoryCompleter(QLatin1String("Cmake.Command.History"));
-        formLayout->addRow(tr("Executable:"), m_pathchooser);
-        formLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding));
-
-        m_preferNinja = new QCheckBox(tr("Prefer Ninja generator (CMake 2.8.9 or higher required)"));
-        formLayout->addRow(m_preferNinja);
-    }
-    m_pathchooser->setPath(m_cmakeValidatorForUser.cmakeExecutable());
-    m_preferNinja->setChecked(preferNinja());
-    return m_widget;
-}
-
-void CMakeSettingsPage::saveSettings() const
-{
-    QSettings *settings = Core::ICore::settings();
-    settings->beginGroup(QLatin1String("CMakeSettings"));
-    settings->setValue(QLatin1String("cmakeExecutable"), m_cmakeValidatorForUser.cmakeExecutable());
-    settings->setValue(QLatin1String("preferNinja"), m_preferNinja->isChecked());
-    settings->endGroup();
-}
-
-void CMakeSettingsPage::apply()
-{
-    if (!m_pathchooser) // page was never shown
-        return;
-    if (m_cmakeValidatorForUser.cmakeExecutable() != m_pathchooser->path())
-        m_cmakeValidatorForUser.setCMakeExecutable(m_pathchooser->path());
-    saveSettings();
-}
-
-void CMakeSettingsPage::finish()
-{
-    delete m_widget;
-}
-
-QString CMakeSettingsPage::cmakeExecutable() const
-{
-    if (!isCMakeExecutableValid())
-        return QString();
-
-    if (m_cmakeValidatorForUser.isValid())
-        return m_cmakeValidatorForUser.cmakeExecutable();
-    if (m_cmakeValidatorForSystem.isValid())
-        return m_cmakeValidatorForSystem.cmakeExecutable();
-    return QString();
-}
-
-void CMakeSettingsPage::setCMakeExecutable(const QString &executable)
-{
-    if (m_cmakeValidatorForUser.cmakeExecutable() == executable)
-        return;
-    m_cmakeValidatorForUser.setCMakeExecutable(executable);
-}
-
-bool CMakeSettingsPage::hasCodeBlocksMsvcGenerator() const
-{
-    if (m_cmakeValidatorForUser.isValid())
-        return m_cmakeValidatorForUser.hasCodeBlocksMsvcGenerator();
-    if (m_cmakeValidatorForSystem.isValid())
-        return m_cmakeValidatorForSystem.hasCodeBlocksMsvcGenerator();
-    return false;
-}
-
-bool CMakeSettingsPage::hasCodeBlocksNinjaGenerator() const
-{
-    if (m_cmakeValidatorForUser.isValid())
-        return m_cmakeValidatorForUser.hasCodeBlocksNinjaGenerator();
-    if (m_cmakeValidatorForSystem.isValid())
-        return m_cmakeValidatorForSystem.hasCodeBlocksNinjaGenerator();
-    return false;
-}
-
-bool CMakeSettingsPage::preferNinja() const
-{
-    QSettings *settings = Core::ICore::settings();
-    settings->beginGroup(QLatin1String("CMakeSettings"));
-    const bool r = settings->value(QLatin1String("preferNinja"), false).toBool();
-    settings->endGroup();
-    return r;
-}
-
-TextEditor::Keywords CMakeSettingsPage::keywords()
-{
-    if (m_cmakeValidatorForUser.isValid())
-        return m_cmakeValidatorForUser.keywords();
-
-    if (m_cmakeValidatorForSystem.isValid())
-        return m_cmakeValidatorForSystem.keywords();
-
-    return TextEditor::Keywords(QStringList(), QStringList(), QMap<QString, QStringList>());
-}
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
index 0b3509b52057f0132c70712f56ef6c8eaf22ab3d..f0fe2d6603117d85fccb7784955bb1eb298b7125 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
@@ -31,14 +31,11 @@
 #define CMAKEPROJECTMANAGER_H
 
 #include <projectexplorer/iprojectmanager.h>
-#include <coreplugin/dialogs/ioptionspage.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/projectnodes.h>
 #include <coreplugin/icontext.h>
-#include <texteditor/codeassist/keywordscompletionassist.h>
 
 #include <utils/environment.h>
-#include <utils/pathchooser.h>
 
 #include <QAction>
 #include <QCheckBox>
@@ -48,9 +45,7 @@
 #include <QStringList>
 #include <QVector>
 
-#include "cmakevalidator.h"
-
-QT_FORWARD_DECLARE_CLASS(QLabel)
+#include "cmakesettingspage.h"
 
 namespace Utils { class QtcProcess; }
 
@@ -99,38 +94,6 @@ private:
     ProjectExplorer::Project *m_contextProject;
 };
 
-class CMakeSettingsPage : public Core::IOptionsPage
-{
-    Q_OBJECT
-
-public:
-    CMakeSettingsPage();
-    ~CMakeSettingsPage();
-
-    QWidget *widget();
-    void apply();
-    void finish();
-
-    QString cmakeExecutable() const;
-    void setCMakeExecutable(const QString &executable);
-    bool isCMakeExecutableValid() const;
-    bool hasCodeBlocksMsvcGenerator() const;
-    bool hasCodeBlocksNinjaGenerator() const;
-    bool preferNinja() const;
-
-    TextEditor::Keywords keywords();
-
-private:
-    void saveSettings() const;
-    QString findCmakeExecutable() const;
-
-    QPointer<QWidget> m_widget;
-    Utils::PathChooser *m_pathchooser;
-    QCheckBox *m_preferNinja;
-    CMakeValidator m_cmakeValidatorForUser;
-    CMakeValidator m_cmakeValidatorForSystem;
-};
-
 } // namespace Internal
 } // namespace CMakeProjectManager
 
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro
index e0e8c8ce974f9af5fb324294aac988d73d97ea9f..7c1203cf4101695418baec15e1ce0809e42576a5 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro
@@ -17,7 +17,9 @@ HEADERS = cmakebuildinfo.h \
     cmakelocatorfilter.h \
     cmakefilecompletionassist.h \
     cmakevalidator.h \
-    cmakeparser.h
+    cmakeparser.h \
+    generatorinfo.h \
+    cmakesettingspage.h
 
 SOURCES = cmakeproject.cpp \
     cmakeprojectplugin.cpp \
@@ -34,7 +36,9 @@ SOURCES = cmakeproject.cpp \
     cmakelocatorfilter.cpp \
     cmakefilecompletionassist.cpp \
     cmakevalidator.cpp \
-    cmakeparser.cpp
+    cmakeparser.cpp \
+    generatorinfo.cpp \
+    cmakesettingspage.cpp
 
 
 RESOURCES += cmakeproject.qrc
diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bc1360cdb56d8d5aef35f333ba40951e35befa78
--- /dev/null
+++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
@@ -0,0 +1,188 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "cmakesettingspage.h"
+
+#include <projectexplorer/projectexplorerconstants.h>
+#include <coreplugin/icore.h>
+#include <utils/environment.h>
+
+#include <QSettings>
+#include <QGroupBox>
+#include <QSpacerItem>
+#include <QFormLayout>
+#include <QBoxLayout>
+#include <QCheckBox>
+
+namespace CMakeProjectManager {
+namespace Internal {
+
+/////
+// CMakeSettingsPage
+////
+
+
+CMakeSettingsPage::CMakeSettingsPage()
+    :  m_pathchooser(0), m_preferNinja(0)
+{
+    setId("Z.CMake");
+    setDisplayName(tr("CMake"));
+    setCategory(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY);
+    setDisplayCategory(QCoreApplication::translate("ProjectExplorer",
+       ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_TR_CATEGORY));
+    setCategoryIcon(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY_ICON));
+
+    QSettings *settings = Core::ICore::settings();
+    settings->beginGroup(QLatin1String("CMakeSettings"));
+    m_cmakeValidatorForUser.setCMakeExecutable(settings->value(QLatin1String("cmakeExecutable")).toString());
+    settings->endGroup();
+
+    m_cmakeValidatorForSystem.setCMakeExecutable(findCmakeExecutable());
+}
+
+bool CMakeSettingsPage::isCMakeExecutableValid() const
+{
+    if (m_cmakeValidatorForUser.isValid())
+        return true;
+
+    return m_cmakeValidatorForSystem.isValid();
+}
+
+CMakeSettingsPage::~CMakeSettingsPage()
+{
+    m_cmakeValidatorForUser.cancel();
+    m_cmakeValidatorForSystem.cancel();
+}
+
+QString CMakeSettingsPage::findCmakeExecutable() const
+{
+    return Utils::Environment::systemEnvironment().searchInPath(QLatin1String("cmake"));
+}
+
+QWidget *CMakeSettingsPage::widget()
+{
+    if (!m_widget) {
+        m_widget = new QWidget;
+        QFormLayout *formLayout = new QFormLayout(m_widget);
+        formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
+        m_pathchooser = new Utils::PathChooser;
+        m_pathchooser->setExpectedKind(Utils::PathChooser::ExistingCommand);
+        m_pathchooser->setHistoryCompleter(QLatin1String("Cmake.Command.History"));
+        formLayout->addRow(tr("Executable:"), m_pathchooser);
+        formLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding));
+
+        m_preferNinja = new QCheckBox(tr("Prefer Ninja generator (CMake 2.8.9 or higher required)"));
+        formLayout->addRow(m_preferNinja);
+    }
+    m_pathchooser->setPath(m_cmakeValidatorForUser.cmakeExecutable());
+    m_preferNinja->setChecked(preferNinja());
+    return m_widget;
+}
+
+void CMakeSettingsPage::saveSettings() const
+{
+    QSettings *settings = Core::ICore::settings();
+    settings->beginGroup(QLatin1String("CMakeSettings"));
+    settings->setValue(QLatin1String("cmakeExecutable"), m_cmakeValidatorForUser.cmakeExecutable());
+    settings->setValue(QLatin1String("preferNinja"), m_preferNinja->isChecked());
+    settings->endGroup();
+}
+
+void CMakeSettingsPage::apply()
+{
+    if (!m_pathchooser) // page was never shown
+        return;
+    if (m_cmakeValidatorForUser.cmakeExecutable() != m_pathchooser->path())
+        m_cmakeValidatorForUser.setCMakeExecutable(m_pathchooser->path());
+    saveSettings();
+}
+
+void CMakeSettingsPage::finish()
+{
+    delete m_widget;
+}
+
+QString CMakeSettingsPage::cmakeExecutable() const
+{
+    if (!isCMakeExecutableValid())
+        return QString();
+
+    if (m_cmakeValidatorForUser.isValid())
+        return m_cmakeValidatorForUser.cmakeExecutable();
+    if (m_cmakeValidatorForSystem.isValid())
+        return m_cmakeValidatorForSystem.cmakeExecutable();
+    return QString();
+}
+
+void CMakeSettingsPage::setCMakeExecutable(const QString &executable)
+{
+    if (m_cmakeValidatorForUser.cmakeExecutable() == executable)
+        return;
+    m_cmakeValidatorForUser.setCMakeExecutable(executable);
+}
+
+bool CMakeSettingsPage::hasCodeBlocksMsvcGenerator() const
+{
+    if (m_cmakeValidatorForUser.isValid())
+        return m_cmakeValidatorForUser.hasCodeBlocksMsvcGenerator();
+    if (m_cmakeValidatorForSystem.isValid())
+        return m_cmakeValidatorForSystem.hasCodeBlocksMsvcGenerator();
+    return false;
+}
+
+bool CMakeSettingsPage::hasCodeBlocksNinjaGenerator() const
+{
+    if (m_cmakeValidatorForUser.isValid())
+        return m_cmakeValidatorForUser.hasCodeBlocksNinjaGenerator();
+    if (m_cmakeValidatorForSystem.isValid())
+        return m_cmakeValidatorForSystem.hasCodeBlocksNinjaGenerator();
+    return false;
+}
+
+bool CMakeSettingsPage::preferNinja() const
+{
+    QSettings *settings = Core::ICore::settings();
+    settings->beginGroup(QLatin1String("CMakeSettings"));
+    const bool r = settings->value(QLatin1String("preferNinja"), false).toBool();
+    settings->endGroup();
+    return r;
+}
+
+TextEditor::Keywords CMakeSettingsPage::keywords()
+{
+    if (m_cmakeValidatorForUser.isValid())
+        return m_cmakeValidatorForUser.keywords();
+
+    if (m_cmakeValidatorForSystem.isValid())
+        return m_cmakeValidatorForSystem.keywords();
+
+    return TextEditor::Keywords(QStringList(), QStringList(), QMap<QString, QStringList>());
+}
+
+} // namespace Internal
+} // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.h b/src/plugins/cmakeprojectmanager/cmakesettingspage.h
new file mode 100644
index 0000000000000000000000000000000000000000..86f62693cd7271ad74271e9385453db45d0a4d3b
--- /dev/null
+++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef CMAKEPROJECTMANAGER_INTERNAL_CMAKESETTINGSPAGE_H
+#define CMAKEPROJECTMANAGER_INTERNAL_CMAKESETTINGSPAGE_H
+
+#include <coreplugin/dialogs/ioptionspage.h>
+#include <utils/pathchooser.h>
+#include <texteditor/codeassist/keywordscompletionassist.h>
+
+#include <QPointer>
+
+#include "cmakevalidator.h"
+
+QT_FORWARD_DECLARE_CLASS(QLabel)
+QT_FORWARD_DECLARE_CLASS(QCheckBox)
+
+namespace CMakeProjectManager {
+namespace Internal {
+
+class CMakeSettingsPage : public Core::IOptionsPage
+{
+    Q_OBJECT
+
+public:
+    CMakeSettingsPage();
+    ~CMakeSettingsPage();
+
+    QWidget *widget();
+    void apply();
+    void finish();
+
+    QString cmakeExecutable() const;
+    void setCMakeExecutable(const QString &executable);
+    bool isCMakeExecutableValid() const;
+    bool hasCodeBlocksMsvcGenerator() const;
+    bool hasCodeBlocksNinjaGenerator() const;
+    bool preferNinja() const;
+
+    TextEditor::Keywords keywords();
+
+private:
+    void saveSettings() const;
+    QString findCmakeExecutable() const;
+
+    QPointer<QWidget> m_widget;
+    Utils::PathChooser *m_pathchooser;
+    QCheckBox *m_preferNinja;
+    CMakeValidator m_cmakeValidatorForUser;
+    CMakeValidator m_cmakeValidatorForSystem;
+};
+
+} // namespace Internal
+} // namespace CMakeProjectManager
+
+#endif // CMAKEPROJECTMANAGER_INTERNAL_CMAKESETTINGSPAGE_H
diff --git a/src/plugins/cmakeprojectmanager/generatorinfo.cpp b/src/plugins/cmakeprojectmanager/generatorinfo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c3543e9d8649b783b5d5bd6912a9db6961d5dd44
--- /dev/null
+++ b/src/plugins/cmakeprojectmanager/generatorinfo.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "generatorinfo.h"
+
+#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/toolchain.h>
+#include <projectexplorer/abi.h>
+#include <projectexplorer/kitinformation.h>
+
+#include <remotelinux/remotelinux_constants.h>
+
+namespace CMakeProjectManager {
+namespace Internal {
+
+GeneratorInfo::GeneratorInfo()
+    : m_kit(0), m_isNinja(false)
+{}
+
+GeneratorInfo::GeneratorInfo(ProjectExplorer::Kit *kit, bool ninja)
+    : m_kit(kit), m_isNinja(ninja)
+{}
+
+ProjectExplorer::Kit *GeneratorInfo::kit() const
+{
+    return m_kit;
+}
+
+bool GeneratorInfo::isNinja() const {
+    return m_isNinja;
+}
+
+QByteArray GeneratorInfo::generator() const
+{
+    if (!m_kit)
+        return QByteArray();
+    ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(m_kit);
+    ProjectExplorer::Abi targetAbi = tc->targetAbi();
+    if (m_isNinja) {
+        return "Ninja";
+    } else if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
+        if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
+                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
+                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor
+                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2012Flavor) {
+            return "NMake Makefiles";
+        } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) {
+            if (Utils::HostOsInfo::isWindowsHost())
+                return "MinGW Makefiles";
+            else
+                return "Unix Makefiles";
+        }
+    }
+    return "Unix Makefiles";
+}
+
+QByteArray GeneratorInfo::generatorArgument() const
+{
+    QByteArray tmp = generator();
+    if (tmp.isEmpty())
+        return tmp;
+    return QByteArray("-GCodeBlocks - ") + tmp;
+}
+
+QString GeneratorInfo::displayName() const
+{
+    if (!m_kit)
+        return QString();
+    if (m_isNinja)
+        return tr("Ninja (%1)").arg(m_kit->displayName());
+    ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(m_kit);
+    ProjectExplorer::Abi targetAbi = tc->targetAbi();
+    if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
+        if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
+                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
+                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor
+                || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2012Flavor) {
+            return tr("NMake Generator (%1)").arg(m_kit->displayName());
+        } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) {
+            if (Utils::HostOsInfo::isWindowsHost())
+                return tr("MinGW Generator (%1)").arg(m_kit->displayName());
+            else
+                return tr("Unix Generator (%1)").arg(m_kit->displayName());
+        }
+    } else {
+        // Non windows
+        return tr("Unix Generator (%1)").arg(m_kit->displayName());
+    }
+    return QString();
+}
+
+QList<GeneratorInfo> GeneratorInfo::generatorInfosFor(ProjectExplorer::Kit *k, Ninja n, bool preferNinja, bool hasCodeBlocks)
+{
+    QList<GeneratorInfo> results;
+    ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(k);
+    if (!tc)
+        return results;
+    Core::Id deviceType = ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(k);
+    if (deviceType !=  ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE
+            && deviceType != RemoteLinux::Constants::GenericLinuxOsType)
+        return results;
+    ProjectExplorer::Abi targetAbi = tc->targetAbi();
+    if (n != ForceNinja) {
+        if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
+            if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
+                    || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
+                    || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor
+                    || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2012Flavor) {
+                if (hasCodeBlocks)
+                    results << GeneratorInfo(k);
+            } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) {
+                results << GeneratorInfo(k);
+            }
+        } else {
+            // Non windows
+            results << GeneratorInfo(k);
+        }
+    }
+    if (n != NoNinja) {
+        if (preferNinja)
+            results.prepend(GeneratorInfo(k, true));
+        else
+            results.append(GeneratorInfo(k, true));
+    }
+    return results;
+}
+
+} // namespace Internal
+} // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/generatorinfo.h b/src/plugins/cmakeprojectmanager/generatorinfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..d016d941521fd9593d0f87f2d0b97cd34f9c67bf
--- /dev/null
+++ b/src/plugins/cmakeprojectmanager/generatorinfo.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef CMAKEPROJECTMANAGER_INTERNAL_GENERATORINFO_H
+#define CMAKEPROJECTMANAGER_INTERNAL_GENERATORINFO_H
+
+#include "cmakeprojectmanager.h"
+
+#include <projectexplorer/kit.h>
+
+#include <QCoreApplication>
+#include <QMetaType>
+
+namespace CMakeProjectManager {
+namespace Internal {
+
+class GeneratorInfo
+{
+    Q_DECLARE_TR_FUNCTIONS(CMakeProjectManager::Internal::GeneratorInfo)
+public:
+    enum Ninja { NoNinja, OfferNinja, ForceNinja };
+    static QList<GeneratorInfo> generatorInfosFor(ProjectExplorer::Kit *k, Ninja n, bool preferNinja, bool hasCodeBlocks);
+
+    GeneratorInfo();
+    explicit GeneratorInfo(ProjectExplorer::Kit *kit, bool ninja = false);
+
+    ProjectExplorer::Kit *kit() const;
+    bool isNinja() const;
+
+    QString displayName() const;
+    QByteArray generatorArgument() const;
+    QByteArray generator() const;
+
+private:
+    ProjectExplorer::Kit *m_kit;
+    bool m_isNinja;
+};
+
+} // namespace Internal
+} // namespace CMakeProjectManager
+
+Q_DECLARE_METATYPE(CMakeProjectManager::Internal::GeneratorInfo)
+
+#endif // CMAKEPROJECTMANAGER_INTERNAL_GENERATORINFO_H