diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
index c82205da100f6e3ec3a93761b59d25ca688a36cc..ae955202252bce0d360d1afc41cdd627e1bf4086 100644
--- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
@@ -41,6 +41,7 @@
 
 #include <utils/pathchooser.h>
 #include <projectexplorer/environment.h>
+#include <projectexplorer/toolchain.h>
 
 #include <QtGui/QVBoxLayout>
 #include <QtGui/QFormLayout>
@@ -187,6 +188,16 @@ void CMakeOpenProjectWizard::setBuildDirectory(const QString &directory)
     m_buildDirectory = directory;
 }
 
+QString CMakeOpenProjectWizard::msvcVersion() const
+{
+    return m_msvcVersion;
+}
+
+void CMakeOpenProjectWizard::setMsvcVersion(const QString &version)
+{
+    m_msvcVersion = version;
+}
+
 QStringList CMakeOpenProjectWizard::arguments() const
 {
     return m_arguments;
@@ -278,7 +289,7 @@ void CMakeRunPage::initWidgets()
     connect(m_argumentsLineEdit,SIGNAL(returnPressed()), this, SLOT(runCMake()));
 
     m_generatorComboBox = new QComboBox(this);
-    m_generatorComboBox->addItems(QStringList() << tr("NMake Generator") << tr("MinGW Generator"));
+
     m_runCMake = new QPushButton(this);
     m_runCMake->setText(tr("Run CMake"));
     connect(m_runCMake, SIGNAL(clicked()), this, SLOT(runCMake()));
@@ -327,7 +338,7 @@ void CMakeRunPage::initializePage()
     }
     if (m_cmakeWizard->cmakeManager()->hasCodeBlocksMsvcGenerator()) {
         m_generatorComboBox->setVisible(true);
-        QString generator;
+        QString cachedGenerator;
         // Try to find out generator from CMakeCachhe file, if it exists
         QFile fi(m_buildDirectory + "/CMakeCache.txt");
         if (fi.exists()) {
@@ -338,16 +349,32 @@ void CMakeRunPage::initializePage()
                     if (line.startsWith("CMAKE_GENERATOR:INTERNAL=")) {
                         int splitpos = line.indexOf('=');
                         if (splitpos != -1) {
-                            generator = line.mid(splitpos).trimmed();
+                            cachedGenerator = line.mid(splitpos).trimmed();
                         }
                         break;
                     }
                 }
             }
+        }        
+        m_generatorComboBox->clear();
+        // Find out whether we have multiple mvc versions
+        QStringList msvcVersions = ProjectExplorer::ToolChain::availableMSVCVersions();
+        qDebug()<<"msvcVersions:"<<msvcVersions;
+        if (msvcVersions.isEmpty()) {
+
+        } else if (msvcVersions.count() == 1) {
+            m_generatorComboBox->addItem(tr("NMake Generator"), msvcVersions.first());
+        } else {
+            foreach (const QString &msvcVersion, msvcVersions)
+                m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(msvcVersion), msvcVersion);
         }
-        if (!generator.isEmpty()) {
-            m_generatorComboBox->setCurrentIndex((generator == "NMake Makefiles" ? 0 : 1));
-        }
+
+        if (cachedGenerator == "NMake Makefiles" && !msvcVersions.isEmpty())
+            m_generatorComboBox->setCurrentIndex(0);
+
+        m_generatorComboBox->addItem(tr("MinGW Generator"), "mingw");
+        if (cachedGenerator == "MinGW Makefiles")
+            m_generatorComboBox->setCurrentIndex(m_generatorComboBox->count() - 1);
     } else {
         // No new enough cmake, simply hide the combo box
         m_generatorComboBox->setVisible(false);
@@ -362,11 +389,31 @@ void CMakeRunPage::runCMake()
     CMakeManager *cmakeManager = m_cmakeWizard->cmakeManager();
 
 #ifdef Q_OS_WIN
-    const QString generator = m_generatorComboBox->currentIndex() == 0 ? QLatin1String("-GCodeBlocks - NMake Makefiles") : QLatin1String("-GCodeBlocks - MinGW Makefiles");
+    m_cmakeWizard->setMsvcVersion(QString());
+    QString generator = QLatin1String("-GCodeBlocks - MinGW Makefiles");
+    if (m_generatorComboBox->isVisible()) {
+         // the combobox is shown, check which generator is selected
+        int index = m_generatorComboBox->currentIndex();
+        if (index != -1) {
+            QString version = m_generatorComboBox->itemData(index).toString();
+            if (version != "mingw") {
+                generator = "-GCodeBlocks - NMake Makefiles";
+                m_cmakeWizard->setMsvcVersion(version);
+            }
+        }   
+    }
 #else // Q_OS_WIN
-    const QString generator = QLatin1String("-GCodeBlocks - Unix Makefiles");
+    QString generator = QLatin1String("-GCodeBlocks - Unix Makefiles");
 #endif
-    m_cmakeProcess = cmakeManager->createXmlFile(arguments, m_cmakeWizard->sourceDirectory(), m_buildDirectory, m_cmakeWizard->environment(), generator);
+    ProjectExplorer::Environment env = m_cmakeWizard->environment();
+    if (!m_cmakeWizard->msvcVersion().isEmpty()) {
+        // Add the environment of that msvc version to environment
+        ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChain::createMSVCToolChain(m_cmakeWizard->msvcVersion(), false);
+        tc->addToEnvironment(env);
+        delete tc;
+    }
+
+    m_cmakeProcess = cmakeManager->createXmlFile(arguments, m_cmakeWizard->sourceDirectory(), m_buildDirectory, env, generator);
     connect(m_cmakeProcess, SIGNAL(readyRead()), this, SLOT(cmakeReadyRead()));
     connect(m_cmakeProcess, SIGNAL(finished(int)), this, SLOT(cmakeFinished()));
 }
diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h
index 0838b133d3032143d82e7839ec173c55d3f54d26..908ea70d7be812c8a20310499dd45a00a84ba46c 100644
--- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h
+++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.h
@@ -83,6 +83,8 @@ public:
     QStringList arguments() const;
     void setArguments(const QStringList &args);
     ProjectExplorer::Environment environment() const;
+    QString msvcVersion() const;
+    void setMsvcVersion(const QString &version);
 private:
     void init();
     bool existsUpToDateXmlFile() const;
@@ -91,6 +93,7 @@ private:
     QString m_buildDirectory;
     QString m_sourceDirectory;
     QStringList m_arguments;
+    QString m_msvcVersion;
     bool m_creatingCbpFiles;
     ProjectExplorer::Environment m_environment;
 };
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 606d970f5a00c9cf32afcf840f43e12830827684..a46d574facfd9273b9308f9768a02b01fe242ecd 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -104,6 +104,7 @@ void CMakeProject::slotActiveBuildConfiguration()
                                     mode,
                                     environment(activeBuildConfiguration()));
         copw.exec();
+        setValue(activeBuildConfiguration(), "msvcVersion", copw.msvcVersion());
     }
     // reparse
     parseCMakeLists();
@@ -129,8 +130,7 @@ void CMakeProject::updateToolChain(const QString &compiler)
         newToolChain = ProjectExplorer::ToolChain::createGccToolChain("gcc");
     } else if (compiler == "msvc8") {
         // TODO MSVC toolchain
-        //newToolChain = ProjectExplorer::ToolChain::createMSVCToolChain("//TODO");
-        Q_ASSERT(false);
+        newToolChain = ProjectExplorer::ToolChain::createMSVCToolChain(value(activeBuildConfiguration(), "msvcVersion").toString(), false);
     } else {
         // TODO other toolchains
         qDebug()<<"Not implemented yet!!! Qt Creator doesn't know which toolchain to use for"<<compiler;
@@ -145,6 +145,13 @@ void CMakeProject::updateToolChain(const QString &compiler)
     }
 }
 
+ProjectExplorer::ToolChain *CMakeProject::toolChain(const QString &buildConfiguration) const
+{
+    if (buildConfiguration != activeBuildConfiguration())
+        qWarning()<<"CMakeProject asked for toolchain of a not active buildconfiguration";
+    return m_toolChain;
+}
+
 void CMakeProject::changeBuildDirectory(const QString &buildConfiguration, const QString &newBuildDirectory)
 {
     setValue(buildConfiguration, "buildDirectory", newBuildDirectory);
@@ -515,6 +522,7 @@ QList<ProjectExplorer::BuildStepConfigWidget*> CMakeProject::subConfigWidgets()
     CMakeOpenProjectWizard copw(projectManager(), sourceDirectory(), buildDirectory(buildConfiguration), environment(buildConfiguration));
     if (copw.exec() == QDialog::Accepted) {
         setValue(buildConfiguration, "buildDirectory", copw.buildDirectory());
+        setValue(buildConfiguration, "msvcVersion", copw.msvcVersion());
         parseCMakeLists();
     }
  }
@@ -567,6 +575,7 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
         insertBuildStep(0, makeStep);
 
         addBuildConfiguration("all");
+        setValue("all", "msvcVersion", copw.msvcVersion());
         makeStep->setBuildTarget("all", "all", true);
         if (!copw.buildDirectory().isEmpty())
             setValue("all", "buildDirectory", copw.buildDirectory());
@@ -577,6 +586,7 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
         cleanMakeStep->setValue("clean", true);
         setActiveBuildConfiguration("all");
 
+
     } else {
         // We have a user file, but we could still be missing the cbp file
         // or simply run createXml with the saved settings
@@ -599,6 +609,7 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
                                         mode,
                                         environment(activeBuildConfiguration()));
             copw.exec();
+            setValue(activeBuildConfiguration(), "msvcVersion", copw.msvcVersion());
         }
     }
     parseCMakeLists(); // Gets the directory from the active buildconfiguration
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 6f17e3fa3ecfb85a3946f6a33dd2c0dfa3ea39f5..1e4ba1c1e9bd3f7199d2c2885a350f4529a813a3 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -106,6 +106,7 @@ public:
 
     QString sourceDirectory() const;
     ProjectExplorer::ToolChain::ToolChainType toolChainType() const;
+    ProjectExplorer::ToolChain *toolChain(const QString &buildConfiguration) const;
 
 protected:
     virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer);
diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp
index b7d9961083110cfad3896caa78ae146e00e66845..e81975271fd6a50e15df1ea775335056efd08a54 100644
--- a/src/plugins/cmakeprojectmanager/makestep.cpp
+++ b/src/plugins/cmakeprojectmanager/makestep.cpp
@@ -57,11 +57,8 @@ bool MakeStep::init(const QString &buildConfiguration)
 
     setEnabled(buildConfiguration, true);
     setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration));
-#ifdef Q_OS_WIN
-    setCommand(buildConfiguration, "mingw32-make");
-#else // Q_OS_WIN
-    setCommand(buildConfiguration, "make"); // TODO give full path here?
-#endif // Q_OS_WIN
+
+    setCommand(buildConfiguration, m_pro->toolChain(buildConfiguration)->makeCommand());
 
     if (!value(buildConfiguration, "cleanConfig").isValid() &&value("clean").isValid() && value("clean").toBool()) {
         // Import old settings
diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp
index 71c762c3708c8375adad87c74eaa124c9235e0b0..16769ca0ddc5499ea0233f89fc7d645a6f00cfbc 100644
--- a/src/plugins/projectexplorer/toolchain.cpp
+++ b/src/plugins/projectexplorer/toolchain.cpp
@@ -45,7 +45,7 @@ using namespace ProjectExplorer::Internal;
 #ifdef Q_OS_WIN64
 static const char * MSVC_RegKey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7";
 #else
-static const char * MSVC_RegKey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7";
+static const char * MSVC_RegKey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7";
 #endif
 
 bool ToolChain::equals(ToolChain *a, ToolChain *b)