diff --git a/src/libs/ssh/sshchannelmanager.cpp b/src/libs/ssh/sshchannelmanager.cpp
index dbae05e06c8f54bf419bd9cce6ad48b0e4b08489..792963702e04c4357929c8091ccff23d4ba58aa1 100644
--- a/src/libs/ssh/sshchannelmanager.cpp
+++ b/src/libs/ssh/sshchannelmanager.cpp
@@ -176,16 +176,23 @@ void SshChannelManager::insertChannel(AbstractSshChannel *priv,
     m_sessions.insert(priv, pub);
 }
 
-int SshChannelManager::closeAllChannels()
+int SshChannelManager::closeAllChannels(CloseAllMode mode)
 {
     const int count = m_channels.count();
     for (ChannelIterator it = m_channels.begin(); it != m_channels.end(); ++it)
         it.value()->closeChannel();
-    m_channels.clear();
-    m_sessions.clear();
+    if (mode == CloseAllAndReset) {
+        m_channels.clear();
+        m_sessions.clear();
+    }
     return count;
 }
 
+int SshChannelManager::channelCount() const
+{
+    return m_channels.count();
+}
+
 void SshChannelManager::removeChannel(ChannelIterator it)
 {
     Q_ASSERT(it != m_channels.end() && "Unexpected channel lookup failure.");
diff --git a/src/libs/ssh/sshchannelmanager_p.h b/src/libs/ssh/sshchannelmanager_p.h
index 29589f6da74187b058443f93a6382d8fcc4e9cee..16626eddb1843a96a5a6f881b82884027e30e8ba 100644
--- a/src/libs/ssh/sshchannelmanager_p.h
+++ b/src/libs/ssh/sshchannelmanager_p.h
@@ -55,7 +55,10 @@ public:
     QSharedPointer<SshRemoteProcess> createRemoteProcess(const QByteArray &command);
     QSharedPointer<SshRemoteProcess> createRemoteShell();
     QSharedPointer<SftpChannel> createSftpChannel();
-    int closeAllChannels();
+    int channelCount() const;
+
+    enum CloseAllMode { CloseAllRegular, CloseAllAndReset };
+    int closeAllChannels(CloseAllMode mode);
 
     void handleChannelRequest(const SshIncomingPacket &packet);
     void handleChannelOpen(const SshIncomingPacket &packet);
diff --git a/src/libs/ssh/sshconnection.cpp b/src/libs/ssh/sshconnection.cpp
index 7e1a8428230cf47825ffcf9bf699ce8bbe5b7486..ebf233d3b6d946a65e8ed70d1690355ab26afee8 100644
--- a/src/libs/ssh/sshconnection.cpp
+++ b/src/libs/ssh/sshconnection.cpp
@@ -194,13 +194,18 @@ QSharedPointer<SftpChannel> SshConnection::createSftpChannel()
 int SshConnection::closeAllChannels()
 {
     try {
-        return d->m_channelManager->closeAllChannels();
+        return d->m_channelManager->closeAllChannels(Internal::SshChannelManager::CloseAllRegular);
     } catch (const Botan::Exception &e) {
         qDebug("%s: %s", Q_FUNC_INFO, e.what());
         return -1;
     }
 }
 
+int SshConnection::channelCount() const
+{
+    return d->m_channelManager->channelCount();
+}
+
 namespace Internal {
 
 SshConnectionPrivate::SshConnectionPrivate(SshConnection *conn,
@@ -680,7 +685,7 @@ void SshConnectionPrivate::closeConnection(SshErrorCode sshError,
     m_keepAliveTimer.stop();
     disconnect(&m_keepAliveTimer, 0, this, 0);
     try {
-        m_channelManager->closeAllChannels();
+        m_channelManager->closeAllChannels(SshChannelManager::CloseAllAndReset);
         m_sendFacility.sendDisconnectPacket(sshError, serverErrorString);
     } catch (Botan::Exception &) {}  // Nothing sensible to be done here.
     if (m_error != SshNoError)
diff --git a/src/libs/ssh/sshconnection.h b/src/libs/ssh/sshconnection.h
index 1e8d7effa82c815ada7215d7b09c5bdd50f999a5..66263c307720fd41e1db38923801276172102208 100644
--- a/src/libs/ssh/sshconnection.h
+++ b/src/libs/ssh/sshconnection.h
@@ -107,6 +107,8 @@ public:
     // -1 if an error occurred, number of channels closed otherwise.
     int closeAllChannels();
 
+    int channelCount() const;
+
 signals:
     void connected();
     void disconnected();
diff --git a/src/libs/ssh/sshconnectionmanager.cpp b/src/libs/ssh/sshconnectionmanager.cpp
index 293ac6e9d2dd2d4aa7b4187f78cf1f36bb68c245..04aa2effe18c5bb1b62fb189460295128dd26a0c 100644
--- a/src/libs/ssh/sshconnectionmanager.cpp
+++ b/src/libs/ssh/sshconnectionmanager.cpp
@@ -97,6 +97,8 @@ public:
                 continue;
 
             if (connection->thread() != QThread::currentThread()) {
+                if (connection->channelCount() != 0)
+                    continue;
                 QMetaObject::invokeMethod(this, "switchToCallerThread",
                     Qt::BlockingQueuedConnection,
                     Q_ARG(SshConnection *, connection),