diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro
index 2c23a1ccf63bffe82026bb977769c9ff9bbc5ca4..5c31c2c6467ce659fe094f16acd0d78672ed534e 100644
--- a/src/plugins/coreplugin/coreplugin.pro
+++ b/src/plugins/coreplugin/coreplugin.pro
@@ -105,8 +105,7 @@ SOURCES += mainwindow.cpp \
     ssh/sftpoperation.cpp \
     ssh/sftpincomingpacket.cpp \
     ssh/sftpdefs.cpp \
-    ssh/sftpchannel.cpp \
-    ssh/sshdelayedsignal.cpp
+    ssh/sftpchannel.cpp
 
 HEADERS += mainwindow.h \
     editmode.h \
@@ -214,8 +213,7 @@ HEADERS += mainwindow.h \
     ssh/sftpincomingpacket_p.h \
     ssh/sftpdefs.h \
     ssh/sftpchannel.h \
-    ssh/sftpchannel_p.h \
-    ssh/sshdelayedsignal_p.h
+    ssh/sftpchannel_p.h
 
 FORMS += dialogs/newdialog.ui \
     actionmanager/commandmappings.ui \
diff --git a/src/plugins/coreplugin/ssh/sftpchannel.cpp b/src/plugins/coreplugin/ssh/sftpchannel.cpp
index 4c94c4ac3a57694c66e933d6ed79c59ac54fcb0e..ca0ff86d98c90dc9314c1d302cb0199a81936995 100644
--- a/src/plugins/coreplugin/ssh/sftpchannel.cpp
+++ b/src/plugins/coreplugin/ssh/sftpchannel.cpp
@@ -30,13 +30,11 @@
 #include "sftpchannel.h"
 #include "sftpchannel_p.h"
 
-#include "sshdelayedsignal_p.h"
 #include "sshexception_p.h"
 #include "sshsendfacility_p.h"
 
 #include <QtCore/QDir>
 #include <QtCore/QFile>
-#include <QtCore/QWeakPointer>
 
 namespace Core {
 
@@ -63,6 +61,15 @@ SftpChannel::SftpChannel(quint32 channelId,
     Internal::SshSendFacility &sendFacility)
     : d(new Internal::SftpChannelPrivate(channelId, sendFacility, this))
 {
+    connect(d, SIGNAL(initialized()), this, SIGNAL(initialized()),
+        Qt::QueuedConnection);
+    connect(d, SIGNAL(initializationFailed(QString)), this,
+        SIGNAL(initializationFailed(QString)), Qt::QueuedConnection);
+    connect(d, SIGNAL(dataAvailable(Core::SftpJobId,QString)), this,
+            SIGNAL(dataAvailable(Core::SftpJobId,QString)), Qt::QueuedConnection);
+    connect(d, SIGNAL(finished(Core::SftpJobId,QString)), this,
+        SIGNAL(finished(Core::SftpJobId,QString)), Qt::QueuedConnection);
+    connect(d, SIGNAL(closed()), this, SIGNAL(closed()), Qt::QueuedConnection);
 }
 
 SftpChannel::State SftpChannel::state() const
@@ -219,7 +226,7 @@ void SftpChannelPrivate::handleChannelFailure()
         throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR,
             "Unexpected SSH_MSG_CHANNEL_FAILURE packet.");
     }
-    createDelayedInitFailedSignal(SSH_TR("Server could not start sftp subsystem."));
+    emit initializationFailed(tr("Server could not start sftp subsystem."));
     closeChannel();
 }
 
@@ -268,7 +275,7 @@ void SftpChannelPrivate::handleCurrentPacket()
     default:
         throw SshServerException(SSH_DISCONNECT_PROTOCOL_ERROR,
             "Unexpected packet.",
-            SSH_TR("Unexpected packet of type %d.").arg(m_incomingPacket.type()));
+            tr("Unexpected packet of type %d.").arg(m_incomingPacket.type()));
     }
 }
 
@@ -285,12 +292,12 @@ void SftpChannelPrivate::handleServerVersion()
 #endif
     const quint32 serverVersion = m_incomingPacket.extractServerVersion();
     if (serverVersion != ProtocolVersion) {
-        createDelayedInitFailedSignal(SSH_TR("Protocol version mismatch: Expected %1, got %2")
+        emit initializationFailed(tr("Protocol version mismatch: Expected %1, got %2")
             .arg(serverVersion).arg(ProtocolVersion));
         closeChannel();
     } else {
         m_sftpState = Initialized;
-        createDelayedInitializedSignal();
+        emit initialized();
     }
 }
 
@@ -401,8 +408,8 @@ void SftpChannelPrivate::handleStatusGeneric(const JobMap::Iterator &it,
     const SftpStatusResponse &response)
 {
     AbstractSftpOperation::Ptr op = it.value();
-    const QString error = errorMessage(response, SSH_TR("Unknown error."));
-    createDelayedJobFinishedSignal(op->jobId, error);
+    const QString error = errorMessage(response, tr("Unknown error."));
+    emit finished(op->jobId, error);
     m_jobs.erase(it);
 }
 
@@ -424,15 +431,15 @@ void SftpChannelPrivate::handleMkdirStatus(const JobMap::Iterator &it,
     Q_ASSERT(dirIt != op->parentJob->mkdirsInProgress.end());
     const QString &remoteDir = dirIt.value().remoteDir;
     if (response.status == SSH_FX_OK) {
-        createDelayedDataAvailableSignal(op->parentJob->jobId,
-            SSH_TR("Created remote directory '%1'.").arg(remoteDir));
+        emit dataAvailable(op->parentJob->jobId,
+            tr("Created remote directory '%1'.").arg(remoteDir));
     } else if (response.status == SSH_FX_FAILURE) {
-        createDelayedDataAvailableSignal(op->parentJob->jobId,
-            SSH_TR("Remote directory '%1' already exists.").arg(remoteDir));
+        emit dataAvailable(op->parentJob->jobId,
+            tr("Remote directory '%1' already exists.").arg(remoteDir));
     } else {
         op->parentJob->setError();
-        createDelayedJobFinishedSignal(op->parentJob->jobId,
-            SSH_TR("Error creating directory '%1': %2")
+        emit finished(op->parentJob->jobId,
+            tr("Error creating directory '%1': %2")
             .arg(remoteDir, response.errorString));
         m_jobs.erase(it);
         return;
@@ -455,8 +462,8 @@ void SftpChannelPrivate::handleMkdirStatus(const JobMap::Iterator &it,
         QSharedPointer<QFile> localFile(new QFile(fileInfo.absoluteFilePath()));
         if (!localFile->open(QIODevice::ReadOnly)) {
             op->parentJob->setError();
-            createDelayedJobFinishedSignal(op->parentJob->jobId,
-                SSH_TR("Could not open local file '%1': %2")
+            emit finished(op->parentJob->jobId,
+                tr("Could not open local file '%1': %2")
                 .arg(fileInfo.absoluteFilePath(), localFile->error()));
             m_jobs.erase(it);
             return;
@@ -472,7 +479,7 @@ void SftpChannelPrivate::handleMkdirStatus(const JobMap::Iterator &it,
     op->parentJob->mkdirsInProgress.erase(dirIt);
     if (op->parentJob->mkdirsInProgress.isEmpty()
         && op->parentJob->uploadsInProgress.isEmpty())
-        createDelayedJobFinishedSignal(op->parentJob->jobId);
+        emit finished(op->parentJob->jobId);
     m_jobs.erase(it);
 }
 
@@ -482,14 +489,14 @@ void SftpChannelPrivate::handleLsStatus(const JobMap::Iterator &it,
     SftpListDir::Ptr op = it.value().staticCast<SftpListDir>();
     switch (op->state) {
     case SftpListDir::OpenRequested:
-    createDelayedJobFinishedSignal(op->jobId, errorMessage(response.errorString,
-            SSH_TR("Remote directory could not be opened for reading.")));
+        emit finished(op->jobId, errorMessage(response.errorString,
+            tr("Remote directory could not be opened for reading.")));
         m_jobs.erase(it);
         break;
     case SftpListDir::Open:
         if (response.status != SSH_FX_EOF)
             reportRequestError(op, errorMessage(response.errorString,
-                SSH_TR("Failed to list remote directory contents.")));
+                tr("Failed to list remote directory contents.")));
         op->state = SftpListDir::CloseRequested;
         sendData(m_outgoingPacket.generateCloseHandle(op->remoteHandle,
             op->jobId).rawData());
@@ -497,8 +504,8 @@ void SftpChannelPrivate::handleLsStatus(const JobMap::Iterator &it,
     case SftpListDir::CloseRequested:
         if (!op->hasError) {
             const QString error = errorMessage(response,
-                SSH_TR("Failed to close remote directory."));
-            createDelayedJobFinishedSignal(op->jobId, error);
+                tr("Failed to close remote directory."));
+            emit finished(op->jobId, error);
         }
         m_jobs.erase(it);
         break;
@@ -514,21 +521,21 @@ void SftpChannelPrivate::handleGetStatus(const JobMap::Iterator &it,
     SftpDownload::Ptr op = it.value().staticCast<SftpDownload>();
     switch (op->state) {
     case SftpDownload::OpenRequested:
-        createDelayedJobFinishedSignal(op->jobId,
+        emit finished(op->jobId,
             errorMessage(response.errorString,
-                SSH_TR("Failed to open remote file for reading.")));
+                tr("Failed to open remote file for reading.")));
         m_jobs.erase(it);
         break;
     case SftpDownload::Open:
         if (op->statRequested) {
             reportRequestError(op, errorMessage(response.errorString,
-                SSH_TR("Failed to stat remote file.")));
+                tr("Failed to stat remote file.")));
             sendTransferCloseHandle(op, response.requestId);
         } else {
             if ((response.status != SSH_FX_EOF || response.requestId != op->eofId)
                 && !op->hasError)
                 reportRequestError(op, errorMessage(response.errorString,
-                    SSH_TR("Failed to read remote file.")));
+                    tr("Failed to read remote file.")));
             finishTransferRequest(it);
         }
         break;
@@ -536,10 +543,10 @@ void SftpChannelPrivate::handleGetStatus(const JobMap::Iterator &it,
         Q_ASSERT(op->inFlightCount == 1);
         if (!op->hasError) {
             if (response.status == SSH_FX_OK)
-                createDelayedJobFinishedSignal(op->jobId);
+                emit finished(op->jobId);
             else
                 reportRequestError(op, errorMessage(response.errorString,
-                    SSH_TR("Failed to close remote file.")));
+                    tr("Failed to close remote file.")));
         }
         removeTransferRequest(it);
         break;
@@ -566,9 +573,9 @@ void SftpChannelPrivate::handlePutStatus(const JobMap::Iterator &it,
         }
 
         if (emitError) {
-            createDelayedJobFinishedSignal(job->jobId,
+            emit finished(job->jobId,
                 errorMessage(response.errorString,
-                    SSH_TR("Failed to open remote file for writing.")));
+                    tr("Failed to open remote file for writing.")));
         }
         m_jobs.erase(it);
         break;
@@ -586,7 +593,7 @@ void SftpChannelPrivate::handlePutStatus(const JobMap::Iterator &it,
             if (job->parentJob)
                 job->parentJob->setError();
             reportRequestError(job, errorMessage(response.errorString,
-                SSH_TR("Failed to write remote file.")));
+                tr("Failed to write remote file.")));
             finishTransferRequest(it);
         }
         break;
@@ -602,18 +609,18 @@ void SftpChannelPrivate::handlePutStatus(const JobMap::Iterator &it,
                 job->parentJob->uploadsInProgress.removeOne(job);
                 if (job->parentJob->mkdirsInProgress.isEmpty()
                     && job->parentJob->uploadsInProgress.isEmpty())
-                    createDelayedJobFinishedSignal(job->parentJob->jobId);
+                    emit finished(job->parentJob->jobId);
             } else {
-                createDelayedJobFinishedSignal(job->jobId);
+                emit finished(job->jobId);
             }
         } else {
             const QString error = errorMessage(response.errorString,
-                SSH_TR("Failed to close remote file."));
+                tr("Failed to close remote file."));
             if (job->parentJob) {
                 job->parentJob->setError();
-                createDelayedJobFinishedSignal(job->parentJob->jobId, error);
+                emit finished(job->parentJob->jobId, error);
             } else {
-                createDelayedJobFinishedSignal(job->jobId, error);
+                emit finished(job->jobId, error);
             }
         }
         m_jobs.erase(it);
@@ -638,7 +645,7 @@ void SftpChannelPrivate::handleName()
 
         for (int i = 0; i < response.files.count(); ++i) {
             const SftpFile &file = response.files.at(i);
-            createDelayedDataAvailableSignal(op->jobId, file.fileName);
+            emit dataAvailable(op->jobId, file.fileName);
         }
         sendData(m_outgoingPacket.generateReadDir(op->remoteHandle,
             op->jobId).rawData());
@@ -721,7 +728,7 @@ void SftpChannelPrivate::handleAttrs()
         } else {
             if (op->parentJob)
                 op->parentJob->setError();
-            reportRequestError(op, SSH_TR("Cannot append to remote file: "
+            reportRequestError(op, tr("Cannot append to remote file: "
                 "Server does not support file size attribute."));
             sendTransferCloseHandle(op, op->jobId);
         }
@@ -740,7 +747,7 @@ SftpChannelPrivate::JobMap::Iterator SftpChannelPrivate::lookupJob(SftpJobId id)
 
 void SftpChannelPrivate::closeHook()
 {
-    createClosedSignal();
+    emit closed();
 }
 
 void SftpChannelPrivate::handleOpenSuccessInternal()
@@ -758,7 +765,7 @@ void SftpChannelPrivate::handleOpenFailureInternal()
         throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR,
             "Unexpected SSH_MSG_CHANNEL_OPEN_FAILURE packet.");
     }
-    createDelayedInitFailedSignal(SSH_TR("Server could not start session."));
+    emit initializationFailed(tr("Server could not start session."));
 }
 
 void SftpChannelPrivate::sendReadRequest(const SftpDownload::Ptr &job,
@@ -776,7 +783,7 @@ void SftpChannelPrivate::sendReadRequest(const SftpDownload::Ptr &job,
 void SftpChannelPrivate::reportRequestError(const AbstractSftpOperationWithHandle::Ptr &job,
     const QString &error)
 {
-    createDelayedJobFinishedSignal(job->jobId, error);
+    emit finished(job->jobId, error);
     job->hasError = true;
 }
 
@@ -810,7 +817,7 @@ void SftpChannelPrivate::sendWriteRequest(const JobMap::Iterator &it)
     if (job->localFile->error() != QFile::NoError) {
         if (job->parentJob)
             job->parentJob->setError();
-        reportRequestError(job, SSH_TR("Error reading local file: %1")
+        reportRequestError(job, tr("Error reading local file: %1")
             .arg(job->localFile->errorString()));
         finishTransferRequest(it);
     } else if (data.isEmpty()) {
@@ -842,58 +849,5 @@ void SftpChannelPrivate::spawnReadRequests(const SftpDownload::Ptr &job)
     }
 }
 
-void SftpChannelPrivate::createDelayedInitFailedSignal(const QString &reason)
-{
-    new SftpInitializationFailedSignal(this, QWeakPointer<SftpChannel>(m_sftp),
-        reason);
-}
-
-void SftpChannelPrivate::emitInitializationFailedSignal(const QString &reason)
-{
-    emit m_sftp->initializationFailed(reason);
-}
-
-void SftpChannelPrivate::createDelayedInitializedSignal()
-{
-    new SftpInitializedSignal(this, QWeakPointer<SftpChannel>(m_sftp));
-}
-
-void SftpChannelPrivate::emitInitialized()
-{
-    emit m_sftp->initialized();
-}
-
-void SftpChannelPrivate::createDelayedJobFinishedSignal(SftpJobId jobId,
-    const QString &error)
-{
-    new SftpJobFinishedSignal(this, QWeakPointer<SftpChannel>(m_sftp), jobId, error);
-}
-
-void SftpChannelPrivate::emitJobFinished(SftpJobId jobId, const QString &error)
-{
-    emit m_sftp->finished(jobId, error);
-}
-
-void SftpChannelPrivate::createDelayedDataAvailableSignal(SftpJobId jobId,
-    const QString &data)
-{
-    new SftpDataAvailableSignal(this, QWeakPointer<SftpChannel>(m_sftp), jobId, data);
-}
-
-void SftpChannelPrivate::emitDataAvailable(SftpJobId jobId, const QString &data)
-{
-    emit m_sftp->dataAvailable(jobId, data);
-}
-
-void SftpChannelPrivate::createClosedSignal()
-{
-    new SftpClosedSignal(this, QWeakPointer<SftpChannel>(m_sftp));
-}
-
-void SftpChannelPrivate::emitClosed()
-{
-    emit m_sftp->closed();
-}
-
 } // namespace Internal
 } // namespace Core
diff --git a/src/plugins/coreplugin/ssh/sftpchannel_p.h b/src/plugins/coreplugin/ssh/sftpchannel_p.h
index ec9c0fcfe874d01d2732f0d8ab254dca2b70756f..63c1fc26ecfc1110ab3d41418abf659b4c48e9fb 100644
--- a/src/plugins/coreplugin/ssh/sftpchannel_p.h
+++ b/src/plugins/coreplugin/ssh/sftpchannel_p.h
@@ -45,6 +45,7 @@ namespace Internal {
 
 class SftpChannelPrivate : public AbstractSshChannel
 {
+    Q_OBJECT
     friend class Core::SftpChannel;
 public:
 
@@ -55,11 +56,12 @@ public:
 
     virtual void closeHook();
 
-    void emitInitializationFailedSignal(const QString &reason);
-    void emitInitialized();
-    void emitJobFinished(SftpJobId jobId, const QString &error);
-    void emitDataAvailable(SftpJobId jobId, const QString &data);
-    void emitClosed();
+signals:
+    void initialized();
+    void initializationFailed(const QString &reason);
+    void closed();
+    void finished(Core::SftpJobId job, const QString &error = QString());
+    void dataAvailable(SftpJobId job, const QString &data);
 
 private:
     typedef QMap<SftpJobId, AbstractSftpOperation::Ptr> JobMap;
@@ -109,13 +111,6 @@ private:
     void sendTransferCloseHandle(const AbstractSftpTransfer::Ptr &job,
         quint32 requestId);
 
-    void createDelayedInitFailedSignal(const QString &reason);
-    void createDelayedInitializedSignal();
-    void createDelayedJobFinishedSignal(SftpJobId jobId,
-        const QString &error = QString());
-    void createDelayedDataAvailableSignal(SftpJobId jobId, const QString &data);
-    void createClosedSignal();
-
     JobMap::Iterator lookupJob(SftpJobId id);
     JobMap m_jobs;
     SftpOutgoingPacket m_outgoingPacket;
diff --git a/src/plugins/coreplugin/ssh/sshchannelmanager.cpp b/src/plugins/coreplugin/ssh/sshchannelmanager.cpp
index f1e0060dc14679d7e250c15a78484d4688d387db..5a6a0a094d2886dc2ffddefa23ed8e2b9a1c4798 100644
--- a/src/plugins/coreplugin/ssh/sshchannelmanager.cpp
+++ b/src/plugins/coreplugin/ssh/sshchannelmanager.cpp
@@ -134,7 +134,7 @@ SshChannelManager::ChannelIterator SshChannelManager::lookupChannelAsIterator(qu
     if (it == m_channels.end() && !allowNotFound) {
         throw SshServerException(SSH_DISCONNECT_PROTOCOL_ERROR,
             "Invalid channel id.",
-            SSH_TR("Invalid channel id %1").arg(channelId));
+            tr("Invalid channel id %1").arg(channelId));
     }
     return it;
 }
diff --git a/src/plugins/coreplugin/ssh/sshconnection.cpp b/src/plugins/coreplugin/ssh/sshconnection.cpp
index 0a98068a2eeb8e5e95eb9b5f4a523d19a4a9d211..51f3f20665dc75df556b63e69bd2fa8f20a5da87 100644
--- a/src/plugins/coreplugin/ssh/sshconnection.cpp
+++ b/src/plugins/coreplugin/ssh/sshconnection.cpp
@@ -59,6 +59,7 @@ namespace {
             if (!staticInitializationsDone) {
                 Botan::LibraryInitializer::initialize("thread_safe=true");
                 qRegisterMetaType<SshError>("SshError");
+                qRegisterMetaType<Core::SftpJobId>("Core::SftpJobId");
                 staticInitializationsDone = true;
             }
             staticInitMutex.unlock();
diff --git a/src/plugins/coreplugin/ssh/sshdelayedsignal.cpp b/src/plugins/coreplugin/ssh/sshdelayedsignal.cpp
deleted file mode 100644
index d35075bf77f0349ba5ab6c547ad25dd1cd6b137c..0000000000000000000000000000000000000000
--- a/src/plugins/coreplugin/ssh/sshdelayedsignal.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/**************************************************************************
-**
-** This file is part of Qt Creator
-**
-** Copyright (c) 2010 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 "sshdelayedsignal_p.h"
-
-#include "sftpchannel_p.h"
-#include "sshremoteprocess_p.h"
-
-#include <QtCore/QTimer>
-
-namespace Core {
-namespace Internal {
-
-SshDelayedSignal::SshDelayedSignal(const QWeakPointer<QObject> &checkObject)
-    : m_checkObject(checkObject)
-{
-    QTimer::singleShot(0, this, SLOT(handleTimeout()));
-}
-
-void SshDelayedSignal::handleTimeout()
-{
-    if (!m_checkObject.isNull())
-        emitSignal();
-    deleteLater();
-}
-
-
-SftpDelayedSignal::SftpDelayedSignal(SftpChannelPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject)
-    : SshDelayedSignal(checkObject), m_privChannel(privChannel) {}
-
-
-SftpInitializationFailedSignal::SftpInitializationFailedSignal(SftpChannelPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject, const QString &reason)
-    : SftpDelayedSignal(privChannel, checkObject), m_reason(reason) {}
-
-void SftpInitializationFailedSignal::emitSignal()
-{
-    m_privChannel->emitInitializationFailedSignal(m_reason);
-}
-
-
-SftpInitializedSignal::SftpInitializedSignal(SftpChannelPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject)
-    : SftpDelayedSignal(privChannel, checkObject) {}
-
-void SftpInitializedSignal::emitSignal()
-{
-    m_privChannel->emitInitialized();
-}
-
-
-SftpJobFinishedSignal::SftpJobFinishedSignal(SftpChannelPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject, SftpJobId jobId,
-    const QString &error)
-    : SftpDelayedSignal(privChannel, checkObject), m_jobId(jobId), m_error(error)
-{
-}
-
-void SftpJobFinishedSignal::emitSignal()
-{
-    m_privChannel->emitJobFinished(m_jobId, m_error);
-}
-
-
-SftpDataAvailableSignal::SftpDataAvailableSignal(SftpChannelPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject, SftpJobId jobId,
-    const QString &data)
-    : SftpDelayedSignal(privChannel, checkObject), m_jobId(jobId), m_data(data) {}
-
-void SftpDataAvailableSignal::emitSignal()
-{
-    m_privChannel->emitDataAvailable(m_jobId, m_data);
-}
-
-
-SftpClosedSignal::SftpClosedSignal(SftpChannelPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject)
-    : SftpDelayedSignal(privChannel, checkObject) {}
-
-void SftpClosedSignal::emitSignal()
-{
-    m_privChannel->emitClosed();
-}
-
-
-SshRemoteProcessDelayedSignal::SshRemoteProcessDelayedSignal(SshRemoteProcessPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject)
-    : SshDelayedSignal(checkObject), m_privChannel(privChannel) {}
-
-
-SshRemoteProcessStartedSignal::SshRemoteProcessStartedSignal(SshRemoteProcessPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject)
-    : SshRemoteProcessDelayedSignal(privChannel, checkObject) {}
-
-void SshRemoteProcessStartedSignal::emitSignal()
-{
-    m_privChannel->emitStartedSignal();
-}
-
-
-SshRemoteProcessOutputAvailableSignal::SshRemoteProcessOutputAvailableSignal(SshRemoteProcessPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject, const QByteArray &output)
-    : SshRemoteProcessDelayedSignal(privChannel, checkObject), m_output(output)
-{
-}
-
-void SshRemoteProcessOutputAvailableSignal::emitSignal()
-{
-    m_privChannel->emitOutputAvailableSignal(m_output);
-}
-
-
-SshRemoteProcessErrorOutputAvailableSignal::SshRemoteProcessErrorOutputAvailableSignal(SshRemoteProcessPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject, const QByteArray &output)
-    : SshRemoteProcessDelayedSignal(privChannel, checkObject), m_output(output)
-{
-}
-
-void SshRemoteProcessErrorOutputAvailableSignal::emitSignal()
-{
-    m_privChannel->emitErrorOutputAvailableSignal(m_output);
-}
-
-
-SshRemoteProcessClosedSignal::SshRemoteProcessClosedSignal(SshRemoteProcessPrivate *privChannel,
-    const QWeakPointer<QObject> &checkObject, int exitStatus)
-    : SshRemoteProcessDelayedSignal(privChannel, checkObject),
-      m_exitStatus(exitStatus)
-{
-}
-
-void SshRemoteProcessClosedSignal::emitSignal()
-{
-    m_privChannel->emitClosedSignal(m_exitStatus);
-}
-
-} // namespace Internal
-} // namespace Core
diff --git a/src/plugins/coreplugin/ssh/sshdelayedsignal_p.h b/src/plugins/coreplugin/ssh/sshdelayedsignal_p.h
deleted file mode 100644
index 09163fb686101e08b1057490e6157c0e4c081b55..0000000000000000000000000000000000000000
--- a/src/plugins/coreplugin/ssh/sshdelayedsignal_p.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/**************************************************************************
-**
-** This file is part of Qt Creator
-**
-** Copyright (c) 2010 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.
-**
-**************************************************************************/
-
-#ifndef SSHDELAYEDSIGNAL_P_H
-#define SSHDELAYEDSIGNAL_P_H
-
-#include "sftpdefs.h"
-
-#include <QtCore/QObject>
-#include <QtCore/QString>
-#include <QtCore/QWeakPointer>
-
-namespace Core {
-namespace Internal {
-class SftpChannelPrivate;
-class SshRemoteProcessPrivate;
-
-class SshDelayedSignal : public QObject
-{
-    Q_OBJECT
-public:
-    SshDelayedSignal(const QWeakPointer<QObject> &checkObject);
-
-private:
-    Q_SLOT void handleTimeout();
-    virtual void emitSignal()=0;
-
-    const QWeakPointer<QObject> m_checkObject;
-};
-
-
-class SftpDelayedSignal : public SshDelayedSignal
-{
-public:
-    SftpDelayedSignal(SftpChannelPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject);
-
-protected:
-    SftpChannelPrivate * const m_privChannel;
-};
-
-class SftpInitializationFailedSignal : public SftpDelayedSignal
-{
-public:
-    SftpInitializationFailedSignal(SftpChannelPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject, const QString &reason);
-
-private:
-    virtual void emitSignal();
-
-    const QString m_reason;
-};
-
-class SftpInitializedSignal : public SftpDelayedSignal
-{
-public:
-    SftpInitializedSignal(SftpChannelPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject);
-
-private:
-    virtual void emitSignal();
-};
-
-class SftpJobFinishedSignal : public SftpDelayedSignal
-{
-public:
-    SftpJobFinishedSignal(SftpChannelPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject, SftpJobId jobId,
-        const QString &error);
-
-private:
-    virtual void emitSignal();
-
-    const SftpJobId m_jobId;
-    const QString m_error;
-};
-
-class SftpDataAvailableSignal : public SftpDelayedSignal
-{
-public:
-    SftpDataAvailableSignal(SftpChannelPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject, SftpJobId jobId,
-        const QString &data);
-
-private:
-    virtual void emitSignal();
-
-    const SftpJobId m_jobId;
-    const QString m_data;
-};
-
-class SftpClosedSignal : public SftpDelayedSignal
-{
-public:
-    SftpClosedSignal(SftpChannelPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject);
-
-private:
-    virtual void emitSignal();
-};
-
-
-class SshRemoteProcessDelayedSignal : public SshDelayedSignal
-{
-public:
-    SshRemoteProcessDelayedSignal(SshRemoteProcessPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject);
-
-protected:
-    SshRemoteProcessPrivate * const m_privChannel;
-};
-
-class SshRemoteProcessStartedSignal : public SshRemoteProcessDelayedSignal
-{
-public:
-    SshRemoteProcessStartedSignal(SshRemoteProcessPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject);
-
-private:
-    virtual void emitSignal();
-};
-
-class SshRemoteProcessOutputAvailableSignal
-    : public SshRemoteProcessDelayedSignal
-{
-public:
-    SshRemoteProcessOutputAvailableSignal(SshRemoteProcessPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject, const QByteArray &output);
-
-private:
-    virtual void emitSignal();
-
-    const QByteArray m_output;
-};
-
-class SshRemoteProcessErrorOutputAvailableSignal
-    : public SshRemoteProcessDelayedSignal
-{
-public:
-    SshRemoteProcessErrorOutputAvailableSignal(SshRemoteProcessPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject, const QByteArray &output);
-
-private:
-    virtual void emitSignal();
-
-    const QByteArray m_output;
-};
-
-class SshRemoteProcessClosedSignal : public SshRemoteProcessDelayedSignal
-{
-public:
-    SshRemoteProcessClosedSignal(SshRemoteProcessPrivate *privChannel,
-        const QWeakPointer<QObject> &checkObject, int exitStatus);
-
-private:
-    virtual void emitSignal();
-
-    const int m_exitStatus;
-};
-
-} // namespace Internal
-} // namespace Core
-
-#endif // SSHDELAYEDSIGNAL_P_H
diff --git a/src/plugins/coreplugin/ssh/sshremoteprocess.cpp b/src/plugins/coreplugin/ssh/sshremoteprocess.cpp
index 47dfc12845df5de320c58a5e6b7b190b97033d1a..0bd1439ce4f1ae785024be2d657906f0229b891a 100644
--- a/src/plugins/coreplugin/ssh/sshremoteprocess.cpp
+++ b/src/plugins/coreplugin/ssh/sshremoteprocess.cpp
@@ -30,7 +30,6 @@
 #include "sshremoteprocess.h"
 #include "sshremoteprocess_p.h"
 
-#include "sshdelayedsignal_p.h"
 #include "sshincomingpacket_p.h"
 #include "sshsendfacility_p.h"
 
@@ -58,6 +57,14 @@ SshRemoteProcess::SshRemoteProcess(const QByteArray &command, quint32 channelId,
     Internal::SshSendFacility &sendFacility)
     : d(new Internal::SshRemoteProcessPrivate(command, channelId, sendFacility, this))
 {
+    connect(d, SIGNAL(started()), this, SIGNAL(started()),
+        Qt::QueuedConnection);
+    connect(d, SIGNAL(outputAvailable(QByteArray)), this,
+        SIGNAL(outputAvailable(QByteArray)), Qt::QueuedConnection);
+    connect(d, SIGNAL(errorOutputAvailable(QByteArray)), this,
+        SIGNAL(errorOutputAvailable(QByteArray)), Qt::QueuedConnection);
+    connect(d, SIGNAL(closed(int)), this, SIGNAL(closed(int)),
+        Qt::QueuedConnection);
 }
 
 SshRemoteProcess::~SshRemoteProcess()
@@ -134,10 +141,10 @@ void SshRemoteProcessPrivate::setProcState(ProcessState newState)
 #endif
     m_procState = newState;
     if (newState == StartFailed) {
-        createClosedSignal(SshRemoteProcess::FailedToStart);
+        emit closed(SshRemoteProcess::FailedToStart);
     } else if (newState == Running) {
         m_wasRunning = true;
-        createStartedSignal();
+        emit started();
     }
 }
 
@@ -145,9 +152,9 @@ void SshRemoteProcessPrivate::closeHook()
 {
     if (m_wasRunning) {
         if (!m_signal.isEmpty())
-            createClosedSignal(SshRemoteProcess::KilledBySignal);
+            emit closed(SshRemoteProcess::KilledBySignal);
         else
-            createClosedSignal(SshRemoteProcess::ExitedNormally);
+            emit closed(SshRemoteProcess::ExitedNormally);
     }
 }
 
@@ -191,7 +198,7 @@ void SshRemoteProcessPrivate::handleChannelFailure()
 
 void SshRemoteProcessPrivate::handleChannelDataInternal(const QByteArray &data)
 {
-    createOutputAvailableSignal(data);
+    emit outputAvailable(data);
 }
 
 void SshRemoteProcessPrivate::handleChannelExtendedDataInternal(quint32 type,
@@ -200,7 +207,7 @@ void SshRemoteProcessPrivate::handleChannelExtendedDataInternal(quint32 type,
     if (type != SSH_EXTENDED_DATA_STDERR)
         qWarning("Unknown extended data type %u", type);
     else
-        createErrorOutputAvailableSignal(data);
+        emit errorOutputAvailable(data);
 }
 
 void SshRemoteProcessPrivate::handleChannelRequest(const SshIncomingPacket &packet)
@@ -227,48 +234,5 @@ void SshRemoteProcessPrivate::handleChannelRequest(const SshIncomingPacket &pack
     }
 }
 
-void SshRemoteProcessPrivate::createStartedSignal()
-{
-    new SshRemoteProcessStartedSignal(this, QWeakPointer<SshRemoteProcess>(m_proc));
-}
-
-void SshRemoteProcessPrivate::emitStartedSignal()
-{
-    emit m_proc->started();
-}
-
-void SshRemoteProcessPrivate::createOutputAvailableSignal(const QByteArray &output)
-{
-    new SshRemoteProcessOutputAvailableSignal(this,
-        QWeakPointer<SshRemoteProcess>(m_proc), output);
-}
-
-void SshRemoteProcessPrivate::emitOutputAvailableSignal(const QByteArray &output)
-{
-    emit m_proc->outputAvailable(output);
-}
-
-void SshRemoteProcessPrivate::createErrorOutputAvailableSignal(const QByteArray &output)
-{
-    new SshRemoteProcessErrorOutputAvailableSignal(this,
-        QWeakPointer<SshRemoteProcess>(m_proc), output);
-}
-
-void SshRemoteProcessPrivate::emitErrorOutputAvailableSignal(const QByteArray &output)
-{
-    emit m_proc->errorOutputAvailable(output);
-}
-
-void SshRemoteProcessPrivate::createClosedSignal(int exitStatus)
-{
-    new SshRemoteProcessClosedSignal(this,
-        QWeakPointer<SshRemoteProcess>(m_proc), exitStatus);
-}
-
-void SshRemoteProcessPrivate::emitClosedSignal(int exitStatus)
-{
-    emit m_proc->closed(exitStatus);
-}
-
 } // namespace Internal
 } // namespace Core
diff --git a/src/plugins/coreplugin/ssh/sshremoteprocess_p.h b/src/plugins/coreplugin/ssh/sshremoteprocess_p.h
index 951ca247310c7ecacf2a35198b43827451c49818..50ea25e2d8585dc9612fc2691d9e99cbebccba83 100644
--- a/src/plugins/coreplugin/ssh/sshremoteprocess_p.h
+++ b/src/plugins/coreplugin/ssh/sshremoteprocess_p.h
@@ -43,6 +43,7 @@ class SshSendFacility;
 
 class SshRemoteProcessPrivate : public AbstractSshChannel
 {
+    Q_OBJECT
     friend class Core::SshRemoteProcess;
 public:
     enum ProcessState {
@@ -54,10 +55,11 @@ public:
 
     virtual void closeHook();
 
-    void emitStartedSignal();
-    void emitOutputAvailableSignal(const QByteArray &output);
-    void emitErrorOutputAvailableSignal(const QByteArray &output);
-    void emitClosedSignal(int exitStatus);
+signals:
+    void started();
+    void outputAvailable(const QByteArray &output);
+    void errorOutputAvailable(const QByteArray &output);
+    void closed(int exitStatus);
 
 private:
     SshRemoteProcessPrivate(const QByteArray &command, quint32 channelId,
@@ -72,11 +74,6 @@ private:
 
     void setProcState(ProcessState newState);
 
-    void createStartedSignal();
-    void createOutputAvailableSignal(const QByteArray &output);
-    void createErrorOutputAvailableSignal(const QByteArray &output);
-    void createClosedSignal(int exitStatus);
-
     ProcessState m_procState;
     bool m_wasRunning;
     QByteArray m_signal;