diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index d5ed52f199eb243dad6947563a49b0f901f1f649..764d7879d879a1d1ac4d2c2a1c98cf64c0fae552 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -798,6 +798,7 @@ void PluginManagerPrivate::nextDelayedInitialize()
     if (delayedInitializeQueue.isEmpty()) {
         delete delayedInitializeTimer;
         delayedInitializeTimer = 0;
+        emit q->initializationDone();
     } else {
         delayedInitializeTimer->start();
     }
diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h
index 9e1cdcde87e1047dda038749982c93c0e958dff4..c1dfd861b9e6fd43b6ad24d75f190fe7f56e9edb 100644
--- a/src/libs/extensionsystem/pluginmanager.h
+++ b/src/libs/extensionsystem/pluginmanager.h
@@ -135,6 +135,7 @@ signals:
     void aboutToRemoveObject(QObject *obj);
 
     void pluginsChanged();
+    void initializationDone();
 
 public slots:
     void remoteArguments(const QString &serializedArguments);
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
index 7d1fb44f8ac35718f615a5194c1f05e3ca770ef1..ba6c8c72925dc84c50154e17f0adf92b6da0f6b3 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
@@ -542,6 +542,8 @@ void SettingsDialog::done(int val)
     settings->setValue(QLatin1String(categoryKeyC), m_currentCategory);
     settings->setValue(QLatin1String(pageKeyC), m_currentPage);
 
+    ICore::saveSettings(); // save all settings
+
     // exit all additional event loops, see comment in execDialog()
     QListIterator<QEventLoop *> it(m_eventLoops);
     it.toBack();
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 54762d9bc5a1ed9008993c6e14462da679422f86..c0d9eeced8aa0e5efb54bbe579e7e4cec817d37d 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -1506,6 +1506,9 @@ void EditorManager::autoSave()
     if (!errors.isEmpty())
         QMessageBox::critical(ICore::mainWindow(), tr("File Error"),
                               errors.join(QLatin1String("\n")));
+
+    // Also save settings while accessing the disk anyway:
+    ICore::saveSettings();
 }
 
 MakeWritableResult EditorManager::makeFileWritable(IDocument *document)
diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp
index b9ad7f93015103ab4953d845026d8bbc87549e2e..0e1bca0846165197b4989ae0f2656a79ba25c5ac 100644
--- a/src/plugins/coreplugin/icore.cpp
+++ b/src/plugins/coreplugin/icore.cpp
@@ -30,6 +30,8 @@
 
 #include "icore.h"
 
+#include <extensionsystem/pluginmanager.h>
+
 /*!
     \namespace Core
     \brief The Core namespace contains all classes that make up the Core plugin
@@ -373,6 +375,9 @@ ICore::ICore(MainWindow *mainwindow)
 {
     m_instance = this;
     m_mainwindow = mainwindow;
+    // Save settings once after all plugins are initialized:
+    connect(ExtensionSystem::PluginManager::instance(), SIGNAL(initializationDone()),
+            this, SIGNAL(saveSettingsRequested()));
 }
 
 ICore::~ICore()
@@ -553,4 +558,12 @@ void ICore::emitNewItemsDialogRequested()
     emit m_instance->newItemsDialogRequested();
 }
 
+void ICore::saveSettings()
+{
+    emit m_instance->saveSettingsRequested();
+
+    ICore::settings(QSettings::SystemScope)->sync();
+    ICore::settings(QSettings::UserScope)->sync();
+}
+
 } // namespace Core
diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h
index a954b6f76a1b93896f1f87b0f828281b2ea2e085..a7be701e214132effbeb6cb381533583c0952b60 100644
--- a/src/plugins/coreplugin/icore.h
+++ b/src/plugins/coreplugin/icore.h
@@ -134,6 +134,8 @@ public:
 
     static void emitNewItemsDialogRequested();
 
+    static void saveSettings();
+
 signals:
     void coreAboutToOpen();
     void coreOpened();
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index 03ea45e3d7e9102c423980edfacdf80660d4bbf5..fffab92b842d44c33485dcd3d8c9c0f8498585cc 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -233,11 +233,6 @@ MainWindow::MainWindow() :
 #if defined(Q_OS_MAC)
     MacFullScreen::addFullScreen(this);
 #endif
-
-    m_autoSaveSessionTimer = new QTimer(this);
-    m_autoSaveSessionTimer->setInterval(10000);
-    connect(m_autoSaveSessionTimer, SIGNAL(timeout()),
-            m_coreImpl, SIGNAL(saveSettingsRequested()));
 }
 
 void MainWindow::setSidebarVisible(bool visible)
@@ -377,13 +372,11 @@ void MainWindow::extensionsInitialized()
     emit m_coreImpl->coreAboutToOpen();
     show();
     emit m_coreImpl->coreOpened();
-    m_autoSaveSessionTimer->start();
 }
 
 void MainWindow::closeEvent(QCloseEvent *event)
 {
-    m_autoSaveSessionTimer->stop();
-    emit m_coreImpl->saveSettingsRequested();
+    ICore::saveSettings();
 
     // Save opened files
     bool cancelled;
@@ -979,7 +972,6 @@ bool MainWindow::showOptionsDialog(const QString &category,
 void MainWindow::saveAll()
 {
     DocumentManager::saveModifiedDocumentsSilently(DocumentManager::modifiedDocuments());
-    emit m_coreImpl->saveSettingsRequested();
 }
 
 void MainWindow::exit()
diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h
index 8a6c5ef35021491082a46c06ccd60e286fc77088..fcfc7fab5ee5777fe18f7cb57d04f38bf6867d83 100644
--- a/src/plugins/coreplugin/mainwindow.h
+++ b/src/plugins/coreplugin/mainwindow.h
@@ -229,7 +229,6 @@ private:
     QColor m_overrideColor;
 
     QStringList m_filesToOpenDelayed;
-    QTimer *m_autoSaveSessionTimer;
 };
 
 } // namespace Internal