diff --git a/src/plugins/cpptools/symbolsfindfilter.cpp b/src/plugins/cpptools/symbolsfindfilter.cpp
index f133831a256013d33e7ec4e638cd025f84d81a1f..a6934a6688540ef17b62ae9859227ae96ef16df2 100644
--- a/src/plugins/cpptools/symbolsfindfilter.cpp
+++ b/src/plugins/cpptools/symbolsfindfilter.cpp
@@ -131,6 +131,16 @@ bool SymbolsFindFilter::isEnabled() const
     return !m_isRunning && m_enabled;
 }
 
+bool SymbolsFindFilter::canCancel() const
+{
+    return m_isRunning;
+}
+
+void SymbolsFindFilter::cancel()
+{
+    m_watcher.cancel();
+}
+
 Find::FindFlags SymbolsFindFilter::supportedFindFlags() const
 {
     return Find::FindCaseSensitively | Find::FindRegularExpression | Find::FindWholeWords;
diff --git a/src/plugins/cpptools/symbolsfindfilter.h b/src/plugins/cpptools/symbolsfindfilter.h
index 420420dc4af7f6a4185cf256c32e56bc1559ab6f..73b67856e26ac831bfbe45a95f2d3dbdf359e81e 100644
--- a/src/plugins/cpptools/symbolsfindfilter.h
+++ b/src/plugins/cpptools/symbolsfindfilter.h
@@ -60,6 +60,8 @@ public:
     QString id() const;
     QString displayName() const;
     bool isEnabled() const;
+    bool canCancel() const;
+    void cancel();
     Find::FindFlags supportedFindFlags() const;
 
     void findAll(const QString &txt, Find::FindFlags findFlags);
diff --git a/src/plugins/find/finddialog.ui b/src/plugins/find/finddialog.ui
index 98ae78e10918cf2661dd169537a1027e4f61621d..e2dd019f12ad80e3e9f86593a71b8bf513d41714 100644
--- a/src/plugins/find/finddialog.ui
+++ b/src/plugins/find/finddialog.ui
@@ -73,7 +73,7 @@
        </property>
       </widget>
      </item>
-     <item row="1" column="0">
+     <item row="2" column="0">
       <widget class="QLabel" name="label_2">
        <property name="text">
         <string>Search &amp;for:</string>
@@ -86,17 +86,10 @@
        </property>
       </widget>
      </item>
-     <item row="1" column="1">
+     <item row="2" column="1">
       <widget class="QLineEdit" name="searchTerm"/>
      </item>
-     <item row="1" column="2">
-      <widget class="QPushButton" name="closeButton">
-       <property name="text">
-        <string>Close</string>
-       </property>
-      </widget>
-     </item>
-     <item row="5" column="0" colspan="2">
+     <item row="7" column="0" colspan="2">
       <widget class="QWidget" name="configWidget" native="true">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@@ -106,14 +99,7 @@
        </property>
       </widget>
      </item>
-     <item row="2" column="2">
-      <widget class="QPushButton" name="replaceButton">
-       <property name="text">
-        <string>Search &amp;&amp; Replace</string>
-       </property>
-      </widget>
-     </item>
-     <item row="2" column="1" rowspan="3">
+     <item row="4" column="1" rowspan="3">
       <widget class="QWidget" name="widget" native="true">
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <property name="margin">
@@ -143,6 +129,27 @@
        </layout>
       </widget>
      </item>
+     <item row="5" column="2">
+      <widget class="QPushButton" name="replaceButton">
+       <property name="text">
+        <string>Search &amp;&amp; Replace</string>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="2">
+      <widget class="QPushButton" name="closeButton">
+       <property name="text">
+        <string>Close</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="2">
+      <widget class="QPushButton" name="cancelButton">
+       <property name="text">
+        <string>Cancel</string>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item>
@@ -164,8 +171,6 @@
   <tabstop>filterList</tabstop>
   <tabstop>searchTerm</tabstop>
   <tabstop>searchButton</tabstop>
-  <tabstop>closeButton</tabstop>
-  <tabstop>replaceButton</tabstop>
  </tabstops>
  <resources/>
  <connections/>
diff --git a/src/plugins/find/findtoolwindow.cpp b/src/plugins/find/findtoolwindow.cpp
index 803b8e397d29154dc1980a275b8c95a7467c88d5..95b397da7f69d88e2cef42b534724af09ddbe0d4 100644
--- a/src/plugins/find/findtoolwindow.cpp
+++ b/src/plugins/find/findtoolwindow.cpp
@@ -52,11 +52,13 @@ FindToolWindow::FindToolWindow(FindPlugin *plugin)
     connect(m_ui.closeButton, SIGNAL(clicked()), this, SLOT(reject()));
     connect(m_ui.searchButton, SIGNAL(clicked()), this, SLOT(search()));
     connect(m_ui.replaceButton, SIGNAL(clicked()), this, SLOT(replace()));
+    connect(m_ui.cancelButton, SIGNAL(clicked()), this, SLOT(cancelSearch()));
     connect(m_ui.matchCase, SIGNAL(toggled(bool)), m_plugin, SLOT(setCaseSensitive(bool)));
     connect(m_ui.wholeWords, SIGNAL(toggled(bool)), m_plugin, SLOT(setWholeWord(bool)));
     connect(m_ui.regExp, SIGNAL(toggled(bool)), m_plugin, SLOT(setRegularExpression(bool)));
     connect(m_ui.filterList, SIGNAL(activated(int)), this, SLOT(setCurrentFilter(int)));
     connect(m_ui.searchTerm, SIGNAL(textChanged(QString)), this, SLOT(updateButtonStates()));
+
     m_findCompleter->setModel(m_plugin->findCompletionModel());
     m_ui.searchTerm->setCompleter(m_findCompleter);
     m_ui.searchTerm->installEventFilter(this);
@@ -100,6 +102,7 @@ void FindToolWindow::updateButtonStates()
     m_ui.regExp->setEnabled(filterEnabled
                             && (m_currentFilter->supportedFindFlags() & Find::FindRegularExpression));
     m_ui.searchTerm->setEnabled(filterEnabled);
+    m_ui.cancelButton->setEnabled(m_currentFilter && m_currentFilter->canCancel());
 }
 
 void FindToolWindow::setFindFilters(const QList<IFindFilter *> &filters)
@@ -195,6 +198,12 @@ void FindToolWindow::replace()
     filter->replaceAll(term, m_plugin->findFlags());
 }
 
+void FindToolWindow::cancelSearch()
+{
+    if (m_currentFilter)
+        m_currentFilter->cancel();
+}
+
 void FindToolWindow::writeSettings()
 {
     QSettings *settings = Core::ICore::instance()->settings();
diff --git a/src/plugins/find/findtoolwindow.h b/src/plugins/find/findtoolwindow.h
index 52f0c1080ec08fc2023766cc3c722b174aaef408..d8a39cb058a121da667bb6eb6e97e0d72ee930f0 100644
--- a/src/plugins/find/findtoolwindow.h
+++ b/src/plugins/find/findtoolwindow.h
@@ -63,6 +63,7 @@ protected:
 private slots:
     void search();
     void replace();
+    void cancelSearch();
     void setCurrentFilter(int index);
     void updateButtonStates();
 
diff --git a/src/plugins/find/ifindfilter.h b/src/plugins/find/ifindfilter.h
index d45dc83a7c2fae6d17b0d801fe10219eb03e3b28..fef767f05f4c04cb1171217434f388de5b8277f2 100644
--- a/src/plugins/find/ifindfilter.h
+++ b/src/plugins/find/ifindfilter.h
@@ -52,7 +52,10 @@ public:
 
     virtual QString id() const = 0;
     virtual QString displayName() const = 0;
+    ///
     virtual bool isEnabled() const = 0;
+    virtual bool canCancel() const = 0;
+    virtual void cancel() = 0;
     virtual QKeySequence defaultShortcut() const { return QKeySequence(); }
     virtual bool isReplaceSupported() const { return false; }
     virtual FindFlags supportedFindFlags() const;
diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp
index 7360ade77129f5a8f9ba867571fee91e7519e6a8..6de00a8bc9a10ee192c832327a94a4f9743c2b74 100644
--- a/src/plugins/texteditor/basefilefind.cpp
+++ b/src/plugins/texteditor/basefilefind.cpp
@@ -70,6 +70,16 @@ bool BaseFileFind::isEnabled() const
     return !m_isSearching;
 }
 
+bool BaseFileFind::canCancel() const
+{
+    return m_isSearching;
+}
+
+void BaseFileFind::cancel()
+{
+    m_watcher.cancel();
+}
+
 QStringList BaseFileFind::fileNameFilters() const
 {
     QStringList filters;
diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h
index 1a26154d405a827373926e732f3e662680503324..b00c6a110c0e572d51f4b44a8ce1a974d4253b1b 100644
--- a/src/plugins/texteditor/basefilefind.h
+++ b/src/plugins/texteditor/basefilefind.h
@@ -62,6 +62,8 @@ public:
     explicit BaseFileFind(Find::SearchResultWindow *resultWindow);
 
     bool isEnabled() const;
+    bool canCancel() const;
+    void cancel();
     bool isReplaceSupported() const { return true; }
     void findAll(const QString &txt, Find::FindFlags findFlags);
     void replaceAll(const QString &txt, Find::FindFlags findFlags);