diff --git a/src/plugins/projectexplorer/allprojectsfilter.cpp b/src/plugins/projectexplorer/allprojectsfilter.cpp
index 7ab9bb4ce925fbbb5740b89510c99eb1ab168640..24a396d1fc76ad7bcad91bbe01da902d465009ce 100644
--- a/src/plugins/projectexplorer/allprojectsfilter.cpp
+++ b/src/plugins/projectexplorer/allprojectsfilter.cpp
@@ -40,16 +40,24 @@ using namespace ProjectExplorer;
 using namespace ProjectExplorer::Internal;
 
 AllProjectsFilter::AllProjectsFilter(ProjectExplorerPlugin *pe)
+    : m_projectExplorer(pe), m_filesUpToDate(false)
 {
-    m_projectExplorer = pe;
     connect(m_projectExplorer, SIGNAL(fileListChanged()),
-            this, SLOT(refreshInternally()));
+            this, SLOT(markFilesAsOutOfDate()));
     setShortcutString("a");
     setIncludedByDefault(true);
 }
 
-void AllProjectsFilter::refreshInternally()
+void AllProjectsFilter::markFilesAsOutOfDate()
 {
+    m_filesUpToDate = false;
+}
+
+void AllProjectsFilter::updateFiles()
+{
+    if (m_filesUpToDate)
+        return;
+    m_filesUpToDate = true;
     m_files.clear();
     SessionManager *session = m_projectExplorer->session();
     if (!session)
@@ -64,7 +72,7 @@ void AllProjectsFilter::refresh(QFutureInterface<void> &future)
 {
     Q_UNUSED(future);
     // invokeAsyncronouslyOnGuiThread
-    connect(this, SIGNAL(invokeRefresh()), this, SLOT(refreshInternally()));
+    connect(this, SIGNAL(invokeRefresh()), this, SLOT(markFilesAsOutOfDate()));
     emit invokeRefresh();
-    disconnect(this, SIGNAL(invokeRefresh()), this, SLOT(refreshInternally()));
+    disconnect(this, SIGNAL(invokeRefresh()), this, SLOT(markFilesAsOutOfDate()));
 }
diff --git a/src/plugins/projectexplorer/allprojectsfilter.h b/src/plugins/projectexplorer/allprojectsfilter.h
index f486580943164bcdf3791fa87b6eb1bc8498a334..f0cf3afea05d7ee0e6a76ec5862b4ffdec0540ff 100644
--- a/src/plugins/projectexplorer/allprojectsfilter.h
+++ b/src/plugins/projectexplorer/allprojectsfilter.h
@@ -53,12 +53,16 @@ public:
     QuickOpen::IQuickOpenFilter::Priority priority() const { return QuickOpen::IQuickOpenFilter::Low; }
     void refresh(QFutureInterface<void> &future);
 
+protected:
+    void updateFiles();
+
 private slots:
-    void refreshInternally();
+    void markFilesAsOutOfDate();
 signals:
     void invokeRefresh();
 private:
     ProjectExplorerPlugin *m_projectExplorer;
+    bool m_filesUpToDate;
 };
 
 } // namespace Internal
diff --git a/src/plugins/quickopen/basefilefilter.cpp b/src/plugins/quickopen/basefilefilter.cpp
index ae09c3128c7ff19256411ed2397eaf706d5e9545..c895af5a7c27f75766b2e63e937482b50a373cd6 100644
--- a/src/plugins/quickopen/basefilefilter.cpp
+++ b/src/plugins/quickopen/basefilefilter.cpp
@@ -43,6 +43,7 @@ BaseFileFilter::BaseFileFilter()
 
 QList<FilterEntry> BaseFileFilter::matchesFor(const QString &origEntry)
 {
+    updateFiles();
     QList<FilterEntry> matches;
     QList<FilterEntry> badMatches;
     QString needle = trimWildcards(origEntry);
@@ -104,3 +105,7 @@ void BaseFileFilter::generateFileNames()
     }
     m_forceNewSearchList = true;
 }
+
+void BaseFileFilter::updateFiles()
+{
+}
diff --git a/src/plugins/quickopen/basefilefilter.h b/src/plugins/quickopen/basefilefilter.h
index e1ff1e10f20b57122a81ce79dc3b6cef3cda0158..30bf059132557aa1b18cbba542fba9ec5e38d177 100644
--- a/src/plugins/quickopen/basefilefilter.h
+++ b/src/plugins/quickopen/basefilefilter.h
@@ -48,6 +48,7 @@ public:
     void accept(QuickOpen::FilterEntry selection) const;
 
 protected:
+    virtual void updateFiles();
     void generateFileNames();
 
     QStringList m_files;