diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp
index ea9ed897c2b6cbb5d337442a505fff41f52d66bd..6441fd017615f9e2621afac05476e32083aca926 100644
--- a/src/plugins/debugger/debuggermainwindow.cpp
+++ b/src/plugins/debugger/debuggermainwindow.cpp
@@ -79,22 +79,15 @@ DebuggerMainWindow::DebuggerMainWindow()
 
 DebuggerMainWindow::~DebuggerMainWindow()
 {
-    // We keep track of widgets for operations that haven't been activated, yet, and make sure we
-    // don't leak any.
+    // As we have to setParent(0) on dock widget that are not selected,
+    // we keep track of all and make sure we don't leak any
     foreach (const Perspective &perspective, m_perspectiveForPerspectiveId) {
         foreach (const Perspective::Operation &operation, perspective.operations()) {
-            if (operation.widget) {
-                // There are two possible states: Either addDockForWidget(widget) has
-                // been called on an operation.widget (e.g. when the perspective gets
-                // activated for the first time), or not. In the first case we don't
-                // have to explicitly delete it as we have called setParent(this) on
-                // it. In the second case, if the widget didn't have a parent before,
-                // we have to delete it.
-                if (!operation.widget->parentWidget()) {
-                    // These are from perspectives that were never activated and didn't
-                    // have a parent to begin with.
-                    delete operation.widget;
-                }
+            if (operation.widget && !operation.widget->parentWidget()) {
+                // These are from inactive perspectives. We call setParent(0) when deactivating
+                // a perspective so that the widgets can't be accidentally enabled in the wrong
+                // perspectives. That's why we have to delete them manually here.
+                delete operation.widget;
             }
         }
     }
@@ -266,9 +259,10 @@ void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId,
         foreach (QDockWidget *dockWidget, m_dockForDockId) {
             QTC_ASSERT(dockWidget, continue);
             dockWidget->setFloating(false);
-            dockWidget->setParent(this);
             removeDockWidget(dockWidget);
             dockWidget->hide();
+            // Prevent saveState storing the data of the wrong children.
+            dockWidget->setParent(0);
         }
 
         ICore::removeAdditionalContext(Context(Id::fromName(m_currentPerspectiveId)));
@@ -303,6 +297,8 @@ void DebuggerMainWindow::loadPerspectiveHelper(const QByteArray &perspectiveId,
 
             ActionManager::actionContainer(Core::Constants::M_WINDOW_VIEWS)->addAction(cmd);
         }
+        // Restore parent/child relation, so that the widget hierarchy is clear.
+        dock->setParent(this);
         if (operation.operationType == Perspective::Raise) {
             dock->raise();
             continue;
@@ -361,7 +357,6 @@ QDockWidget *DebuggerMainWindow::registerDockWidget(const QByteArray &dockId, QW
 {
     QTC_ASSERT(!widget->objectName().isEmpty(), return 0);
     QDockWidget *dockWidget = addDockForWidget(widget);
-    dockWidget->setParent(this);
     m_dockForDockId[dockId] = dockWidget;
     return dockWidget;
 }