diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
index 5e0cac944ef0b64a79bb4e3b71909bba5862a57e..195325bceb2eb7a4311c9431ac81285c9e61806f 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
@@ -30,18 +30,37 @@
 #include "settingsdialog.h"
 
 #include <extensionsystem/pluginmanager.h>
+#include "icore.h"
 
+#include <QtCore/QSettings>
 #include <QtGui/QHeaderView>
 #include <QtGui/QPushButton>
 
+namespace {
+    struct PageData {
+        int index;
+        QString category;
+        QString id;
+    };
+}
+
+Q_DECLARE_METATYPE(::PageData);
+
 using namespace Core;
 using namespace Core::Internal;
 
-SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
-                               const QString &initialPage)
+SettingsDialog::SettingsDialog(QWidget *parent, const QString &categoryId,
+                               const QString &pageId)
     : QDialog(parent), m_applied(false)
 {
     setupUi(this);
+    QString initialCategory = categoryId;
+    QString initialPage = pageId;
+    if (initialCategory.isEmpty() && initialPage.isEmpty()) {
+        QSettings *settings = ICore::instance()->settings();
+        initialCategory = settings->value("General/LastPreferenceCategory", QVariant(QString())).toString();
+        initialPage = settings->value("General/LastPreferencePage", QVariant(QString())).toString();
+    }
     buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
 
     connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(apply()));
@@ -50,7 +69,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
     pageTree->header()->setVisible(false);
 
     connect(pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
-        this, SLOT(pageSelected(QTreeWidgetItem *)));
+        this, SLOT(pageSelected()));
 
     QMap<QString, QTreeWidgetItem *> categories;
 
@@ -59,9 +78,14 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
 
     int index = 0;
     foreach (IOptionsPage *page, pages) {
+        PageData pageData;
+        pageData.index = index;
+        pageData.category = page->category();
+        pageData.id = page->id();
+
         QTreeWidgetItem *item = new QTreeWidgetItem;
         item->setText(0, page->trName());
-        item->setData(0, Qt::UserRole, index);
+        item->setData(0, Qt::UserRole, qVariantFromValue(pageData));
 
         QStringList categoriesId = page->category().split(QLatin1Char('|'));
         QStringList trCategories = page->trCategory().split(QLatin1Char('|'));
@@ -71,7 +95,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
         if (!categories.contains(currentCategory)) {
             treeitem = new QTreeWidgetItem(pageTree);
             treeitem->setText(0, trCategories.at(0));
-            treeitem->setData(0, Qt::UserRole, index);
+            treeitem->setData(0, Qt::UserRole, qVariantFromValue(pageData));
             categories.insert(currentCategory, treeitem);
         }
 
@@ -81,7 +105,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
                 treeitem = new QTreeWidgetItem(categories.value(currentCategory));
                 currentCategory +=  QLatin1Char('|') + categoriesId.at(catCount);
                 treeitem->setText(0, trCategories.at(catCount));
-                treeitem->setData(0, Qt::UserRole, index);
+                treeitem->setData(0, Qt::UserRole, qVariantFromValue(pageData));
                 categories.insert(currentCategory, treeitem);
             } else {
                 currentCategory +=  QLatin1Char('|') + categoriesId.at(catCount);
@@ -114,10 +138,13 @@ SettingsDialog::~SettingsDialog()
 {
 }
 
-void SettingsDialog::pageSelected(QTreeWidgetItem *)
+void SettingsDialog::pageSelected()
 {
     QTreeWidgetItem *item = pageTree->currentItem();
-    int index = item->data(0, Qt::UserRole).toInt();
+    PageData data = item->data(0, Qt::UserRole).value<PageData>();
+    int index = data.index;
+    m_currentCategory = data.category;
+    m_currentPage = data.id;
     stackedPages->setCurrentIndex(index);
 }
 
@@ -151,3 +178,11 @@ bool SettingsDialog::execDialog()
     exec();
     return m_applied;
 }
+
+void SettingsDialog::done(int val)
+{
+    QSettings *settings = ICore::instance()->settings();
+    settings->setValue("General/LastPreferenceCategory", m_currentCategory);
+    settings->setValue("General/LastPreferencePage", m_currentPage);
+    QDialog::done(val);
+}
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.h b/src/plugins/coreplugin/dialogs/settingsdialog.h
index 36c7d8a1a626a6550a44e15cb45aca5742e7d3b9..88f0a7a5abc3ac270f888aa46b3cf7e8c854b23f 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.h
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.h
@@ -53,8 +53,11 @@ public:
     // at least once
     bool execDialog();
 
+public slots:
+    void done(int);
+
 private slots:
-    void pageSelected(QTreeWidgetItem *cat);
+    void pageSelected();
     void accept();
     void reject();
     void apply();
@@ -62,6 +65,8 @@ private slots:
 private:
     QList<Core::IOptionsPage*> m_pages;
     bool m_applied;
+    QString m_currentCategory;
+    QString m_currentPage;
 };
 
 } // namespace Internal