diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
index 114ce63e49d874983dc80daf2b1d92dffa69433c..fcf8fb2b7377d187c51a8ed7675494b359843dab 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
@@ -290,7 +290,8 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
     m_categoryList(new CategoryListView),
     m_headerLabel(new QLabel),
     m_running(false),
-    m_applied(false)
+    m_applied(false),
+    m_finished(false)
 {
     m_applied = false;
 
@@ -507,6 +508,9 @@ void SettingsDialog::filter(const QString &text)
 
 void SettingsDialog::accept()
 {
+    if (m_finished)
+        return;
+    m_finished = true;
     disconnectTabWidgets();
     m_applied = true;
     foreach (IOptionsPage *page, m_visitedPages)
@@ -518,6 +522,9 @@ void SettingsDialog::accept()
 
 void SettingsDialog::reject()
 {
+    if (m_finished)
+        return;
+    m_finished = true;
     disconnectTabWidgets();
     foreach (IOptionsPage *page, m_pages)
         page->finish();
@@ -571,6 +578,7 @@ bool SettingsDialog::execDialog()
 {
     if (!m_running) {
         m_running = true;
+        m_finished = false;
         exec();
         m_running = false;
         m_instance = 0;
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.h b/src/plugins/coreplugin/dialogs/settingsdialog.h
index 416961984cf54cc311971f166ab887cf26d607d2..63db6b6539423710b0d722061b4f20058670a926 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.h
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.h
@@ -113,6 +113,7 @@ private:
     QLabel *m_headerLabel;
     bool m_running;
     bool m_applied;
+    bool m_finished;
     QList<QEventLoop *> m_eventLoops;
     static QPointer<SettingsDialog> m_instance;
 };