diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp
index fcde4a2a46387fb31037017aec81860fa6d51e89..2a42a58fd304ca947b78b89b9b5d48ceeb541807 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.cpp
+++ b/src/plugins/projectexplorer/abstractprocessstep.cpp
@@ -204,6 +204,12 @@ void AbstractProcessStep::processStarted()
 
 void AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status)
 {
+    // Clean up output parsers
+    if (m_outputParserChain) {
+        delete m_outputParserChain;
+        m_outputParserChain = 0;
+    }
+
     if (status == QProcess::NormalExit && exitCode == 0) {
         emit addOutput(tr("The process \"%1\" exited normally.")
                        .arg(QDir::toNativeSeparators(m_command)),
diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp
index 25020291709e688b8892f816c5f7d34e924ffdac..4bd15206071b0743a6bafa805386589ad2a55470 100644
--- a/src/plugins/projectexplorer/ioutputparser.cpp
+++ b/src/plugins/projectexplorer/ioutputparser.cpp
@@ -60,9 +60,9 @@ IOutputParser *IOutputParser::takeOutputParserChain()
 {
     IOutputParser *parser = m_parser;
     disconnect(parser, SIGNAL(addOutput(QString,ProjectExplorer::BuildStep::OutputFormat)),
-            this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat)));
+               this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat)));
     disconnect(parser, SIGNAL(addTask(ProjectExplorer::Task)),
-            this, SLOT(taskAdded(ProjectExplorer::Task)));
+               this, SLOT(taskAdded(ProjectExplorer::Task)));
     m_parser = 0;
     return parser;
 }
@@ -72,6 +72,13 @@ IOutputParser *IOutputParser::childParser() const
     return m_parser;
 }
 
+void IOutputParser::setChildParser(IOutputParser *parser)
+{
+    if (m_parser != parser)
+        delete m_parser;
+    m_parser = parser;
+}
+
 void IOutputParser::stdOutput(const QString &line)
 {
     if (m_parser)
diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h
index ba8dfbb47e5564da5c98039805b4d967fc5371f2..37da95b6ce6f54bcd6b6531e5abf03720c1da153 100644
--- a/src/plugins/projectexplorer/ioutputparser.h
+++ b/src/plugins/projectexplorer/ioutputparser.h
@@ -57,6 +57,7 @@ public:
     /// Return the head of this parsers output parser children
     /// IOutputParser keeps ownership!
     IOutputParser *childParser() const;
+    void setChildParser(IOutputParser *parser);
 
     /// Called once for each line if standard output to parse.
     virtual void stdOutput(const QString &line);
diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp
index e1ea1a61f122c910d1c7cfd030048dc07b6438fd..ab3b714ec82afd728a0e05a77e7bca2689601921 100644
--- a/src/plugins/projectexplorer/outputparser_test.cpp
+++ b/src/plugins/projectexplorer/outputparser_test.cpp
@@ -64,6 +64,19 @@ void OutputParserTester::testParsing(const QString &lines,
         else
             childParser()->stdError(input);
     }
+     // first disconnect ourselves from the end of the parser chain again
+    IOutputParser * parser = this;
+    while (parser = parser->childParser()) {
+        if (parser->childParser() == this) {
+            childParser()->takeOutputParserChain();
+            break;
+        }
+    }
+    parser = 0;
+    emit aboutToDeleteParser();
+
+    // then delete the parser(s) to test
+    setChildParser(0);
 
     QCOMPARE(m_receivedOutput, outputLines);
     QCOMPARE(m_receivedStdErrChildLine, childStdErrLines);
diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h
index 5d3a4d2d0b1b18fc32e0bbd3facba0dc46a3d63c..74fe5c87a638fbeda6ba5daf0bddfae624fb89cd 100644
--- a/src/plugins/projectexplorer/outputparser_test.h
+++ b/src/plugins/projectexplorer/outputparser_test.h
@@ -70,6 +70,9 @@ public:
 
     void appendOutputParser(IOutputParser *parser);
 
+signals:
+    void aboutToDeleteParser();
+
 private slots:
     void outputAdded(const QString &line, const QTextCharFormat &textCharFormat);
     void taskAdded(const ProjectExplorer::Task &task);