diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 34e0348e2c96427ddfae28d2300f8994d3933778..27524c49fea47a490bc8eef40ac08ab4741caba7 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -1027,11 +1027,10 @@ void DebuggerManager::cleanupViews()
 
 void DebuggerManager::exitDebugger()
 {
-    STATE_DEBUG("");
-    if (d->m_engine)
+    // The engine will finally call setState(DebuggerNotReady) which
+    // in turn will handle the cleanup.
+    if (d->m_engine && state() != DebuggerNotReady)
         d->m_engine->exitDebugger();
-    cleanupViews();
-    setState(DebuggerNotReady);
 }
 
 DebuggerStartParametersPtr DebuggerManager::startParameters() const
@@ -1139,19 +1138,13 @@ void DebuggerManager::executeDebuggerCommand(const QString &command)
 
 void DebuggerManager::sessionLoaded()
 {
-    cleanupViews();
-    setState(DebuggerNotReady);
-    setBusyCursor(false);
     loadSessionData();
 }
 
 void DebuggerManager::aboutToUnloadSession()
 {
-    cleanupViews();
     if (d->m_engine)
         d->m_engine->shutdown();
-    setState(DebuggerNotReady);
-    setBusyCursor(false);
 }
 
 void DebuggerManager::aboutToSaveSession()
@@ -1626,6 +1619,7 @@ void DebuggerManager::setState(DebuggerState state)
 
     if (d->m_state == DebuggerNotReady) {
         setBusyCursor(false);
+        cleanupViews();
         emit debuggingFinished();
     }