diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp
index 972f79fd417977fdc8544a8feeb57a08d5aa934b..92025f3ff3ae7a2a6c1592dbb0fc04ebe10fdaeb 100644
--- a/src/plugins/projectexplorer/gnumakeparser.cpp
+++ b/src/plugins/projectexplorer/gnumakeparser.cpp
@@ -43,7 +43,8 @@ namespace {
 }
 
 GnuMakeParser::GnuMakeParser(const QString &dir) :
-    m_suppressIssues(false)
+    m_suppressIssues(false),
+    m_fatalErrorCount(0)
 {
     m_makeDir.setPattern(QLatin1String(MAKE_PATTERN) +
                          QLatin1String("(\\w+) directory .(.+).$"));
@@ -55,6 +56,11 @@ GnuMakeParser::GnuMakeParser(const QString &dir) :
     addDirectory(dir);
 }
 
+int GnuMakeParser::fatalErrors() const
+{
+    return m_fatalErrorCount;
+}
+
 void GnuMakeParser::stdOutput(const QString &line)
 {
     QString lne = line.trimmed();
@@ -75,6 +81,7 @@ void GnuMakeParser::stdError(const QString &line)
     QString lne = line.trimmed();
 
     if (m_makefileError.indexIn(lne) > -1) {
+        ++m_fatalErrorCount;
         if (!m_suppressIssues) {
             m_suppressIssues = true;
             addTask(Task(Task::Error,
@@ -86,6 +93,7 @@ void GnuMakeParser::stdError(const QString &line)
         return;
     }
     if (m_makeLine.indexIn(lne) > -1) {
+        ++m_fatalErrorCount;
         if (!m_suppressIssues) {
             m_suppressIssues = true;
             addTask(Task(Task::Error,
diff --git a/src/plugins/projectexplorer/gnumakeparser.h b/src/plugins/projectexplorer/gnumakeparser.h
index ca1b041ae04ed1b71441b2d7655e94942ef5c388..f5c693e519f78566816200c72bce257cbbcd8745 100644
--- a/src/plugins/projectexplorer/gnumakeparser.h
+++ b/src/plugins/projectexplorer/gnumakeparser.h
@@ -49,6 +49,8 @@ public:
 
     QStringList searchDirectories() const;
 
+    int fatalErrors() const;
+
 public slots:
     virtual void taskAdded(const ProjectExplorer::Task &task);
 
@@ -66,6 +68,8 @@ private:
     friend class ProjectExplorerPlugin;
 #endif
     bool m_suppressIssues;
+
+    int m_fatalErrorCount;
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index 04fa070e5046ad5a9ec66325033808eb915be181..fb3184ac82bc8c3a791e882e77b6cf7c8dea9ecb 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -187,6 +187,16 @@ void MakeStep::run(QFutureInterface<bool> & fi)
     AbstractProcessStep::run(fi);
 }
 
+bool MakeStep::processSucceeded(int exitCode, QProcess::ExitStatus status)
+{
+    // Symbian does retun 0, even on failed makes! So we check for fatal make errors here.
+    ProjectExplorer::GnuMakeParser *parser = qobject_cast<ProjectExplorer::GnuMakeParser *>(outputParser());
+    if (parser && parser->fatalErrors() != 0)
+        return false;
+
+    return AbstractProcessStep::processSucceeded(exitCode, status);
+}
+
 bool MakeStep::immutable() const
 {
     return false;
diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h
index 133cd784ee8cc8ed0fce8abe3058dbbd7ecacd0d..8fe405f078aa4c4b4028868a1c9aaa8dc970132d 100644
--- a/src/plugins/qt4projectmanager/makestep.h
+++ b/src/plugins/qt4projectmanager/makestep.h
@@ -86,6 +86,8 @@ public:
 
     virtual bool init();
     virtual void run(QFutureInterface<bool> &);
+    bool processSucceeded(int exitCode, QProcess::ExitStatus status);
+
     virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
     virtual bool immutable() const;
     QStringList userArguments();