diff --git a/src/libs/utils/ssh/sshconnection.cpp b/src/libs/utils/ssh/sshconnection.cpp
index 93302b81cf243a4d9181533e0bffce567d2af308..9d90b8d39af248a36aab21613dbbff991cdac99f 100644
--- a/src/libs/utils/ssh/sshconnection.cpp
+++ b/src/libs/utils/ssh/sshconnection.cpp
@@ -342,6 +342,7 @@ void SshConnectionPrivate::handleServerId()
     m_keyExchange.reset(new SshKeyExchange(m_sendFacility));
     m_serverId = m_incomingData.left(endOffset);
     m_keyExchange->sendKexInitPacket(m_serverId);
+    m_keyExchangeState = KexInitSent;
     m_incomingData.remove(0, endOffset + 2);
 }
 
@@ -358,7 +359,7 @@ void SshConnectionPrivate::handlePackets()
 void SshConnectionPrivate::handleCurrentPacket()
 {
     Q_ASSERT(m_incomingPacket.isComplete());
-    Q_ASSERT(m_keyExchangeState == KeyExchangeStarted || !m_ignoreNextPacket);
+    Q_ASSERT(m_keyExchangeState == DhInitSent || !m_ignoreNextPacket);
 
     if (m_ignoreNextPacket) {
         m_ignoreNextPacket = false;
@@ -381,14 +382,15 @@ void SshConnectionPrivate::handleCurrentPacket()
 
 void SshConnectionPrivate::handleKeyExchangeInitPacket()
 {
-    if (m_keyExchangeState != NoKeyExchange) {
+    if (m_keyExchangeState != NoKeyExchange
+            && m_keyExchangeState != KexInitSent) {
         throw SshServerException(SSH_DISCONNECT_PROTOCOL_ERROR,
             "Unexpected packet.", tr("Unexpected packet of type %1.")
             .arg(m_incomingPacket.type()));
     }
 
     // Server-initiated re-exchange.
-    if (m_state == ConnectionEstablished) {
+    if (m_keyExchangeState == NoKeyExchange) {
         m_keyExchange.reset(new SshKeyExchange(m_sendFacility));
         m_keyExchange->sendKexInitPacket(m_serverId);
     }
@@ -400,12 +402,12 @@ void SshConnectionPrivate::handleKeyExchangeInitPacket()
         m_ignoreNextPacket = true;
     }
 
-    m_keyExchangeState = KeyExchangeStarted;
+    m_keyExchangeState = DhInitSent;
 }
 
 void SshConnectionPrivate::handleKeyExchangeReplyPacket()
 {
-    if (m_keyExchangeState != KeyExchangeStarted) {
+    if (m_keyExchangeState != DhInitSent) {
         throw SshServerException(SSH_DISCONNECT_PROTOCOL_ERROR,
             "Unexpected packet.", tr("Unexpected packet of type %1.")
             .arg(m_incomingPacket.type()));
@@ -414,12 +416,12 @@ void SshConnectionPrivate::handleKeyExchangeReplyPacket()
     m_keyExchange->sendNewKeysPacket(m_incomingPacket,
         ClientId.left(ClientId.size() - 2));
     m_sendFacility.recreateKeys(*m_keyExchange);
-    m_keyExchangeState = KeyExchangeSuccess;
+    m_keyExchangeState = NewKeysSent;
 }
 
 void SshConnectionPrivate::handleNewKeysPacket()
 {
-    if (m_keyExchangeState != KeyExchangeSuccess) {
+    if (m_keyExchangeState != NewKeysSent) {
         throw SshServerException(SSH_DISCONNECT_PROTOCOL_ERROR,
             "Unexpected packet.", tr("Unexpected packet of type %1.")
             .arg(m_incomingPacket.type()));
diff --git a/src/libs/utils/ssh/sshconnection_p.h b/src/libs/utils/ssh/sshconnection_p.h
index 352dd986b59b758d0c00400812267ab86cc6bea3..79806c50ff313fbce829b7fa47802e0e14a05371 100644
--- a/src/libs/utils/ssh/sshconnection_p.h
+++ b/src/libs/utils/ssh/sshconnection_p.h
@@ -71,8 +71,10 @@ enum SshStateInternal {
 
 enum SshKeyExchangeState {
     NoKeyExchange,
-    KeyExchangeStarted,    // After server's KEXINIT message
-    KeyExchangeSuccess     // After server's DH_REPLY message
+    KexInitSent,
+    DhInitSent,
+    NewKeysSent,
+    KeyExchangeSuccess  // After server's DH_REPLY message
 };
 
 class SshConnectionPrivate : public QObject