diff --git a/src/plugins/analyzerbase/analyzerconstants.h b/src/plugins/analyzerbase/analyzerconstants.h
index 1b1826443cbbf88c93bbf98338dcd2723037e8c4..5034e5531dc98fd3236e795b613eed4e0a55c64a 100644
--- a/src/plugins/analyzerbase/analyzerconstants.h
+++ b/src/plugins/analyzerbase/analyzerconstants.h
@@ -45,7 +45,7 @@ enum StartMode
     StartLocal = -1,
     StartRemote = -2,
     StartQml = -3,
-    StartQmlAndroid = -4 // TODO: remove this enum and make it generic
+    StartQmlRemote = -4 // TODO: remove this enum and make it generic
 };
 
 namespace Constants {
diff --git a/src/plugins/analyzerbase/ianalyzertool.cpp b/src/plugins/analyzerbase/ianalyzertool.cpp
index fc22394e29d4da9fd9ee6e1f95f37a57b4571f36..e29e3681c993f77499f5e2f61a010a4d79264b51 100644
--- a/src/plugins/analyzerbase/ianalyzertool.cpp
+++ b/src/plugins/analyzerbase/ianalyzertool.cpp
@@ -54,7 +54,7 @@ Id IAnalyzerTool::defaultActionId(const IAnalyzerTool *tool, StartMode mode)
     case StartRemote:
         return id.withSuffix(".Remote");
     case StartQml:
-    case StartQmlAndroid:
+    case StartQmlRemote:
         return id.withSuffix(".Qml");
     }
     return Id();
diff --git a/src/plugins/android/androidanalyzesupport.cpp b/src/plugins/android/androidanalyzesupport.cpp
index 652a477e83244a4a9b92a2c043a616275b7706cd..227938a34a01fbca1e8e974a434a3f311d58cf5a 100644
--- a/src/plugins/android/androidanalyzesupport.cpp
+++ b/src/plugins/android/androidanalyzesupport.cpp
@@ -63,7 +63,7 @@ RunControl *AndroidAnalyzeSupport::createAnalyzeRunControl(AndroidRunConfigurati
 
     AnalyzerStartParameters params;
     params.toolId = tool->id();
-    params.startMode = StartQmlAndroid;
+    params.startMode = StartQmlRemote;
     Target *target = runConfig->target();
     params.displayName = AndroidManager::packageName(target);
     params.sysroot = SysRootKitInformation::sysRoot(target->kit()).toString();
diff --git a/src/plugins/qmlprofiler/qmlprofiler.pro b/src/plugins/qmlprofiler/qmlprofiler.pro
index 4209a73221718af4219caa024dbfd427d2592f59..c2f6f058184f4a117adbf7e226f2a45fc12afc5f 100644
--- a/src/plugins/qmlprofiler/qmlprofiler.pro
+++ b/src/plugins/qmlprofiler/qmlprofiler.pro
@@ -11,7 +11,6 @@ SOURCES += \
     qmlprofilerengine.cpp \
     qmlprofilerattachdialog.cpp \
     localqmlprofilerrunner.cpp \
-    remotelinuxqmlprofilerrunner.cpp \
     qmlprofilereventview.cpp \
     qmlprofilerdetailsrewriter.cpp \
     qmlprofilertraceview.cpp \
@@ -32,7 +31,6 @@ HEADERS += \
     qmlprofilerattachdialog.h \
     abstractqmlprofilerrunner.h \
     localqmlprofilerrunner.h \
-    remotelinuxqmlprofilerrunner.h \
     qmlprofilereventview.h \
     qmlprofilerdetailsrewriter.h \
     qmlprofilertraceview.h \
diff --git a/src/plugins/qmlprofiler/qmlprofiler.qbs b/src/plugins/qmlprofiler/qmlprofiler.qbs
index f19582516d8638faa279d518be316e6abd3c2267..7567289cc7a7ce445bd3ec856cf55f7bd3ed210c 100644
--- a/src/plugins/qmlprofiler/qmlprofiler.qbs
+++ b/src/plugins/qmlprofiler/qmlprofiler.qbs
@@ -55,8 +55,6 @@ QtcPlugin {
         "qmlprofilerviewmanager.h",
         "qv8profilerdatamodel.cpp",
         "qv8profilerdatamodel.h",
-        "remotelinuxqmlprofilerrunner.cpp",
-        "remotelinuxqmlprofilerrunner.h",
         "timelinerenderer.cpp",
         "timelinerenderer.h",
         "canvas/qdeclarativecanvas.cpp",
diff --git a/src/plugins/qmlprofiler/qmlprofiler_dependencies.pri b/src/plugins/qmlprofiler/qmlprofiler_dependencies.pri
index 18371ae3f3c0737566fc0601fc9227c7c24dcfbe..9685afccc3dde26821d203cd2fdd5dec5d508773 100644
--- a/src/plugins/qmlprofiler/qmlprofiler_dependencies.pri
+++ b/src/plugins/qmlprofiler/qmlprofiler_dependencies.pri
@@ -7,5 +7,4 @@ QTC_PLUGIN_DEPENDS += \
     analyzerbase \
     qmlprojectmanager \
     qt4projectmanager \
-    qmljstools \
-    remotelinux
+    qmljstools
diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.cpp b/src/plugins/qmlprofiler/qmlprofilerengine.cpp
index 1bb6f46cb022f9c4b9a7403ead2521f2df12d959..6b0185685f20a22a4573947493633fd72672836f 100644
--- a/src/plugins/qmlprofiler/qmlprofilerengine.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilerengine.cpp
@@ -30,7 +30,6 @@
 #include "qmlprofilerengine.h"
 
 #include "localqmlprofilerrunner.h"
-#include "remotelinuxqmlprofilerrunner.h"
 
 #include <analyzerbase/analyzermanager.h>
 #include <coreplugin/icore.h>
@@ -46,7 +45,6 @@
 #include <projectexplorer/localapplicationruncontrol.h>
 #include <projectexplorer/localapplicationrunconfiguration.h>
 #include <qmldebug/qmloutputparser.h>
-#include <remotelinux/remotelinuxrunconfiguration.h>
 
 #include <QMainWindow>
 #include <QMessageBox>
@@ -91,37 +89,36 @@ QmlProfilerEngine::QmlProfilerEnginePrivate::createRunner(ProjectExplorer::RunCo
     if (!runConfiguration) // attaching
         return 0;
 
-    if (RemoteLinux::RemoteLinuxRunConfiguration *rmConfig =
-            qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration)) {
-        runner = new RemoteLinuxQmlProfilerRunner(rmConfig, parent);
+    QmlProjectManager::QmlProjectRunConfiguration *rc1 =
+                qobject_cast<QmlProjectManager::QmlProjectRunConfiguration *>(runConfiguration);
+    LocalApplicationRunConfiguration *rc2 =
+                   qobject_cast<LocalApplicationRunConfiguration *>(runConfiguration);
+    // Supports only local run configurations
+    if (!rc1 && !rc2)
+        return 0;
+
+    ProjectExplorer::EnvironmentAspect *environment
+            = runConfiguration->extraAspect<ProjectExplorer::EnvironmentAspect>();
+    QTC_ASSERT(environment, return 0);
+    LocalQmlProfilerRunner::Configuration conf;
+    if (rc1) {
+        // This is a "plain" .qmlproject.
+        conf.executable = rc1->observerPath();
+        conf.executableArguments = rc1->viewerArguments();
+        conf.workingDirectory = rc1->workingDirectory();
+        conf.environment = environment->environment();
     } else {
-        ProjectExplorer::EnvironmentAspect *environment
-                = runConfiguration->extraAspect<ProjectExplorer::EnvironmentAspect>();
-        QTC_ASSERT(environment, return 0);
-        LocalQmlProfilerRunner::Configuration conf;
-        if (QmlProjectManager::QmlProjectRunConfiguration *rc1 =
-                qobject_cast<QmlProjectManager::QmlProjectRunConfiguration *>(runConfiguration)) {
-            // This is a "plain" .qmlproject.
-            conf.executable = rc1->observerPath();
-            conf.executableArguments = rc1->viewerArguments();
-            conf.workingDirectory = rc1->workingDirectory();
-            conf.environment = environment->environment();
-        } else if (LocalApplicationRunConfiguration *rc2 =
-                   qobject_cast<LocalApplicationRunConfiguration *>(runConfiguration)) {
-            // FIXME: Check.
-            conf.executable = rc2->executable();
-            conf.executableArguments = rc2->commandLineArguments();
-            conf.workingDirectory = rc2->workingDirectory();
-            conf.environment = environment->environment();
-        } else {
-            QTC_CHECK(false);
-        }
-        const ProjectExplorer::IDevice::ConstPtr device =
-                ProjectExplorer::DeviceKitInformation::device(runConfiguration->target()->kit());
-        QTC_ASSERT(device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE, return 0);
-        conf.port = sp.analyzerPort;
-        runner = new LocalQmlProfilerRunner(conf, parent);
+        // FIXME: Check.
+        conf.executable = rc2->executable();
+        conf.executableArguments = rc2->commandLineArguments();
+        conf.workingDirectory = rc2->workingDirectory();
+        conf.environment = environment->environment();
     }
+    const ProjectExplorer::IDevice::ConstPtr device =
+            ProjectExplorer::DeviceKitInformation::device(runConfiguration->target()->kit());
+    QTC_ASSERT(device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE, return 0);
+    conf.port = sp.analyzerPort;
+    runner = new LocalQmlProfilerRunner(conf, parent);
     return runner;
 }
 
@@ -197,7 +194,7 @@ bool QmlProfilerEngine::start()
                 this, SLOT(logApplicationMessage(QString,Utils::OutputFormat)));
         d->m_runner->start();
         d->m_noDebugOutputTimer.start();
-    } else if (d->sp.startMode == StartQmlAndroid) {
+    } else if (d->sp.startMode == StartQmlRemote) {
         d->m_noDebugOutputTimer.start();
     } else {
         emit processRunning(startParameters().analyzerPort);
diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp
index 669fdfcad593903d2a7539eee4c7305ae967606e..f1528cfa3147da17e58af9d136b9f670ffa7bf30 100644
--- a/src/plugins/qmlprofiler/qmlprofilertool.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp
@@ -57,9 +57,6 @@
 #include <projectexplorer/localapplicationrunconfiguration.h>
 #include <texteditor/itexteditor.h>
 
-#include <remotelinux/remotelinuxrunconfiguration.h>
-#include <remotelinux/linuxdevice.h>
-
 #include <android/androidconstants.h>
 
 #include <coreplugin/coreconstants.h>
@@ -97,7 +94,6 @@ using namespace QmlProfiler::Constants;
 using namespace QmlDebug;
 using namespace ProjectExplorer;
 using namespace QmlProjectManager;
-using namespace RemoteLinux;
 
 class QmlProfilerTool::QmlProfilerToolPrivate
 {
@@ -284,7 +280,6 @@ IAnalyzerEngine *QmlProfilerTool::createEngine(const AnalyzerStartParameters &sp
 bool QmlProfilerTool::canRun(RunConfiguration *runConfiguration, RunMode mode) const
 {
     if (qobject_cast<QmlProjectRunConfiguration *>(runConfiguration)
-            || qobject_cast<RemoteLinuxRunConfiguration *>(runConfiguration)
             || qobject_cast<LocalApplicationRunConfiguration *>(runConfiguration))
         return mode == runMode();
     return false;
@@ -328,16 +323,6 @@ AnalyzerStartParameters QmlProfilerTool::createStartParameters(RunConfiguration
         sp.debuggee = rc2->executable();
         sp.debuggeeArgs = rc2->commandLineArguments();
         sp.displayName = rc2->displayName();
-    } else if (RemoteLinux::RemoteLinuxRunConfiguration *rc3 =
-            qobject_cast<RemoteLinux::RemoteLinuxRunConfiguration *>(runConfiguration)) {
-        sp.debuggee = rc3->remoteExecutableFilePath();
-        sp.debuggeeArgs = rc3->arguments();
-        sp.connParams = ProjectExplorer::DeviceKitInformation::device(rc3->target()->kit())->sshParameters();
-        sp.analyzerCmdPrefix = rc3->commandPrefix();
-        sp.displayName = rc3->displayName();
-        sp.sysroot = sysroot(rc3);
-        sp.analyzerHost = sp.connParams.host;
-        sp.analyzerPort = sp.connParams.port;
     } else {
         // What could that be?
         QTC_ASSERT(false, return sp);
diff --git a/src/plugins/remotelinux/iremotelinuxrunsupport.cpp b/src/plugins/remotelinux/iremotelinuxrunsupport.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ed18d0dc789be0936df6243c97560c295b77f223
--- /dev/null
+++ b/src/plugins/remotelinux/iremotelinuxrunsupport.cpp
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "iremotelinuxrunsupport.h"
+#include "remotelinuxrunconfiguration.h"
+
+#include <projectexplorer/target.h>
+#include <projectexplorer/kitinformation.h>
+#include <projectexplorer/devicesupport/deviceapplicationrunner.h>
+#include <projectexplorer/devicesupport/deviceusedportsgatherer.h>
+
+#include <utils/portlist.h>
+
+using namespace ProjectExplorer;
+
+namespace RemoteLinux {
+namespace Internal {
+
+class IRemoteLinuxRunSupportPrivate
+{
+public:
+    IRemoteLinuxRunSupportPrivate(const RemoteLinuxRunConfiguration *runConfig)
+        : state(IRemoteLinuxRunSupport::Inactive),
+          device(DeviceKitInformation::device(runConfig->target()->kit())),
+          remoteFilePath(runConfig->remoteExecutableFilePath()),
+          arguments(runConfig->arguments()),
+          commandPrefix(runConfig->commandPrefix())
+    {
+    }
+
+    IRemoteLinuxRunSupport::State state;
+    DeviceApplicationRunner appRunner;
+    DeviceUsedPortsGatherer portsGatherer;
+    const ProjectExplorer::IDevice::ConstPtr device;
+    Utils::PortList portList;
+    const QString remoteFilePath;
+    const QString arguments;
+    const QString commandPrefix;
+};
+
+} // namespace Internal
+
+using namespace Internal;
+
+IRemoteLinuxRunSupport::IRemoteLinuxRunSupport(RemoteLinuxRunConfiguration *runConfig, QObject *parent)
+    : QObject(parent),
+      d(new IRemoteLinuxRunSupportPrivate(runConfig))
+{
+}
+
+IRemoteLinuxRunSupport::~IRemoteLinuxRunSupport()
+{
+    setFinished();
+    delete d;
+}
+
+void IRemoteLinuxRunSupport::setApplicationRunnerPreRunAction(DeviceApplicationHelperAction *action)
+{
+    d->appRunner.setPreRunAction(action);
+}
+
+void IRemoteLinuxRunSupport::setApplicationRunnerPostRunAction(DeviceApplicationHelperAction *action)
+{
+    d->appRunner.setPostRunAction(action);
+}
+
+void IRemoteLinuxRunSupport::setState(IRemoteLinuxRunSupport::State state)
+{
+    d->state = state;
+}
+
+IRemoteLinuxRunSupport::State IRemoteLinuxRunSupport::state() const
+{
+    return d->state;
+}
+
+void IRemoteLinuxRunSupport::handleRemoteSetupRequested()
+{
+    QTC_ASSERT(d->state == Inactive, return);
+    d->state = GatheringPorts;
+    connect(&d->portsGatherer, SIGNAL(error(QString)), SLOT(handlePortsGathererError(QString)));
+    connect(&d->portsGatherer, SIGNAL(portListReady()), SLOT(handlePortListReady()));
+    d->portsGatherer.start(d->device);
+}
+
+void IRemoteLinuxRunSupport::handlePortsGathererError(const QString &message)
+{
+    QTC_ASSERT(d->state == GatheringPorts, return);
+    handleAdapterSetupFailed(message);
+}
+
+void IRemoteLinuxRunSupport::handlePortListReady()
+{
+    QTC_ASSERT(d->state == GatheringPorts, return);
+
+    d->portList = d->device->freePorts();
+    startExecution();
+}
+
+void IRemoteLinuxRunSupport::handleAppRunnerError(const QString &)
+{
+}
+
+void IRemoteLinuxRunSupport::handleRemoteOutput(const QByteArray &)
+{
+}
+
+void IRemoteLinuxRunSupport::handleRemoteErrorOutput(const QByteArray &)
+{
+}
+
+void IRemoteLinuxRunSupport::handleAppRunnerFinished(bool)
+{
+}
+
+void IRemoteLinuxRunSupport::handleProgressReport(const QString &)
+{
+}
+
+void IRemoteLinuxRunSupport::handleAdapterSetupFailed(const QString &)
+{
+    setFinished();
+}
+
+void IRemoteLinuxRunSupport::handleAdapterSetupDone()
+{
+    d->state = Running;
+}
+
+void IRemoteLinuxRunSupport::setFinished()
+{
+    if (d->state == Inactive)
+        return;
+    d->portsGatherer.disconnect(this);
+    d->appRunner.disconnect(this);
+    if (d->state == Running) {
+        const QString stopCommand
+                = d->device->processSupport()->killProcessByNameCommandLine(d->remoteFilePath);
+        d->appRunner.stop(stopCommand.toUtf8());
+    }
+    d->state = Inactive;
+}
+
+bool IRemoteLinuxRunSupport::setPort(int &port)
+{
+    port = d->portsGatherer.getNextFreePort(&d->portList);
+    if (port == -1) {
+        handleAdapterSetupFailed(tr("Not enough free ports on device for debugging."));
+        return false;
+    }
+    return true;
+}
+
+QString IRemoteLinuxRunSupport::arguments() const
+{
+    return d->arguments;
+}
+
+QString IRemoteLinuxRunSupport::commandPrefix() const
+{
+    return d->commandPrefix;
+}
+
+QString IRemoteLinuxRunSupport::remoteFilePath() const
+{
+    return d->remoteFilePath;
+}
+
+const IDevice::ConstPtr IRemoteLinuxRunSupport::device() const
+{
+    return d->device;
+}
+
+DeviceApplicationRunner *IRemoteLinuxRunSupport::appRunner() const
+{
+    return &d->appRunner;
+}
+
+} // namespace RemoteLinux
diff --git a/src/plugins/remotelinux/iremotelinuxrunsupport.h b/src/plugins/remotelinux/iremotelinuxrunsupport.h
new file mode 100644
index 0000000000000000000000000000000000000000..1d234d71a372fee9296a811bcb3d57a15cc8351c
--- /dev/null
+++ b/src/plugins/remotelinux/iremotelinuxrunsupport.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef IREMOTELINUXRUNSUPPORT_H
+#define IREMOTELINUXRUNSUPPORT_H
+
+#include "remotelinux_export.h"
+
+#include <projectexplorer/devicesupport/idevice.h>
+
+#include <QObject>
+
+namespace ProjectExplorer {
+class DeviceApplicationHelperAction;
+class DeviceApplicationRunner;
+}
+
+namespace RemoteLinux {
+
+class RemoteLinuxRunConfiguration;
+
+namespace Internal { class IRemoteLinuxRunSupportPrivate; }
+
+class REMOTELINUX_EXPORT IRemoteLinuxRunSupport : public QObject
+{
+    Q_OBJECT
+protected:
+    enum State
+    {
+        Inactive,
+        GatheringPorts,
+        StartingRunner,
+        Running
+    };
+public:
+    IRemoteLinuxRunSupport(RemoteLinuxRunConfiguration *runConfig,
+                          QObject *parent = 0);
+    ~IRemoteLinuxRunSupport();
+
+    void setApplicationRunnerPreRunAction(ProjectExplorer::DeviceApplicationHelperAction *action);
+    void setApplicationRunnerPostRunAction(ProjectExplorer::DeviceApplicationHelperAction *action);
+
+protected:
+    void setState(State state);
+    State state() const;
+    ProjectExplorer::DeviceApplicationRunner *appRunner() const;
+
+    virtual void startExecution() = 0;
+
+    virtual void handleAdapterSetupFailed(const QString &error);
+    virtual void handleAdapterSetupDone();
+
+    void setFinished();
+    bool setPort(int &port);
+
+    QString arguments() const;
+    QString commandPrefix() const;
+    QString remoteFilePath() const;
+    const ProjectExplorer::IDevice::ConstPtr device() const;
+
+protected slots:
+    virtual void handleRemoteSetupRequested();
+    virtual void handleAppRunnerError(const QString &error);
+    virtual void handleRemoteOutput(const QByteArray &output);
+    virtual void handleRemoteErrorOutput(const QByteArray &output);
+    virtual void handleAppRunnerFinished(bool success);
+    virtual void handleProgressReport(const QString &progressOutput);
+
+private slots:
+    void handlePortsGathererError(const QString &message);
+    void handlePortListReady();
+
+private:
+    friend class Internal::IRemoteLinuxRunSupportPrivate;
+    Internal::IRemoteLinuxRunSupportPrivate * const d;
+};
+
+} // namespace RemoteLinux
+
+#endif // IREMOTELINUXRUNSUPPORT_H
diff --git a/src/plugins/remotelinux/remotelinux.pro b/src/plugins/remotelinux/remotelinux.pro
index 0c25de13787f9103d71672a8a2e3eaa774f44d80..e108242bb4b6b91442ffaf95809c79bd0b791180 100644
--- a/src/plugins/remotelinux/remotelinux.pro
+++ b/src/plugins/remotelinux/remotelinux.pro
@@ -46,7 +46,9 @@ HEADERS += \
     genericlinuxdeviceconfigurationwidget.h \
     remotelinuxcheckforfreediskspaceservice.h \
     remotelinuxcheckforfreediskspacestep.h \
-    remotelinuxdeploymentdatamodel.h
+    remotelinuxdeploymentdatamodel.h \
+    iremotelinuxrunsupport.h \
+    remotelinuxanalyzesupport.h
 
 SOURCES += \
     embeddedlinuxqtversion.cpp \
@@ -90,7 +92,9 @@ SOURCES += \
     genericlinuxdeviceconfigurationwidget.cpp \
     remotelinuxcheckforfreediskspaceservice.cpp \
     remotelinuxcheckforfreediskspacestep.cpp \
-    remotelinuxdeploymentdatamodel.cpp
+    remotelinuxdeploymentdatamodel.cpp \
+    iremotelinuxrunsupport.cpp \
+    remotelinuxanalyzesupport.cpp
 
 FORMS += \
     genericlinuxdeviceconfigurationwizardsetuppage.ui \
diff --git a/src/plugins/remotelinux/remotelinux_dependencies.pri b/src/plugins/remotelinux/remotelinux_dependencies.pri
index 4027b3a12c4286a928b936bb7e1aef2d802657ee..682503fc07e3128bc8794978ebc06c9d5357a6b2 100644
--- a/src/plugins/remotelinux/remotelinux_dependencies.pri
+++ b/src/plugins/remotelinux/remotelinux_dependencies.pri
@@ -3,4 +3,5 @@ QTC_PLUGIN_DEPENDS += \
     coreplugin \
     debugger \
     projectexplorer \
-    qtsupport
+    qtsupport \
+    analyzerbase
diff --git a/src/plugins/remotelinux/remotelinuxanalyzesupport.cpp b/src/plugins/remotelinux/remotelinuxanalyzesupport.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a487e0224ed6ece743eef20d2060f94bf5b179f8
--- /dev/null
+++ b/src/plugins/remotelinux/remotelinuxanalyzesupport.cpp
@@ -0,0 +1,207 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "remotelinuxanalyzesupport.h"
+
+#include "remotelinuxrunconfiguration.h"
+
+#include <analyzerbase/ianalyzerengine.h>
+
+#include <projectexplorer/buildconfiguration.h>
+#include <projectexplorer/project.h>
+#include <projectexplorer/target.h>
+#include <projectexplorer/toolchain.h>
+#include <projectexplorer/devicesupport/deviceapplicationrunner.h>
+#include <projectexplorer/kitinformation.h>
+
+#include <utils/qtcassert.h>
+
+#include <QPointer>
+
+using namespace QSsh;
+using namespace Analyzer;
+using namespace ProjectExplorer;
+
+namespace RemoteLinux {
+namespace Internal {
+
+class RemoteLinuxAnalyzeSupportPrivate
+{
+public:
+    RemoteLinuxAnalyzeSupportPrivate(IAnalyzerEngine *engine, RunMode runMode)
+        : engine(engine),
+          qmlProfiling(runMode == QmlProfilerRunMode),
+          qmlPort(-1)
+    {
+    }
+
+    const QPointer<IAnalyzerEngine> engine;
+    bool qmlProfiling;
+    int qmlPort;
+};
+
+} // namespace Internal
+
+using namespace Internal;
+
+AnalyzerStartParameters RemoteLinuxAnalyzeSupport::startParameters(const RemoteLinuxRunConfiguration *runConfig,
+                                                                   RunMode runMode)
+{
+    AnalyzerStartParameters params;
+    if (runMode == QmlProfilerRunMode)
+        params.startMode = StartQmlRemote;
+    params.debuggee = runConfig->remoteExecutableFilePath();
+    params.debuggeeArgs = runConfig->arguments();
+    params.connParams = DeviceKitInformation::device(runConfig->target()->kit())->sshParameters();
+    params.analyzerCmdPrefix = runConfig->commandPrefix();
+    params.displayName = runConfig->displayName();
+    params.sysroot = SysRootKitInformation::sysRoot(runConfig->target()->kit()).toString();
+    params.analyzerHost = params.connParams.host;
+    params.analyzerPort = params.connParams.port;
+
+    return params;
+}
+
+RemoteLinuxAnalyzeSupport::RemoteLinuxAnalyzeSupport(RemoteLinuxRunConfiguration *runConfig,
+                                                     IAnalyzerEngine *engine, RunMode runMode)
+    : IRemoteLinuxRunSupport(runConfig, engine),
+      d(new RemoteLinuxAnalyzeSupportPrivate(engine, runMode))
+{
+    connect(d->engine, SIGNAL(starting(const Analyzer::IAnalyzerEngine*)),
+            SLOT(handleRemoteSetupRequested()));
+    connect(d->engine, SIGNAL(finished()), SLOT(handleProfilingFinished()));
+}
+
+RemoteLinuxAnalyzeSupport::~RemoteLinuxAnalyzeSupport()
+{
+    delete d;
+}
+
+void RemoteLinuxAnalyzeSupport::showMessage(const QString &msg, Utils::OutputFormat format)
+{
+    if (state() != Inactive && d->engine)
+        d->engine->logApplicationMessage(msg, format);
+}
+
+void RemoteLinuxAnalyzeSupport::handleRemoteSetupRequested()
+{
+    QTC_ASSERT(state() == Inactive, return);
+
+    showMessage(tr("Checking available ports...\n"), Utils::NormalMessageFormat);
+    IRemoteLinuxRunSupport::handleRemoteSetupRequested();
+}
+
+void RemoteLinuxAnalyzeSupport::startExecution()
+{
+    QTC_ASSERT(state() == GatheringPorts, return);
+
+    if (d->qmlProfiling && !setPort(d->qmlPort))
+            return;
+
+    setState(StartingRunner);
+
+    DeviceApplicationRunner *runner = appRunner();
+    connect(runner, SIGNAL(remoteStderr(QByteArray)), SLOT(handleRemoteErrorOutput(QByteArray)));
+    connect(runner, SIGNAL(remoteStdout(QByteArray)), SLOT(handleRemoteOutput(QByteArray)));
+    if (d->qmlProfiling)
+        connect(runner, SIGNAL(remoteProcessStarted()), SLOT(handleRemoteProcessStarted()));
+    QString args = arguments();
+    if (d->qmlProfiling)
+        args += QString::fromLocal8Bit(" -qmljsdebugger=port:%1,block").arg(d->qmlPort);
+    const QString remoteCommandLine = d->qmlProfiling
+        ? QString::fromLatin1("%1 %2 %3").arg(commandPrefix()).arg(remoteFilePath()).arg(args)
+        : QString();
+    connect(runner, SIGNAL(finished(bool)), SLOT(handleAppRunnerFinished(bool)));
+    connect(runner, SIGNAL(reportProgress(QString)), SLOT(handleProgressReport(QString)));
+    connect(runner, SIGNAL(reportError(QString)), SLOT(handleAppRunnerError(QString)));
+    runner->start(device(), remoteCommandLine.toUtf8());
+}
+
+void RemoteLinuxAnalyzeSupport::handleAppRunnerError(const QString &error)
+{
+    if (state() == Running)
+        showMessage(error, Utils::ErrorMessageFormat);
+    else if (state() != Inactive)
+        handleAdapterSetupFailed(error);
+}
+
+void RemoteLinuxAnalyzeSupport::handleAppRunnerFinished(bool success)
+{
+    if (!success)
+        showMessage(tr("Failure running remote process."), Utils::NormalMessageFormat);
+}
+
+void RemoteLinuxAnalyzeSupport::handleProfilingFinished()
+{
+    setFinished();
+}
+
+void RemoteLinuxAnalyzeSupport::handleRemoteOutput(const QByteArray &output)
+{
+    QTC_ASSERT(state() == Inactive || state() == Running, return);
+
+    showMessage(QString::fromUtf8(output), Utils::StdOutFormat);
+}
+
+void RemoteLinuxAnalyzeSupport::handleRemoteErrorOutput(const QByteArray &output)
+{
+    QTC_ASSERT(state() != GatheringPorts, return);
+
+    if (!d->engine)
+        return;
+
+    showMessage(QString::fromUtf8(output), Utils::StdErrFormat);
+}
+
+void RemoteLinuxAnalyzeSupport::handleProgressReport(const QString &progressOutput)
+{
+    showMessage(progressOutput + QLatin1Char('\n'), Utils::NormalMessageFormat);
+}
+
+void RemoteLinuxAnalyzeSupport::handleAdapterSetupFailed(const QString &error)
+{
+    IRemoteLinuxRunSupport::handleAdapterSetupFailed(error);
+    showMessage(tr("Initial setup failed: %1").arg(error), Utils::NormalMessageFormat);
+}
+
+void RemoteLinuxAnalyzeSupport::handleAdapterSetupDone()
+{
+    IRemoteLinuxRunSupport::handleAdapterSetupDone();
+    d->engine->notifyRemoteSetupDone(d->qmlPort);
+}
+
+void RemoteLinuxAnalyzeSupport::handleRemoteProcessStarted()
+{
+    QTC_ASSERT(d->qmlProfiling, return);
+    QTC_ASSERT(state() == StartingRunner, return);
+
+    handleAdapterSetupDone();
+}
+
+} // namespace RemoteLinux
diff --git a/src/plugins/remotelinux/remotelinuxanalyzesupport.h b/src/plugins/remotelinux/remotelinuxanalyzesupport.h
new file mode 100644
index 0000000000000000000000000000000000000000..bfe8118833facdd3e3e841b37ce4fa4f86e343e9
--- /dev/null
+++ b/src/plugins/remotelinux/remotelinuxanalyzesupport.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef REMOTELINUXANALYZESUPPORT_H
+#define REMOTELINUXANALYZESUPPORT_H
+
+#include "iremotelinuxrunsupport.h"
+
+#include <projectexplorer/projectexplorerconstants.h>
+#include <utils/outputformat.h>
+
+namespace Analyzer {
+class AnalyzerStartParameters;
+class IAnalyzerEngine;
+}
+
+namespace RemoteLinux {
+class RemoteLinuxRunConfiguration;
+
+namespace Internal { class RemoteLinuxAnalyzeSupportPrivate; }
+
+class REMOTELINUX_EXPORT RemoteLinuxAnalyzeSupport : public IRemoteLinuxRunSupport
+{
+    Q_OBJECT
+public:
+    static Analyzer::AnalyzerStartParameters startParameters(const RemoteLinuxRunConfiguration *runConfig,
+                                                             ProjectExplorer::RunMode runMode);
+
+    RemoteLinuxAnalyzeSupport(RemoteLinuxRunConfiguration *runConfig,
+            Analyzer::IAnalyzerEngine *engine, ProjectExplorer::RunMode runMode);
+    ~RemoteLinuxAnalyzeSupport();
+
+protected:
+    void startExecution();
+    void handleAdapterSetupFailed(const QString &error);
+    void handleAdapterSetupDone();
+
+private slots:
+    void handleRemoteSetupRequested();
+    void handleAppRunnerError(const QString &error);
+    void handleRemoteOutput(const QByteArray &output);
+    void handleRemoteErrorOutput(const QByteArray &output);
+    void handleAppRunnerFinished(bool success);
+    void handleProgressReport(const QString &progressOutput);
+
+    void handleRemoteProcessStarted();
+    void handleProfilingFinished();
+
+private:
+    void showMessage(const QString &, Utils::OutputFormat);
+
+    Internal::RemoteLinuxAnalyzeSupportPrivate * const d;
+};
+
+} // namespace RemoteLinux
+
+#endif // REMOTELINUXANALYZESUPPORT_H
diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
index 308e99fd2521b4d2b6f23a7e7e64c0ef65256452..fa7d5f3ef0d01ffaa0e3622e3a9b636c68d7d18c 100644
--- a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
+++ b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp
@@ -36,12 +36,11 @@
 #include <debugger/debuggerstartparameters.h>
 #include <debugger/debuggerkitinformation.h>
 #include <projectexplorer/buildconfiguration.h>
-#include <projectexplorer/devicesupport/deviceusedportsgatherer.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/toolchain.h>
 #include <projectexplorer/devicesupport/deviceapplicationrunner.h>
-#include <utils/portlist.h>
+
 #include <utils/qtcassert.h>
 
 #include <QPointer>
@@ -52,9 +51,6 @@ using namespace ProjectExplorer;
 
 namespace RemoteLinux {
 namespace Internal {
-namespace {
-enum State { Inactive, GatheringPorts, StartingRunner, Debugging };
-} // anonymous namespace
 
 class LinuxDeviceDebugSupportPrivate
 {
@@ -64,12 +60,7 @@ public:
         : engine(engine),
           qmlDebugging(runConfig->extraAspect<Debugger::DebuggerRunConfigurationAspect>()->useQmlDebugger()),
           cppDebugging(runConfig->extraAspect<Debugger::DebuggerRunConfigurationAspect>()->useCppDebugger()),
-          state(Inactive),
-          gdbServerPort(-1), qmlPort(-1),
-          device(DeviceKitInformation::device(runConfig->target()->kit())),
-          remoteFilePath(runConfig->remoteExecutableFilePath()),
-          arguments(runConfig->arguments()),
-          commandPrefix(runConfig->commandPrefix())
+          gdbServerPort(-1), qmlPort(-1)
     {
     }
 
@@ -77,16 +68,8 @@ public:
     bool qmlDebugging;
     bool cppDebugging;
     QByteArray gdbserverOutput;
-    State state;
     int gdbServerPort;
     int qmlPort;
-    DeviceApplicationRunner appRunner;
-    DeviceUsedPortsGatherer portsGatherer;
-    const ProjectExplorer::IDevice::ConstPtr device;
-    Utils::PortList portList;
-    const QString remoteFilePath;
-    const QString arguments;
-    const QString commandPrefix;
 };
 
 } // namespace Internal
@@ -135,9 +118,9 @@ DebuggerStartParameters LinuxDeviceDebugSupport::startParameters(const RemoteLin
     return params;
 }
 
-LinuxDeviceDebugSupport::LinuxDeviceDebugSupport(RunConfiguration *runConfig,
+LinuxDeviceDebugSupport::LinuxDeviceDebugSupport(RemoteLinuxRunConfiguration *runConfig,
         DebuggerEngine *engine)
-    : QObject(engine),
+    : IRemoteLinuxRunSupport(runConfig, engine),
       d(new LinuxDeviceDebugSupportPrivate(static_cast<RemoteLinuxRunConfiguration *>(runConfig), engine))
 {
     connect(d->engine, SIGNAL(requestRemoteSetup()), this, SLOT(handleRemoteSetupRequested()));
@@ -145,96 +128,70 @@ LinuxDeviceDebugSupport::LinuxDeviceDebugSupport(RunConfiguration *runConfig,
 
 LinuxDeviceDebugSupport::~LinuxDeviceDebugSupport()
 {
-    setFinished();
     delete d;
 }
 
-void LinuxDeviceDebugSupport::setApplicationRunnerPreRunAction(DeviceApplicationHelperAction *action)
-{
-    d->appRunner.setPreRunAction(action);
-}
-
-void LinuxDeviceDebugSupport::setApplicationRunnerPostRunAction(DeviceApplicationHelperAction *action)
-{
-    d->appRunner.setPostRunAction(action);
-}
-
 void LinuxDeviceDebugSupport::showMessage(const QString &msg, int channel)
 {
-    if (d->state != Inactive && d->engine)
+    if (state() != Inactive && d->engine)
         d->engine->showMessage(msg, channel);
 }
 
 void LinuxDeviceDebugSupport::handleRemoteSetupRequested()
 {
-    QTC_ASSERT(d->state == Inactive, return);
+    QTC_ASSERT(state() == Inactive, return);
 
-    d->state = GatheringPorts;
     showMessage(tr("Checking available ports...\n"), LogStatus);
-    connect(&d->portsGatherer, SIGNAL(error(QString)), SLOT(handlePortsGathererError(QString)));
-    connect(&d->portsGatherer, SIGNAL(portListReady()), SLOT(handlePortListReady()));
-    d->portsGatherer.start(d->device);
-}
-
-void LinuxDeviceDebugSupport::handlePortsGathererError(const QString &message)
-{
-    QTC_ASSERT(d->state == GatheringPorts, return);
-    handleAdapterSetupFailed(message);
-}
-
-void LinuxDeviceDebugSupport::handlePortListReady()
-{
-    QTC_ASSERT(d->state == GatheringPorts, return);
-
-    d->portList = d->device->freePorts();
-    startExecution();
+    IRemoteLinuxRunSupport::handleRemoteSetupRequested();
 }
 
 void LinuxDeviceDebugSupport::startExecution()
 {
-    QTC_ASSERT(d->state == GatheringPorts, return);
+    QTC_ASSERT(state() == GatheringPorts, return);
 
     if (d->cppDebugging && !setPort(d->gdbServerPort))
         return;
     if (d->qmlDebugging && !setPort(d->qmlPort))
             return;
 
-    d->state = StartingRunner;
+    setState(StartingRunner);
     d->gdbserverOutput.clear();
 
-    connect(&d->appRunner, SIGNAL(remoteStderr(QByteArray)),
-            SLOT(handleRemoteErrorOutput(QByteArray)));
-    connect(&d->appRunner, SIGNAL(remoteStdout(QByteArray)), SLOT(handleRemoteOutput(QByteArray)));
+    DeviceApplicationRunner *runner = appRunner();
+    connect(runner, SIGNAL(remoteStderr(QByteArray)), SLOT(handleRemoteErrorOutput(QByteArray)));
+    connect(runner, SIGNAL(remoteStdout(QByteArray)), SLOT(handleRemoteOutput(QByteArray)));
     if (d->qmlDebugging && !d->cppDebugging)
-        connect(&d->appRunner, SIGNAL(remoteProcessStarted()), SLOT(handleRemoteProcessStarted()));
-    QString args = d->arguments;
+        connect(runner, SIGNAL(remoteProcessStarted()), SLOT(handleRemoteProcessStarted()));
+    QString args = arguments();
     if (d->qmlDebugging)
         args += QString::fromLocal8Bit(" -qmljsdebugger=port:%1,block").arg(d->qmlPort);
     const QString remoteCommandLine = (d->qmlDebugging && !d->cppDebugging)
-        ? QString::fromLatin1("%1 %2 %3").arg(d->commandPrefix).arg(d->remoteFilePath).arg(args)
-        : QString::fromLatin1("%1 gdbserver :%2 %3 %4").arg(d->commandPrefix)
-              .arg(d->gdbServerPort).arg(d->remoteFilePath).arg(args);
-    connect(&d->appRunner, SIGNAL(finished(bool)), SLOT(handleAppRunnerFinished(bool)));
-    d->appRunner.start(d->device, remoteCommandLine.toUtf8());
+        ? QString::fromLatin1("%1 %2 %3").arg(commandPrefix()).arg(remoteFilePath()).arg(args)
+        : QString::fromLatin1("%1 gdbserver :%2 %3 %4").arg(commandPrefix())
+              .arg(d->gdbServerPort).arg(remoteFilePath()).arg(args);
+    connect(runner, SIGNAL(finished(bool)), SLOT(handleAppRunnerFinished(bool)));
+    connect(runner, SIGNAL(reportProgress(QString)), SLOT(handleProgressReport(QString)));
+    connect(runner, SIGNAL(reportError(QString)), SLOT(handleAppRunnerError(QString)));
+    runner->start(device(), remoteCommandLine.toUtf8());
 }
 
 void LinuxDeviceDebugSupport::handleAppRunnerError(const QString &error)
 {
-    if (d->state == Debugging) {
+    if (state() == Running) {
         showMessage(error, AppError);
         if (d->engine)
             d->engine->notifyInferiorIll();
-    } else if (d->state != Inactive) {
+    } else if (state() != Inactive) {
         handleAdapterSetupFailed(error);
     }
 }
 
 void LinuxDeviceDebugSupport::handleAppRunnerFinished(bool success)
 {
-    if (!d->engine || d->state == Inactive)
+    if (!d->engine || state() == Inactive)
         return;
 
-    if (d->state == Debugging) {
+    if (state() == Running) {
         // The QML engine does not realize on its own that the application has finished.
         if (d->qmlDebugging && !d->cppDebugging)
             d->engine->quitDebugger();
@@ -253,20 +210,20 @@ void LinuxDeviceDebugSupport::handleDebuggingFinished()
 
 void LinuxDeviceDebugSupport::handleRemoteOutput(const QByteArray &output)
 {
-    QTC_ASSERT(d->state == Inactive || d->state == Debugging, return);
+    QTC_ASSERT(state() == Inactive || state() == Running, return);
 
     showMessage(QString::fromUtf8(output), AppOutput);
 }
 
 void LinuxDeviceDebugSupport::handleRemoteErrorOutput(const QByteArray &output)
 {
-    QTC_ASSERT(d->state != GatheringPorts, return);
+    QTC_ASSERT(state() != GatheringPorts, return);
 
     if (!d->engine)
         return;
 
     showMessage(QString::fromUtf8(output), AppError);
-    if (d->state == StartingRunner && d->cppDebugging) {
+    if (state() == StartingRunner && d->cppDebugging) {
         d->gdbserverOutput += output;
         if (d->gdbserverOutput.contains("Listening on port")) {
             handleAdapterSetupDone();
@@ -282,46 +239,22 @@ void LinuxDeviceDebugSupport::handleProgressReport(const QString &progressOutput
 
 void LinuxDeviceDebugSupport::handleAdapterSetupFailed(const QString &error)
 {
-    setFinished();
+    IRemoteLinuxRunSupport::handleAdapterSetupFailed(error);
     d->engine->notifyEngineRemoteSetupFailed(tr("Initial setup failed: %1").arg(error));
 }
 
 void LinuxDeviceDebugSupport::handleAdapterSetupDone()
 {
-    d->state = Debugging;
+    IRemoteLinuxRunSupport::handleAdapterSetupDone();
     d->engine->notifyEngineRemoteSetupDone(d->gdbServerPort, d->qmlPort);
 }
 
 void LinuxDeviceDebugSupport::handleRemoteProcessStarted()
 {
     QTC_ASSERT(d->qmlDebugging && !d->cppDebugging, return);
-    QTC_ASSERT(d->state == StartingRunner, return);
+    QTC_ASSERT(state() == StartingRunner, return);
 
     handleAdapterSetupDone();
 }
 
-void LinuxDeviceDebugSupport::setFinished()
-{
-    if (d->state == Inactive)
-        return;
-    d->portsGatherer.disconnect(this);
-    d->appRunner.disconnect(this);
-    if (d->state == StartingRunner) {
-        const QString stopCommand
-                = d->device->processSupport()->killProcessByNameCommandLine(d->remoteFilePath);
-        d->appRunner.stop(stopCommand.toUtf8());
-    }
-    d->state = Inactive;
-}
-
-bool LinuxDeviceDebugSupport::setPort(int &port)
-{
-    port = d->portsGatherer.getNextFreePort(&d->portList);
-    if (port == -1) {
-        handleAdapterSetupFailed(tr("Not enough free ports on device for debugging."));
-        return false;
-    }
-    return true;
-}
-
 } // namespace RemoteLinux
diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.h b/src/plugins/remotelinux/remotelinuxdebugsupport.h
index 7096dfaeaca954e4b8a33bfd0224d1a2a04d1d1d..49047e3427b195cb187f4ed63cfb678f3cb48413 100644
--- a/src/plugins/remotelinux/remotelinuxdebugsupport.h
+++ b/src/plugins/remotelinux/remotelinuxdebugsupport.h
@@ -30,56 +30,45 @@
 #ifndef REMOTELINUXDEBUGSUPPORT_H
 #define REMOTELINUXDEBUGSUPPORT_H
 
-#include "remotelinux_export.h"
-
-#include <QObject>
+#include "iremotelinuxrunsupport.h"
 
 namespace Debugger {
 class DebuggerEngine;
 class DebuggerStartParameters;
 }
 
-namespace ProjectExplorer {
-class DeviceApplicationHelperAction;
-class RunConfiguration;
-}
-
 namespace RemoteLinux {
 class RemoteLinuxRunConfiguration;
 
 namespace Internal { class LinuxDeviceDebugSupportPrivate; }
 
-class REMOTELINUX_EXPORT LinuxDeviceDebugSupport : public QObject
+class REMOTELINUX_EXPORT LinuxDeviceDebugSupport : public IRemoteLinuxRunSupport
 {
     Q_OBJECT
 public:
     static Debugger::DebuggerStartParameters startParameters(const RemoteLinuxRunConfiguration *runConfig);
 
-    LinuxDeviceDebugSupport(ProjectExplorer::RunConfiguration *runConfig,
+    LinuxDeviceDebugSupport(RemoteLinuxRunConfiguration *runConfig,
             Debugger::DebuggerEngine *engine);
     ~LinuxDeviceDebugSupport();
 
-    void setApplicationRunnerPreRunAction(ProjectExplorer::DeviceApplicationHelperAction *action);
-    void setApplicationRunnerPostRunAction(ProjectExplorer::DeviceApplicationHelperAction *action);
+protected:
+    void startExecution();
+    void handleAdapterSetupFailed(const QString &error);
+    void handleAdapterSetupDone();
 
 private slots:
     void handleRemoteSetupRequested();
     void handleAppRunnerError(const QString &error);
-    void startExecution();
-    void handleDebuggingFinished();
     void handleRemoteOutput(const QByteArray &output);
     void handleRemoteErrorOutput(const QByteArray &output);
+    void handleAppRunnerFinished(bool success);
     void handleProgressReport(const QString &progressOutput);
+
     void handleRemoteProcessStarted();
-    void handleAppRunnerFinished(bool success);
-    void handlePortsGathererError(const QString &message);
-    void handlePortListReady();
+    void handleDebuggingFinished();
 
 private:
-    void handleAdapterSetupFailed(const QString &error);
-    void handleAdapterSetupDone();
-    void setFinished();
-    bool setPort(int &port);
     void showMessage(const QString &msg, int channel);
 
     Internal::LinuxDeviceDebugSupportPrivate * const d;
diff --git a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp
index 8682e540559a27e81cfc9e27ff71a5fbad4e6649..3792e39e084da5152e6683fcb0ecdf25d2567b2c 100644
--- a/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp
+++ b/src/plugins/remotelinux/remotelinuxruncontrolfactory.cpp
@@ -29,6 +29,7 @@
 
 #include "remotelinuxruncontrolfactory.h"
 
+#include "remotelinuxanalyzesupport.h"
 #include "remotelinuxdebugsupport.h"
 #include "remotelinuxrunconfiguration.h"
 #include "remotelinuxruncontrol.h"
@@ -36,11 +37,15 @@
 #include <debugger/debuggerplugin.h>
 #include <debugger/debuggerrunner.h>
 #include <debugger/debuggerstartparameters.h>
+#include <analyzerbase/analyzerstartparameters.h>
+#include <analyzerbase/analyzermanager.h>
+#include <analyzerbase/analyzerruncontrol.h>
 #include <projectexplorer/kitinformation.h>
 #include <projectexplorer/target.h>
 #include <utils/portlist.h>
 #include <utils/qtcassert.h>
 
+using namespace Analyzer;
 using namespace Debugger;
 using namespace ProjectExplorer;
 
@@ -58,8 +63,10 @@ RemoteLinuxRunControlFactory::~RemoteLinuxRunControlFactory()
 
 bool RemoteLinuxRunControlFactory::canRun(RunConfiguration *runConfiguration, RunMode mode) const
 {
-    if (mode != NormalRunMode && mode != DebugRunMode && mode != DebugRunModeWithBreakOnMain)
+    if (mode != NormalRunMode && mode != DebugRunMode && mode != DebugRunModeWithBreakOnMain
+            && mode != QmlProfilerRunMode) {
         return false;
+    }
 
     const QByteArray idStr = runConfiguration->id().name();
     return runConfiguration->isEnabled() && idStr.startsWith(RemoteLinuxRunConfiguration::IdPrefix);
@@ -98,8 +105,21 @@ RunControl *RemoteLinuxRunControlFactory::create(RunConfiguration *runConfig, Ru
         connect(runControl, SIGNAL(finished()), debugSupport, SLOT(handleDebuggingFinished()));
         return runControl;
     }
+    case QmlProfilerRunMode: {
+        IAnalyzerTool *tool = AnalyzerManager::toolFromRunMode(mode);
+        if (!tool) {
+            if (errorMessage)
+                *errorMessage = tr("No analyzer tool selected.");
+            return 0;
+        }
+        AnalyzerStartParameters params = RemoteLinuxAnalyzeSupport::startParameters(rc, mode);
+        AnalyzerRunControl * const runControl = new AnalyzerRunControl(tool, params, runConfig);
+        RemoteLinuxAnalyzeSupport * const analyzeSupport =
+                new RemoteLinuxAnalyzeSupport(rc, runControl->engine(), mode);
+        connect(runControl, SIGNAL(finished()), analyzeSupport, SLOT(handleProfilingFinished()));
+        return runControl;
+    }
     case NoRunMode:
-    case QmlProfilerRunMode:
     case CallgrindRunMode:
     case MemcheckRunMode:
         QTC_ASSERT(false, return 0);