diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.cpp b/src/plugins/debugger/gdb/abstractgdbadapter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3acb9db1e11dbe98b777bd386af48f48a53f74d3
--- /dev/null
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.cpp
@@ -0,0 +1,87 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "abstractgdbadapter.h"
+
+#include <utils/qtcassert.h>
+
+#include <QtCore/QObject>
+#include <QtCore/QProcess>
+
+namespace Debugger {
+namespace Internal {
+
+AbstractGdbAdapter::AbstractGdbAdapter(GdbEngine *engine, QObject *parent)
+        : QObject(parent), m_engine(engine)
+{
+}
+
+AbstractGdbAdapter::~AbstractGdbAdapter()
+{
+    disconnect();
+}
+
+// This cannot be in the c'tor, as it would not connect the "virtual" slots
+void AbstractGdbAdapter::commonInit()
+{
+    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
+    connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
+        this, SLOT(handleGdbError(QProcess::ProcessError)));
+    connect(&m_gdbProc, SIGNAL(started()),
+        this, SLOT(handleGdbStarted()));
+    connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)),
+        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
+    connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
+        this, SIGNAL(readyReadStandardOutput()));
+    connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
+        this, SIGNAL(readyReadStandardError()));
+}
+
+QByteArray AbstractGdbAdapter::readAllStandardOutput()
+{
+    return m_gdbProc.readAllStandardOutput();
+}
+
+QByteArray AbstractGdbAdapter::readAllStandardError()
+{
+    return m_gdbProc.readAllStandardError();
+}
+
+void AbstractGdbAdapter::write(const QByteArray &data)
+{
+    m_gdbProc.write(data);
+}
+
+bool AbstractGdbAdapter::isTrkAdapter() const
+{
+    return false;
+}
+
+} // namespace Internal
+} // namespace Debugger
diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index b107477b6c0b2e061b27fcf8d1f04d2d7559c34d..cafc03d491dee4234973146bbcd23c96d834b668 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -48,15 +48,13 @@ class AbstractGdbAdapter : public QObject
     Q_OBJECT
 
 public:
-    AbstractGdbAdapter(GdbEngine *engine, QObject *parent = 0)
-        : QObject(parent), m_engine(engine)
-    {}
-    virtual ~AbstractGdbAdapter() { disconnect(); }
+    AbstractGdbAdapter(GdbEngine *engine, QObject *parent = 0);
+    virtual ~AbstractGdbAdapter();
 
-    virtual QByteArray readAllStandardError() = 0;
-    virtual QByteArray readAllStandardOutput() = 0;
-    virtual void write(const QByteArray &data) = 0;
-    virtual bool isTrkAdapter() const = 0;
+    QByteArray readAllStandardOutput();
+    QByteArray readAllStandardError();
+    virtual void write(const QByteArray &data);
+    virtual bool isTrkAdapter() const; // isUtterlyBrokenAdapter
 
     virtual void startAdapter() = 0;
     virtual void prepareInferior() = 0;
@@ -83,6 +81,7 @@ signals:
     void readyReadStandardError();
 
 protected:
+    void commonInit();
     DebuggerState state() const
         { return m_engine->state(); }
     void setState(DebuggerState state)
@@ -95,6 +94,8 @@ protected:
         { m_engine->showStatusMessage(msg); }
 
     GdbEngine * const m_engine;
+
+    QProcess m_gdbProc;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp
index 2e07e1a7b3780ec941667c107cd3f9d58e751b1f..a43947129b7a9cbe88f14fb6e3ab43ee2691f1f1 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp
@@ -53,17 +53,7 @@ namespace Internal {
 AttachGdbAdapter::AttachGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
-    connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleGdbError(QProcess::ProcessError)));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
-        this, SIGNAL(readyReadStandardOutput()));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
-        this, SIGNAL(readyReadStandardError()));
-    connect(&m_gdbProc, SIGNAL(started()),
-        this, SLOT(handleGdbStarted()));
-    connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
+    commonInit();
 }
 
 void AttachGdbAdapter::startAdapter()
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.h b/src/plugins/debugger/gdb/attachgdbadapter.h
index c3a30a7705ab105c8cc045df1ea6506397a7512d..8495497105bc5627d709a5c29b28dd3228968185 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.h
+++ b/src/plugins/debugger/gdb/attachgdbadapter.h
@@ -52,11 +52,6 @@ class AttachGdbAdapter : public AbstractGdbAdapter
 public:
     AttachGdbAdapter(GdbEngine *engine, QObject *parent = 0);
 
-private:
-    QByteArray readAllStandardError() { return m_gdbProc.readAllStandardError(); }
-    QByteArray readAllStandardOutput() { return m_gdbProc.readAllStandardOutput(); }
-    void write(const QByteArray &data) { m_gdbProc.write(data, data.size()); }
-    bool isTrkAdapter() const { return false; }
     bool dumpersAvailable() const { return false; }
 
     void startAdapter();
@@ -65,6 +60,7 @@ private:
     void interruptInferior();
     void shutdown();
 
+private:
     void handleAttach(const GdbResponse &response);
     void handleDetach(const GdbResponse &response);
     void handleExit(const GdbResponse &response);
@@ -72,8 +68,6 @@ private:
     Q_SLOT void handleGdbStarted();
     Q_SLOT void handleGdbFinished(int, QProcess::ExitStatus);
     Q_SLOT void handleGdbError(QProcess::ProcessError error);
-
-    QProcess m_gdbProc;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp
index 90747c1b54415009ec35528614453a29fc5b1bb1..d51963606e3be7cf1a00861584a221241978bf89 100644
--- a/src/plugins/debugger/gdb/coregdbadapter.cpp
+++ b/src/plugins/debugger/gdb/coregdbadapter.cpp
@@ -53,17 +53,7 @@ namespace Internal {
 CoreGdbAdapter::CoreGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
-    connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleGdbError(QProcess::ProcessError)));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
-        this, SIGNAL(readyReadStandardOutput()));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
-        this, SIGNAL(readyReadStandardError()));
-    connect(&m_gdbProc, SIGNAL(started()),
-        this, SLOT(handleGdbStarted()));
-    connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
+    commonInit();
 }
 
 void CoreGdbAdapter::startAdapter()
diff --git a/src/plugins/debugger/gdb/coregdbadapter.h b/src/plugins/debugger/gdb/coregdbadapter.h
index 52bcf7a42842959dc6d594084d983f1e90c8c217..b097f315464e194faf855caaa7ab8db756422f15 100644
--- a/src/plugins/debugger/gdb/coregdbadapter.h
+++ b/src/plugins/debugger/gdb/coregdbadapter.h
@@ -52,11 +52,6 @@ class CoreGdbAdapter : public AbstractGdbAdapter
 public:
     CoreGdbAdapter(GdbEngine *engine, QObject *parent = 0);
 
-private:
-    QByteArray readAllStandardError() { return m_gdbProc.readAllStandardError(); }
-    QByteArray readAllStandardOutput() { return m_gdbProc.readAllStandardOutput(); }
-    void write(const QByteArray &data) { m_gdbProc.write(data, data.size()); }
-    bool isTrkAdapter() const { return false; }
     bool dumpersAvailable() const { return false; }
 
     void startAdapter();
@@ -65,6 +60,7 @@ private:
     void interruptInferior();
     void shutdown();
 
+private:
     void handleTargetCore1(const GdbResponse &response);
     void handleDetach1(const GdbResponse &response);
     void handleFileExecAndSymbols(const GdbResponse &response);
@@ -75,7 +71,6 @@ private:
     Q_SLOT void handleGdbError(QProcess::ProcessError error);
     Q_SLOT void handleGdbFinished(int, QProcess::ExitStatus);
 
-    QProcess m_gdbProc;
     QString m_executable;
 };
 
diff --git a/src/plugins/debugger/gdb/gdb.pri b/src/plugins/debugger/gdb/gdb.pri
index 5dc9fc83734e1a201b5d247d6e5aa0b69d006e4a..ddd47c88b13e120e395683b0f632e02266f105a8 100644
--- a/src/plugins/debugger/gdb/gdb.pri
+++ b/src/plugins/debugger/gdb/gdb.pri
@@ -26,6 +26,7 @@ SOURCES += \
     $$PWD/trkoptions.cpp \
     $$PWD/trkoptionswidget.cpp \
     $$PWD/trkoptionspage.cpp \
+    $$PWD/abstractgdbadapter.cpp \
     $$PWD/attachgdbadapter.cpp \
     $$PWD/coregdbadapter.cpp \
     $$PWD/plaingdbadapter.cpp \
diff --git a/src/plugins/debugger/gdb/plaingdbadapter.cpp b/src/plugins/debugger/gdb/plaingdbadapter.cpp
index f0210e9d63cfe449fc5a9358610bfaf69ce9ca4c..00aed0f9588b7cffdc461612ce065c1681043b46 100644
--- a/src/plugins/debugger/gdb/plaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/plaingdbadapter.cpp
@@ -58,17 +58,7 @@ namespace Internal {
 PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
-    connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleGdbError(QProcess::ProcessError)));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
-        this, SIGNAL(readyReadStandardOutput()));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
-        this, SIGNAL(readyReadStandardError()));
-    connect(&m_gdbProc, SIGNAL(started()),
-        this, SLOT(handleGdbStarted()));
-    connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
+    commonInit();
 
     m_stubProc.setMode(Utils::ConsoleProcess::Debug);
 #ifdef Q_OS_UNIX
diff --git a/src/plugins/debugger/gdb/plaingdbadapter.h b/src/plugins/debugger/gdb/plaingdbadapter.h
index 9f2c4f0120a8f69d13f54fd8d2791965a374bf51..6a69f4d66d38c0faf4c1b7a867fb2a962c6485d3 100644
--- a/src/plugins/debugger/gdb/plaingdbadapter.h
+++ b/src/plugins/debugger/gdb/plaingdbadapter.h
@@ -55,10 +55,6 @@ class PlainGdbAdapter : public AbstractGdbAdapter
 public:
     PlainGdbAdapter(GdbEngine *engine, QObject *parent = 0);
 
-    QByteArray readAllStandardError() { return m_gdbProc.readAllStandardError(); }
-    QByteArray readAllStandardOutput() { return m_gdbProc.readAllStandardOutput(); }
-    void write(const QByteArray &data) { m_gdbProc.write(data, data.size()); }
-    bool isTrkAdapter() const { return false; }
     bool dumpersAvailable() const { return true; }
 
     void startAdapter();
@@ -81,7 +77,6 @@ private:
     Q_SLOT void stubStarted();
     Q_SLOT void stubError(const QString &msg);
 
-    QProcess m_gdbProc;
     Utils::ConsoleProcess m_stubProc;
     OutputCollector m_outputCollector;
 };
diff --git a/src/plugins/debugger/gdb/remotegdbadapter.cpp b/src/plugins/debugger/gdb/remotegdbadapter.cpp
index 422eed5954ec55985196cefe0e8c1d51d93b95f1..71ee7852b279c93b08b2881766ecdde816d39807 100644
--- a/src/plugins/debugger/gdb/remotegdbadapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbadapter.cpp
@@ -54,17 +54,7 @@ namespace Internal {
 RemoteGdbAdapter::RemoteGdbAdapter(GdbEngine *engine, QObject *parent)
     : AbstractGdbAdapter(engine, parent)
 {
-    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
-    connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleGdbError(QProcess::ProcessError)));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
-        this, SIGNAL(readyReadStandardOutput()));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
-        this, SIGNAL(readyReadStandardError()));
-    connect(&m_gdbProc, SIGNAL(started()),
-        this, SLOT(handleGdbStarted()));
-    connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
+    commonInit();
 
     connect(&m_uploadProc, SIGNAL(error(QProcess::ProcessError)),
         this, SLOT(uploadProcError(QProcess::ProcessError)));
diff --git a/src/plugins/debugger/gdb/remotegdbadapter.h b/src/plugins/debugger/gdb/remotegdbadapter.h
index d45e27fda601e687f08579936a57dc4e9c36107a..a0ca3aac4cb8c0fcaf7b20c3261639a1dc2b1aec 100644
--- a/src/plugins/debugger/gdb/remotegdbadapter.h
+++ b/src/plugins/debugger/gdb/remotegdbadapter.h
@@ -52,11 +52,6 @@ class RemoteGdbAdapter : public AbstractGdbAdapter
 public:
     RemoteGdbAdapter(GdbEngine *engine, QObject *parent = 0);
 
-private:
-    QByteArray readAllStandardError() { return m_gdbProc.readAllStandardError(); }
-    QByteArray readAllStandardOutput() { return m_gdbProc.readAllStandardOutput(); }
-    void write(const QByteArray &data) { m_gdbProc.write(data, data.size()); }
-    bool isTrkAdapter() const { return false; }
     bool dumpersAvailable() const { return true; }
 
     void startAdapter();
@@ -65,6 +60,7 @@ private:
     void interruptInferior();
     void shutdown();
 
+private:
     Q_SLOT void readUploadStandardOutput();
     Q_SLOT void readUploadStandardError();
     Q_SLOT void uploadProcError(QProcess::ProcessError error);
@@ -79,7 +75,6 @@ private:
     Q_SLOT void handleGdbError(QProcess::ProcessError error);
     Q_SLOT void handleGdbFinished(int, QProcess::ExitStatus);
 
-    QProcess m_gdbProc;
     QProcess m_uploadProc;
 };
 
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index 9ab1047713d29ef3c671ab162c21480a8a05fadb..f12697546b3a4620725cb4298de3729714ecec73 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -203,16 +203,8 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
     const uid_t portOffset = getuid();
 #endif
     m_gdbServerName = _("127.0.0.1:%1").arg(2222 + portOffset);
-    connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
-        this, SIGNAL(readyReadStandardError()));
-    connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
-        this, SIGNAL(readyReadStandardOutput()));
-    connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleGdbError(QProcess::ProcessError)));
-    connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
-    connect(&m_gdbProc, SIGNAL(started()),
-        this, SLOT(handleGdbStarted()));
+
+    commonInit();
     connect(&m_gdbProc, SIGNAL(stateChanged(QProcess::ProcessState)),
         this, SLOT(handleGdbStateChanged(QProcess::ProcessState)));
 
@@ -1830,16 +1822,6 @@ void TrkGdbAdapter::handleRfcommStateChanged(QProcess::ProcessState newState)
 // AbstractGdbAdapter interface implementation
 //
 
-QByteArray TrkGdbAdapter::readAllStandardError()
-{
-    return m_gdbProc.readAllStandardError();
-}
-
-QByteArray TrkGdbAdapter::readAllStandardOutput()
-{
-    return m_gdbProc.readAllStandardOutput();
-}
-
 void TrkGdbAdapter::write(const QByteArray &data)
 {
     // Write magic packets directly to TRK.
@@ -1870,7 +1852,7 @@ void TrkGdbAdapter::write(const QByteArray &data)
            trkReadMemoryMessage(m_session.dataseg, 12));
         return;
     }
-    m_gdbProc.write(data, data.size());
+    m_gdbProc.write(data);
 }
 
 uint oldPC;
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index bcde7c3e555cfc321a83a6863d360dac363e616a..030d61215a2333773dffeabb9ba7be7d5e9d0721 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -155,7 +155,6 @@ private:
 
     QString m_gdbServerName; // 127.0.0.1:(2222+uid)
 
-    QProcess m_gdbProc;
     QProcess m_rfcommProc;
     bool m_running;