diff --git a/src/plugins/projectexplorer/applicationlauncher.h b/src/plugins/projectexplorer/applicationlauncher.h
index 63d3eba33c915beb573a582163346f02896f29b5..a35f654eaafae77ce2a4e44c9fa3d0eea65a70dc 100644
--- a/src/plugins/projectexplorer/applicationlauncher.h
+++ b/src/plugins/projectexplorer/applicationlauncher.h
@@ -35,19 +35,13 @@
 #include <QtCore/QObject>
 #include <QtCore/QStringList>
 #include <QtCore/QProcess>
-#ifndef Q_OS_WIN
-#include <QtCore/QTextCodec>
-#endif
 
 namespace Utils {
 class ConsoleProcess;
 }
 
 namespace ProjectExplorer {
-
-namespace Internal {
-    class WinGuiProcess;
-}
+struct ApplicationLauncherPrivate;
 
 class PROJECTEXPLORER_EXPORT ApplicationLauncher : public QObject
 {
@@ -59,7 +53,9 @@ public:
         Gui
     };
 
-    ApplicationLauncher(QObject *parent = 0);
+    explicit ApplicationLauncher(QObject *parent = 0);
+    ~ApplicationLauncher();
+
     void setWorkingDirectory(const QString &dir);
     void setEnvironment(const QStringList &env);
 
@@ -90,17 +86,7 @@ private slots:
     void bringToForeground();
 
 private:
-    QProcess *m_guiProcess;
-    Utils::ConsoleProcess *m_consoleProcess;
-    Mode m_currentMode;
-
-#ifdef Q_OS_WIN
-    Internal::WinGuiProcess *m_winGuiProcess;
-#else
-    QTextCodec *m_outputCodec;
-    QTextCodec::ConverterState m_outputCodecState;
-    QTextCodec::ConverterState m_errorCodecState;
-#endif
+    QScopedPointer<ApplicationLauncherPrivate> d;
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/applicationlauncher_win.cpp b/src/plugins/projectexplorer/applicationlauncher_win.cpp
index bb35f7c2420eff60254b09dfe5b0b79e1ab7d890..eb61352dcc4963047d0d7f3a0ba28c74fda75d24 100644
--- a/src/plugins/projectexplorer/applicationlauncher_win.cpp
+++ b/src/plugins/projectexplorer/applicationlauncher_win.cpp
@@ -31,52 +31,57 @@
 #include "consoleprocess.h"
 #include "winguiprocess.h"
 
-#include <QDebug>
+#include <QtCore/QDebug>
 
-using namespace ProjectExplorer;
-using namespace ProjectExplorer::Internal;
-using namespace Utils;
+namespace ProjectExplorer {
+
+struct ApplicationLauncherPrivate {
+    ApplicationLauncherPrivate() : m_currentMode(ApplicationLauncher::Gui) {}
+
+    Utils::ConsoleProcess m_consoleProcess;
+    ApplicationLauncher::Mode m_currentMode;
+    Internal::WinGuiProcess m_winGuiProcess;
+};
 
 ApplicationLauncher::ApplicationLauncher(QObject *parent)
-    : QObject(parent)
+    : QObject(parent), d(new ApplicationLauncherPrivate)
 {
-    m_currentMode = Gui;
-
-    m_consoleProcess = new ConsoleProcess(this);
-    connect(m_consoleProcess, SIGNAL(processMessage(const QString&, bool)),
+    connect(&d->m_consoleProcess, SIGNAL(processMessage(QString,bool)),
             this, SIGNAL(appendMessage(QString,bool)));
-    connect(m_consoleProcess, SIGNAL(processStopped()),
+    connect(&d->m_consoleProcess, SIGNAL(processStopped()),
             this, SLOT(processStopped()));
 
-    m_winGuiProcess = new WinGuiProcess(this);
-    connect(m_winGuiProcess, SIGNAL(processMessage(const QString &, bool)),
+    connect(&d->m_winGuiProcess, SIGNAL(processMessage(QString, bool)),
         this, SIGNAL(appendMessage(QString,bool)));
-    connect(m_winGuiProcess, SIGNAL(receivedDebugOutput(const QString&, bool)),
-        this, SLOT(readWinDebugOutput(const QString&, bool)));
-    connect(m_winGuiProcess, SIGNAL(processFinished(int)),
+    connect(&d->m_winGuiProcess, SIGNAL(receivedDebugOutput(QString, bool)),
+        this, SLOT(readWinDebugOutput(QString, bool)));
+    connect(&d->m_winGuiProcess, SIGNAL(processFinished(int)),
             this, SLOT(processFinished(int)));
+}
 
+ApplicationLauncher::~ApplicationLauncher()
+{
 }
 
 void ApplicationLauncher::setWorkingDirectory(const QString &dir)
 {
-    m_winGuiProcess->setWorkingDirectory(dir);
-    m_consoleProcess->setWorkingDirectory(dir);
+    d->m_winGuiProcess.setWorkingDirectory(dir);
+    d->m_consoleProcess.setWorkingDirectory(dir);
 }
 
 void ApplicationLauncher::setEnvironment(const QStringList &env)
 {
-    m_winGuiProcess->setEnvironment(env);
-    m_consoleProcess->setEnvironment(env);
+    d->m_winGuiProcess.setEnvironment(env);
+    d->m_consoleProcess.setEnvironment(env);
 }
 
 void ApplicationLauncher::start(Mode mode, const QString &program, const QStringList &args)
 {
-    m_currentMode = mode;
+    d->m_currentMode = mode;
     if (mode == Gui) {
-        m_winGuiProcess->start(program, args);
+        d->m_winGuiProcess.start(program, args);
     } else {
-        m_consoleProcess->start(program, args);
+        d->m_consoleProcess.start(program, args);
     }
 }
 
@@ -84,20 +89,20 @@ void ApplicationLauncher::stop()
 {
     if (!isRunning())
         return;
-    if (m_currentMode == Gui) {
-        m_winGuiProcess->stop();
+    if (d->m_currentMode == Gui) {
+        d->m_winGuiProcess.stop();
     } else {
-        m_consoleProcess->stop();
+        d->m_consoleProcess.stop();
         processStopped();
     }
 }
 
 bool ApplicationLauncher::isRunning() const
 {
-    if (m_currentMode == Gui)
-        return m_winGuiProcess->isRunning();
+    if (d->m_currentMode == Gui)
+        return d->m_winGuiProcess.isRunning();
     else
-        return m_consoleProcess->isRunning();
+        return d->m_consoleProcess.isRunning();
 }
 
 qint64 ApplicationLauncher::applicationPID() const
@@ -106,10 +111,10 @@ qint64 ApplicationLauncher::applicationPID() const
     if (!isRunning())
         return result;
 
-    if (m_currentMode == Console) {
-        result = m_consoleProcess->applicationPID();
+    if (d->m_currentMode == Console) {
+        result = d->m_consoleProcess.applicationPID();
     } else {
-        result = m_winGuiProcess->applicationPID();
+        result = d->m_winGuiProcess.applicationPID();
     }
     return result;
 }
@@ -133,3 +138,5 @@ void ApplicationLauncher::processFinished(int exitCode)
 void ApplicationLauncher::bringToForeground()
 {
 }
+
+} // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/applicationlauncher_x11.cpp b/src/plugins/projectexplorer/applicationlauncher_x11.cpp
index e14dc2b2a93e8d38280e13e3fd5c9901f7abd65d..d058c96f95434263bb16493059ddf47837faed4b 100644
--- a/src/plugins/projectexplorer/applicationlauncher_x11.cpp
+++ b/src/plugins/projectexplorer/applicationlauncher_x11.cpp
@@ -33,55 +33,73 @@
 #include <coreplugin/icore.h>
 
 #include <QtCore/QTimer>
+#include <QtCore/QTextCodec>
 
-using namespace ProjectExplorer;
-using namespace Utils;
+namespace ProjectExplorer {
+
+struct ApplicationLauncherPrivate {
+    ApplicationLauncherPrivate();
+
+    QProcess m_guiProcess;
+    Utils::ConsoleProcess m_consoleProcess;
+    ApplicationLauncher::Mode m_currentMode;
+
+    QTextCodec *m_outputCodec;
+    QTextCodec::ConverterState m_outputCodecState;
+    QTextCodec::ConverterState m_errorCodecState;
+};
+
+ApplicationLauncherPrivate::ApplicationLauncherPrivate() :
+    m_currentMode(ApplicationLauncher::Gui),
+    m_outputCodec(QTextCodec::codecForLocale())
+{
+}
 
 ApplicationLauncher::ApplicationLauncher(QObject *parent)
-    : QObject(parent)
+    : QObject(parent), d(new ApplicationLauncherPrivate)
 {
-    m_outputCodec = QTextCodec::codecForLocale();
-    m_currentMode = Gui;
-    m_guiProcess = new QProcess(this);
-    m_guiProcess->setReadChannelMode(QProcess::SeparateChannels);
-    connect(m_guiProcess, SIGNAL(error(QProcess::ProcessError)),
+    d->m_guiProcess.setReadChannelMode(QProcess::SeparateChannels);
+    connect(&d->m_guiProcess, SIGNAL(error(QProcess::ProcessError)),
         this, SLOT(guiProcessError()));
-    connect(m_guiProcess, SIGNAL(readyReadStandardOutput()),
+    connect(&d->m_guiProcess, SIGNAL(readyReadStandardOutput()),
         this, SLOT(readStandardOutput()));
-    connect(m_guiProcess, SIGNAL(readyReadStandardError()),
+    connect(&d->m_guiProcess, SIGNAL(readyReadStandardError()),
         this, SLOT(readStandardError()));
-    connect(m_guiProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
+    connect(&d->m_guiProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
             this, SLOT(processDone(int, QProcess::ExitStatus)));
-    connect(m_guiProcess, SIGNAL(started()),
+    connect(&d->m_guiProcess, SIGNAL(started()),
             this, SLOT(bringToForeground()));
 
-    m_consoleProcess = new ConsoleProcess(this);
-    m_consoleProcess->setSettings(Core::ICore::instance()->settings());
-    connect(m_consoleProcess, SIGNAL(processMessage(QString,bool)),
+    d->m_consoleProcess.setSettings(Core::ICore::instance()->settings());
+    connect(&d->m_consoleProcess, SIGNAL(processMessage(QString,bool)),
             this, SIGNAL(appendMessage(QString,bool)));
-    connect(m_consoleProcess, SIGNAL(processStopped()),
+    connect(&d->m_consoleProcess, SIGNAL(processStopped()),
             this, SLOT(processStopped()));
 }
 
+ApplicationLauncher::~ApplicationLauncher()
+{
+}
+
 void ApplicationLauncher::setWorkingDirectory(const QString &dir)
 {
-    m_guiProcess->setWorkingDirectory(dir);
-    m_consoleProcess->setWorkingDirectory(dir);
+    d->m_guiProcess.setWorkingDirectory(dir);
+    d->m_consoleProcess.setWorkingDirectory(dir);
 }
 
 void ApplicationLauncher::setEnvironment(const QStringList &env)
 {
-    m_guiProcess->setEnvironment(env);
-    m_consoleProcess->setEnvironment(env);
+    d->m_guiProcess.setEnvironment(env);
+    d->m_consoleProcess.setEnvironment(env);
 }
 
 void ApplicationLauncher::start(Mode mode, const QString &program, const QStringList &args)
 {
-    m_currentMode = mode;
+    d->m_currentMode = mode;
     if (mode == Gui) {
-        m_guiProcess->start(program, args);
+        d->m_guiProcess.start(program, args);
     } else {
-        m_consoleProcess->start(program, args);
+        d->m_consoleProcess.start(program, args);
     }
 }
 
@@ -89,24 +107,24 @@ void ApplicationLauncher::stop()
 {
     if (!isRunning())
         return;
-    if (m_currentMode == Gui) {
-        m_guiProcess->terminate();
-        if (!m_guiProcess->waitForFinished(1000)) { // This is blocking, so be fast.
-            m_guiProcess->kill();
-            m_guiProcess->waitForFinished();
+    if (d->m_currentMode == Gui) {
+        d->m_guiProcess.terminate();
+        if (!d->m_guiProcess.waitForFinished(1000)) { // This is blocking, so be fast.
+            d->m_guiProcess.kill();
+            d->m_guiProcess.waitForFinished();
         }
     } else {
-        m_consoleProcess->stop();
+        d->m_consoleProcess.stop();
         processStopped();
     }
 }
 
 bool ApplicationLauncher::isRunning() const
 {
-    if (m_currentMode == Gui)
-        return m_guiProcess->state() != QProcess::NotRunning;
+    if (d->m_currentMode == Gui)
+        return d->m_guiProcess.state() != QProcess::NotRunning;
     else
-        return m_consoleProcess->isRunning();
+        return d->m_consoleProcess.isRunning();
 }
 
 qint64 ApplicationLauncher::applicationPID() const
@@ -115,10 +133,10 @@ qint64 ApplicationLauncher::applicationPID() const
     if (!isRunning())
         return result;
 
-    if (m_currentMode == Console) {
-        result = m_consoleProcess->applicationPID();
+    if (d->m_currentMode == Console) {
+        result = d->m_consoleProcess.applicationPID();
     } else {
-        result = (qint64)m_guiProcess->pid();
+        result = (qint64)d->m_guiProcess.pid();
     }
     return result;
 }
@@ -126,7 +144,7 @@ qint64 ApplicationLauncher::applicationPID() const
 void ApplicationLauncher::guiProcessError()
 {
     QString error;
-    switch (m_guiProcess->error()) {
+    switch (d->m_guiProcess.error()) {
     case QProcess::FailedToStart:
         error = tr("Failed to start program. Path or permissions wrong?");
         break;
@@ -141,17 +159,17 @@ void ApplicationLauncher::guiProcessError()
 
 void ApplicationLauncher::readStandardOutput()
 {
-    QByteArray data = m_guiProcess->readAllStandardOutput();
-    emit appendOutput(m_outputCodec->toUnicode(
-            data.constData(), data.length(), &m_outputCodecState),
+    QByteArray data = d->m_guiProcess.readAllStandardOutput();
+    emit appendOutput(d->m_outputCodec->toUnicode(
+            data.constData(), data.length(), &d->m_outputCodecState),
                       false);
 }
 
 void ApplicationLauncher::readStandardError()
 {
-    QByteArray data = m_guiProcess->readAllStandardError();
-    emit appendOutput(m_outputCodec->toUnicode(
-            data.constData(), data.length(), &m_errorCodecState),
+    QByteArray data = d->m_guiProcess.readAllStandardError();
+    emit appendOutput(d->m_outputCodec->toUnicode(
+            data.constData(), data.length(), &d->m_errorCodecState),
                       true);
 }
 
@@ -169,3 +187,5 @@ void ApplicationLauncher::bringToForeground()
 {
     emit bringToForegroundRequested(applicationPID());
 }
+
+} // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/winguiprocess.h b/src/plugins/projectexplorer/winguiprocess.h
index 1136997df0ae9ef9c97e69763eb669f0eb1c2eb0..e729317dd2d31746b1afcf65f750b7f011370ea0 100644
--- a/src/plugins/projectexplorer/winguiprocess.h
+++ b/src/plugins/projectexplorer/winguiprocess.h
@@ -50,8 +50,8 @@ class WinGuiProcess : public QThread, public AbstractProcess
     Q_OBJECT
 
 public:
-    WinGuiProcess(QObject *parent);
-    ~WinGuiProcess();
+    explicit WinGuiProcess(QObject *parent = 0);
+    virtual ~WinGuiProcess();
 
     bool start(const QString &program, const QStringList &args);
     void stop();