diff --git a/src/plugins/projectexplorer/taskhub.h b/src/plugins/projectexplorer/taskhub.h
index 1355705e61f139bf1f318378d32483544837e8bf..90f77abd75eb9b5c012a941b2bf0b9624548cf94 100644
--- a/src/plugins/projectexplorer/taskhub.h
+++ b/src/plugins/projectexplorer/taskhub.h
@@ -45,10 +45,13 @@ public:
     TaskHub();
     virtual ~TaskHub();
 
+public slots:
     void addCategory(const Core::Id &categoryId, const QString &displayName, bool visible = true);
-    void addTask(Task task);
+    void addTask(ProjectExplorer::Task task);
     void clearTasks(const Core::Id &categoryId = Core::Id());
-    void removeTask(const Task &task);
+    void removeTask(const ProjectExplorer::Task &task);
+
+public:
     void updateTaskFileName(unsigned int id, const QString &fileName);
     void updateTaskLineNumber(unsigned int id, int line);
     void taskMarkClicked(unsigned int id);
@@ -58,6 +61,7 @@ public:
     void requestPopup();
 
     QIcon taskTypeIcon(ProjectExplorer::Task::TaskType t) const;
+
 signals:
     void categoryAdded(const Core::Id &categoryId, const QString &displayName, bool visible);
     void taskAdded(const ProjectExplorer::Task &task);
diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
index 9e944c94227404c8cd4da3ca6508628fe2d6df04..10522cebe18c43a2f77bb0d95fd643aa769222c6 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
@@ -135,8 +135,6 @@ void QbsBuildStep::run(QFutureInterface<bool> &fi)
             this, SLOT(handleProgress(int)));
     connect(m_job, SIGNAL(reportCommandDescription(QString,QString)),
             this, SLOT(handleCommandDescriptionReport(QString,QString)));
-    connect(m_job, SIGNAL(reportWarning(qbs::Error)),
-            this, SLOT(handleWarningReport(qbs::Error)));
     connect(m_job, SIGNAL(reportProcessResult(qbs::ProcessResult)),
             this, SLOT(handleProcessResultReport(qbs::ProcessResult)));
 }
@@ -246,14 +244,6 @@ void QbsBuildStep::handleProgress(int value)
     m_fi->setProgressValue(m_progressBase + value);
 }
 
-void QbsBuildStep::handleWarningReport(const qbs::Error &error)
-{
-    foreach (const qbs::ErrorData &data, error.entries()) {
-        createTaskAndOutput(ProjectExplorer::Task::Warning, data.description(),
-                            data.codeLocation().fileName(), data.codeLocation().line());
-    }
-}
-
 void QbsBuildStep::handleCommandDescriptionReport(const QString &highlight, const QString &message)
 {
     Q_UNUSED(highlight);
diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h
index 9d5e1da3945b3fb08ab172af22eea2c70984890c..0d1ce0691b18def88d061f5e68f5201e16b60326 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildstep.h
+++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h
@@ -78,7 +78,6 @@ private slots:
     void buildingDone(bool success);
     void handleTaskStarted(const QString &desciption, int max);
     void handleProgress(int value);
-    void handleWarningReport(const qbs::Error &error);
     void handleCommandDescriptionReport(const QString &highlight, const QString &message);
     void handleProcessResultReport(const qbs::ProcessResult &result);
 
diff --git a/src/plugins/qbsprojectmanager/qbslogsink.cpp b/src/plugins/qbsprojectmanager/qbslogsink.cpp
index 03cfe0fdf6639c65448e7a8f531f3f43e0dfe7d3..624f51391758f31c284f7800169ae0e5af60d053 100644
--- a/src/plugins/qbsprojectmanager/qbslogsink.cpp
+++ b/src/plugins/qbsprojectmanager/qbslogsink.cpp
@@ -32,6 +32,9 @@
 #include <qbs.h>
 
 #include <coreplugin/messagemanager.h>
+#include <projectexplorer/projectexplorer.h>
+#include <projectexplorer/taskhub.h>
+#include <utils/fileutils.h>
 
 #include <QCoreApplication>
 #include <QMutexLocker>
@@ -46,6 +49,9 @@ namespace Internal {
 
 QbsLogSink::QbsLogSink(QObject *parent) : QObject(parent)
 {
+    ProjectExplorer::TaskHub *hub = ProjectExplorer::ProjectExplorerPlugin::instance()->taskHub();
+    connect(this, SIGNAL(newTask(ProjectExplorer::Task)),
+            hub, SLOT(addTask(ProjectExplorer::Task)), Qt::QueuedConnection);
 }
 
 void QbsLogSink::sendMessages()
@@ -62,6 +68,16 @@ void QbsLogSink::sendMessages()
         mm->printToOutputPane(msg);
 }
 
+void QbsLogSink::doPrintWarning(const qbs::Error &warning)
+{
+    foreach (const qbs::ErrorData &data, warning.entries())
+        emit newTask(ProjectExplorer::Task(ProjectExplorer::Task::Warning,
+                                           data.description(),
+                                           Utils::FileName::fromString(data.codeLocation().fileName()),
+                                           data.codeLocation().line(),
+                                           ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
+}
+
 void QbsLogSink::doPrintMessage(qbs::LoggerLevel level, const QString &message, const QString &tag)
 {
     Q_UNUSED(tag);
diff --git a/src/plugins/qbsprojectmanager/qbslogsink.h b/src/plugins/qbsprojectmanager/qbslogsink.h
index cfbfc1b1d00e717e2837cbddbf32ae15293eabe4..fe40101e884279c54d1f7fb55690adc212c3cbfe 100644
--- a/src/plugins/qbsprojectmanager/qbslogsink.h
+++ b/src/plugins/qbsprojectmanager/qbslogsink.h
@@ -30,6 +30,8 @@
 #ifndef QBSLOGSINK_H
 #define QBSLOGSINK_H
 
+#include <projectexplorer/task.h>
+
 #include <qbs.h>
 
 #include <QMutex>
@@ -45,10 +47,14 @@ class QbsLogSink : public QObject, public qbs::ILogSink
 public:
     QbsLogSink(QObject *parent = 0);
 
+signals:
+    void newTask(const ProjectExplorer::Task &task);
+
 private slots:
     void sendMessages();
 
 private:
+    void doPrintWarning(const qbs::Error &warning);
     void doPrintMessage(qbs::LoggerLevel level, const QString &message, const QString &tag);
 
     QStringList m_messages;
diff --git a/src/shared/qbs b/src/shared/qbs
index 32ae53690c01e5269ac2a9ad0dadf549ce04ee3f..5df624fa5884ba7ca9d1d0666484ad24c1c0b70b 160000
--- a/src/shared/qbs
+++ b/src/shared/qbs
@@ -1 +1 @@
-Subproject commit 32ae53690c01e5269ac2a9ad0dadf549ce04ee3f
+Subproject commit 5df624fa5884ba7ca9d1d0666484ad24c1c0b70b