diff --git a/src/plugins/projectexplorer/customtoolchain.cpp b/src/plugins/projectexplorer/customtoolchain.cpp
index 3ea892b659431bb2dafcd924e353a1b2ab20cd6f..4bce373ec4a53dcdb71e2d88d93532eb2e7c8566 100644
--- a/src/plugins/projectexplorer/customtoolchain.cpp
+++ b/src/plugins/projectexplorer/customtoolchain.cpp
@@ -30,16 +30,21 @@
 #include "customtoolchain.h"
 #include "abiwidget.h"
 #include "gccparser.h"
+#include "clangparser.h"
+#include "linuxiccparser.h"
+#include "msvcparser.h"
 #include "projectexplorerconstants.h"
 #include "toolchainmanager.h"
 
 #include <utils/detailswidget.h>
 #include <utils/environment.h>
 #include <utils/pathchooser.h>
+#include <utils/qtcassert.h>
 
 #include <QFormLayout>
 #include <QPlainTextEdit>
 #include <QLineEdit>
+#include <QComboBox>
 
 using namespace Utils;
 
@@ -57,13 +62,15 @@ static const char predefinedMacrosKeyC[] = "ProjectExplorer.CustomToolChain.Pred
 static const char headerPathsKeyC[] = "ProjectExplorer.CustomToolChain.HeaderPaths";
 static const char cxx11FlagsKeyC[] = "ProjectExplorer.CustomToolChain.Cxx11Flags";
 static const char mkspecsKeyC[] = "ProjectExplorer.CustomToolChain.Mkspecs";
+static const char outputParserKeyC[] = "ProjectExplorer.CustomToolChain.OutputParser";
 
 // --------------------------------------------------------------------------
 // CustomToolChain
 // --------------------------------------------------------------------------
 
 CustomToolChain::CustomToolChain(bool autodetect) :
-    ToolChain(QLatin1String(Constants::CUSTOM_TOOLCHAIN_ID), autodetect)
+    ToolChain(QLatin1String(Constants::CUSTOM_TOOLCHAIN_ID), autodetect),
+    m_outputParser(Gcc)
 { }
 
 CustomToolChain::CustomToolChain(const QString &id, bool autodetect) :
@@ -188,10 +195,15 @@ QList<FileName> CustomToolChain::suggestedMkspecList() const
     return m_mkspecs;
 }
 
-// TODO: Customize
 IOutputParser *CustomToolChain::outputParser() const
 {
-    return new GccParser;
+    switch (m_outputParser) {
+    case Gcc: return new GccParser;
+    case Clang: return new ClangParser;
+    case LinuxIcc: return new LinuxIccParser;
+    case Msvc: return new MsvcParser;
+    default: return 0;
+    }
 }
 
 QStringList CustomToolChain::headerPathsList() const
@@ -279,6 +291,7 @@ QVariantMap CustomToolChain::toMap() const
     data.insert(QLatin1String(headerPathsKeyC), headerPathsList());
     data.insert(QLatin1String(cxx11FlagsKeyC), m_cxx11Flags);
     data.insert(QLatin1String(mkspecsKeyC), mkspecs());
+    data.insert(QLatin1String(outputParserKeyC), m_outputParser);
 
     return data;
 }
@@ -295,6 +308,8 @@ bool CustomToolChain::fromMap(const QVariantMap &data)
     setHeaderPaths(data.value(QLatin1String(headerPathsKeyC)).toStringList());
     m_cxx11Flags = data.value(QLatin1String(cxx11FlagsKeyC)).toStringList();
     setMkspecs(data.value(QLatin1String(mkspecsKeyC)).toString());
+    m_outputParser = (OutputParser)data.value(QLatin1String(outputParserKeyC)).toInt();
+    QTC_ASSERT(m_outputParser >= Gcc && m_outputParser < OutputParserCount, return false);
 
     return true;
 }
@@ -312,6 +327,27 @@ bool CustomToolChain::operator ==(const ToolChain &other) const
             && m_systemHeaderPaths == customTc->m_systemHeaderPaths;
 }
 
+CustomToolChain::OutputParser CustomToolChain::outputParserType() const
+{
+    return m_outputParser;
+}
+
+void CustomToolChain::setOutputParserType(CustomToolChain::OutputParser parser)
+{
+    m_outputParser = parser;
+}
+
+QString CustomToolChain::parserName(CustomToolChain::OutputParser parser)
+{
+    switch (parser) {
+    case Gcc: return tr("GCC");
+    case Clang: return tr("Clang");
+    case LinuxIcc: return tr("ICC");
+    case Msvc: return tr("MSVC");
+    default: return QString();
+    }
+}
+
 ToolChainConfigWidget *CustomToolChain::configurationWidget()
 {
     return new Internal::CustomToolChainConfigWidget(this);
@@ -419,10 +455,14 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
     m_predefinedDetails(new TextEditDetailsWidget(m_predefinedMacros)),
     m_headerDetails(new TextEditDetailsWidget(m_headerPaths)),
     m_cxx11Flags(new QLineEdit),
-    m_mkspecs(new QLineEdit)
+    m_mkspecs(new QLineEdit),
+    m_errorParserComboBox(new QComboBox)
 {
     Q_ASSERT(tc);
 
+    for (int i = 0; i < CustomToolChain::OutputParserCount; ++i)
+        m_errorParserComboBox->addItem(CustomToolChain::parserName((CustomToolChain::OutputParser)i));
+
     m_predefinedMacros->setTabChangesFocus(true);
     m_predefinedMacros->setToolTip(tr("Each line defines a macro. Format is MACRO[=VALUE]"));
     m_headerPaths->setTabChangesFocus(true);
@@ -438,6 +478,8 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
     m_mainLayout->addRow(tr("&Header paths:"), m_headerDetails);
     m_mainLayout->addRow(tr("C++11 &flags:"), m_cxx11Flags);
     m_mainLayout->addRow(tr("&Qt mkspecs:"), m_mkspecs);
+    m_mainLayout->addRow(tr("Error Parser:"), m_errorParserComboBox);
+    m_mainLayout->addRow(tr("&Error Parser:"), m_parserLayout);
     addErrorLabel();
 
     setFromToolchain();
@@ -447,6 +489,9 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
     connect(m_abiWidget, SIGNAL(abiChanged()), this, SIGNAL(dirty()));
     connect(m_predefinedMacros, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
     connect(m_headerPaths, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
+    connect(m_errorParserComboBox, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(errorParserChanged(int)));
+    errorParserChanged(m_errorParserComboBox->currentIndex());
 }
 
 void CustomToolChainConfigWidget::updateSummaries()
@@ -457,6 +502,12 @@ void CustomToolChainConfigWidget::updateSummaries()
         m_headerDetails->updateSummaryText();
 }
 
+void CustomToolChainConfigWidget::errorParserChanged(int index)
+{
+    Q_UNUSED(index);
+    emit dirty();
+}
+
 void CustomToolChainConfigWidget::applyImpl()
 {
     if (toolChain()->isAutoDetected())
@@ -473,6 +524,7 @@ void CustomToolChainConfigWidget::applyImpl()
     tc->setCxx11Flags(m_cxx11Flags->text().split(QLatin1Char(',')));
     tc->setMkspecs(m_mkspecs->text());
     tc->setDisplayName(displayName); // reset display name
+    tc->setOutputParserType((CustomToolChain::OutputParser)m_errorParserComboBox->currentIndex());
 }
 
 void CustomToolChainConfigWidget::setFromToolchain()
@@ -487,6 +539,7 @@ void CustomToolChainConfigWidget::setFromToolchain()
     m_headerPaths->setPlainText(tc->headerPathsList().join(QLatin1String("\n")));
     m_cxx11Flags->setText(tc->cxx11Flags().join(QLatin1String(",")));
     m_mkspecs->setText(tc->mkspecs());
+    m_errorParserComboBox->setCurrentIndex(tc->outputParserType());
     blockSignals(blocked);
 }
 
@@ -500,7 +553,8 @@ bool CustomToolChainConfigWidget::isDirtyImpl() const
             || m_predefinedDetails->entries() != tc->rawPredefinedMacros()
             || m_headerDetails->entries() != tc->headerPathsList()
             || m_cxx11Flags->text().split(QLatin1Char(',')) != tc->cxx11Flags()
-            || m_mkspecs->text() != tc->mkspecs();
+            || m_mkspecs->text() != tc->mkspecs()
+            || m_errorParserComboBox->currentIndex() == tc->outputParserType();
 }
 
 void CustomToolChainConfigWidget::makeReadOnlyImpl()
diff --git a/src/plugins/projectexplorer/customtoolchain.h b/src/plugins/projectexplorer/customtoolchain.h
index 97489bd54f28ced50e233973a20ad8af12c218bf..79c0315649388e7530f882e2f614474e6e4b6209 100644
--- a/src/plugins/projectexplorer/customtoolchain.h
+++ b/src/plugins/projectexplorer/customtoolchain.h
@@ -42,6 +42,7 @@
 QT_BEGIN_NAMESPACE
 class QPlainTextEdit;
 class QTextEdit;
+class QComboBox;
 QT_END_NAMESPACE
 
 namespace Utils { class PathChooser; }
@@ -57,7 +58,18 @@ namespace Internal { class CustomToolChainFactory; }
 
 class PROJECTEXPLORER_EXPORT CustomToolChain : public ToolChain
 {
+    Q_DECLARE_TR_FUNCTIONS(CustomToolChain)
+
 public:
+    enum OutputParser
+    {
+        Gcc = 0,
+        Clang = 1,
+        LinuxIcc = 2,
+        Msvc = 3,
+        OutputParserCount
+    };
+
     QString type() const;
     QString typeDisplayName() const;
     Abi targetAbi() const;
@@ -98,6 +110,9 @@ public:
 
     ToolChain *clone() const;
 
+    OutputParser outputParserType() const;
+    void setOutputParserType(OutputParser parser);
+    static QString parserName(OutputParser parser);
 protected:
     CustomToolChain(const QString &id, bool autodetect);
     CustomToolChain(const CustomToolChain &);
@@ -114,6 +129,7 @@ private:
     QStringList m_cxx11Flags;
     QList<Utils::FileName> m_mkspecs;
 
+    OutputParser m_outputParser;
     friend class Internal::CustomToolChainFactory;
     friend class ToolChainFactory;
 };
@@ -157,6 +173,7 @@ public:
 
 private slots:
     void updateSummaries();
+    void errorParserChanged(int index);
 
 protected:
     void applyImpl();
@@ -175,6 +192,7 @@ protected:
     TextEditDetailsWidget *m_headerDetails;
     QLineEdit *m_cxx11Flags;
     QLineEdit *m_mkspecs;
+    QComboBox *m_errorParserComboBox;
 };
 
 } // namespace Internal