diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
index 200d4037ceed0217c9624b770e76598d8c00a659..93eb7504029c64bfe7aad420227b5d4a5a93b702 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
@@ -315,6 +315,8 @@ void CMakeSettingsPage::saveSettings() const
 
 void CMakeSettingsPage::apply()
 {
+    if (!m_pathchooser) // page was never shown
+        return;
     if (m_cmakeExecutable == m_pathchooser->path())
         return;
     m_cmakeExecutable = m_pathchooser->path();
diff --git a/src/plugins/coreplugin/actionmanager/commandmappings.cpp b/src/plugins/coreplugin/actionmanager/commandmappings.cpp
index c62aa11827021fdef8a3a7cbb30a5e3fc066fb43..f49f621bc994ba4e23a62ace1d6b793bd5c5884c 100644
--- a/src/plugins/coreplugin/actionmanager/commandmappings.cpp
+++ b/src/plugins/coreplugin/actionmanager/commandmappings.cpp
@@ -54,7 +54,7 @@ using namespace Core;
 using namespace Core::Internal;
 
 CommandMappings::CommandMappings(QObject *parent)
-    : IOptionsPage(parent)
+    : IOptionsPage(parent), m_page(0)
 {
 }
 
@@ -140,7 +140,10 @@ void CommandMappings::setTargetHeader(const QString &s)
 
 void CommandMappings::finish()
 {
+    if (!m_page) // page was never shown
+        return;
     delete m_page;
+    m_page = 0;
 }
 
 void CommandMappings::commandChanged(QTreeWidgetItem *current)
diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp
index b408c2db04c22d4aa9e82ae2984ae8004f410446..e88cb0b10c35d18d48b7db3877b27b6b0794d962 100644
--- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp
+++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp
@@ -34,14 +34,19 @@
   \mainclass
   \brief The IOptionsPage is an interface for providing options pages.
 
+  You need to subclass this interface and put an instance of your subclass
+  into the plugin manager object pool (e.g. ExtensionSystem::PluginManager::addObject).
   Guidelines for implementing:
   \list
-  \o id() is an id used for filtering when calling ICore:: showOptionsDialog()
-  \o displayName() is the (translated) name for display.
-  \o category() is the category used for filtering when calling ICore:: showOptionsDialog()
-  \o displayCategory() is the translated category
+  \o id() is a unique identifier for referencing this page
+  \o displayName() is the (translated) name for display
+  \o category() is the unique id for the category that the page should be displayed in
+  \o displayCategory() is the translated name of the category
+  \o createPage() is called to retrieve the widget to show in the preferences dialog
+     The widget will be destroyed by the widget hierarchy when the dialog closes
   \o apply() is called to store the settings. It should detect if any changes have been
-         made and store those.
-  \o matches() is used for the options dialog search filter.
+         made and store those
+  \o finish() is called directly before the preferences dialog closes
+  \o matches() is used for the options dialog search filter
   \endlist
 */
diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.h b/src/plugins/coreplugin/dialogs/ioptionspage.h
index 7818921e7e1fa0904471a44e284975c8990ca10e..6a64736d5e80ae27f9140d4f62d3bf1dd226fe1c 100644
--- a/src/plugins/coreplugin/dialogs/ioptionspage.h
+++ b/src/plugins/coreplugin/dialogs/ioptionspage.h
@@ -60,6 +60,29 @@ public:
     virtual void finish() = 0;
 };
 
+/*
+    Alternative way for providing option pages instead of adding IOptionsPage
+    objects into the plugin manager pool. Should only be used if creation of the
+    actual option pages is not possible or too expensive at Qt Creator startup.
+    (Like the designer integration, which needs to initialize designer plugins
+    before the options pages get available.)
+*/
+
+class CORE_EXPORT IOptionsPageProvider : public QObject
+{
+    Q_OBJECT
+
+public:
+    IOptionsPageProvider(QObject *parent = 0) : QObject(parent) {}
+    virtual ~IOptionsPageProvider() {}
+
+    virtual QString category() const = 0;
+    virtual QString displayCategory() const = 0;
+    virtual QIcon categoryIcon() const = 0;
+
+    virtual QList<IOptionsPage *> pages() const = 0;
+};
+
 } // namespace Core
 
 #endif // IOPTIONSPAGE_H
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
index a87f81270f4ad066147e481bd1a6d335e6852ef0..e5c6a1825f37228fe324e601b734186b4ed8cfff 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
@@ -72,7 +72,8 @@ public:
     QString id;
     QString displayName;
     QIcon icon;
-    QList<IOptionsPage*> pages;
+    QList<IOptionsPage *> pages;
+    QList<IOptionsPageProvider *> providers;
     int index;
     QTabWidget *tabWidget;
 };
@@ -86,7 +87,8 @@ public:
     int rowCount(const QModelIndex &parent = QModelIndex()) const;
     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
 
-    void setPages(const QList<IOptionsPage*> &pages);
+    void setPages(const QList<IOptionsPage*> &pages,
+                  const QList<IOptionsPageProvider *> &providers);
     const QList<Category*> &categories() const { return m_categories; }
 
 private:
@@ -130,7 +132,8 @@ QVariant CategoryModel::data(const QModelIndex &index, int role) const
     return QVariant();
 }
 
-void CategoryModel::setPages(const QList<IOptionsPage*> &pages)
+void CategoryModel::setPages(const QList<IOptionsPage*> &pages,
+                             const QList<IOptionsPageProvider *> &providers)
 {
     // Clear any previous categories
     qDeleteAll(m_categories);
@@ -143,13 +146,32 @@ void CategoryModel::setPages(const QList<IOptionsPage*> &pages)
         if (!category) {
             category = new Category;
             category->id = categoryId;
+            category->tabWidget = 0;
+            category->index = -1;
+            m_categories.append(category);
+        }
+        if (category->displayName.isEmpty())
             category->displayName = page->displayCategory();
+        if (category->icon.isNull())
             category->icon = page->categoryIcon();
-            category->pages.append(page);
+        category->pages.append(page);
+    }
+
+    foreach (IOptionsPageProvider *provider, providers) {
+        const QString &categoryId = provider->category();
+        Category *category = findCategoryById(categoryId);
+        if (!category) {
+            category = new Category;
+            category->id = categoryId;
+            category->tabWidget = 0;
+            category->index = -1;
             m_categories.append(category);
-        } else {
-            category->pages.append(page);
         }
+        if (category->displayName.isEmpty())
+            category->displayName = provider->displayCategory();
+        if (category->icon.isNull())
+            category->icon = provider->categoryIcon();
+        category->providers.append(provider);
     }
 
     reset();
@@ -277,26 +299,8 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
     setWindowTitle(tr("Options"));
 #endif
 
-    m_model->setPages(m_pages);
-
-    // Create the tab widgets with the pages in each category
-    const QList<Category*> &categories = m_model->categories();
-    for (int i = 0; i < categories.size(); ++i) {
-        Category *category = categories.at(i);
-
-        QTabWidget *tabWidget = new QTabWidget;
-        for (int j = 0; j < category->pages.size(); ++j) {
-            IOptionsPage *page = category->pages.at(j);
-            QWidget *widget = page->createPage(0);
-            tabWidget->addTab(widget, page->displayName());
-        }
-
-        connect(tabWidget, SIGNAL(currentChanged(int)),
-                this, SLOT(currentTabChanged(int)));
-
-        category->tabWidget = tabWidget;
-        category->index = m_stackedLayout->addWidget(tabWidget);
-    }
+    m_model->setPages(m_pages,
+        ExtensionSystem::PluginManager::instance()->getObjects<IOptionsPageProvider>());
 
     m_proxyModel->setSourceModel(m_model);
     m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
@@ -383,6 +387,7 @@ void SettingsDialog::createGui()
     mainGridLayout->addWidget(buttonBox,        2, 0, 1, 2);
     mainGridLayout->setColumnStretch(1, 4);
     setLayout(mainGridLayout);
+    setMinimumSize(1070, 680);
 }
 
 SettingsDialog::~SettingsDialog()
@@ -392,7 +397,7 @@ SettingsDialog::~SettingsDialog()
 void SettingsDialog::showCategory(int index)
 {
     Category *category = m_model->categories().at(index);
-
+    ensureCategoryWidget(category);
     // Update current category and page
     m_currentCategory = category->id;
     const int currentTabIndex = category->tabWidget->currentIndex();
@@ -408,6 +413,29 @@ void SettingsDialog::showCategory(int index)
     updateEnabledTabs(category, m_filterLineEdit->text());
 }
 
+void SettingsDialog::ensureCategoryWidget(Category *category)
+{
+    if (category->tabWidget != 0)
+        return;
+    foreach (const IOptionsPageProvider *provider, category->providers) {
+        category->pages += provider->pages();
+    }
+    qStableSort(category->pages.begin(), category->pages.end(), optionsPageLessThan);
+
+    QTabWidget *tabWidget = new QTabWidget;
+    for (int j = 0; j < category->pages.size(); ++j) {
+        IOptionsPage *page = category->pages.at(j);
+        QWidget *widget = page->createPage(0);
+        tabWidget->addTab(widget, page->displayName());
+    }
+
+    connect(tabWidget, SIGNAL(currentChanged(int)),
+            this, SLOT(currentTabChanged(int)));
+
+    category->tabWidget = tabWidget;
+    category->index = m_stackedLayout->addWidget(tabWidget);
+}
+
 void SettingsDialog::updateEnabledTabs(Category *category, const QString &searchText)
 {
     for (int i = 0; i < category->pages.size(); ++i) {
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.h b/src/plugins/coreplugin/dialogs/settingsdialog.h
index 4172f036f871c8dc0e6d4eee858b3398c879d88c..f942b03c523c098cf692872dcab16eaf10d80b65 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.h
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.h
@@ -93,6 +93,7 @@ private:
     void showCategory(int index);
     void showPage(const QString &categoryId, const QString &pageId);
     void updateEnabledTabs(Category *category, const QString &searchText);
+    void ensureCategoryWidget(Category *category);
 
     const QList<Core::IOptionsPage*> m_pages;
 
diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp
index dec8e22cbb12a995c8c282c17370fbcc86cf97ba..844b3550057c6b773e506af61a9d160e3194cf7f 100644
--- a/src/plugins/coreplugin/generalsettings.cpp
+++ b/src/plugins/coreplugin/generalsettings.cpp
@@ -53,7 +53,7 @@ using namespace Core::Internal;
 
 
 GeneralSettings::GeneralSettings():
-    m_dialog(0)
+    m_page(0), m_dialog(0)
 {
 }
 
@@ -188,6 +188,8 @@ bool GeneralSettings::matches(const QString &s) const
 
 void GeneralSettings::apply()
 {
+    if (!m_page) // wasn't shown, can't be changed
+        return;
     int currentIndex = m_page->languageBox->currentIndex();
     setLanguage(m_page->languageBox->itemData(currentIndex, Qt::UserRole).toString());
     // Apply the new base color if accepted
@@ -205,7 +207,10 @@ void GeneralSettings::apply()
 
 void GeneralSettings::finish()
 {
+    if (!m_page) // page was never shown
+        return;
     delete m_page;
+    m_page = 0;
 }
 
 void GeneralSettings::resetInterfaceColor()
diff --git a/src/plugins/cpaster/fileshareprotocolsettingspage.cpp b/src/plugins/cpaster/fileshareprotocolsettingspage.cpp
index ea19de63e27e2a728a2e8772d1e22667f3e5066c..fd0a19c2989bcbd880cf3607f3405af5b983c09a 100644
--- a/src/plugins/cpaster/fileshareprotocolsettingspage.cpp
+++ b/src/plugins/cpaster/fileshareprotocolsettingspage.cpp
@@ -96,7 +96,7 @@ FileShareProtocolSettings FileShareProtocolSettingsWidget::settings() const
 // ----------FileShareProtocolSettingsPage
 FileShareProtocolSettingsPage::FileShareProtocolSettingsPage(const QSharedPointer<FileShareProtocolSettings> &s,
                                                              QObject *parent) :
-    Core::IOptionsPage(parent), m_settings(s)
+    Core::IOptionsPage(parent), m_settings(s), m_widget(0)
 {
 }
 
@@ -134,6 +134,8 @@ QWidget *FileShareProtocolSettingsPage::createPage(QWidget *parent)
 
 void FileShareProtocolSettingsPage::apply()
 {
+    if (!m_widget) // page was never shown
+        return;
     const FileShareProtocolSettings newSettings = m_widget->settings();
     if (newSettings != *m_settings) {
         *m_settings = newSettings;
diff --git a/src/plugins/cpaster/settingspage.cpp b/src/plugins/cpaster/settingspage.cpp
index 3d59b7ac07550706e7fa3f77791bf66f51f3280d..346e75088a18e25bc2d67cecace5980bbfa36215 100644
--- a/src/plugins/cpaster/settingspage.cpp
+++ b/src/plugins/cpaster/settingspage.cpp
@@ -76,7 +76,7 @@ Settings SettingsWidget::settings()
 }
 
 SettingsPage::SettingsPage(const QSharedPointer<Settings> &settings) :
-    m_settings(settings)
+    m_settings(settings), m_widget(0)
 {
 }
 
@@ -121,7 +121,8 @@ QWidget *SettingsPage::createPage(QWidget *parent)
 
 void SettingsPage::apply()
 {
-    QTC_ASSERT(m_widget, return)
+    if (!m_widget) // page was never shown
+        return;
     const Settings newSettings = m_widget->settings();
     if (newSettings != *m_settings) {
         *m_settings = newSettings;
diff --git a/src/plugins/cpptools/completionsettingspage.cpp b/src/plugins/cpptools/completionsettingspage.cpp
index 2db7dc3087f4a6d56c946303f8a8c6e2731e54de..995ee2d7d8e032aaa049137c915ccc6df8dc748d 100644
--- a/src/plugins/cpptools/completionsettingspage.cpp
+++ b/src/plugins/cpptools/completionsettingspage.cpp
@@ -40,7 +40,7 @@
 using namespace CppTools::Internal;
 
 CompletionSettingsPage::CompletionSettingsPage()
-    : m_page(new Ui_CompletionSettingsPage)
+    : m_page(0)
 {
 }
 
@@ -62,6 +62,7 @@ QString CompletionSettingsPage::displayName() const
 QWidget *CompletionSettingsPage::createPage(QWidget *parent)
 {
     QWidget *w = new QWidget(parent);
+    m_page = new Ui_CompletionSettingsPage;
     m_page->setupUi(w);
 
     const TextEditor::CompletionSettings &settings =
@@ -113,6 +114,8 @@ QWidget *CompletionSettingsPage::createPage(QWidget *parent)
 
 void CompletionSettingsPage::apply()
 {
+    if (!m_page) // page was never shown
+        return;
     TextEditor::CompletionSettings settings;
     settings.m_caseSensitivity = caseSensitivity();
     settings.m_completionTrigger = completionTrigger();
@@ -151,3 +154,11 @@ TextEditor::CompletionTrigger CompletionSettingsPage::completionTrigger() const
         return TextEditor::AutomaticCompletion;
     }
 }
+
+void CompletionSettingsPage::finish()
+{
+    if (!m_page) // page was never shown
+        return;
+    delete m_page;
+    m_page = 0;
+}
diff --git a/src/plugins/cpptools/completionsettingspage.h b/src/plugins/cpptools/completionsettingspage.h
index c2b0c56dc30105a5bb372fff43bbaa294edc3609..25ceac12583c513f5c2dc930674d9d238dbdb2ff 100644
--- a/src/plugins/cpptools/completionsettingspage.h
+++ b/src/plugins/cpptools/completionsettingspage.h
@@ -55,7 +55,7 @@ public:
 
     QWidget *createPage(QWidget *parent);
     void apply();
-    void finish() { }
+    void finish();
     virtual bool matches(const QString &) const;
 
 private:
diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp
index 7884defae84b9e4e0041fc7a843b3fba16448df1..6ac2251e4f9fdebfef6bdc52182d857adfb4a070 100644
--- a/src/plugins/debugger/gdb/gdboptionspage.cpp
+++ b/src/plugins/debugger/gdb/gdboptionspage.cpp
@@ -139,6 +139,7 @@ void GdbOptionsPage::writeGdbBinarySettings() /* static */
 }
 
 GdbOptionsPage::GdbOptionsPage()
+    : m_ui(0)
 {
 }
 
@@ -170,67 +171,68 @@ QIcon GdbOptionsPage::categoryIcon() const
 QWidget *GdbOptionsPage::createPage(QWidget *parent)
 {
     QWidget *w = new QWidget(parent);
-    m_ui.setupUi(w);
-    m_ui.gdbChooserWidget->setGdbBinaries(gdbBinaryToolChainMap);
-    m_ui.scriptFileChooser->setExpectedKind(Utils::PathChooser::File);
-    m_ui.scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File"));
+    m_ui = new Ui::GdbOptionsPage;
+    m_ui->setupUi(w);
+    m_ui->gdbChooserWidget->setGdbBinaries(gdbBinaryToolChainMap);
+    m_ui->scriptFileChooser->setExpectedKind(Utils::PathChooser::File);
+    m_ui->scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File"));
 
     m_group.clear();
     m_group.insert(debuggerCore()->action(GdbScriptFile),
-        m_ui.scriptFileChooser);
+        m_ui->scriptFileChooser);
     m_group.insert(debuggerCore()->action(GdbEnvironment),
-        m_ui.environmentEdit);
+        m_ui->environmentEdit);
     m_group.insert(debuggerCore()->action(AdjustBreakpointLocations),
-        m_ui.checkBoxAdjustBreakpointLocations);
+        m_ui->checkBoxAdjustBreakpointLocations);
     m_group.insert(debuggerCore()->action(GdbWatchdogTimeout),
-        m_ui.spinBoxGdbWatchdogTimeout);
+        m_ui->spinBoxGdbWatchdogTimeout);
 
     m_group.insert(debuggerCore()->action(UseMessageBoxForSignals),
-        m_ui.checkBoxUseMessageBoxForSignals);
+        m_ui->checkBoxUseMessageBoxForSignals);
     m_group.insert(debuggerCore()->action(SkipKnownFrames),
-        m_ui.checkBoxSkipKnownFrames);
+        m_ui->checkBoxSkipKnownFrames);
     m_group.insert(debuggerCore()->action(EnableReverseDebugging),
-        m_ui.checkBoxEnableReverseDebugging);
+        m_ui->checkBoxEnableReverseDebugging);
     m_group.insert(debuggerCore()->action(GdbWatchdogTimeout), 0);
 
 #if 1
-    m_ui.groupBoxPluginDebugging->hide();
+    m_ui->groupBoxPluginDebugging->hide();
 #else // The related code (handleAqcuiredInferior()) is disabled as well.
     m_group.insert(debuggerCore()->action(AllPluginBreakpoints),
-        m_ui.radioButtonAllPluginBreakpoints);
+        m_ui->radioButtonAllPluginBreakpoints);
     m_group.insert(debuggerCore()->action(SelectedPluginBreakpoints),
-        m_ui.radioButtonSelectedPluginBreakpoints);
+        m_ui->radioButtonSelectedPluginBreakpoints);
     m_group.insert(debuggerCore()->action(NoPluginBreakpoints),
-        m_ui.radioButtonNoPluginBreakpoints);
+        m_ui->radioButtonNoPluginBreakpoints);
     m_group.insert(debuggerCore()->action(SelectedPluginBreakpointsPattern),
-        m_ui.lineEditSelectedPluginBreakpointsPattern);
+        m_ui->lineEditSelectedPluginBreakpointsPattern);
 #endif
 
-    m_ui.lineEditSelectedPluginBreakpointsPattern->
+    m_ui->lineEditSelectedPluginBreakpointsPattern->
         setEnabled(debuggerCore()->action(SelectedPluginBreakpoints)->value().toBool());
-    connect(m_ui.radioButtonSelectedPluginBreakpoints, SIGNAL(toggled(bool)),
-        m_ui.lineEditSelectedPluginBreakpointsPattern, SLOT(setEnabled(bool)));
+    connect(m_ui->radioButtonSelectedPluginBreakpoints, SIGNAL(toggled(bool)),
+        m_ui->lineEditSelectedPluginBreakpointsPattern, SLOT(setEnabled(bool)));
 
     // FIXME
-    m_ui.environmentEdit->hide();
-    m_ui.labelEnvironment->hide();
+    m_ui->environmentEdit->hide();
+    m_ui->labelEnvironment->hide();
 
     if (m_searchKeywords.isEmpty()) {
         QLatin1Char sep(' ');
         QTextStream(&m_searchKeywords)
-                << sep << m_ui.groupBoxLocations->title()
-                << sep << m_ui.labelEnvironment->text()
-                << sep << m_ui.labelGdbStartupScript->text()
-                << sep << m_ui.labelGdbWatchdogTimeout->text()
-                << sep << m_ui.checkBoxEnableReverseDebugging->text()
-                << sep << m_ui.checkBoxSkipKnownFrames->text()
-                << sep << m_ui.checkBoxUseMessageBoxForSignals->text()
-                << sep << m_ui.checkBoxAdjustBreakpointLocations->text()
-                << sep << m_ui.groupBoxPluginDebugging->title()
-                << sep << m_ui.radioButtonAllPluginBreakpoints->text()
-                << sep << m_ui.radioButtonSelectedPluginBreakpoints->text()
-                << sep << m_ui.labelSelectedPluginBreakpoints->text()
-                << sep << m_ui.radioButtonNoPluginBreakpoints->text()
+                << sep << m_ui->groupBoxLocations->title()
+                << sep << m_ui->labelEnvironment->text()
+                << sep << m_ui->labelGdbStartupScript->text()
+                << sep << m_ui->labelGdbWatchdogTimeout->text()
+                << sep << m_ui->checkBoxEnableReverseDebugging->text()
+                << sep << m_ui->checkBoxSkipKnownFrames->text()
+                << sep << m_ui->checkBoxUseMessageBoxForSignals->text()
+                << sep << m_ui->checkBoxAdjustBreakpointLocations->text()
+                << sep << m_ui->groupBoxPluginDebugging->title()
+                << sep << m_ui->radioButtonAllPluginBreakpoints->text()
+                << sep << m_ui->radioButtonSelectedPluginBreakpoints->text()
+                << sep << m_ui->labelSelectedPluginBreakpoints->text()
+                << sep << m_ui->radioButtonNoPluginBreakpoints->text()
                    ;
         m_searchKeywords.remove(QLatin1Char('&'));
     }
@@ -239,17 +241,22 @@ QWidget *GdbOptionsPage::createPage(QWidget *parent)
 
 void GdbOptionsPage::apply()
 {
+    if (!m_ui) // page never shown
+        return;
     m_group.apply(Core::ICore::instance()->settings());
-
-    if (m_ui.gdbChooserWidget->isDirty()) {
+    if (m_ui->gdbChooserWidget->isDirty()) {
         gdbBinariesChanged = true;
-        gdbBinaryToolChainMap = m_ui.gdbChooserWidget->gdbBinaries();
-        m_ui.gdbChooserWidget->clearDirty();
+        gdbBinaryToolChainMap = m_ui->gdbChooserWidget->gdbBinaries();
+        m_ui->gdbChooserWidget->clearDirty();
     }
 }
 
 void GdbOptionsPage::finish()
 {
+    if (!m_ui) // page never shown
+        return;
+    delete m_ui;
+    m_ui = 0;
     m_group.finish();
 }
 
diff --git a/src/plugins/debugger/gdb/gdboptionspage.h b/src/plugins/debugger/gdb/gdboptionspage.h
index 445dac36e58c8da6c7da2fa3a01695d3c1bda379..6a4a9567c2fdab789ca3372579f70f1c5d5499d0 100644
--- a/src/plugins/debugger/gdb/gdboptionspage.h
+++ b/src/plugins/debugger/gdb/gdboptionspage.h
@@ -64,7 +64,7 @@ public:
     static void writeGdbBinarySettings();
 
 private:
-    Ui::GdbOptionsPage m_ui;
+    Ui::GdbOptionsPage *m_ui;
     Utils::SavedActionSet m_group;
     QString m_searchKeywords;
 };
diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp
index 1c10c422ab061c2a6c4a5867db3a5e4a47d88d60..a2155ebb2ab818a69792c4441b458b386fa94057 100644
--- a/src/plugins/designer/formeditorplugin.cpp
+++ b/src/plugins/designer/formeditorplugin.cpp
@@ -37,6 +37,7 @@
 #  include "cppsettingspage.h"
 #endif
 
+#include "settingspage.h"
 #include "designerconstants.h"
 
 #include <coreplugin/icore.h>
@@ -84,6 +85,7 @@ bool FormEditorPlugin::initialize(const QStringList &arguments, QString *error)
     initializeTemplates();
 
     addAutoReleasedObject(new FormEditorFactory);
+    addAutoReleasedObject(new SettingsPageProvider);
 
     // Ensure that loading designer translations is done before FormEditorW is instantiated
     const QString locale = Core::ICore::instance()->userInterfaceLanguage();
@@ -97,18 +99,9 @@ bool FormEditorPlugin::initialize(const QStringList &arguments, QString *error)
             qApp->installTranslator(qtr);
     }
     error->clear();
-    // Delayed loading: Make sure settings pages are there if options
-    // dialog is requested.
-    connect(Core::ICore::instance(), SIGNAL(optionsDialogRequested()),
-            this, SLOT(ensurePluginInitialized()));
     return true;
 }
 
-void FormEditorPlugin::ensurePluginInitialized()
-{
-    FormEditorW::instance()->ensureInitStage(FormEditorW::RegisterPlugins);
-}
-
 void FormEditorPlugin::extensionsInitialized()
 {
     // 4) test and make sure everything works (undo, saving, editors, opening/closing multiple files, dirtiness etc)
diff --git a/src/plugins/designer/formeditorplugin.h b/src/plugins/designer/formeditorplugin.h
index 47ce3d3949780bf0aff1cfdd2aace82aa36c8731..7ee2afa0802fdfd9e5bf853261bea3093ce9810c 100644
--- a/src/plugins/designer/formeditorplugin.h
+++ b/src/plugins/designer/formeditorplugin.h
@@ -57,9 +57,6 @@ public:
     bool initialize(const QStringList &arguments, QString *error_message = 0);
     void extensionsInitialized();
 
-public slots:
-    void ensurePluginInitialized();
-
 private:
 
     void initializeTemplates();
diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp
index 86b6a989a60856c28b03b7f97d540492c3424949..012fa46b4951e51826b5c3c6773c414e9381e4cb 100644
--- a/src/plugins/designer/formeditorw.cpp
+++ b/src/plugins/designer/formeditorw.cpp
@@ -186,7 +186,6 @@ FormEditorW::FormEditorW() :
 
     foreach (QDesignerOptionsPageInterface *designerPage, m_formeditor->optionsPages()) {
         SettingsPage *settingsPage = new SettingsPage(designerPage);
-        ExtensionSystem::PluginManager::instance()->addObject(settingsPage);
         m_settingsPages.append(settingsPage);
     }
 
@@ -213,10 +212,8 @@ FormEditorW::~FormEditorW()
     }
 
     delete m_formeditor;
-    foreach (SettingsPage *settingsPage, m_settingsPages) {
-        ExtensionSystem::PluginManager::instance()->removeObject(settingsPage);
-        delete settingsPage;
-    }
+    qDeleteAll(m_settingsPages);
+    m_settingsPages.clear();
     delete m_integration;
 
     m_self = 0;
@@ -389,6 +386,11 @@ void FormEditorW::initDesignerSubWindows()
     m_designerSubWindows[ActionEditorSubWindow] = ae;
 }
 
+QList<Core::IOptionsPage *> FormEditorW::optionsPages() const
+{
+    return m_settingsPages;
+}
+
 void FormEditorW::ensureInitStage(InitializationStage s)
 {
     if (Designer::Constants::Internal::debug)
diff --git a/src/plugins/designer/formeditorw.h b/src/plugins/designer/formeditorw.h
index e54ee40f90e152ce57b0d1813151b1952eaf48d8..fc4d2573be5e28272dabb3c6b51e66188ae3f35b 100644
--- a/src/plugins/designer/formeditorw.h
+++ b/src/plugins/designer/formeditorw.h
@@ -32,7 +32,8 @@
 
 #include "designerconstants.h"
 
-#include "coreplugin/icontext.h"
+#include <coreplugin/icontext.h>
+#include <coreplugin/dialogs/ioptionspage.h>
 
 #include <QtCore/QMap>
 #include <QtCore/QObject>
@@ -85,12 +86,10 @@ class DesignerContext;
   * The plugin uses this stage at first by calling ensureInitStage().
   * Requesting an editor via instance() will fully initialize the class.
   * This is based on the assumption that the Designer settings work with
-  * no plugins loaded. If that does not work, full initialization can be
-  * triggered by connection to the ICore::optionsDialogRequested() signal.
+  * no plugins loaded.
   *
   * The form editor shows a read-only XML editor in edit mode and Qt Designer
-  * in Design mode. It connects to void EditorManager::currentEditorChanged()
-  * and switches modes if a designer XML editor is activated. */
+  * in Design mode. */
 class FormEditorW : public QObject
 {
     Q_OBJECT
@@ -117,6 +116,7 @@ public:
     inline QWidget * const*designerSubWindows() const { return m_designerSubWindows; }
 
     EditorData activeEditor() const;
+    QList<Core::IOptionsPage *> optionsPages() const;
 
 private slots:
     void activateEditMode(int id);
@@ -178,7 +178,7 @@ private:
     QAction *m_lockAction;
     QAction *m_resetLayoutAction;
 
-    QList<SettingsPage *> m_settingsPages;
+    QList<Core::IOptionsPage *> m_settingsPages;
     QActionGroup *m_actionGroupEditMode;
     QAction *m_actionPrint;
     QAction *m_actionPreview;
diff --git a/src/plugins/designer/settingspage.cpp b/src/plugins/designer/settingspage.cpp
index f316a6e78cb0b82d4359646f15b4d1823d5c5a0e..729ab94539d4080c3a98c0f88798edbf2c14d5da 100644
--- a/src/plugins/designer/settingspage.cpp
+++ b/src/plugins/designer/settingspage.cpp
@@ -29,6 +29,7 @@
 
 #include "settingspage.h"
 #include "designerconstants.h"
+#include "formeditorw.h"
 
 #include <extensionsystem/pluginmanager.h>
 #include "qt_private/abstractoptionspage_p.h"
@@ -37,7 +38,7 @@
 using namespace Designer::Internal;
 
 SettingsPage::SettingsPage(QDesignerOptionsPageInterface *designerPage) :
-    m_designerPage(designerPage)
+    m_designerPage(designerPage), m_initialized(false)
 {
 }
 
@@ -72,15 +73,52 @@ QIcon SettingsPage::categoryIcon() const
 
 QWidget *SettingsPage::createPage(QWidget *parent)
 {
+    m_initialized = true;
     return m_designerPage->createPage(parent);
 }
 
 void SettingsPage::apply()
 {
-    m_designerPage->apply();
+    if (m_initialized)
+        m_designerPage->apply();
 }
 
 void SettingsPage::finish()
 {
-    m_designerPage->finish();
+    if (m_initialized)
+        m_designerPage->finish();
+}
+
+SettingsPageProvider::SettingsPageProvider(QObject *parent)
+    : IOptionsPageProvider(parent), m_initialized(false)
+{
+}
+
+SettingsPageProvider::~SettingsPageProvider()
+{
+}
+
+QString SettingsPageProvider::category() const
+{
+    return QLatin1String(Designer::Constants::SETTINGS_CATEGORY);
+}
+
+QString SettingsPageProvider::displayCategory() const
+{
+    return QCoreApplication::translate("Designer", Designer::Constants::SETTINGS_TR_CATEGORY);
+}
+
+QIcon SettingsPageProvider::categoryIcon() const
+{
+    return QIcon(QLatin1String(Designer::Constants::SETTINGS_CATEGORY_ICON));
+}
+
+QList<Core::IOptionsPage *> SettingsPageProvider::pages() const
+{
+    if (!m_initialized) {
+        // get options pages from designer
+        m_initialized = true;
+        FormEditorW::ensureInitStage(FormEditorW::RegisterPlugins);
+    }
+    return FormEditorW::instance()->optionsPages();
 }
diff --git a/src/plugins/designer/settingspage.h b/src/plugins/designer/settingspage.h
index 0732e386fac46d3ade416b1063eb8ca283084417..3853f2ff5dffb7aaa87e8ba41457afce7611eb44 100644
--- a/src/plugins/designer/settingspage.h
+++ b/src/plugins/designer/settingspage.h
@@ -61,6 +61,25 @@ public:
 
 private:
     QDesignerOptionsPageInterface *m_designerPage;
+    bool m_initialized;
+};
+
+class SettingsPageProvider : public Core::IOptionsPageProvider
+{
+    Q_OBJECT
+
+public:
+    SettingsPageProvider(QObject *parent = 0);
+    ~SettingsPageProvider();
+
+    QString category() const;
+    QString displayCategory() const;
+    QIcon categoryIcon() const;
+
+    QList<Core::IOptionsPage *> pages() const;
+
+private:
+    mutable bool m_initialized;
 };
 
 } // namespace Internal
diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp
index dc4daff803d407c551a214d823b02f2d4a1e4c11..b70c4e003e75db91430c9a5d900d3f8b267b0cc5 100644
--- a/src/plugins/help/generalsettingspage.cpp
+++ b/src/plugins/help/generalsettingspage.cpp
@@ -54,6 +54,7 @@
 using namespace Help::Internal;
 
 GeneralSettingsPage::GeneralSettingsPage()
+    : m_ui(0)
 {
     m_font = qApp->font();
 #if !defined(QT_NO_WEBKIT)
@@ -90,10 +91,10 @@ QIcon GeneralSettingsPage::categoryIcon() const
 QWidget *GeneralSettingsPage::createPage(QWidget *parent)
 {
     QWidget *widget = new QWidget(parent);
-
-    m_ui.setupUi(widget);
-    m_ui.sizeComboBox->setEditable(false);
-    m_ui.styleComboBox->setEditable(false);
+    m_ui = new Ui::GeneralSettingsPage;
+    m_ui->setupUi(widget);
+    m_ui->sizeComboBox->setEditable(false);
+    m_ui->styleComboBox->setEditable(false);
 
     Core::HelpManager *manager = Core::HelpManager::instance();
     m_font = qVariantValue<QFont>(manager->customValue(QLatin1String("font"),
@@ -109,58 +110,60 @@ QWidget *GeneralSettingsPage::createPage(QWidget *parent)
         m_homePage = manager->customValue(QLatin1String("DefaultHomePage"),
             Help::Constants::AboutBlank).toString();
     }
-    m_ui.homePageLineEdit->setText(m_homePage);
+    m_ui->homePageLineEdit->setText(m_homePage);
 
     const int startOption = manager->customValue(QLatin1String("StartOption"),
         Help::Constants::ShowLastPages).toInt();
-    m_ui.helpStartComboBox->setCurrentIndex(startOption);
+    m_ui->helpStartComboBox->setCurrentIndex(startOption);
 
     m_contextOption = manager->customValue(QLatin1String("ContextHelpOption"),
         Help::Constants::SideBySideIfPossible).toInt();
-    m_ui.contextHelpComboBox->setCurrentIndex(m_contextOption);
+    m_ui->contextHelpComboBox->setCurrentIndex(m_contextOption);
 
-    connect(m_ui.currentPageButton, SIGNAL(clicked()), this, SLOT(setCurrentPage()));
-    connect(m_ui.blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage()));
-    connect(m_ui.defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage()));
+    connect(m_ui->currentPageButton, SIGNAL(clicked()), this, SLOT(setCurrentPage()));
+    connect(m_ui->blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage()));
+    connect(m_ui->defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage()));
 
     HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer();
     if (!viewer)
-        m_ui.currentPageButton->setEnabled(false);
+        m_ui->currentPageButton->setEnabled(false);
 
-    m_ui.errorLabel->setVisible(false);
-    connect(m_ui.importButton, SIGNAL(clicked()), this, SLOT(importBookmarks()));
-    connect(m_ui.exportButton, SIGNAL(clicked()), this, SLOT(exportBookmarks()));
+    m_ui->errorLabel->setVisible(false);
+    connect(m_ui->importButton, SIGNAL(clicked()), this, SLOT(importBookmarks()));
+    connect(m_ui->exportButton, SIGNAL(clicked()), this, SLOT(exportBookmarks()));
 
     if (m_searchKeywords.isEmpty()) {
-        QTextStream(&m_searchKeywords) << ' ' << m_ui.contextHelpLabel->text()
-           << ' ' << m_ui.startPageLabel->text() << ' ' << m_ui.homePageLabel->text()
-           << ' ' << m_ui.bookmarkGroupBox->title();
+        QTextStream(&m_searchKeywords) << ' ' << m_ui->contextHelpLabel->text()
+           << ' ' << m_ui->startPageLabel->text() << ' ' << m_ui->homePageLabel->text()
+           << ' ' << m_ui->bookmarkGroupBox->title();
         m_searchKeywords.remove(QLatin1Char('&'));
     }
 
     m_returnOnClose = manager->customValue(QLatin1String("ReturnOnClose"),
         false).toBool();
-    m_ui.m_returnOnClose->setChecked(m_returnOnClose);
+    m_ui->m_returnOnClose->setChecked(m_returnOnClose);
 
     return widget;
 }
 
 void GeneralSettingsPage::apply()
 {
+    if (!m_ui) // page was never shown
+        return;
     QFont newFont;
-    const QString &family = m_ui.familyComboBox->currentFont().family();
+    const QString &family = m_ui->familyComboBox->currentFont().family();
     newFont.setFamily(family);
 
     int fontSize = 14;
-    int currentIndex = m_ui.sizeComboBox->currentIndex();
+    int currentIndex = m_ui->sizeComboBox->currentIndex();
     if (currentIndex != -1)
-        fontSize = m_ui.sizeComboBox->itemData(currentIndex).toInt();
+        fontSize = m_ui->sizeComboBox->itemData(currentIndex).toInt();
     newFont.setPointSize(fontSize);
 
     QString fontStyle = QLatin1String("Normal");
-    currentIndex = m_ui.styleComboBox->currentIndex();
+    currentIndex = m_ui->styleComboBox->currentIndex();
     if (currentIndex != -1)
-        fontStyle = m_ui.styleComboBox->itemText(currentIndex);
+        fontStyle = m_ui->styleComboBox->itemText(currentIndex);
     newFont.setBold(m_fontDatabase.bold(family, fontStyle));
     if (fontStyle.contains(QLatin1String("Italic")))
         newFont.setStyle(QFont::StyleItalic);
@@ -180,15 +183,15 @@ void GeneralSettingsPage::apply()
         emit fontChanged();
     }
 
-    QString homePage = m_ui.homePageLineEdit->text();
+    QString homePage = m_ui->homePageLineEdit->text();
     if (homePage.isEmpty())
         homePage = Help::Constants::AboutBlank;
     manager->setCustomValue(QLatin1String("HomePage"), homePage);
 
-    const int startOption = m_ui.helpStartComboBox->currentIndex();
+    const int startOption = m_ui->helpStartComboBox->currentIndex();
     manager->setCustomValue(QLatin1String("StartOption"), startOption);
 
-    const int helpOption = m_ui.contextHelpComboBox->currentIndex();
+    const int helpOption = m_ui->contextHelpComboBox->currentIndex();
     if (m_contextOption != helpOption) {
         m_contextOption = helpOption;
         manager->setCustomValue(QLatin1String("ContextHelpOption"), helpOption);
@@ -201,7 +204,7 @@ void GeneralSettingsPage::apply()
         emit contextHelpOptionChanged();
     }
 
-    const bool close = m_ui.m_returnOnClose->isChecked();
+    const bool close = m_ui->m_returnOnClose->isChecked();
     if (m_returnOnClose != close) {
         m_returnOnClose = close;
         manager->setCustomValue(QLatin1String("ReturnOnClose"), close);
@@ -213,24 +216,24 @@ void GeneralSettingsPage::setCurrentPage()
 {
     HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer();
     if (viewer)
-        m_ui.homePageLineEdit->setText(viewer->source().toString());
+        m_ui->homePageLineEdit->setText(viewer->source().toString());
 }
 
 void GeneralSettingsPage::setBlankPage()
 {
-    m_ui.homePageLineEdit->setText(Help::Constants::AboutBlank);
+    m_ui->homePageLineEdit->setText(Help::Constants::AboutBlank);
 }
 
 void GeneralSettingsPage::setDefaultPage()
 {
     const QString &defaultHomePage = Core::HelpManager::instance()
         ->customValue(QLatin1String("DefaultHomePage"), QString()).toString();
-    m_ui.homePageLineEdit->setText(defaultHomePage);
+    m_ui->homePageLineEdit->setText(defaultHomePage);
 }
 
 void GeneralSettingsPage::importBookmarks()
 {
-    m_ui.errorLabel->setVisible(false);
+    m_ui->errorLabel->setVisible(false);
 
     QString fileName = QFileDialog::getOpenFileName(0, tr("Import Bookmarks"),
         QDir::currentPath(), tr("Files (*.xbel)"));
@@ -246,13 +249,13 @@ void GeneralSettingsPage::importBookmarks()
             return;
     }
 
-    m_ui.errorLabel->setVisible(true);
-    m_ui.errorLabel->setText(tr("There was an error while importing bookmarks!"));
+    m_ui->errorLabel->setVisible(true);
+    m_ui->errorLabel->setText(tr("There was an error while importing bookmarks!"));
 }
 
 void GeneralSettingsPage::exportBookmarks()
 {
-    m_ui.errorLabel->setVisible(false);
+    m_ui->errorLabel->setVisible(false);
 
     QString fileName = QFileDialog::getSaveFileName(0, tr("Save File"),
         "untitled.xbel", tr("Files (*.xbel)"));
@@ -277,18 +280,18 @@ void GeneralSettingsPage::updateFontSize()
     if (pointSizes.empty())
         pointSizes = QFontDatabase::standardSizes();
 
-    m_ui.sizeComboBox->clear();
-    m_ui.sizeComboBox->setCurrentIndex(-1);
-    m_ui.sizeComboBox->setEnabled(!pointSizes.empty());
+    m_ui->sizeComboBox->clear();
+    m_ui->sizeComboBox->setCurrentIndex(-1);
+    m_ui->sizeComboBox->setEnabled(!pointSizes.empty());
 
     //  try to maintain selection or select closest.
     if (!pointSizes.empty()) {
         QString n;
         foreach (int pointSize, pointSizes)
-            m_ui.sizeComboBox->addItem(n.setNum(pointSize), QVariant(pointSize));
+            m_ui->sizeComboBox->addItem(n.setNum(pointSize), QVariant(pointSize));
         const int closestIndex = closestPointSizeIndex(m_font.pointSize());
         if (closestIndex != -1)
-            m_ui.sizeComboBox->setCurrentIndex(closestIndex);
+            m_ui->sizeComboBox->setCurrentIndex(closestIndex);
     }
 }
 
@@ -297,32 +300,32 @@ void GeneralSettingsPage::updateFontStyle()
     const QString &fontStyle = m_fontDatabase.styleString(m_font);
     const QStringList &styles = m_fontDatabase.styles(m_font.family());
 
-    m_ui.styleComboBox->clear();
-    m_ui.styleComboBox->setCurrentIndex(-1);
-    m_ui.styleComboBox->setEnabled(!styles.empty());
+    m_ui->styleComboBox->clear();
+    m_ui->styleComboBox->setCurrentIndex(-1);
+    m_ui->styleComboBox->setEnabled(!styles.empty());
 
     if (!styles.empty()) {
         int normalIndex = -1;
         const QString normalStyle = QLatin1String("Normal");
         foreach (const QString &style, styles) {
             // try to maintain selection or select 'normal' preferably
-            const int newIndex = m_ui.styleComboBox->count();
-            m_ui.styleComboBox->addItem(style);
+            const int newIndex = m_ui->styleComboBox->count();
+            m_ui->styleComboBox->addItem(style);
             if (fontStyle == style) {
-                m_ui.styleComboBox->setCurrentIndex(newIndex);
+                m_ui->styleComboBox->setCurrentIndex(newIndex);
             } else {
                 if (fontStyle ==  normalStyle)
                     normalIndex = newIndex;
             }
         }
-        if (m_ui.styleComboBox->currentIndex() == -1 && normalIndex != -1)
-            m_ui.styleComboBox->setCurrentIndex(normalIndex);
+        if (m_ui->styleComboBox->currentIndex() == -1 && normalIndex != -1)
+            m_ui->styleComboBox->setCurrentIndex(normalIndex);
     }
 }
 
 void GeneralSettingsPage::updateFontFamily()
 {
-    m_ui.familyComboBox->setCurrentFont(m_font);
+    m_ui->familyComboBox->setCurrentFont(m_font);
 }
 
 int GeneralSettingsPage::closestPointSizeIndex(int desiredPointSize) const
@@ -331,9 +334,9 @@ int GeneralSettingsPage::closestPointSizeIndex(int desiredPointSize) const
     int closestIndex = -1;
     int closestAbsError = 0xFFFF;
 
-    const int pointSizeCount = m_ui.sizeComboBox->count();
+    const int pointSizeCount = m_ui->sizeComboBox->count();
     for (int i = 0; i < pointSizeCount; i++) {
-        const int itemPointSize = m_ui.sizeComboBox->itemData(i).toInt();
+        const int itemPointSize = m_ui->sizeComboBox->itemData(i).toInt();
         const int absError = qAbs(desiredPointSize - itemPointSize);
         if (absError < closestAbsError) {
             closestIndex  = i;
@@ -353,3 +356,11 @@ bool GeneralSettingsPage::matches(const QString &s) const
 {
     return m_searchKeywords.contains(s, Qt::CaseInsensitive);
 }
+
+void GeneralSettingsPage::finish()
+{
+    if (!m_ui) // page was never shown
+        return;
+    delete m_ui;
+    m_ui = 0;
+}
diff --git a/src/plugins/help/generalsettingspage.h b/src/plugins/help/generalsettingspage.h
index 87a93b5b130f42cedb3c99dbbb044f0b88be7314..60d0b7ba0d4eae2df8b5fe29ffebf20e2263f8b8 100644
--- a/src/plugins/help/generalsettingspage.h
+++ b/src/plugins/help/generalsettingspage.h
@@ -53,7 +53,7 @@ public:
 
     QWidget *createPage(QWidget *parent);
     void apply();
-    void finish() {}
+    void finish();
     virtual bool matches(const QString &s) const;
 
 signals:
@@ -85,7 +85,7 @@ private:
     bool m_returnOnClose;
 
     QString m_searchKeywords;
-    Ui::GeneralSettingsPage m_ui;
+    Ui::GeneralSettingsPage *m_ui;
 };
 
     }   // Internal
diff --git a/src/plugins/qmldesigner/settingspage.cpp b/src/plugins/qmldesigner/settingspage.cpp
index 104ae4d94d17388f02c33716af491035aae1bc06..9363a02853339da585e2422ee73fc279415885dd 100644
--- a/src/plugins/qmldesigner/settingspage.cpp
+++ b/src/plugins/qmldesigner/settingspage.cpp
@@ -109,6 +109,8 @@ QWidget *SettingsPage::createPage(QWidget *parent)
 
 void SettingsPage::apply()
 {
+    if (!m_widget) // page was never shown
+        return;
     BauhausPlugin::pluginInstance()->setSettings(m_widget->settings());
 }
 
diff --git a/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp b/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp
index 776fdfbd7d62bd4f6c606d32e7f949c4c2f14df7..686d57a1e7d18b6f1da253e43e699aae429db861 100644
--- a/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp
+++ b/src/plugins/qmljseditor/quicktoolbarsettingspage.cpp
@@ -161,6 +161,8 @@ QWidget *QuickToolBarSettingsPage::createPage(QWidget *parent)
 
 void QuickToolBarSettingsPage::apply()
 {
+    if (!m_widget) // page was never shown
+        return;
     m_widget->settings().set();
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp
index 81d48aa0ec95a1c5888d0139d8bbde9f80befd52..47aa0e558d86fbc05f53db1f024e4f89fc5d97ed 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp
@@ -411,7 +411,8 @@ QWidget *S60DevicesPreferencePane::createPage(QWidget *parent)
 
 void S60DevicesPreferencePane::apply()
 {
-    QTC_ASSERT(m_widget, return)
+    if (!m_widget) // page was never shown
+        return;
 
     m_devices->setDevices(m_widget->devices());
 }
diff --git a/src/plugins/qt4projectmanager/qtoptionspage.cpp b/src/plugins/qt4projectmanager/qtoptionspage.cpp
index e62e3e447192b03b7dee57aaffceb2b4db8bf686..dff55fddd006bfc1bd2d94f3cdff98a32d72a70a 100644
--- a/src/plugins/qt4projectmanager/qtoptionspage.cpp
+++ b/src/plugins/qt4projectmanager/qtoptionspage.cpp
@@ -133,6 +133,8 @@ QWidget *QtOptionsPage::createPage(QWidget *parent)
 
 void QtOptionsPage::apply()
 {
+    if (!m_widget) // page was never shown
+        return;
     m_widget->finish();
 
     QtVersionManager *vm = QtVersionManager::instance();
diff --git a/src/plugins/texteditor/behaviorsettingspage.cpp b/src/plugins/texteditor/behaviorsettingspage.cpp
index 3c44039d8e78b0fd21a80e81490d4cfc370503ac..874d5a6cc74db3939e6e9af29c60b3b1c8043fb9 100644
--- a/src/plugins/texteditor/behaviorsettingspage.cpp
+++ b/src/plugins/texteditor/behaviorsettingspage.cpp
@@ -49,7 +49,7 @@ struct BehaviorSettingsPage::BehaviorSettingsPagePrivate
     explicit BehaviorSettingsPagePrivate(const BehaviorSettingsPageParameters &p);
 
     const BehaviorSettingsPageParameters m_parameters;
-    Ui::BehaviorSettingsPage m_page;
+    Ui::BehaviorSettingsPage *m_page;
 
     TabSettings m_tabSettings;
     StorageSettings m_storageSettings;
@@ -60,7 +60,7 @@ struct BehaviorSettingsPage::BehaviorSettingsPagePrivate
 
 BehaviorSettingsPage::BehaviorSettingsPagePrivate::BehaviorSettingsPagePrivate
     (const BehaviorSettingsPageParameters &p)
-  : m_parameters(p)
+    : m_parameters(p), m_page(0)
 {
     if (const QSettings *s = Core::ICore::instance()->settings()) {
         m_tabSettings.fromSettings(m_parameters.settingsPrefix, s);
@@ -94,30 +94,31 @@ QString BehaviorSettingsPage::displayName() const
 QWidget *BehaviorSettingsPage::createPage(QWidget *parent)
 {
     QWidget *w = new QWidget(parent);
-    m_d->m_page.setupUi(w);
+    m_d->m_page = new Ui::BehaviorSettingsPage;
+    m_d->m_page->setupUi(w);
     settingsToUI();
     if (m_d->m_searchKeywords.isEmpty()) {
         QLatin1Char sep(' ');
         QTextStream(&m_d->m_searchKeywords)
-          << m_d->m_page.insertSpaces->text()
-          << sep << m_d->m_page.autoInsertSpaces->text()
-          << sep << m_d->m_page.autoIndent->text()
-          << sep << m_d->m_page.smartBackspace->text()
-          << sep << m_d->m_page.indentBlocksLabel->text()
-          << sep << m_d->m_page.continuationAlignLabel->text()
-          << sep << m_d->m_page.tabKeyIndentLabel->text()
-          << sep << m_d->m_page.cleanWhitespace->text()
-          << sep << m_d->m_page.inEntireDocument->text()
-          << sep << m_d->m_page.cleanIndentation->text()
-          << sep << m_d->m_page.addFinalNewLine->text()
-          << sep << m_d->m_page.encodingLabel->text()
-          << sep << m_d->m_page.utf8BomLabel->text()
-          << sep << m_d->m_page.mouseNavigation->text()
-          << sep << m_d->m_page.scrollWheelZooming->text()
-          << sep << m_d->m_page.groupBoxTabAndIndentSettings->title()
-          << sep << m_d->m_page.groupBoxStorageSettings->title()
-          << sep << m_d->m_page.groupBoxEncodings->title()
-          << sep << m_d->m_page.groupBoxMouse->title();
+          << m_d->m_page->insertSpaces->text()
+          << sep << m_d->m_page->autoInsertSpaces->text()
+          << sep << m_d->m_page->autoIndent->text()
+          << sep << m_d->m_page->smartBackspace->text()
+          << sep << m_d->m_page->indentBlocksLabel->text()
+          << sep << m_d->m_page->continuationAlignLabel->text()
+          << sep << m_d->m_page->tabKeyIndentLabel->text()
+          << sep << m_d->m_page->cleanWhitespace->text()
+          << sep << m_d->m_page->inEntireDocument->text()
+          << sep << m_d->m_page->cleanIndentation->text()
+          << sep << m_d->m_page->addFinalNewLine->text()
+          << sep << m_d->m_page->encodingLabel->text()
+          << sep << m_d->m_page->utf8BomLabel->text()
+          << sep << m_d->m_page->mouseNavigation->text()
+          << sep << m_d->m_page->scrollWheelZooming->text()
+          << sep << m_d->m_page->groupBoxTabAndIndentSettings->title()
+          << sep << m_d->m_page->groupBoxStorageSettings->title()
+          << sep << m_d->m_page->groupBoxEncodings->title()
+          << sep << m_d->m_page->groupBoxMouse->title();
         m_d->m_searchKeywords.remove(QLatin1Char('&'));
     }
 
@@ -143,18 +144,20 @@ QWidget *BehaviorSettingsPage::createPage(QWidget *parent)
             name += QLatin1String(" / ");
             name += QString::fromLatin1(alias);
         }
-        m_d->m_page.encodingBox->addItem(name);
+        m_d->m_page->encodingBox->addItem(name);
         if (defaultTextCodec == codec)
-            m_d->m_page.encodingBox->setCurrentIndex(i);
+            m_d->m_page->encodingBox->setCurrentIndex(i);
     }
 
-    m_d->m_page.utf8BomBox->setCurrentIndex(Core::EditorManager::instance()->utf8BomSetting());
+    m_d->m_page->utf8BomBox->setCurrentIndex(Core::EditorManager::instance()->utf8BomSetting());
 
     return w;
 }
 
 void BehaviorSettingsPage::apply()
 {
+    if (!m_d->m_page) // page was never shown
+        return;
     TabSettings newTabSettings;
     StorageSettings newStorageSettings;
     BehaviorSettings newBehaviorSettings;
@@ -190,61 +193,69 @@ void BehaviorSettingsPage::apply()
 
     QSettings* settings = Core::ICore::instance()->settings();
     settings->setValue(QLatin1String(Core::Constants::SETTINGS_DEFAULTTEXTENCODING),
-                       m_codecs.at(m_d->m_page.encodingBox->currentIndex())->name());
+                       m_codecs.at(m_d->m_page->encodingBox->currentIndex())->name());
 
     Core::EditorManager::instance()->setUtf8BomSetting(
-                Core::IFile::Utf8BomSetting(m_d->m_page.utf8BomBox->currentIndex()));
+                Core::IFile::Utf8BomSetting(m_d->m_page->utf8BomBox->currentIndex()));
+}
+
+void BehaviorSettingsPage::finish()
+{
+    if (!m_d->m_page) // page was never shown
+        return;
+    delete m_d->m_page;
+    m_d->m_page = 0;
 }
 
 void BehaviorSettingsPage::settingsFromUI(TabSettings &tabSettings,
                                           StorageSettings &storageSettings,
                                           BehaviorSettings &behaviorSettings) const
 {
-    tabSettings.m_spacesForTabs = m_d->m_page.insertSpaces->isChecked();
-    tabSettings.m_autoSpacesForTabs = m_d->m_page.autoInsertSpaces->isChecked();
-    tabSettings.m_autoIndent = m_d->m_page.autoIndent->isChecked();
-    tabSettings.m_smartBackspace = m_d->m_page.smartBackspace->isChecked();
-    tabSettings.m_tabSize = m_d->m_page.tabSize->value();
-    tabSettings.m_indentSize = m_d->m_page.indentSize->value();
-    tabSettings.m_indentBraces = m_d->m_page.indentBlocksBehavior->currentIndex() >= 1;
-    tabSettings.m_doubleIndentBlocks = m_d->m_page.indentBlocksBehavior->currentIndex() >= 2;
-
-    tabSettings.m_tabKeyBehavior = (TabSettings::TabKeyBehavior)m_d->m_page.tabKeyBehavior->currentIndex();
-    tabSettings.m_continuationAlignBehavior = (TabSettings::ContinuationAlignBehavior)m_d->m_page.continuationAlignBehavior->currentIndex();
-
-    storageSettings.m_cleanWhitespace = m_d->m_page.cleanWhitespace->isChecked();
-    storageSettings.m_inEntireDocument = m_d->m_page.inEntireDocument->isChecked();
-    storageSettings.m_cleanIndentation = m_d->m_page.cleanIndentation->isChecked();
-    storageSettings.m_addFinalNewLine = m_d->m_page.addFinalNewLine->isChecked();
-
-    behaviorSettings.m_mouseNavigation = m_d->m_page.mouseNavigation->isChecked();
-    behaviorSettings.m_scrollWheelZooming = m_d->m_page.scrollWheelZooming->isChecked();
+    tabSettings.m_spacesForTabs = m_d->m_page->insertSpaces->isChecked();
+    tabSettings.m_autoSpacesForTabs = m_d->m_page->autoInsertSpaces->isChecked();
+    tabSettings.m_autoIndent = m_d->m_page->autoIndent->isChecked();
+    tabSettings.m_smartBackspace = m_d->m_page->smartBackspace->isChecked();
+    tabSettings.m_tabSize = m_d->m_page->tabSize->value();
+    tabSettings.m_indentSize = m_d->m_page->indentSize->value();
+    tabSettings.m_indentBraces = m_d->m_page->indentBlocksBehavior->currentIndex() >= 1;
+    tabSettings.m_doubleIndentBlocks = m_d->m_page->indentBlocksBehavior->currentIndex() >= 2;
+
+    tabSettings.m_tabKeyBehavior = (TabSettings::TabKeyBehavior)m_d->m_page->tabKeyBehavior->currentIndex();
+    tabSettings.m_continuationAlignBehavior = (TabSettings::ContinuationAlignBehavior)m_d->m_page->continuationAlignBehavior->currentIndex();
+
+    storageSettings.m_cleanWhitespace = m_d->m_page->cleanWhitespace->isChecked();
+    storageSettings.m_inEntireDocument = m_d->m_page->inEntireDocument->isChecked();
+    storageSettings.m_cleanIndentation = m_d->m_page->cleanIndentation->isChecked();
+    storageSettings.m_addFinalNewLine = m_d->m_page->addFinalNewLine->isChecked();
+
+    behaviorSettings.m_mouseNavigation = m_d->m_page->mouseNavigation->isChecked();
+    behaviorSettings.m_scrollWheelZooming = m_d->m_page->scrollWheelZooming->isChecked();
 }
 
 void BehaviorSettingsPage::settingsToUI()
 {
     const TabSettings &tabSettings = m_d->m_tabSettings;
-    m_d->m_page.insertSpaces->setChecked(tabSettings.m_spacesForTabs);
-    m_d->m_page.autoInsertSpaces->setChecked(tabSettings.m_autoSpacesForTabs);
-    m_d->m_page.autoIndent->setChecked(tabSettings.m_autoIndent);
-    m_d->m_page.smartBackspace->setChecked(tabSettings.m_smartBackspace);
-    m_d->m_page.tabSize->setValue(tabSettings.m_tabSize);
-    m_d->m_page.indentSize->setValue(tabSettings.m_indentSize);
-    m_d->m_page.indentBlocksBehavior->setCurrentIndex(tabSettings.m_indentBraces ?
+    m_d->m_page->insertSpaces->setChecked(tabSettings.m_spacesForTabs);
+    m_d->m_page->autoInsertSpaces->setChecked(tabSettings.m_autoSpacesForTabs);
+    m_d->m_page->autoIndent->setChecked(tabSettings.m_autoIndent);
+    m_d->m_page->smartBackspace->setChecked(tabSettings.m_smartBackspace);
+    m_d->m_page->tabSize->setValue(tabSettings.m_tabSize);
+    m_d->m_page->indentSize->setValue(tabSettings.m_indentSize);
+    m_d->m_page->indentBlocksBehavior->setCurrentIndex(tabSettings.m_indentBraces ?
                                                       (tabSettings.m_doubleIndentBlocks ? 2 : 1)
                                                         : 0);
-    m_d->m_page.tabKeyBehavior->setCurrentIndex(tabSettings.m_tabKeyBehavior);
-    m_d->m_page.continuationAlignBehavior->setCurrentIndex(tabSettings.m_continuationAlignBehavior);
+    m_d->m_page->tabKeyBehavior->setCurrentIndex(tabSettings.m_tabKeyBehavior);
+    m_d->m_page->continuationAlignBehavior->setCurrentIndex(tabSettings.m_continuationAlignBehavior);
 
     const StorageSettings &storageSettings = m_d->m_storageSettings;
-    m_d->m_page.cleanWhitespace->setChecked(storageSettings.m_cleanWhitespace);
-    m_d->m_page.inEntireDocument->setChecked(storageSettings.m_inEntireDocument);
-    m_d->m_page.cleanIndentation->setChecked(storageSettings.m_cleanIndentation);
-    m_d->m_page.addFinalNewLine->setChecked(storageSettings.m_addFinalNewLine);
+    m_d->m_page->cleanWhitespace->setChecked(storageSettings.m_cleanWhitespace);
+    m_d->m_page->inEntireDocument->setChecked(storageSettings.m_inEntireDocument);
+    m_d->m_page->cleanIndentation->setChecked(storageSettings.m_cleanIndentation);
+    m_d->m_page->addFinalNewLine->setChecked(storageSettings.m_addFinalNewLine);
 
     const BehaviorSettings &behaviorSettings = m_d->m_behaviorSettings;
-    m_d->m_page.mouseNavigation->setChecked(behaviorSettings.m_mouseNavigation);
-    m_d->m_page.scrollWheelZooming->setChecked(behaviorSettings.m_scrollWheelZooming);
+    m_d->m_page->mouseNavigation->setChecked(behaviorSettings.m_mouseNavigation);
+    m_d->m_page->scrollWheelZooming->setChecked(behaviorSettings.m_scrollWheelZooming);
 }
 
 const TabSettings &BehaviorSettingsPage::tabSettings() const
@@ -264,5 +275,5 @@ const BehaviorSettings &BehaviorSettingsPage::behaviorSettings() const
 
 bool BehaviorSettingsPage::matches(const QString &s) const
 {
-   return m_d->m_searchKeywords.contains(s, Qt::CaseInsensitive);
+    return m_d->m_searchKeywords.contains(s, Qt::CaseInsensitive);
 }
diff --git a/src/plugins/texteditor/behaviorsettingspage.h b/src/plugins/texteditor/behaviorsettingspage.h
index bf765766c1bc97e655144961196b30ca33eaf49f..756418ae200103b695d2820b0b0314ea1d422e3e 100644
--- a/src/plugins/texteditor/behaviorsettingspage.h
+++ b/src/plugins/texteditor/behaviorsettingspage.h
@@ -62,7 +62,7 @@ public:
 
     QWidget *createPage(QWidget *parent);
     void apply();
-    void finish() { }
+    void finish();
     bool matches(const QString &s) const;
 
     const TabSettings &tabSettings() const;
diff --git a/src/plugins/texteditor/displaysettingspage.cpp b/src/plugins/texteditor/displaysettingspage.cpp
index 6a30c609c5dade107a1676f8e0dd226b00f7d639..56f7515d91090fec9fe1989ebccf9d430d1b3039 100644
--- a/src/plugins/texteditor/displaysettingspage.cpp
+++ b/src/plugins/texteditor/displaysettingspage.cpp
@@ -43,14 +43,14 @@ struct DisplaySettingsPage::DisplaySettingsPagePrivate
     explicit DisplaySettingsPagePrivate(const DisplaySettingsPageParameters &p);
 
     const DisplaySettingsPageParameters m_parameters;
-    Ui::DisplaySettingsPage m_page;
+    Ui::DisplaySettingsPage *m_page;
     DisplaySettings m_displaySettings;
     QString m_searchKeywords;
 };
 
 DisplaySettingsPage::DisplaySettingsPagePrivate::DisplaySettingsPagePrivate
     (const DisplaySettingsPageParameters &p)
-    : m_parameters(p)
+    : m_parameters(p), m_page(0)
 {
     if (const QSettings *s = Core::ICore::instance()->settings()) {
         m_displaySettings.fromSettings(m_parameters.settingsPrefix, s);
@@ -82,18 +82,19 @@ QString DisplaySettingsPage::displayName() const
 QWidget *DisplaySettingsPage::createPage(QWidget *parent)
 {
     QWidget *w = new QWidget(parent);
-    m_d->m_page.setupUi(w);
+    m_d->m_page = new Ui::DisplaySettingsPage;
+    m_d->m_page->setupUi(w);
     settingsToUI();
     if (m_d->m_searchKeywords.isEmpty()) {
-        QTextStream(&m_d->m_searchKeywords) << m_d->m_page.displayLineNumbers->text()
-          << ' ' << m_d->m_page.highlightCurrentLine->text()
-          << ' ' << m_d->m_page.displayFoldingMarkers->text()
-          << ' ' << m_d->m_page.highlightBlocks->text()
-          << ' ' << m_d->m_page.visualizeWhitespace->text()
-          << ' ' << m_d->m_page.animateMatchingParentheses->text()
-          << ' ' << m_d->m_page.enableTextWrapping->text()
-          << ' ' << m_d->m_page.autoFoldFirstComment->text()
-          << ' ' << m_d->m_page.centerOnScroll->text();
+        QTextStream(&m_d->m_searchKeywords) << m_d->m_page->displayLineNumbers->text()
+          << ' ' << m_d->m_page->highlightCurrentLine->text()
+          << ' ' << m_d->m_page->displayFoldingMarkers->text()
+          << ' ' << m_d->m_page->highlightBlocks->text()
+          << ' ' << m_d->m_page->visualizeWhitespace->text()
+          << ' ' << m_d->m_page->animateMatchingParentheses->text()
+          << ' ' << m_d->m_page->enableTextWrapping->text()
+          << ' ' << m_d->m_page->autoFoldFirstComment->text()
+          << ' ' << m_d->m_page->centerOnScroll->text();
         m_d->m_searchKeywords.remove(QLatin1Char('&'));
     }
     return w;
@@ -101,43 +102,53 @@ QWidget *DisplaySettingsPage::createPage(QWidget *parent)
 
 void DisplaySettingsPage::apply()
 {
+    if (!m_d->m_page) // page was never shown
+        return;
     DisplaySettings newDisplaySettings;
 
     settingsFromUI(newDisplaySettings);
     setDisplaySettings(newDisplaySettings);
 }
 
+void DisplaySettingsPage::finish()
+{
+    if (!m_d->m_page) // page was never shown
+        return;
+    delete m_d->m_page;
+    m_d->m_page = 0;
+}
+
 void DisplaySettingsPage::settingsFromUI(DisplaySettings &displaySettings) const
 {
-    displaySettings.m_displayLineNumbers = m_d->m_page.displayLineNumbers->isChecked();
-    displaySettings.m_textWrapping = m_d->m_page.enableTextWrapping->isChecked();
-    displaySettings.m_showWrapColumn = m_d->m_page.showWrapColumn->isChecked();
-    displaySettings.m_wrapColumn = m_d->m_page.wrapColumn->value();
-    displaySettings.m_visualizeWhitespace = m_d->m_page.visualizeWhitespace->isChecked();
-    displaySettings.m_displayFoldingMarkers = m_d->m_page.displayFoldingMarkers->isChecked();
-    displaySettings.m_highlightCurrentLine = m_d->m_page.highlightCurrentLine->isChecked();
-    displaySettings.m_highlightBlocks = m_d->m_page.highlightBlocks->isChecked();
-    displaySettings.m_animateMatchingParentheses = m_d->m_page.animateMatchingParentheses->isChecked();
-    displaySettings.m_markTextChanges = m_d->m_page.markTextChanges->isChecked();
-    displaySettings.m_autoFoldFirstComment = m_d->m_page.autoFoldFirstComment->isChecked();
-    displaySettings.m_centerCursorOnScroll = m_d->m_page.centerOnScroll->isChecked();
+    displaySettings.m_displayLineNumbers = m_d->m_page->displayLineNumbers->isChecked();
+    displaySettings.m_textWrapping = m_d->m_page->enableTextWrapping->isChecked();
+    displaySettings.m_showWrapColumn = m_d->m_page->showWrapColumn->isChecked();
+    displaySettings.m_wrapColumn = m_d->m_page->wrapColumn->value();
+    displaySettings.m_visualizeWhitespace = m_d->m_page->visualizeWhitespace->isChecked();
+    displaySettings.m_displayFoldingMarkers = m_d->m_page->displayFoldingMarkers->isChecked();
+    displaySettings.m_highlightCurrentLine = m_d->m_page->highlightCurrentLine->isChecked();
+    displaySettings.m_highlightBlocks = m_d->m_page->highlightBlocks->isChecked();
+    displaySettings.m_animateMatchingParentheses = m_d->m_page->animateMatchingParentheses->isChecked();
+    displaySettings.m_markTextChanges = m_d->m_page->markTextChanges->isChecked();
+    displaySettings.m_autoFoldFirstComment = m_d->m_page->autoFoldFirstComment->isChecked();
+    displaySettings.m_centerCursorOnScroll = m_d->m_page->centerOnScroll->isChecked();
 }
 
 void DisplaySettingsPage::settingsToUI()
 {
     const DisplaySettings &displaySettings = m_d->m_displaySettings;
-    m_d->m_page.displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers);
-    m_d->m_page.enableTextWrapping->setChecked(displaySettings.m_textWrapping);
-    m_d->m_page.showWrapColumn->setChecked(displaySettings.m_showWrapColumn);
-    m_d->m_page.wrapColumn->setValue(displaySettings.m_wrapColumn);
-    m_d->m_page.visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace);
-    m_d->m_page.displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers);
-    m_d->m_page.highlightCurrentLine->setChecked(displaySettings.m_highlightCurrentLine);
-    m_d->m_page.highlightBlocks->setChecked(displaySettings.m_highlightBlocks);
-    m_d->m_page.animateMatchingParentheses->setChecked(displaySettings.m_animateMatchingParentheses);
-    m_d->m_page.markTextChanges->setChecked(displaySettings.m_markTextChanges);
-    m_d->m_page.autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment);
-    m_d->m_page.centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll);
+    m_d->m_page->displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers);
+    m_d->m_page->enableTextWrapping->setChecked(displaySettings.m_textWrapping);
+    m_d->m_page->showWrapColumn->setChecked(displaySettings.m_showWrapColumn);
+    m_d->m_page->wrapColumn->setValue(displaySettings.m_wrapColumn);
+    m_d->m_page->visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace);
+    m_d->m_page->displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers);
+    m_d->m_page->highlightCurrentLine->setChecked(displaySettings.m_highlightCurrentLine);
+    m_d->m_page->highlightBlocks->setChecked(displaySettings.m_highlightBlocks);
+    m_d->m_page->animateMatchingParentheses->setChecked(displaySettings.m_animateMatchingParentheses);
+    m_d->m_page->markTextChanges->setChecked(displaySettings.m_markTextChanges);
+    m_d->m_page->autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment);
+    m_d->m_page->centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll);
 }
 
 const DisplaySettings &DisplaySettingsPage::displaySettings() const
diff --git a/src/plugins/texteditor/displaysettingspage.h b/src/plugins/texteditor/displaysettingspage.h
index dc43ee5a683d1f0e30a46d27c65ea140e3bac5eb..012d4909f6e2ae49330a2de832565c3921e79add 100644
--- a/src/plugins/texteditor/displaysettingspage.h
+++ b/src/plugins/texteditor/displaysettingspage.h
@@ -60,7 +60,7 @@ public:
 
     QWidget *createPage(QWidget *parent);
     void apply();
-    void finish() { }
+    void finish();
     virtual bool matches(const QString &s) const;
 
     const DisplaySettings &displaySettings() const;
diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp
index 2f27b940ab455467c2abae89f1c32b1f9c14d802..5a8dabcfd476fbae107ba6b00d51bab78db8ff66 100644
--- a/src/plugins/texteditor/fontsettingspage.cpp
+++ b/src/plugins/texteditor/fontsettingspage.cpp
@@ -129,7 +129,7 @@ public:
     TextEditor::FormatDescriptions m_descriptions;
     FontSettings m_value;
     FontSettings m_lastValue;
-    Ui::FontSettingsPage ui;
+    Ui::FontSettingsPage *m_ui;
     SchemeListModel *m_schemeListModel;
     bool m_refreshingSchemeList;
     QString m_searchKeywords;
@@ -180,6 +180,7 @@ FontSettingsPagePrivate::FontSettingsPagePrivate(const TextEditor::FormatDescrip
     m_displayName(displayName),
     m_settingsGroup(Utils::settingsKey(category)),
     m_descriptions(fd),
+    m_ui(0),
     m_schemeListModel(new SchemeListModel),
     m_refreshingSchemeList(false)
 {
@@ -331,28 +332,29 @@ QString FontSettingsPage::displayName() const
 QWidget *FontSettingsPage::createPage(QWidget *parent)
 {
     QWidget *w = new QWidget(parent);
-    d_ptr->ui.setupUi(w);
-    d_ptr->ui.schemeComboBox->setModel(d_ptr->m_schemeListModel);
+    d_ptr->m_ui = new Ui::FontSettingsPage;
+    d_ptr->m_ui->setupUi(w);
+    d_ptr->m_ui->schemeComboBox->setModel(d_ptr->m_schemeListModel);
 
     QFontDatabase db;
     const QStringList families = db.families();
-    d_ptr->ui.familyComboBox->addItems(families);
+    d_ptr->m_ui->familyComboBox->addItems(families);
     const int idx = families.indexOf(d_ptr->m_value.family());
-    d_ptr->ui.familyComboBox->setCurrentIndex(idx);
+    d_ptr->m_ui->familyComboBox->setCurrentIndex(idx);
 
-    d_ptr->ui.antialias->setChecked(d_ptr->m_value.antialias());
-    d_ptr->ui.zoomSpinBox->setValue(d_ptr->m_value.fontZoom());
+    d_ptr->m_ui->antialias->setChecked(d_ptr->m_value.antialias());
+    d_ptr->m_ui->zoomSpinBox->setValue(d_ptr->m_value.fontZoom());
 
-    d_ptr->ui.schemeEdit->setFormatDescriptions(d_ptr->m_descriptions);
-    d_ptr->ui.schemeEdit->setBaseFont(d_ptr->m_value.font());
-    d_ptr->ui.schemeEdit->setColorScheme(d_ptr->m_value.colorScheme());
+    d_ptr->m_ui->schemeEdit->setFormatDescriptions(d_ptr->m_descriptions);
+    d_ptr->m_ui->schemeEdit->setBaseFont(d_ptr->m_value.font());
+    d_ptr->m_ui->schemeEdit->setColorScheme(d_ptr->m_value.colorScheme());
 
-    connect(d_ptr->ui.familyComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontFamilySelected(QString)));
-    connect(d_ptr->ui.sizeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontSizeSelected(QString)));
-    connect(d_ptr->ui.zoomSpinBox, SIGNAL(valueChanged(int)), this, SLOT(fontZoomChanged()));
-    connect(d_ptr->ui.schemeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(colorSchemeSelected(int)));
-    connect(d_ptr->ui.copyButton, SIGNAL(clicked()), this, SLOT(copyColorScheme()));
-    connect(d_ptr->ui.deleteButton, SIGNAL(clicked()), this, SLOT(confirmDeleteColorScheme()));
+    connect(d_ptr->m_ui->familyComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontFamilySelected(QString)));
+    connect(d_ptr->m_ui->sizeComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(fontSizeSelected(QString)));
+    connect(d_ptr->m_ui->zoomSpinBox, SIGNAL(valueChanged(int)), this, SLOT(fontZoomChanged()));
+    connect(d_ptr->m_ui->schemeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(colorSchemeSelected(int)));
+    connect(d_ptr->m_ui->copyButton, SIGNAL(clicked()), this, SLOT(copyColorScheme()));
+    connect(d_ptr->m_ui->deleteButton, SIGNAL(clicked()), this, SLOT(confirmDeleteColorScheme()));
 
 
     updatePointSizes();
@@ -361,12 +363,12 @@ QWidget *FontSettingsPage::createPage(QWidget *parent)
     if (d_ptr->m_searchKeywords.isEmpty()) {
         QLatin1Char sep(' ');
         d_ptr->m_searchKeywords =
-                d_ptr->ui.fontGroupBox->title() + sep
-                + d_ptr->ui.familyLabel->text() + sep
-                + d_ptr->ui.sizeLabel->text() + sep
-                + d_ptr->ui.zoomLabel->text() + sep
-                + d_ptr->ui.antialias->text() + sep
-                + d_ptr->ui.colorSchemeGroupBox->title();
+                d_ptr->m_ui->fontGroupBox->title() + sep
+                + d_ptr->m_ui->familyLabel->text() + sep
+                + d_ptr->m_ui->sizeLabel->text() + sep
+                + d_ptr->m_ui->zoomLabel->text() + sep
+                + d_ptr->m_ui->antialias->text() + sep
+                + d_ptr->m_ui->colorSchemeGroupBox->title();
         d_ptr->m_searchKeywords.remove(QLatin1Char('&'));
     }
     return w;
@@ -375,7 +377,7 @@ QWidget *FontSettingsPage::createPage(QWidget *parent)
 void FontSettingsPage::fontFamilySelected(const QString &family)
 {
     d_ptr->m_value.setFamily(family);
-    d_ptr->ui.schemeEdit->setBaseFont(d_ptr->m_value.font());
+    d_ptr->m_ui->schemeEdit->setBaseFont(d_ptr->m_value.font());
     updatePointSizes();
 }
 
@@ -383,13 +385,13 @@ void FontSettingsPage::updatePointSizes()
 {
     // Update point sizes
     const int oldSize = d_ptr->m_value.fontSize();
-    if (d_ptr->ui.sizeComboBox->count()) {
-        const QString curSize = d_ptr->ui.sizeComboBox->currentText();
+    if (d_ptr->m_ui->sizeComboBox->count()) {
+        const QString curSize = d_ptr->m_ui->sizeComboBox->currentText();
         bool ok = true;
         int oldSize = curSize.toInt(&ok);
         if (!ok)
             oldSize = d_ptr->m_value.fontSize();
-        d_ptr->ui.sizeComboBox->clear();
+        d_ptr->m_ui->sizeComboBox->clear();
     }
     const QList<int> sizeLst = pointSizesForSelectedFont();
     int idx = -1;
@@ -397,16 +399,16 @@ void FontSettingsPage::updatePointSizes()
     for (; i < sizeLst.count(); ++i) {
         if (idx == -1 && sizeLst.at(i) >= oldSize)
             idx = i;
-        d_ptr->ui.sizeComboBox->addItem(QString::number(sizeLst.at(i)));
+        d_ptr->m_ui->sizeComboBox->addItem(QString::number(sizeLst.at(i)));
     }
     if (idx != -1)
-        d_ptr->ui.sizeComboBox->setCurrentIndex(idx);
+        d_ptr->m_ui->sizeComboBox->setCurrentIndex(idx);
 }
 
 QList<int> FontSettingsPage::pointSizesForSelectedFont() const
 {
     QFontDatabase db;
-    const QString familyName = d_ptr->ui.familyComboBox->currentText();
+    const QString familyName = d_ptr->m_ui->familyComboBox->currentText();
     QList<int> sizeLst = db.pointSizes(familyName);
     if (!sizeLst.isEmpty())
         return sizeLst;
@@ -426,13 +428,13 @@ void FontSettingsPage::fontSizeSelected(const QString &sizeString)
     const int size = sizeString.toInt(&ok);
     if (ok) {
         d_ptr->m_value.setFontSize(size);
-        d_ptr->ui.schemeEdit->setBaseFont(d_ptr->m_value.font());
+        d_ptr->m_ui->schemeEdit->setBaseFont(d_ptr->m_value.font());
     }
 }
 
 void FontSettingsPage::fontZoomChanged()
 {
-    d_ptr->m_value.setFontZoom(d_ptr->ui.zoomSpinBox->value());
+    d_ptr->m_value.setFontZoom(d_ptr->m_ui->zoomSpinBox->value());
 }
 
 void FontSettingsPage::colorSchemeSelected(int index)
@@ -446,16 +448,16 @@ void FontSettingsPage::colorSchemeSelected(int index)
         const ColorSchemeEntry &entry = d_ptr->m_schemeListModel->colorSchemeAt(index);
         readOnly = entry.readOnly;
         d_ptr->m_value.loadColorScheme(entry.fileName, d_ptr->m_descriptions);
-        d_ptr->ui.schemeEdit->setColorScheme(d_ptr->m_value.colorScheme());
+        d_ptr->m_ui->schemeEdit->setColorScheme(d_ptr->m_value.colorScheme());
     }
-    d_ptr->ui.copyButton->setEnabled(index != -1);
-    d_ptr->ui.deleteButton->setEnabled(!readOnly);
-    d_ptr->ui.schemeEdit->setReadOnly(readOnly);
+    d_ptr->m_ui->copyButton->setEnabled(index != -1);
+    d_ptr->m_ui->deleteButton->setEnabled(!readOnly);
+    d_ptr->m_ui->schemeEdit->setReadOnly(readOnly);
 }
 
 void FontSettingsPage::copyColorScheme()
 {
-    QInputDialog *dialog = new QInputDialog(d_ptr->ui.copyButton->window());
+    QInputDialog *dialog = new QInputDialog(d_ptr->m_ui->copyButton->window());
     dialog->setAttribute(Qt::WA_DeleteOnClose);
     dialog->setInputMode(QInputDialog::TextInput);
     dialog->setWindowTitle(tr("Copy Color Scheme"));
@@ -468,7 +470,7 @@ void FontSettingsPage::copyColorScheme()
 
 void FontSettingsPage::copyColorScheme(const QString &name)
 {
-    int index = d_ptr->ui.schemeComboBox->currentIndex();
+    int index = d_ptr->m_ui->schemeComboBox->currentIndex();
     if (index == -1)
         return;
 
@@ -483,7 +485,7 @@ void FontSettingsPage::copyColorScheme(const QString &name)
         maybeSaveColorScheme();
 
         // Make sure we're copying the current version
-        d_ptr->m_value.setColorScheme(d_ptr->ui.schemeEdit->colorScheme());
+        d_ptr->m_value.setColorScheme(d_ptr->m_ui->schemeEdit->colorScheme());
 
         ColorScheme scheme = d_ptr->m_value.colorScheme();
         scheme.setDisplayName(name);
@@ -496,7 +498,7 @@ void FontSettingsPage::copyColorScheme(const QString &name)
 
 void FontSettingsPage::confirmDeleteColorScheme()
 {
-    const int index = d_ptr->ui.schemeComboBox->currentIndex();
+    const int index = d_ptr->m_ui->schemeComboBox->currentIndex();
     if (index == -1)
         return;
 
@@ -508,7 +510,7 @@ void FontSettingsPage::confirmDeleteColorScheme()
                                               tr("Delete Color Scheme"),
                                               tr("Are you sure you want to delete this color scheme permanently?"),
                                               QMessageBox::Discard | QMessageBox::Cancel,
-                                              d_ptr->ui.deleteButton->window());
+                                              d_ptr->m_ui->deleteButton->window());
 
     // Change the text and role of the discard button
     QPushButton *deleteButton = static_cast<QPushButton*>(messageBox->button(QMessageBox::Discard));
@@ -524,7 +526,7 @@ void FontSettingsPage::confirmDeleteColorScheme()
 
 void FontSettingsPage::deleteColorScheme()
 {
-    const int index = d_ptr->ui.schemeComboBox->currentIndex();
+    const int index = d_ptr->m_ui->schemeComboBox->currentIndex();
     QTC_ASSERT(index != -1, return)
 
     const ColorSchemeEntry &entry = d_ptr->m_schemeListModel->colorSchemeAt(index);
@@ -536,15 +538,15 @@ void FontSettingsPage::deleteColorScheme()
 
 void FontSettingsPage::maybeSaveColorScheme()
 {
-    if (d_ptr->m_value.colorScheme() == d_ptr->ui.schemeEdit->colorScheme())
+    if (d_ptr->m_value.colorScheme() == d_ptr->m_ui->schemeEdit->colorScheme())
         return;
 
     QMessageBox *messageBox = new QMessageBox(QMessageBox::Warning,
                                               tr("Color Scheme Changed"),
                                               tr("The color scheme \"%1\" was modified, do you want to save the changes?")
-                                                  .arg(d_ptr->ui.schemeEdit->colorScheme().displayName()),
+                                                  .arg(d_ptr->m_ui->schemeEdit->colorScheme().displayName()),
                                               QMessageBox::Discard | QMessageBox::Save,
-                                              d_ptr->ui.schemeComboBox->window());
+                                              d_ptr->m_ui->schemeComboBox->window());
 
     // Change the text of the discard button
     QPushButton *discardButton = static_cast<QPushButton*>(messageBox->button(QMessageBox::Discard));
@@ -553,7 +555,7 @@ void FontSettingsPage::maybeSaveColorScheme()
     messageBox->setDefaultButton(QMessageBox::Save);
 
     if (messageBox->exec() == QMessageBox::Save) {
-        const ColorScheme &scheme = d_ptr->ui.schemeEdit->colorScheme();
+        const ColorScheme &scheme = d_ptr->m_ui->schemeEdit->colorScheme();
         scheme.save(d_ptr->m_value.colorSchemeFileName());
     }
 }
@@ -594,7 +596,7 @@ void FontSettingsPage::refreshColorSchemeList()
 
     d_ptr->m_refreshingSchemeList = true;
     d_ptr->m_schemeListModel->setColorSchemes(colorSchemes);
-    d_ptr->ui.schemeComboBox->setCurrentIndex(selected);
+    d_ptr->m_ui->schemeComboBox->setCurrentIndex(selected);
     d_ptr->m_refreshingSchemeList = false;
 }
 
@@ -605,16 +607,18 @@ void FontSettingsPage::delayedChange()
 
 void FontSettingsPage::apply()
 {
-    d_ptr->m_value.setAntialias(d_ptr->ui.antialias->isChecked());
+    if (!d_ptr->m_ui) // page was never shown
+        return;
+    d_ptr->m_value.setAntialias(d_ptr->m_ui->antialias->isChecked());
 
-    if (d_ptr->m_value.colorScheme() != d_ptr->ui.schemeEdit->colorScheme()) {
+    if (d_ptr->m_value.colorScheme() != d_ptr->m_ui->schemeEdit->colorScheme()) {
         // Update the scheme and save it under the name it already has
-        d_ptr->m_value.setColorScheme(d_ptr->ui.schemeEdit->colorScheme());
+        d_ptr->m_value.setColorScheme(d_ptr->m_ui->schemeEdit->colorScheme());
         const ColorScheme &scheme = d_ptr->m_value.colorScheme();
         scheme.save(d_ptr->m_value.colorSchemeFileName());
     }
 
-    int index = d_ptr->ui.schemeComboBox->currentIndex();
+    int index = d_ptr->m_ui->schemeComboBox->currentIndex();
     if (index != -1) {
         const ColorSchemeEntry &entry = d_ptr->m_schemeListModel->colorSchemeAt(index);
         if (entry.fileName != d_ptr->m_value.colorSchemeFileName())
@@ -637,8 +641,12 @@ void FontSettingsPage::saveSettings()
 
 void FontSettingsPage::finish()
 {
+    if (!d_ptr->m_ui) // page was never shown
+        return;
     // If changes were applied, these are equal. Otherwise restores last value.
     d_ptr->m_value = d_ptr->m_lastValue;
+    delete d_ptr->m_ui;
+    d_ptr->m_ui = 0;
 }
 
 const FontSettings &FontSettingsPage::fontSettings() const
diff --git a/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp b/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp
index ffa8086225392ded35315987574023bb2241a2a8..b27498b1f7e1322e6766d012e8b65a6ee69b9d14 100644
--- a/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp
+++ b/src/plugins/texteditor/generichighlighter/highlightersettingspage.cpp
@@ -53,14 +53,15 @@ struct HighlighterSettingsPage::HighlighterSettingsPagePrivate
 
     HighlighterSettings m_settings;
 
-    Ui::HighlighterSettingsPage m_page;
+    Ui::HighlighterSettingsPage *m_page;
 };
 
 HighlighterSettingsPage::HighlighterSettingsPagePrivate::
 HighlighterSettingsPagePrivate(const QString &id) :
     m_id(id),
     m_displayName(tr("Generic Highlighter")),
-    m_settingsPrefix(QLatin1String("Text"))
+    m_settingsPrefix(QLatin1String("Text")),
+    m_page(0)
 {}
 
 HighlighterSettingsPage::HighlighterSettingsPage(const QString &id, QObject *parent) :
@@ -90,27 +91,28 @@ QString HighlighterSettingsPage::displayName() const
 QWidget *HighlighterSettingsPage::createPage(QWidget *parent)
 {
     QWidget *w = new QWidget(parent);
-    m_d->m_page.setupUi(w);
-    m_d->m_page.definitionFilesPath->setExpectedKind(Utils::PathChooser::Directory);
-    m_d->m_page.definitionFilesPath->addButton(tr("Download Definitions"), this,
+    m_d->m_page = new Ui::HighlighterSettingsPage;
+    m_d->m_page->setupUi(w);
+    m_d->m_page->definitionFilesPath->setExpectedKind(Utils::PathChooser::Directory);
+    m_d->m_page->definitionFilesPath->addButton(tr("Download Definitions"), this,
                                                SLOT(requestAvailableDefinitionsMetaData()));
-    m_d->m_page.fallbackDefinitionFilesPath->setExpectedKind(Utils::PathChooser::Directory);
-    m_d->m_page.fallbackDefinitionFilesPath->addButton(tr("Autodetect"), this,
+    m_d->m_page->fallbackDefinitionFilesPath->setExpectedKind(Utils::PathChooser::Directory);
+    m_d->m_page->fallbackDefinitionFilesPath->addButton(tr("Autodetect"), this,
                                                        SLOT(resetDefinitionsLocation()));
 
     settingsToUI();
 
     if (m_d->m_searchKeywords.isEmpty()) {
-        QTextStream(&m_d->m_searchKeywords) << m_d->m_page.definitionFilesGroupBox->title()
-            << m_d->m_page.locationLabel->text()
-            << m_d->m_page.alertWhenNoDefinition->text()
-            << m_d->m_page.useFallbackLocation->text()
-            << m_d->m_page.ignoreLabel->text();
+        QTextStream(&m_d->m_searchKeywords) << m_d->m_page->definitionFilesGroupBox->title()
+            << m_d->m_page->locationLabel->text()
+            << m_d->m_page->alertWhenNoDefinition->text()
+            << m_d->m_page->useFallbackLocation->text()
+            << m_d->m_page->ignoreLabel->text();
     }
 
-    connect(m_d->m_page.useFallbackLocation, SIGNAL(clicked(bool)),
+    connect(m_d->m_page->useFallbackLocation, SIGNAL(clicked(bool)),
             this, SLOT(setFallbackLocationState(bool)));
-    connect(m_d->m_page.definitionFilesPath, SIGNAL(validChanged(bool)),
+    connect(m_d->m_page->definitionFilesPath, SIGNAL(validChanged(bool)),
             this, SLOT(setDownloadDefinitionsState(bool)));
     connect(w, SIGNAL(destroyed()), this, SLOT(ignoreDownloadReply()));
 
@@ -119,6 +121,8 @@ QWidget *HighlighterSettingsPage::createPage(QWidget *parent)
 
 void HighlighterSettingsPage::apply()
 {
+    if (!m_d->m_page) // page was not shown
+        return;
     if (settingsChanged())
         settingsFromUI();
 
@@ -128,6 +132,14 @@ void HighlighterSettingsPage::apply()
     }
 }
 
+void HighlighterSettingsPage::finish()
+{
+    if (!m_d->m_page) // page was not shown
+        return;
+    delete m_d->m_page;
+    m_d->m_page = 0;
+}
+
 bool HighlighterSettingsPage::matches(const QString &s) const
 {
     return m_d->m_searchKeywords.contains(s, Qt::CaseInsensitive);
@@ -139,34 +151,34 @@ const HighlighterSettings &HighlighterSettingsPage::highlighterSettings() const
 }
 
 void HighlighterSettingsPage::settingsFromUI()
-{    
+{
     if (!m_requestMimeTypeRegistration && (
-        m_d->m_settings.definitionFilesPath() != m_d->m_page.definitionFilesPath->path() ||
+        m_d->m_settings.definitionFilesPath() != m_d->m_page->definitionFilesPath->path() ||
         m_d->m_settings.fallbackDefinitionFilesPath() !=
-            m_d->m_page.fallbackDefinitionFilesPath->path() ||
-        m_d->m_settings.useFallbackLocation() != m_d->m_page.useFallbackLocation->isChecked())) {
+            m_d->m_page->fallbackDefinitionFilesPath->path() ||
+        m_d->m_settings.useFallbackLocation() != m_d->m_page->useFallbackLocation->isChecked())) {
         m_requestMimeTypeRegistration = true;
     }
 
-    m_d->m_settings.setDefinitionFilesPath(m_d->m_page.definitionFilesPath->path());
-    m_d->m_settings.setFallbackDefinitionFilesPath(m_d->m_page.fallbackDefinitionFilesPath->path());
-    m_d->m_settings.setAlertWhenNoDefinition(m_d->m_page.alertWhenNoDefinition->isChecked());
-    m_d->m_settings.setUseFallbackLocation(m_d->m_page.useFallbackLocation->isChecked());
-    m_d->m_settings.setIgnoredFilesPatterns(m_d->m_page.ignoreEdit->text());
+    m_d->m_settings.setDefinitionFilesPath(m_d->m_page->definitionFilesPath->path());
+    m_d->m_settings.setFallbackDefinitionFilesPath(m_d->m_page->fallbackDefinitionFilesPath->path());
+    m_d->m_settings.setAlertWhenNoDefinition(m_d->m_page->alertWhenNoDefinition->isChecked());
+    m_d->m_settings.setUseFallbackLocation(m_d->m_page->useFallbackLocation->isChecked());
+    m_d->m_settings.setIgnoredFilesPatterns(m_d->m_page->ignoreEdit->text());
     if (QSettings *s = Core::ICore::instance()->settings())
         m_d->m_settings.toSettings(m_d->m_settingsPrefix, s);
 }
 
 void HighlighterSettingsPage::settingsToUI()
 {
-    m_d->m_page.definitionFilesPath->setPath(m_d->m_settings.definitionFilesPath());
-    m_d->m_page.fallbackDefinitionFilesPath->setPath(m_d->m_settings.fallbackDefinitionFilesPath());
-    m_d->m_page.alertWhenNoDefinition->setChecked(m_d->m_settings.alertWhenNoDefinition());
-    m_d->m_page.useFallbackLocation->setChecked(m_d->m_settings.useFallbackLocation());
-    m_d->m_page.ignoreEdit->setText(m_d->m_settings.ignoredFilesPatterns());
-
-    setFallbackLocationState(m_d->m_page.useFallbackLocation->isChecked());
-    setDownloadDefinitionsState(m_d->m_page.definitionFilesPath->isValid());
+    m_d->m_page->definitionFilesPath->setPath(m_d->m_settings.definitionFilesPath());
+    m_d->m_page->fallbackDefinitionFilesPath->setPath(m_d->m_settings.fallbackDefinitionFilesPath());
+    m_d->m_page->alertWhenNoDefinition->setChecked(m_d->m_settings.alertWhenNoDefinition());
+    m_d->m_page->useFallbackLocation->setChecked(m_d->m_settings.useFallbackLocation());
+    m_d->m_page->ignoreEdit->setText(m_d->m_settings.ignoredFilesPatterns());
+
+    setFallbackLocationState(m_d->m_page->useFallbackLocation->isChecked());
+    setDownloadDefinitionsState(m_d->m_page->definitionFilesPath->isValid());
 }
 
 void HighlighterSettingsPage::resetDefinitionsLocation()
@@ -176,7 +188,7 @@ void HighlighterSettingsPage::resetDefinitionsLocation()
         QMessageBox::information(0, tr("Autodetect Definitions"),
                                  tr("No pre-installed definitions could be found."));
     else
-        m_d->m_page.fallbackDefinitionFilesPath->setPath(location);
+        m_d->m_page->fallbackDefinitionFilesPath->setPath(location);
 }
 
 void HighlighterSettingsPage::requestAvailableDefinitionsMetaData()
@@ -206,43 +218,43 @@ void HighlighterSettingsPage::ignoreDownloadReply()
 void HighlighterSettingsPage::manageDefinitions(const QList<HighlightDefinitionMetaData> &metaData)
 {
     ManageDefinitionsDialog dialog(metaData,
-                                   m_d->m_page.definitionFilesPath->path() + QLatin1Char('/'),
-                                   m_d->m_page.definitionFilesPath->buttonAtIndex(1)->window());
+                                   m_d->m_page->definitionFilesPath->path() + QLatin1Char('/'),
+                                   m_d->m_page->definitionFilesPath->buttonAtIndex(1)->window());
     if (dialog.exec() && !m_requestMimeTypeRegistration)
         m_requestMimeTypeRegistration = true;
-    setDownloadDefinitionsState(m_d->m_page.definitionFilesPath->isValid());
+    setDownloadDefinitionsState(m_d->m_page->definitionFilesPath->isValid());
 }
 
 void HighlighterSettingsPage::showError()
 {
-    QMessageBox::critical(m_d->m_page.definitionFilesPath->buttonAtIndex(1)->window(),
+    QMessageBox::critical(m_d->m_page->definitionFilesPath->buttonAtIndex(1)->window(),
                           tr("Error connecting to server."),
                           tr("Not possible to retrieve data."));
-    setDownloadDefinitionsState(m_d->m_page.definitionFilesPath->isValid());
+    setDownloadDefinitionsState(m_d->m_page->definitionFilesPath->isValid());
 }
 
 void HighlighterSettingsPage::setFallbackLocationState(bool checked)
 {
-    m_d->m_page.fallbackDefinitionFilesPath->setEnabled(checked);
+    m_d->m_page->fallbackDefinitionFilesPath->setEnabled(checked);
 }
 
 void HighlighterSettingsPage::setDownloadDefinitionsState(bool valid)
 {
-    m_d->m_page.definitionFilesPath->buttonAtIndex(1)->setEnabled(valid);
+    m_d->m_page->definitionFilesPath->buttonAtIndex(1)->setEnabled(valid);
 }
 
 bool HighlighterSettingsPage::settingsChanged() const
-{    
-    if (m_d->m_settings.definitionFilesPath() != m_d->m_page.definitionFilesPath->path())
+{
+    if (m_d->m_settings.definitionFilesPath() != m_d->m_page->definitionFilesPath->path())
         return true;
     if (m_d->m_settings.fallbackDefinitionFilesPath() !=
-            m_d->m_page.fallbackDefinitionFilesPath->path())
+            m_d->m_page->fallbackDefinitionFilesPath->path())
         return true;
-    if (m_d->m_settings.alertWhenNoDefinition() != m_d->m_page.alertWhenNoDefinition->isChecked())
+    if (m_d->m_settings.alertWhenNoDefinition() != m_d->m_page->alertWhenNoDefinition->isChecked())
         return true;
-    if (m_d->m_settings.useFallbackLocation() != m_d->m_page.useFallbackLocation->isChecked())
+    if (m_d->m_settings.useFallbackLocation() != m_d->m_page->useFallbackLocation->isChecked())
         return true;
-    if (m_d->m_settings.ignoredFilesPatterns() != m_d->m_page.ignoreEdit->text())
+    if (m_d->m_settings.ignoredFilesPatterns() != m_d->m_page->ignoreEdit->text())
         return true;
     return false;
 }
diff --git a/src/plugins/texteditor/generichighlighter/highlightersettingspage.h b/src/plugins/texteditor/generichighlighter/highlightersettingspage.h
index a5096c71f91c84b16696e5637b38d719ec8873b3..4c6409b58055e72aeac2bcfc56e31825f5f4ac27 100644
--- a/src/plugins/texteditor/generichighlighter/highlightersettingspage.h
+++ b/src/plugins/texteditor/generichighlighter/highlightersettingspage.h
@@ -56,7 +56,7 @@ public:
 
     QWidget *createPage(QWidget *parent);
     void apply();
-    void finish() {}
+    void finish();
     bool matches(const QString &s) const;
 
     const HighlighterSettings &highlighterSettings() const;