diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
index e5c6a1825f37228fe324e601b734186b4ed8cfff..9a05e191bc5c926d1365bdd1dba74d4d347abd69 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
@@ -436,6 +436,12 @@ void SettingsDialog::ensureCategoryWidget(Category *category)
     category->index = m_stackedLayout->addWidget(tabWidget);
 }
 
+void SettingsDialog::ensureAllCategoryWidgets()
+{
+    foreach (Category *category, m_model->categories())
+        ensureCategoryWidget(category);
+}
+
 void SettingsDialog::updateEnabledTabs(Category *category, const QString &searchText)
 {
     for (int i = 0; i < category->pages.size(); ++i) {
@@ -472,6 +478,7 @@ void SettingsDialog::currentTabChanged(int index)
 
 void SettingsDialog::filter(const QString &text)
 {
+    ensureAllCategoryWidgets();
     // When there is no current index, select the first one when possible
     if (!m_categoryList->currentIndex().isValid() && m_model->rowCount() > 0)
         m_categoryList->setCurrentIndex(m_proxyModel->index(0, 0));
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.h b/src/plugins/coreplugin/dialogs/settingsdialog.h
index f942b03c523c098cf692872dcab16eaf10d80b65..9e09496be9a2fa45c32f9212160d8957de2945c5 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.h
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.h
@@ -94,6 +94,7 @@ private:
     void showPage(const QString &categoryId, const QString &pageId);
     void updateEnabledTabs(Category *category, const QString &searchText);
     void ensureCategoryWidget(Category *category);
+    void ensureAllCategoryWidgets();
 
     const QList<Core::IOptionsPage*> m_pages;