diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
index 1b3f7164684f9cb0b102944e0c75483ba5ba9fdf..50e0c96b6204ef6236d86ed0df7e46215a0307a6 100644
--- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
@@ -409,7 +409,9 @@ void CMakeRunPage::initializePage()
             ProjectExplorer::Abi targetAbi = tc->targetAbi();
             QVariant tcVariant = qVariantFromValue(static_cast<void *>(tc));
             if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
-                if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvcFlavor)
+                if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
+                        || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
+                        || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor)
                     m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(tc->displayName()), tcVariant);
                 else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor)
                     m_generatorComboBox->addItem(tr("MinGW Generator (%1)").arg(tc->displayName()), tcVariant);
@@ -450,10 +452,10 @@ void CMakeRunPage::runCMake()
 
     QString generator = QLatin1String("-GCodeBlocks - Unix Makefiles");
     if (tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS) {
-        if (tc->targetAbi().osFlavor() == ProjectExplorer::Abi::WindowsMsvcFlavor)
-            generator = QLatin1String("-GCodeBlocks - NMake Makefiles");
-        else
+        if (tc->targetAbi().osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor)
             generator = QLatin1String("-GCodeBlocks - MinGW Makefiles");
+        else
+            generator = QLatin1String("-GCodeBlocks - NMake Makefiles");
     }
 
 
diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index b19218bf9731ed4e401c7f3bd9a8cc97ca6f48a6..949bed5fb452d7638141aaade7f816485b9faa46 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -349,7 +349,9 @@ static QString cdbBinary(const DebuggerStartParameters &sp)
     if (!sp.debuggerCommand.isEmpty()) {
         // Do not use a GDB binary if we got started for a project with MinGW runtime.
         const bool abiMatch = sp.toolChainAbi.os() == ProjectExplorer::Abi::WindowsOS
-                    && sp.toolChainAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvcFlavor;
+                    && (sp.toolChainAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
+                        || sp.toolChainAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
+                        || sp.toolChainAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor);
         if (abiMatch)
             return sp.debuggerCommand;
     }
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index c80a80b3ec8af247b11a1d3af5c8593213a26031..cf30cbd1fe4eb19d58584c47f57aefd104681104 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1474,7 +1474,7 @@ void DebuggerPluginPrivate::startRemoteCdbSession()
     Abi hostAbi = Abi::hostAbi();
     sp.toolChainAbi = ProjectExplorer::Abi(hostAbi.architecture(),
                                            ProjectExplorer::Abi::WindowsOS,
-                                           ProjectExplorer::Abi::WindowsMsvcFlavor,
+                                           ProjectExplorer::Abi::WindowsMsvc2010Flavor,
                                            ProjectExplorer::Abi::PEFormat,
                                            true);
     sp.startMode = AttachToRemote;
@@ -2461,7 +2461,7 @@ QString DebuggerPluginPrivate::debuggerForAbi(const Abi &abi, DebuggerEngineType
     if (searchAbi.os() == ProjectExplorer::Abi::WindowsOS) {
         switch (et) {
         case CdbEngineType:
-            searchAbi = Abi(abi.architecture(), abi.os(), Abi::WindowsMsvcFlavor,
+            searchAbi = Abi(abi.architecture(), abi.os(), Abi::WindowsMsvc2010Flavor,
                             abi.binaryFormat(), abi.wordWidth());
             break;
         case GdbEngineType:
diff --git a/src/plugins/projectexplorer/abi.cpp b/src/plugins/projectexplorer/abi.cpp
index 1314bc2a5ac2414e0a02b300e6d22b50055c1a25..8e363d69234145027e980c3596b34a8f4fabd09d 100644
--- a/src/plugins/projectexplorer/abi.cpp
+++ b/src/plugins/projectexplorer/abi.cpp
@@ -93,10 +93,24 @@ static QList<Abi> parseCoffHeader(const QByteArray &data)
     if (data.size() >= 68) {
         // Get Major and Minor Image Version from optional header fields
         quint32 image = (data.at(67) << 24) + (data.at(66) << 16) + (data.at(65) << 8) + data.at(64);
-        if (image == 1) // Image is 1 for mingw and higher for MSVC (4.something in some encoding)
+        if (image == 1) { // Image is 1 for mingw and higher for MSVC (4.something in some encoding)
             flavor = Abi::WindowsMSysFlavor;
-        else
-            flavor = Abi::WindowsMsvcFlavor;
+        } else {
+            switch (data.at(22)) {
+            case 8:
+                flavor = Abi::WindowsMsvc2005Flavor;
+                break;
+            case 9:
+                flavor = Abi::WindowsMsvc2008Flavor;
+                break;
+            case 10:
+                flavor = Abi::WindowsMsvc2010Flavor;
+                break;
+            default:
+                // Keep unknown flavor
+                break;
+            }
+        }
     }
 
     if (arch != Abi::UnknownArchitecture && width != 0)
@@ -196,7 +210,7 @@ Abi::Abi(const Architecture &a, const OS &o,
             m_osFlavor = UnknownFlavor;
         break;
     case ProjectExplorer::Abi::WindowsOS:
-        if (m_osFlavor < WindowsMsvcFlavor || m_osFlavor > WindowsCEFlavor)
+        if (m_osFlavor < WindowsMsvc2005Flavor || m_osFlavor > WindowsCEFlavor)
             m_osFlavor = UnknownFlavor;
         break;
     }
@@ -258,8 +272,12 @@ Abi::Abi(const QString &abiString) :
             m_osFlavor = SymbianEmulatorFlavor;
         else if (abiParts.at(2) == QLatin1String("generic") && m_os == UnixOS)
             m_osFlavor = GenericUnixFlavor;
-        else if (abiParts.at(2) == QLatin1String("msvc") && m_os == WindowsOS)
-            m_osFlavor = WindowsMsvcFlavor;
+        else if (abiParts.at(2) == QLatin1String("msvc2005") && m_os == WindowsOS)
+            m_osFlavor = WindowsMsvc2005Flavor;
+        else if (abiParts.at(2) == QLatin1String("msvc2008") && m_os == WindowsOS)
+            m_osFlavor = WindowsMsvc2008Flavor;
+        else if (abiParts.at(2) == QLatin1String("msvc2010") && m_os == WindowsOS)
+            m_osFlavor = WindowsMsvc2010Flavor;
         else if (abiParts.at(2) == QLatin1String("msys") && m_os == WindowsOS)
             m_osFlavor = WindowsMSysFlavor;
         else if (abiParts.at(2) == QLatin1String("ce") && m_os == WindowsOS)
@@ -399,8 +417,12 @@ QString Abi::toString(const OSFlavor &of)
         return QLatin1String("emulator");
     case ProjectExplorer::Abi::GenericUnixFlavor:
         return QLatin1String("generic");
-    case ProjectExplorer::Abi::WindowsMsvcFlavor:
-        return QLatin1String("msvc");
+    case ProjectExplorer::Abi::WindowsMsvc2005Flavor:
+        return QLatin1String("msvc2005");
+    case ProjectExplorer::Abi::WindowsMsvc2008Flavor:
+        return QLatin1String("msvc2008");
+    case ProjectExplorer::Abi::WindowsMsvc2010Flavor:
+        return QLatin1String("msvc2010");
     case ProjectExplorer::Abi::WindowsMSysFlavor:
         return QLatin1String("msys");
     case ProjectExplorer::Abi::WindowsCEFlavor:
@@ -445,7 +467,15 @@ Abi Abi::hostAbi()
 
 #if defined (Q_OS_WIN)
     os = WindowsOS;
-    subos = WindowsMsvcFlavor;
+#if _MSC_VER == 1600
+    subos = WindowsMsvc2010Flavor;
+#elif _MSC_VER == 1500
+    subos = WindowsMsvc2008Flavor;
+#elif _MSC_VER == 1400
+    subos = WindowsMsvc2005Flavor;
+#elif defined (mingw32)
+    subos = WindowsMSysFlavor;
+#endif
     format = PEFormat;
 #elif defined (Q_OS_LINUX)
     os = LinuxOS;
diff --git a/src/plugins/projectexplorer/abi.h b/src/plugins/projectexplorer/abi.h
index 98dbcbb924db5d7a61443ae42e7aada954f1b8b6..8c312b1ad981c1f0904c8777ce9ab472d541fa88 100644
--- a/src/plugins/projectexplorer/abi.h
+++ b/src/plugins/projectexplorer/abi.h
@@ -85,7 +85,9 @@ public:
         GenericUnixFlavor,
 
         // Windows
-        WindowsMsvcFlavor,
+        WindowsMsvc2005Flavor,
+        WindowsMsvc2008Flavor,
+        WindowsMsvc2010Flavor,
         WindowsMSysFlavor,
         WindowsCEFlavor
     };
diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp
index bc22bf9fc6312f9fc59a92d3cbafaff3e4d33ffe..4ad8d7d631c3ca2d10b7f205aa6be749ff797991 100644
--- a/src/plugins/projectexplorer/msvctoolchain.cpp
+++ b/src/plugins/projectexplorer/msvctoolchain.cpp
@@ -82,6 +82,44 @@ static QString platformName(MsvcToolChain::Platform t)
     return QString();
 }
 
+static Abi findAbiOfMsvc(MsvcToolChain::Type type, MsvcToolChain::Platform platform, const QString &version)
+{
+    Abi::Architecture arch = Abi::X86Architecture;
+    Abi::OSFlavor flavor = Abi::UnknownFlavor;
+    int wordWidth = 64;
+
+    switch (platform)
+    {
+    case ProjectExplorer::Internal::MsvcToolChain::s32:
+        wordWidth = 32;
+        break;
+    case ProjectExplorer::Internal::MsvcToolChain::ia64:
+        arch = Abi::ItaniumArchitecture;
+        break;
+    case ProjectExplorer::Internal::MsvcToolChain::s64:
+    case ProjectExplorer::Internal::MsvcToolChain::amd64:
+        break;
+    };
+
+    QString msvcVersionString = version;
+    if (type == MsvcToolChain::WindowsSDK) {
+        if (version.startsWith("7."))
+            msvcVersionString = "10.0";
+        else if (version.startsWith("6.1"))
+            msvcVersionString = "9.0";
+        else
+            msvcVersionString = "8.0";
+    }
+    if (msvcVersionString.startsWith("10."))
+        flavor = Abi::WindowsMsvc2010Flavor;
+    else if (msvcVersionString.startsWith("9."))
+        flavor = Abi::WindowsMsvc2008Flavor;
+    else
+        flavor = Abi::WindowsMsvc2005Flavor;
+
+    return Abi(arch, Abi::WindowsOS, flavor, Abi::PEFormat, wordWidth);
+}
+
 static QString generateDisplayName(const QString &name,
                                    MsvcToolChain::Type t,
                                    MsvcToolChain::Platform p)
@@ -309,36 +347,25 @@ static Utils::Environment msvcReadEnvironmentSetting(const QString &varsBat,
 // MsvcToolChain
 // --------------------------------------------------------------------------
 
-MsvcToolChain::MsvcToolChain(Type type, const QString &name, Platform platform,
+MsvcToolChain::MsvcToolChain(const QString &name, const Abi &abi,
                              const QString &varsBat, const QString &varsBatArg, bool autodetect) :
     ToolChain(QLatin1String(Constants::MSVC_TOOLCHAIN_ID), autodetect),
     m_varsBat(varsBat),
     m_varsBatArg(varsBatArg),
     m_lastEnvironment(Utils::Environment::systemEnvironment()),
-    m_is64bit(true),
-    m_architecture(Abi::X86Architecture)
+    m_abi(abi)
 {
     Q_ASSERT(!name.isEmpty());
     Q_ASSERT(!m_varsBat.isEmpty());
     Q_ASSERT(QFileInfo(m_varsBat).exists());
-
-    switch (platform)
-    {
-    case ProjectExplorer::Internal::MsvcToolChain::s32:
-        m_is64bit = false;
-        break;
-    case ProjectExplorer::Internal::MsvcToolChain::ia64:
-        m_architecture = Abi::ItaniumArchitecture;
-        break;
-    case ProjectExplorer::Internal::MsvcToolChain::s64:
-    case ProjectExplorer::Internal::MsvcToolChain::amd64:
-        break;
-    };
+    Q_ASSERT(abi.os() == Abi::WindowsOS);
+    Q_ASSERT(abi.binaryFormat() == Abi::PEFormat);
+    Q_ASSERT(abi.osFlavor() != Abi::WindowsMSysFlavor);
 
     setId(QString::fromLatin1("%1:%2.%3").arg(Constants::MSVC_TOOLCHAIN_ID).arg(m_varsBat)
             .arg(m_varsBatArg));
 
-    setDisplayName(generateDisplayName(name, type, platform));
+    setDisplayName(name);
 }
 
 QString MsvcToolChain::typeName() const
@@ -348,7 +375,7 @@ QString MsvcToolChain::typeName() const
 
 Abi MsvcToolChain::targetAbi() const
 {
-    return Abi(m_architecture, Abi::WindowsOS, Abi::WindowsMsvcFlavor, Abi::PEFormat, m_is64bit ? 64 : 32);
+    return m_abi;
 }
 
 bool MsvcToolChain::isValid() const
@@ -566,6 +593,7 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect()
     if (!defaultSdkPath.isEmpty()) {
         foreach (const QString &sdkKey, sdkRegistry.childGroups()) {
             const QString name = sdkRegistry.value(sdkKey + QLatin1String("/ProductName")).toString();
+            const QString version = sdkRegistry.value(sdkKey + QLatin1String("/ProductVersion")).toString();
             const QString folder = sdkRegistry.value(sdkKey + QLatin1String("/InstallationFolder")).toString();
             if (folder.isEmpty())
                 continue;
@@ -574,13 +602,17 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect()
             if (!QFileInfo(sdkVcVarsBat).exists())
                 continue;
             QList<ToolChain *> tmp;
-            tmp.append(new MsvcToolChain(MsvcToolChain::WindowsSDK, name,MsvcToolChain::s32,
+
+            tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::s32),
+                                         findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::s32, version),
                                          sdkVcVarsBat, QLatin1String("/x86"), true));
 #ifdef Q_OS_WIN64
             // Add all platforms
-            tmp.append(new MsvcToolChain(MsvcToolChain::WindowsSDK, name, MsvcToolChain::s64,
+            tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::s64),
+                                         findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::s64, version),
                                          sdkVcVarsBat, QLatin1String("/x64"), true));
-            tmp.append(new MsvcToolChain(MsvcToolChain::WindowsSDK, name, MsvcToolChain::ia64,
+            tmp.append(new MsvcToolChain(generateDisplayName(name, MsvcToolChain::WindowsSDK, MsvcToolChain::ia64),
+                                         findAbiOfMsvc(MsvcToolChain::WindowsSDK, MsvcToolChain::ia64, version),
                                          sdkVcVarsBat, QLatin1String("/ia64"), true));
 #endif
             // Make sure the default is front.
@@ -610,19 +642,24 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect()
         // Check existence of various install scripts
         const QString vcvars32bat = path + QLatin1String("bin\\vcvars32.bat");
         if (QFileInfo(vcvars32bat).isFile())
-            results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::s32,
+            results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::s32),
+                                             findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::s32, vsName),
                                              vcvars32bat, QString(), true));
         if (version >= 10) {
             // Just one common file
             const QString vcvarsAllbat = path + QLatin1String("vcvarsall.bat");
             if (QFileInfo(vcvarsAllbat).isFile()) {
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::s32,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::s32),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::s32, vsName),
                                                  vcvarsAllbat, QLatin1String("x86"), true));
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::amd64,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
                                                  vcvarsAllbat, QLatin1String("amd64"), true));
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::s64,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::s64),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::s64, vsName),
                                                  vcvarsAllbat, QLatin1String("x64"), true));
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::ia64,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName),
                                                  vcvarsAllbat, QLatin1String("ia64"), true));
             } else {
                 qWarning("Unable to find MSVC setup script %s in version %d", qPrintable(vcvarsAllbat), version);
@@ -631,19 +668,23 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect()
             // Amd 64 is the preferred 64bit platform
             const QString vcvarsAmd64bat = path + QLatin1String("bin\\amd64\\vcvarsamd64.bat");
             if (QFileInfo(vcvarsAmd64bat).isFile())
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::amd64,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
                                                  vcvarsAmd64bat, QString(), true));
             const QString vcvarsAmd64bat2 = path + QLatin1String("bin\\vcvarsx86_amd64.bat");
             if (QFileInfo(vcvarsAmd64bat2).isFile())
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::amd64,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::amd64),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::amd64, vsName),
                                                  vcvarsAmd64bat2, QString(), true));
             const QString vcvars64bat = path + QLatin1String("bin\\vcvars64.bat");
             if (QFileInfo(vcvars64bat).isFile())
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::s64,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::s64),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::s64, vsName),
                                                  vcvars64bat, QString(), true));
             const QString vcvarsIA64bat = path + QLatin1String("bin\\vcvarsx86_ia64.bat");
             if (QFileInfo(vcvarsIA64bat).isFile())
-                results.append(new MsvcToolChain(MsvcToolChain::VS, vsName, MsvcToolChain::ia64,
+                results.append(new MsvcToolChain(generateDisplayName(vsName, MsvcToolChain::VS, MsvcToolChain::ia64),
+                                                 findAbiOfMsvc(MsvcToolChain::VS, MsvcToolChain::ia64, vsName),
                                                  vcvarsIA64bat, QString(), true));
         }
     }
diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h
index 8c4cc9eb85e6077a6a52c6f6cc64346839a3a51e..fd1528edb0dc107d426be3f02ac208a1f08b44bb 100644
--- a/src/plugins/projectexplorer/msvctoolchain.h
+++ b/src/plugins/projectexplorer/msvctoolchain.h
@@ -55,8 +55,8 @@ public:
     enum Type { WindowsSDK, VS };
     enum Platform { s32, s64, ia64, amd64 };
 
-    MsvcToolChain(Type type, const QString &name, Platform platform, const QString &varsBat,
-                  const QString &varsBatArg, bool autodetect = false);
+    MsvcToolChain(const QString &name, const Abi &abi,
+                  const QString &varsBat, const QString &varsBatArg, bool autodetect = false);
 
     QString typeName() const;
     Abi targetAbi() const;
@@ -89,8 +89,7 @@ private:
     mutable Utils::Environment m_lastEnvironment;   // Last checked 'incoming' environment.
     mutable Utils::Environment m_resultEnvironment; // Resulting environment for VC
     mutable QList<HeaderPath> m_headerPaths;
-    bool m_is64bit;
-    Abi::Architecture m_architecture;
+    Abi m_abi;
 };
 
 // --------------------------------------------------------------------------