diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index eb7a8b98b5218e5ad892fa0020ca17e4364937e6..c7338cdb1b5159bfaf6c943801092052dea28d86 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -283,9 +283,6 @@ MainWindow::~MainWindow()
     delete m_rightPaneWidget;
     m_rightPaneWidget = 0;
 
-    delete m_navigationWidget;
-    m_navigationWidget = 0;
-
     delete m_modeManager;
     m_modeManager = 0;
     delete m_mimeDatabase;
@@ -366,7 +363,11 @@ void MainWindow::closeEvent(QCloseEvent *event)
     }
 
     emit m_coreImpl->coreAboutToClose();
+
     writeSettings();
+
+    m_navigationWidget->closeSubWidgets();
+
     event->accept();
 }
 
diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp
index 2e8753f1775379a9d3a20c36a8d6282f1bb152b5..0bfb62aea684845a509ae45193a3376bf1173311 100644
--- a/src/plugins/coreplugin/navigationwidget.cpp
+++ b/src/plugins/coreplugin/navigationwidget.cpp
@@ -340,6 +340,15 @@ void NavigationWidget::restoreSettings(QSettings *settings)
     }
 }
 
+void NavigationWidget::closeSubWidgets()
+{
+    foreach (NavigationSubWidget *subWidget, m_subWidgets) {
+        subWidget->saveSettings();
+        delete subWidget;
+    }
+    m_subWidgets.clear();
+}
+
 void NavigationWidget::setShown(bool b)
 {
     if (m_shown == b)
diff --git a/src/plugins/coreplugin/navigationwidget.h b/src/plugins/coreplugin/navigationwidget.h
index a9ffe2b4298f8b570d9a96c5c363a54a6d362df8..1c4834aeb0fab54004db53b48340ace53d297245 100644
--- a/src/plugins/coreplugin/navigationwidget.h
+++ b/src/plugins/coreplugin/navigationwidget.h
@@ -92,6 +92,8 @@ public:
     void saveSettings(QSettings *settings);
     void restoreSettings(QSettings *settings);
 
+    void closeSubWidgets();
+
     bool isShown() const;
     void setShown(bool b);