diff --git a/src/plugins/projectexplorer/outputformatter.cpp b/src/plugins/projectexplorer/outputformatter.cpp
index 69bb04b72ea6a10c80065c9825da26229536205f..9cf37e31036cddaa42e895cc106a515546e7a1a5 100644
--- a/src/plugins/projectexplorer/outputformatter.cpp
+++ b/src/plugins/projectexplorer/outputformatter.cpp
@@ -37,8 +37,8 @@
 using namespace ProjectExplorer;
 using namespace TextEditor;
 
-OutputFormatter::OutputFormatter(QObject *parent)
-    : QObject(parent)
+OutputFormatter::OutputFormatter()
+    : QObject()
     , m_formats(0)
 {
     initFormats();
@@ -58,7 +58,6 @@ QPlainTextEdit *OutputFormatter::plainTextEdit() const
 void OutputFormatter::setPlainTextEdit(QPlainTextEdit *plainText)
 {
     m_plainTextEdit = plainText;
-    setParent(m_plainTextEdit);
 }
 
 void OutputFormatter::appendApplicationOutput(const QString &text, bool onStdErr)
@@ -83,15 +82,6 @@ void OutputFormatter::append(const QString &text, const QTextCharFormat &format)
     cursor.insertText(text, format);
 }
 
-void OutputFormatter::mousePressEvent(QMouseEvent * /*e*/)
-{}
-
-void OutputFormatter::mouseReleaseEvent(QMouseEvent * /*e*/)
-{}
-
-void OutputFormatter::mouseMoveEvent(QMouseEvent * /*e*/)
-{}
-
 void OutputFormatter::initFormats()
 {
     FontSettings fs = TextEditorSettings::instance()->fontSettings();
@@ -117,3 +107,8 @@ void OutputFormatter::initFormats()
     m_formats[StdErrFormat].setFont(font);
     m_formats[StdErrFormat].setForeground(QColor(200, 0, 0));
 }
+
+void OutputFormatter::handleLink(const QString &href)
+{
+    Q_UNUSED(href);
+}
diff --git a/src/plugins/projectexplorer/outputformatter.h b/src/plugins/projectexplorer/outputformatter.h
index effff7725a0eaa25e7fdfb97abda7baeb2c05fd7..71737a9e7c161d180953ff95d4cf387d006c78d1 100644
--- a/src/plugins/projectexplorer/outputformatter.h
+++ b/src/plugins/projectexplorer/outputformatter.h
@@ -46,7 +46,7 @@ class PROJECTEXPLORER_EXPORT OutputFormatter: public QObject
     Q_OBJECT
 
 public:
-    OutputFormatter(QObject *parent = 0);
+    OutputFormatter();
     virtual ~OutputFormatter();
 
     QPlainTextEdit *plainTextEdit() const;
@@ -55,9 +55,7 @@ public:
     virtual void appendApplicationOutput(const QString &text, bool onStdErr);
     virtual void appendMessage(const QString &text, bool isError);
 
-    virtual void mousePressEvent(QMouseEvent *e);
-    virtual void mouseReleaseEvent(QMouseEvent *e);
-    virtual void mouseMoveEvent(QMouseEvent *e);
+    virtual void handleLink(const QString &href);
 
 protected:
     enum Format {
diff --git a/src/plugins/projectexplorer/outputwindow.cpp b/src/plugins/projectexplorer/outputwindow.cpp
index 481bf4deb78b79b328df11c3260f8cdced379116..a12c94fa1e6abd84955a3177f600613d2e3594a1 100644
--- a/src/plugins/projectexplorer/outputwindow.cpp
+++ b/src/plugins/projectexplorer/outputwindow.cpp
@@ -44,6 +44,8 @@
 #include <coreplugin/icontext.h>
 #include <find/basetextfind.h>
 #include <aggregation/aggregate.h>
+#include <texteditor/basetexteditor.h>
+#include <projectexplorer/project.h>
 
 #include <QtGui/QIcon>
 #include <QtGui/QScrollBar>
@@ -211,7 +213,7 @@ void OutputPane::createNewOutputWindow(RunControl *rc)
             OutputWindow *ow = static_cast<OutputWindow *>(m_tabWidget->widget(i));
             ow->grayOutOldContent();
             ow->verticalScrollBar()->setValue(ow->verticalScrollBar()->maximum());
-            ow->setFormatter(rc->createOutputFormatter(ow));
+            ow->setFormatter(rc->outputFormatter());
             m_outputWindows.insert(rc, ow);
             found = true;
             break;
@@ -219,7 +221,7 @@ void OutputPane::createNewOutputWindow(RunControl *rc)
     }
     if (!found) {
         OutputWindow *ow = new OutputWindow(m_tabWidget);
-        ow->setFormatter(rc->createOutputFormatter(ow));
+        ow->setFormatter(rc->outputFormatter());
         Aggregation::Aggregate *agg = new Aggregation::Aggregate;
         agg->add(ow);
         agg->add(new Find::BaseTextFind(ow));
@@ -376,6 +378,8 @@ OutputWindow::OutputWindow(QWidget *parent)
     : QPlainTextEdit(parent)
     , m_enforceNewline(false)
     , m_scrollToBottom(false)
+    , m_linksActive(true)
+    , m_mousePressed(false)
 {
     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
     //setCenterOnScroll(false);
@@ -429,6 +433,42 @@ OutputWindow::~OutputWindow()
     delete m_outputWindowContext;
 }
 
+void OutputWindow::mousePressEvent(QMouseEvent *e)
+{
+    m_mousePressed = true;
+    QPlainTextEdit::mousePressEvent(e);
+}
+
+
+void OutputWindow::mouseReleaseEvent(QMouseEvent *e)
+{
+    m_mousePressed = false;
+
+    if (!m_linksActive) {
+        // Mouse was released, activate links again
+        m_linksActive = true;
+        return;
+    }
+
+    const QString href = anchorAt(e->pos());
+    if (m_formatter)
+        m_formatter->handleLink(href);
+    QPlainTextEdit::mouseReleaseEvent(e);
+}
+
+void OutputWindow::mouseMoveEvent(QMouseEvent *e)
+{
+    // Cursor was dragged to make a selection, deactivate links
+    if (m_mousePressed && textCursor().hasSelection())
+        m_linksActive = false;
+
+    if (!m_linksActive || anchorAt(e->pos()).isEmpty())
+        viewport()->setCursor(Qt::IBeamCursor);
+    else
+        viewport()->setCursor(Qt::PointingHandCursor);
+    QPlainTextEdit::mouseMoveEvent(e);
+}
+
 OutputFormatter *OutputWindow::formatter() const
 {
     return m_formatter;
@@ -554,21 +594,3 @@ void OutputWindow::enableUndoRedo()
     setMaximumBlockCount(0);
     setUndoRedoEnabled(true);
 }
-
-void OutputWindow::mousePressEvent(QMouseEvent *e)
-{
-    QPlainTextEdit::mousePressEvent(e);
-    m_formatter->mousePressEvent(e);
-}
-
-void OutputWindow::mouseReleaseEvent(QMouseEvent *e)
-{
-    QPlainTextEdit::mouseReleaseEvent(e);
-    m_formatter->mouseReleaseEvent(e);
-}
-
-void OutputWindow::mouseMoveEvent(QMouseEvent *e)
-{
-    QPlainTextEdit::mouseMoveEvent(e);
-    m_formatter->mouseMoveEvent(e);
-}
diff --git a/src/plugins/projectexplorer/outputwindow.h b/src/plugins/projectexplorer/outputwindow.h
index 6822b1cfcf709e6d97fef7e5213033202b438d91..33ef4aca48855ca818261cdc65eb26fdbb4998d0 100644
--- a/src/plugins/projectexplorer/outputwindow.h
+++ b/src/plugins/projectexplorer/outputwindow.h
@@ -49,6 +49,7 @@ namespace Core {
 namespace ProjectExplorer {
 class OutputFormatter;
 class RunControl;
+class Project;
 
 namespace Constants {
     const char * const C_APP_OUTPUT = "Application Output";
@@ -140,23 +141,24 @@ public:
     void showEvent(QShowEvent *);
 
 protected:
-    void mousePressEvent(QMouseEvent *e);
-    void mouseReleaseEvent(QMouseEvent *e);
-    void mouseMoveEvent(QMouseEvent *e);
-
     bool isScrollbarAtBottom() const;
     void scrollToBottom();
 
+    virtual void mousePressEvent(QMouseEvent *e);
+    virtual void mouseReleaseEvent(QMouseEvent *e);
+    virtual void mouseMoveEvent(QMouseEvent *e);
+
 private:
     void enableUndoRedo();
     QString doNewlineEnfocement(const QString &out);
 
-private:
     Core::BaseContext *m_outputWindowContext;
     OutputFormatter *m_formatter;
 
     bool m_enforceNewline;
     bool m_scrollToBottom;
+    bool m_linksActive;
+    bool m_mousePressed;
 };
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp
index 33b59d6984a9e084bc1cf7684477b3d5e956650e..d089ef8ecfb2baba16d5df50d9e98500eff09a4b 100644
--- a/src/plugins/projectexplorer/runconfiguration.cpp
+++ b/src/plugins/projectexplorer/runconfiguration.cpp
@@ -179,6 +179,11 @@ Target *RunConfiguration::target() const
     return m_target;
 }
 
+ProjectExplorer::OutputFormatter *RunConfiguration::createOutputFormatter() const
+{
+    return new OutputFormatter();
+}
+
 IRunConfigurationFactory::IRunConfigurationFactory(QObject *parent) :
     QObject(parent)
 {
@@ -218,13 +223,23 @@ IRunControlFactory::~IRunControlFactory()
 RunControl::RunControl(RunConfiguration *runConfiguration, QString mode)
     : m_runMode(mode), m_runConfiguration(runConfiguration)
 {
-    if (runConfiguration)
+    if (runConfiguration) {
         m_displayName  = runConfiguration->displayName();
+        m_outputFormatter = runConfiguration->createOutputFormatter();
+    }
+    // We need to ensure that there's always a OutputFormatter
+    if (!m_outputFormatter)
+        m_outputFormatter = new OutputFormatter();
 }
 
 RunControl::~RunControl()
 {
+    delete m_outputFormatter;
+}
 
+OutputFormatter *RunControl::outputFormatter()
+{
+    return m_outputFormatter;
 }
 
 QString RunControl::runMode() const
@@ -242,11 +257,6 @@ bool RunControl::sameRunConfiguration(RunControl *other)
     return other->m_runConfiguration.data() == m_runConfiguration.data();
 }
 
-OutputFormatter *RunControl::createOutputFormatter(QObject *parent)
-{
-    return new OutputFormatter(parent);
-}
-
 void RunControl::bringApplicationToForeground(qint64 pid)
 {
 #ifdef Q_OS_MAC
diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h
index f9e897e509fbda10e016b174bd832d31ab59bc93..c1532590f65135d8a0beac9837e16f6e5c4b3e2d 100644
--- a/src/plugins/projectexplorer/runconfiguration.h
+++ b/src/plugins/projectexplorer/runconfiguration.h
@@ -85,6 +85,8 @@ public:
 
     Target *target() const;
 
+    virtual ProjectExplorer::OutputFormatter *createOutputFormatter() const;
+
 signals:
     void isEnabledChanged(bool value);
 
@@ -169,7 +171,7 @@ public:
 
     bool sameRunConfiguration(RunControl *other);
 
-    virtual OutputFormatter *createOutputFormatter(QObject *parent = 0);
+    OutputFormatter *outputFormatter();
     QString runMode() const;
 
 signals:
@@ -189,6 +191,7 @@ private:
     QString m_displayName;
     QString m_runMode;
     const QWeakPointer<RunConfiguration> m_runConfiguration;
+    OutputFormatter *m_outputFormatter;
 
 #ifdef Q_OS_MAC
     //these two are used to bring apps in the foreground on Mac
diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro
index 72e0d2cadd7ed07c9a9a6cd356aab756a573c5c1..3fca4d496c27e7ace933521ec134312a8fc91b8a 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro
+++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro
@@ -22,8 +22,7 @@ HEADERS += qmlproject.h \
     qmltaskmanager.h \
     qmlprojectmanager_global.h \
     qmlprojectmanagerconstants.h \
-    qmlprojecttarget.h \
-    qmloutputformatter.h
+    qmlprojecttarget.h
 SOURCES += qmlproject.cpp \
     qmlprojectplugin.cpp \
     qmlprojectmanager.cpp \
@@ -35,8 +34,7 @@ SOURCES += qmlproject.cpp \
     qmlprojectrunconfigurationfactory.cpp \
     qmlprojectapplicationwizard.cpp \
     qmltaskmanager.cpp \
-    qmlprojecttarget.cpp \
-    qmloutputformatter.cpp
+    qmlprojecttarget.cpp
 RESOURCES += qmlproject.qrc
 
 OTHER_FILES += QmlProjectManager.pluginspec \
diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
index 3b959f83af023b2a768f511780df1c3d43843039..0a664a6fff645c5b77494899150b7903302fdcf5 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
@@ -27,9 +27,9 @@
 **
 **************************************************************************/
 
+#include "qmlprojectrunconfiguration.h"
 #include "qmlproject.h"
 #include "qmlprojectmanagerconstants.h"
-#include "qmlprojectrunconfiguration.h"
 #include "qmlprojecttarget.h"
 #include "projectexplorer/projectexplorer.h"
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp
index 9d3cbbd1df31eec731063a312153a1037eaa26ec..5de043e92bccaafd5c667ed62f7685a89d7312c7 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp
@@ -27,7 +27,6 @@
 **
 **************************************************************************/
 
-#include "qmloutputformatter.h"
 #include "qmlprojectruncontrol.h"
 #include "qmlprojectrunconfiguration.h"
 #include "qmlprojectconstants.h"
@@ -103,11 +102,6 @@ bool QmlRunControl::isRunning() const
     return m_applicationLauncher.isRunning();
 }
 
-ProjectExplorer::OutputFormatter *QmlRunControl::createOutputFormatter(QObject *parent)
-{
-    return new QmlOutputFormatter(parent);
-}
-
 void QmlRunControl::slotBringApplicationToForeground(qint64 pid)
 {
     bringApplicationToForeground(pid);
diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h
index 89d0d7dc5469261fe4fc9d1af2208484314bec38..7e85370a6eb49ef4ca76be295be723772405ddc7 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.h
@@ -51,8 +51,6 @@ public:
     virtual void stop();
     virtual bool isRunning() const;
 
-    virtual ProjectExplorer::OutputFormatter *createOutputFormatter(QObject *parent = 0);
-
 private slots:
     void processExited(int exitCode);
     void slotBringApplicationToForeground(qint64 pid);
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index 4d40f7de890f0c0359b2ba277bec5c0977a1d131..6b09682b13d004cb7191a9f0bb6bc2528490003f 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -35,6 +35,7 @@
 #include "maemorunconfigurationwidget.h"
 #include "maemotoolchain.h"
 #include "qemuruntimemanager.h"
+#include "qtoutputformatter.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/messagemanager.h>
@@ -113,6 +114,11 @@ QWidget *MaemoRunConfiguration::createConfigurationWidget()
     return new MaemoRunConfigurationWidget(this);
 }
 
+ProjectExplorer::OutputFormatter *MaemoRunConfiguration::createConfigurationWidget() const
+{
+    return new QtOutputFormatter(qt4Target()->qt4Project());
+}
+
 void MaemoRunConfiguration::proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode *pro)
 {
     if (m_proFilePath == pro->path())
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
index 1f674bbc1a49e8e17e6fc67211ec5d038a4a2f88..81a2897d53fd6bb3dbc2e1023cdda4316fa50e94 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
@@ -68,6 +68,7 @@ public:
 
     bool isEnabled(ProjectExplorer::BuildConfiguration *config) const;
     QWidget *createConfigurationWidget();
+    ProjectExplorer::OutputFormatter *createConfigurationWidget() const;
     Qt4Target *qt4Target() const;
     Qt4BuildConfiguration *activeQt4BuildConfiguration() const;
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index c92eab72e1bad17c99d5347814492f5e9ac4640a..3070b8a2124f79aac38129d8417b11c8ace43f46 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -41,6 +41,7 @@
 #include "qt4buildconfiguration.h"
 #include "qt4projectmanagerconstants.h"
 #include "s60createpackagestep.h"
+#include "qtoutputformatter.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/messagemanager.h>
@@ -207,6 +208,11 @@ QWidget *S60DeviceRunConfiguration::createConfigurationWidget()
     return new S60DeviceRunConfigurationWidget(this);
 }
 
+ProjectExplorer::OutputFormatter *S60DeviceRunConfiguration::createOutputFormatter() const
+{
+    return new QtOutputFormatter(qt4Target()->qt4Project());
+}
+
 QVariantMap S60DeviceRunConfiguration::toMap() const
 {
     QVariantMap map(ProjectExplorer::RunConfiguration::toMap());
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
index a1cb5d45906c68ad1e28c747e4322c6c8654a2cd..7776692d256a6f20f4e296a0c28f6685d588d75b 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
@@ -74,6 +74,8 @@ public:
     bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const;
     QWidget *createConfigurationWidget();
 
+    ProjectExplorer::OutputFormatter *createOutputFormatter() const;
+
     QString serialPortName() const;
     void setSerialPortName(const QString &name);
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
index 9ae33ff517aae649d524da693ab61e2d6dcd2b50..20dc6b8c2c13f8876d1740df2b0747c7cfb26564 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
@@ -37,6 +37,7 @@
 #include "s60devices.h"
 #include "qt4buildconfiguration.h"
 #include "qt4projectmanagerconstants.h"
+#include "qtoutputformatter.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/messagemanager.h>
@@ -131,6 +132,11 @@ QWidget *S60EmulatorRunConfiguration::createConfigurationWidget()
     return new S60EmulatorRunConfigurationWidget(this);
 }
 
+ProjectExplorer::OutputFormatter *S60EmulatorRunConfiguration::createOutputFormatter() const
+{
+    return new QtOutputFormatter(qt4Target()->qt4Project());
+}
+
 QVariantMap S60EmulatorRunConfiguration::toMap() const
 {
     QVariantMap map(ProjectExplorer::RunConfiguration::toMap());
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
index 917eac35b3b116bda3678301fa7a14f7e5a1e89b..62f0435e5f219161a6af49ab0b0f10e899ad73e0 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
@@ -67,6 +67,8 @@ public:
     bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const;
     QWidget *createConfigurationWidget();
 
+    ProjectExplorer::OutputFormatter *createOutputFormatter() const;
+
     QString executable() const;
 
     QVariantMap toMap() const;
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro
index f4c492ac33b7189a631d9b4a1d4caa263de35912..678bd5a9bce8c5b8940db4b49b407b9f8541b65e 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.pro
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro
@@ -44,7 +44,8 @@ HEADERS += qt4projectmanagerplugin.h \
     gettingstartedwelcomepage.h \
     qt4buildconfiguration.h \
     qt4target.h \
-    qmakeparser.h
+    qmakeparser.h \
+    qtoutputformatter.h
 SOURCES += qt4projectmanagerplugin.cpp \
     qt4projectmanager.cpp \
     qt4project.cpp \
@@ -85,7 +86,8 @@ SOURCES += qt4projectmanagerplugin.cpp \
     gettingstartedwelcomepage.cpp \
     qt4buildconfiguration.cpp \
     qt4target.cpp \
-    qmakeparser.cpp
+    qmakeparser.cpp \
+    qtoutputformatter.cpp
 FORMS += makestep.ui \
     qmakestep.ui \
     qt4projectconfigwidget.ui \
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
index a50d08eca1eb52769ae7e73798696f18157f7285..d866299aa53ae91a55bc982d4f61cf27cf30f83d 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
@@ -36,6 +36,7 @@
 #include "qt4target.h"
 #include "qt4buildconfiguration.h"
 #include "qt4projectmanagerconstants.h"
+#include "qtoutputformatter.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/messagemanager.h>
@@ -669,6 +670,11 @@ ProjectExplorer::ToolChain::ToolChainType Qt4RunConfiguration::toolChainType() c
     return qt4bc->toolChainType();
 }
 
+ProjectExplorer::OutputFormatter *Qt4RunConfiguration::createOutputFormatter() const
+{
+    return new QtOutputFormatter(qt4Target()->qt4Project());
+}
+
 ///
 /// Qt4RunConfigurationFactory
 /// This class is used to restore run settings (saved in .user files)
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt4runconfiguration.h
index 10ac7960f6eba472e567469871fc0abe7bc03ff2..882131c5c5b4bce18739033a176502270626b300 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.h
@@ -93,6 +93,8 @@ public:
     // TODO detectQtShadowBuild() ? how did this work ?
     QVariantMap toMap() const;
 
+    ProjectExplorer::OutputFormatter *createOutputFormatter() const;
+
 signals:
     void commandLineArgumentsChanged(const QString&);
     void workingDirectoryChanged(const QString&);
diff --git a/src/plugins/qmlprojectmanager/qmloutputformatter.cpp b/src/plugins/qt4projectmanager/qtoutputformatter.cpp
similarity index 53%
rename from src/plugins/qmlprojectmanager/qmloutputformatter.cpp
rename to src/plugins/qt4projectmanager/qtoutputformatter.cpp
index bd371334db133284689f2024c8d4fb24f414d2a0..4fe349be511d87fa9c938e01f478011d03a44703 100644
--- a/src/plugins/qmlprojectmanager/qmloutputformatter.cpp
+++ b/src/plugins/qt4projectmanager/qtoutputformatter.cpp
@@ -27,24 +27,28 @@
 **
 **************************************************************************/
 
-#include "qmloutputformatter.h"
+#include "qtoutputformatter.h"
 
 #include <texteditor/basetexteditor.h>
+#include <qt4projectmanager/qt4project.h>
 
+#include <QtCore/QFileInfo>
 #include <QtGui/QPlainTextEdit>
 
 using namespace ProjectExplorer;
-using namespace QmlProjectManager::Internal;
+using namespace Qt4ProjectManager;
 
-QmlOutputFormatter::QmlOutputFormatter(QObject *parent)
-    : OutputFormatter(parent)
+QtOutputFormatter::QtOutputFormatter(Qt4Project *project)
+    : OutputFormatter()
     , m_qmlError(QLatin1String("(file:///[^:]+:\\d+:\\d+):"))
-    , m_linksActive(true)
-    , m_mousePressed(false)
+    , m_qtError(QLatin1String("Object::.*in (.*:\\d+)"))
+    , m_project(project)
+
 {
+
 }
 
-void QmlOutputFormatter::appendApplicationOutput(const QString &text, bool onStdErr)
+void QtOutputFormatter::appendApplicationOutput(const QString &text, bool onStdErr)
 {
     QTextCharFormat linkFormat;
     linkFormat.setForeground(plainTextEdit()->palette().link().color());
@@ -52,37 +56,33 @@ void QmlOutputFormatter::appendApplicationOutput(const QString &text, bool onStd
     linkFormat.setAnchor(true);
 
     // Create links from QML errors (anything of the form "file:///...:[line]:[column]:")
-    int index = 0;
-    while (m_qmlError.indexIn(text, index) != -1) {
+    if (m_qmlError.indexIn(text) != -1) {
         const int matchPos = m_qmlError.pos(1);
-        const QString leader = text.mid(index, matchPos - index);
+        const QString leader = text.left(matchPos);
         append(leader, onStdErr ? StdErrFormat : StdOutFormat);
 
         const QString matched = m_qmlError.cap(1);
         linkFormat.setAnchorHref(matched);
         append(matched, linkFormat);
 
-        index = matchPos + m_qmlError.matchedLength() - 1;
-    }
-    append(text.mid(index), onStdErr ? StdErrFormat : StdOutFormat);
-}
-
-void QmlOutputFormatter::mousePressEvent(QMouseEvent * /*e*/)
-{
-    m_mousePressed = true;
-}
+        int index = matchPos + m_qmlError.matchedLength() - 1;
+        append(text.mid(index), onStdErr ? StdErrFormat : StdOutFormat);
+    } else if (m_qtError.indexIn(text) != -1) {
+        const int matchPos = m_qtError.pos(1);
+        const QString leader = text.left(matchPos);
+        append(leader, onStdErr ? StdErrFormat : StdOutFormat);
 
-void QmlOutputFormatter::mouseReleaseEvent(QMouseEvent *e)
-{
-    m_mousePressed = false;
+        const QString matched = m_qtError.cap(1);
+        linkFormat.setAnchorHref(m_qtError.cap(1));
+        append(matched, linkFormat);
 
-    if (!m_linksActive) {
-        // Mouse was released, activate links again
-        m_linksActive = true;
-        return;
+        int index = matchPos + m_qtError.matchedLength() - 1;
+        append(text.mid(index), onStdErr ? StdErrFormat : StdOutFormat);
     }
+}
 
-    const QString href = plainTextEdit()->anchorAt(e->pos());
+void QtOutputFormatter::handleLink(const QString &href)
+{
     if (!href.isEmpty()) {
         QRegExp qmlErrorLink(QLatin1String("^file://(/[^:]+):(\\d+):(\\d+)"));
 
@@ -91,18 +91,30 @@ void QmlOutputFormatter::mouseReleaseEvent(QMouseEvent *e)
             const int line = qmlErrorLink.cap(2).toInt();
             const int column = qmlErrorLink.cap(3).toInt();
             TextEditor::BaseTextEditor::openEditorAt(fileName, line, column - 1);
+            return;
         }
-    }
-}
 
-void QmlOutputFormatter::mouseMoveEvent(QMouseEvent *e)
-{
-    // Cursor was dragged to make a selection, deactivate links
-    if (m_mousePressed && plainTextEdit()->textCursor().hasSelection())
-        m_linksActive = false;
-
-    if (!m_linksActive || plainTextEdit()->anchorAt(e->pos()).isEmpty())
-        plainTextEdit()->viewport()->setCursor(Qt::IBeamCursor);
-    else
-        plainTextEdit()->viewport()->setCursor(Qt::PointingHandCursor);
+        QRegExp qtErrorLink(QLatin1String("^(.*):(\\d+)$"));
+        if (qtErrorLink.indexIn(href) != 1) {
+            QString fileName = qtErrorLink.cap(1);
+            const int line = qtErrorLink.cap(2).toInt();
+            QFileInfo fi(fileName);
+            if (fi.isRelative()) {
+                // Yeah fileName is relative, no suprise
+                Qt4Project *pro = m_project.data();
+                if (pro) {
+                    QString baseName = fi.fileName();
+                    foreach (const QString &file, pro->files(Project::AllFiles)) {
+                        if (file.endsWith(baseName)) {
+                            // pick the first one...
+                            fileName = file;
+                            break;
+                        }
+                    }
+                }
+            }
+            TextEditor::BaseTextEditor::openEditorAt(fileName, line, 0);
+            return;
+        }
+    }
 }
diff --git a/src/plugins/qmlprojectmanager/qmloutputformatter.h b/src/plugins/qt4projectmanager/qtoutputformatter.h
similarity index 80%
rename from src/plugins/qmlprojectmanager/qmloutputformatter.h
rename to src/plugins/qt4projectmanager/qtoutputformatter.h
index 8d0e64d6d515a8f83259f6018eeae6e719e09d32..9a039581db6889594d19400118223f3c2320ab33 100644
--- a/src/plugins/qmlprojectmanager/qmloutputformatter.h
+++ b/src/plugins/qt4projectmanager/qtoutputformatter.h
@@ -31,30 +31,29 @@
 #define QMLOUTPUTFORMATTER_H
 
 #include <projectexplorer/outputformatter.h>
-
 #include <QtCore/QRegExp>
+#include <QSharedPointer>
 
-namespace QmlProjectManager {
-namespace Internal {
+namespace Qt4ProjectManager
+{
+class Qt4Project;
 
-class QmlOutputFormatter: public ProjectExplorer::OutputFormatter
+class QtOutputFormatter: public ProjectExplorer::OutputFormatter
 {
 public:
-    QmlOutputFormatter(QObject *parent = 0);
+    QtOutputFormatter(Qt4Project *project);
 
     virtual void appendApplicationOutput(const QString &text, bool onStdErr);
 
-    virtual void mousePressEvent(QMouseEvent *e);
-    virtual void mouseReleaseEvent(QMouseEvent *e);
-    virtual void mouseMoveEvent(QMouseEvent *e);
+    virtual void handleLink(const QString &href);
 
 private:
     QRegExp m_qmlError;
-    bool m_linksActive;
-    bool m_mousePressed;
+    QRegExp m_qtError;
+    QWeakPointer<Qt4Project> m_project;
 };
 
-} // namespace Internal
+
 } // namespace QmlProjectManager
 
 #endif // QMLOUTPUTFORMATTER_H