diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h
index 5a2c7ba29ce97e928773edc6920556ef1212e08e..a93f0b352d14790253991766e8763b3d1139d1e1 100644
--- a/src/plugins/cpptools/searchsymbols.h
+++ b/src/plugins/cpptools/searchsymbols.h
@@ -184,6 +184,7 @@ private:
 } // namespace CppTools
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(CppTools::SearchSymbols::SymbolTypes)
+Q_DECLARE_METATYPE(CppTools::SearchSymbols::SymbolTypes)
 Q_DECLARE_METATYPE(CppTools::ModelItemInfo)
 
 #endif // SEARCHSYMBOLS_H
diff --git a/src/plugins/cpptools/symbolsfindfilter.cpp b/src/plugins/cpptools/symbolsfindfilter.cpp
index 8b4b94b98e4b2b242dfc794e5d2e83733c2fb6cd..e29528ad81b369a71b36c20f06ca4f4d865d6ae2 100644
--- a/src/plugins/cpptools/symbolsfindfilter.cpp
+++ b/src/plugins/cpptools/symbolsfindfilter.cpp
@@ -59,22 +59,24 @@ namespace {
     const char * const SETTINGS_SEARCHSCOPE = "SearchScope";
 
     void runSearch(QFutureInterface<Find::SearchResultItem> &future,
-              QString txt, Find::FindFlags findFlags, CPlusPlus::Snapshot snapshot,
-              SearchSymbols::SymbolTypes types, QSet<QString> fileNames)
+              SymbolsFindParameters parameters, CPlusPlus::Snapshot snapshot,
+              QSet<QString> fileNames)
     {
         future.setProgressRange(0, snapshot.size());
         future.setProgressValue(0);
         int progress = 0;
 
         SearchSymbols search;
-        search.setSymbolsToSearchFor(types);
+        search.setSymbolsToSearchFor(parameters.types);
         search.setSeparateScope(true);
         CPlusPlus::Snapshot::const_iterator it = snapshot.begin();
 
-        QString findString = (findFlags & Find::FindRegularExpression ? txt : QRegExp::escape(txt));
-        if (findFlags & Find::FindWholeWords)
+        QString findString = (parameters.flags & Find::FindRegularExpression
+                              ? parameters.text : QRegExp::escape(parameters.text));
+        if (parameters.flags & Find::FindWholeWords)
             findString = QString::fromLatin1("\\b%1\\b").arg(findString);
-        QRegExp matcher(findString, (findFlags & Find::FindCaseSensitively ? Qt::CaseSensitive : Qt::CaseInsensitive));
+        QRegExp matcher(findString, (parameters.flags & Find::FindCaseSensitively
+                                     ? Qt::CaseSensitive : Qt::CaseInsensitive));
         while (it != snapshot.end() && !future.isCanceled()) {
             if (fileNames.isEmpty() || fileNames.contains(it.value()->fileName())) {
                 QVector<Find::SearchResultItem> resultItems;
@@ -82,7 +84,8 @@ namespace {
                 foreach (const ModelItemInfo &info, modelInfos) {
                     int index = matcher.indexIn(info.symbolName);
                     if (index != -1) {
-                        QStringList path = info.fullyQualifiedName.mid(0, info.fullyQualifiedName.size() - 1);
+                        QStringList path = info.fullyQualifiedName.mid(0,
+                            info.fullyQualifiedName.size() - 1);
                         Find::SearchResultItem item;
                         item.path = path;
                         item.text = info.symbolName;
@@ -150,12 +153,28 @@ void SymbolsFindFilter::findAll(const QString &txt, Find::FindFlags findFlags)
 {
     Find::SearchResultWindow *window = Find::SearchResultWindow::instance();
     Find::SearchResult *search = window->startNewSearch(label(), toolTip(findFlags), txt);
-    connect(search, SIGNAL(activated(Find::SearchResultItem)), this, SLOT(openEditor(Find::SearchResultItem)));
+    search->setSearchAgainSupported(true);
+    connect(search, SIGNAL(activated(Find::SearchResultItem)),
+            this, SLOT(openEditor(Find::SearchResultItem)));
     connect(search, SIGNAL(cancelled()), this, SLOT(cancel()));
+    connect(search, SIGNAL(searchAgainRequested()), this, SLOT(searchAgain()));
+    connect(this, SIGNAL(enabledChanged(bool)), search, SLOT(setSearchAgainEnabled(bool)));
     window->popup(true);
 
+    SymbolsFindParameters parameters;
+    parameters.text = txt;
+    parameters.flags = findFlags;
+    parameters.types = m_symbolsToSearch;
+    parameters.scope = m_scope;
+    search->setUserData(qVariantFromValue(parameters));
+    startSearch(search);
+}
+
+void SymbolsFindFilter::startSearch(Find::SearchResult *search)
+{
+    SymbolsFindParameters parameters = search->userData().value<SymbolsFindParameters>();
     QSet<QString> projectFileNames;
-    if (m_scope == SymbolsFindFilter::SearchProjectsOnly) {
+    if (parameters.scope == SymbolsFindFilter::SearchProjectsOnly) {
         foreach (ProjectExplorer::Project *project,
                  ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projects()) {
             projectFileNames += project->files(ProjectExplorer::Project::AllFiles).toSet();
@@ -168,10 +187,9 @@ void SymbolsFindFilter::findAll(const QString &txt, Find::FindFlags findFlags)
             this, SLOT(finish()));
     connect(watcher, SIGNAL(resultsReadyAt(int,int)),
             this, SLOT(addResults(int, int)));
-    watcher->setFuture(QtConcurrent::run<Find::SearchResultItem, QString,
-        Find::FindFlags, CPlusPlus::Snapshot,
-        SearchSymbols::SymbolTypes, QSet<QString> >(runSearch, txt, findFlags, m_manager->snapshot(),
-                                    m_symbolsToSearch, projectFileNames));
+    watcher->setFuture(QtConcurrent::run<Find::SearchResultItem, SymbolsFindParameters,
+                       CPlusPlus::Snapshot, QSet<QString> >(runSearch, parameters,
+                                                    m_manager->snapshot(), projectFileNames));
     Core::ICore::instance()->progressManager()->addTask(watcher->future(),
                                                         tr("Searching"),
                                                         Find::Constants::TASK_SEARCH);
@@ -254,6 +272,14 @@ void SymbolsFindFilter::onAllTasksFinished(const QString &type)
     }
 }
 
+void SymbolsFindFilter::searchAgain()
+{
+    Find::SearchResult *search = qobject_cast<Find::SearchResult *>(sender());
+    QTC_ASSERT(search, return);
+    search->reset();
+    startSearch(search);
+}
+
 QString SymbolsFindFilter::label() const
 {
     return tr("C++ Symbols:");
diff --git a/src/plugins/cpptools/symbolsfindfilter.h b/src/plugins/cpptools/symbolsfindfilter.h
index 5a8dd43195d05eec31b3fff2da143dea2ac6700c..b0ddd19e7eb718880b925698a3df2b7ff9d706f6 100644
--- a/src/plugins/cpptools/symbolsfindfilter.h
+++ b/src/plugins/cpptools/symbolsfindfilter.h
@@ -89,10 +89,12 @@ private slots:
     void cancel();
     void onTaskStarted(const QString &type);
     void onAllTasksFinished(const QString &type);
+    void searchAgain();
 
 private:
     QString label() const;
     QString toolTip(Find::FindFlags findFlags) const;
+    void startSearch(Find::SearchResult *search);
 
     CppModelManager *m_manager;
     bool m_enabled;
@@ -102,6 +104,15 @@ private:
     SearchScope m_scope;
 };
 
+class SymbolsFindParameters
+{
+public:
+    QString text;
+    Find::FindFlags flags;
+    SearchSymbols::SymbolTypes types;
+    SymbolsFindFilter::SearchScope scope;
+};
+
 class SymbolsFindFilterConfigWidget : public QWidget
 {
     Q_OBJECT
@@ -128,4 +139,7 @@ private:
 } // Internal
 } // CppTools
 
+Q_DECLARE_METATYPE(CppTools::Internal::SymbolsFindFilter::SearchScope)
+Q_DECLARE_METATYPE(CppTools::Internal::SymbolsFindParameters)
+
 #endif // SYMBOLSFINDFILTER_H