diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp
index 05a9ad3806c6677760f048ce6c8575f2f1ce07e4..55d94dd474e2aa35fe80d1309af555e55c08a1a1 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.cpp
+++ b/src/plugins/projectexplorer/abstractprocessstep.cpp
@@ -185,7 +185,8 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
     m_timer = 0;
 
     // The process has finished, leftover data is read in processFinished
-    bool returnValue = processFinished(m_process->exitCode(), m_process->exitStatus());
+    processFinished(m_process->exitCode(), m_process->exitStatus());
+    bool returnValue = processSucceeded(m_process->exitCode(), m_process->exitStatus()) || m_ignoreReturnValue;
 
     delete m_process;
     m_process = 0;
@@ -198,22 +199,27 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi)
 
 void AbstractProcessStep::processStarted()
 {
-    emit addOutput(tr("<font color=\"#0000ff\">Starting: %1 %2</font>\n").arg(m_command, Qt::escape(m_arguments.join(" "))));
+    emit addOutput(tr("<font color=\"#0000ff\">Starting: \"%1\" %2</font>\n").arg(m_command, Qt::escape(m_arguments.join(" "))));
 }
 
-bool AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status)
+void AbstractProcessStep::processFinished(int exitCode, QProcess::ExitStatus status)
 {
-    const bool ok = status == QProcess::NormalExit && (exitCode == 0 || m_ignoreReturnValue);
-    if (ok)
-        emit addOutput(tr("<font color=\"#0000ff\">Exited with code %1.</font>").arg(m_process->exitCode()));
+    if (status == QProcess::NormalExit && exitCode == 0)
+        emit addOutput(tr("<font color=\"#0000ff\">The process \"%1\" exited normally.</font>").arg(m_command));
+    else if (status == QProcess::NormalExit)
+        emit addOutput(tr("<font color=\"#ff0000\"><b>The process \"%1\" exited with code %2.</b></font>").arg(m_command, m_process->exitCode()));
     else
-        emit addOutput(tr("<font color=\"#ff0000\"><b>Exited with code %1.</b></font>").arg(m_process->exitCode()));
-    return ok;
+        emit addOutput(tr("<font color=\"#ff0000\"><b>The process \"%1\" crashed.</b></font>").arg(m_command));
 }
 
 void AbstractProcessStep::processStartupFailed()
 {
-   emit addOutput(tr("<font color=\"#ff0000\"><b>Could not start process %1 </b></font>").arg(m_command));
+   emit addOutput(tr("<font color=\"#ff0000\"><b>Could not start process \"%1\"</b></font>").arg(m_command));
+}
+
+bool AbstractProcessStep::processSucceeded(int exitCode, QProcess::ExitStatus status)
+{
+    return exitCode == 0 && status == QProcess::NormalExit;
 }
 
 void AbstractProcessStep::processReadyReadStdOutput()
@@ -260,6 +266,11 @@ void AbstractProcessStep::checkForCancel()
 
 void AbstractProcessStep::taskAdded(const ProjectExplorer::Task &task)
 {
+    // Do not bother to report issues if we do not care about the results of
+    // the buildstep anyway:
+    if (m_ignoreReturnValue)
+        return;
+
     Task editable(task);
     QString filePath = QDir::cleanPath(task.file.trimmed());
     if (!filePath.isEmpty() && !QDir::isAbsolutePath(filePath)) {
diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h
index 0705cfde3924fca96f9e12ebf2b0a6397c04f62b..98399fdab2b00273120eaf928964fe19fb2a2cf8 100644
--- a/src/plugins/projectexplorer/abstractprocessstep.h
+++ b/src/plugins/projectexplorer/abstractprocessstep.h
@@ -125,10 +125,12 @@ protected:
     virtual void processStarted();
     /// Called after the process Finished
     /// the default implementation adds a line to the output window
-    virtual bool processFinished(int exitCode, QProcess::ExitStatus status);
+    virtual void processFinished(int exitCode, QProcess::ExitStatus status);
     /// Called if the process could not be started,
     /// by default adds a message to the output window
     virtual void processStartupFailed();
+    /// Called to test whether a prcess succeeded or not.
+    virtual bool processSucceeded(int exitCode, QProcess::ExitStatus status);
     /// Called for each line of output on stdOut()
     /// the default implementation adds the line to the
     /// application output window
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index 065e22f742051ea1b45f29cb75a50e486fd8ad2b..977830055211ae3cdeb0177d163f4a955c6153b1 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -266,9 +266,9 @@ void QMakeStep::processStartupFailed()
     AbstractProcessStep::processStartupFailed();
 }
 
-bool QMakeStep::processFinished(int exitCode, QProcess::ExitStatus status)
+bool QMakeStep::processSucceeded(int exitCode, QProcess::ExitStatus status)
 {
-    bool result = AbstractProcessStep::processFinished(exitCode, status);
+    bool result = AbstractProcessStep::processSucceeded(exitCode, status);
     if (!result)
         m_forced = true;
     qt4BuildConfiguration()->emitBuildDirectoryInitialized();
diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h
index 436183ec0017d5bfc180ef9806ff7fce46f7a199..79156622d185e014f92a7613b98c447715df6556 100644
--- a/src/plugins/qt4projectmanager/qmakestep.h
+++ b/src/plugins/qt4projectmanager/qmakestep.h
@@ -100,7 +100,7 @@ protected:
     virtual bool fromMap(const QVariantMap &map);
 
     virtual void processStartupFailed();
-    virtual bool processFinished(int exitCode, QProcess::ExitStatus status);
+    virtual bool processSucceeded(int exitCode, QProcess::ExitStatus status);
 
 private:
     void ctor();