diff --git a/docs/source/release/v4.3.0/mantidworkbench.rst b/docs/source/release/v4.3.0/mantidworkbench.rst
index 98ce09c660f4c32455de321f74c518b077578646..e6e7e049db919ca8e095462563cb274263d53b0e 100644
--- a/docs/source/release/v4.3.0/mantidworkbench.rst
+++ b/docs/source/release/v4.3.0/mantidworkbench.rst
@@ -38,6 +38,7 @@ Improvements
 - Most changes in the settings dialog now take place immediately, no longer needing a restart, such as hiding algorithm categories, interfaces or choosing wether to see invisible workspaces.
 - A warning now appears if you attempt to plot more than ten spectra.
 - The Save menu action in the workspaces toolbox to save using version 1 of the SaveAscii algorithm has been removed as no one was using it and it only added confusion. The option to save using the most recent version of SaveASCII is still available.
+- You can now search for functions when doing fits.
 
 Bugfixes
 ########
diff --git a/qt/python/CMakeLists.txt b/qt/python/CMakeLists.txt
index bb453e4c5d77a887550fb574a63b5ff8006f5cea..88c5126d5b5a36a7707dafcd8bd3d410deea5967 100644
--- a/qt/python/CMakeLists.txt
+++ b/qt/python/CMakeLists.txt
@@ -123,6 +123,7 @@ if(ENABLE_WORKBENCH OR ENABLE_WORKBENCH)
       mantidqt/widgets/codeeditor/test/test_multifileinterpreter_view.py
       mantidqt/widgets/codeeditor/tab_widget/test/test_codeeditor_tab_presenter.py
       mantidqt/widgets/codeeditor/tab_widget/test/test_codeeditor_tab_view.py
+      mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py
       mantidqt/widgets/instrumentview/test/test_instrumentview_io.py
       mantidqt/widgets/instrumentview/test/test_instrumentview_view.py
       mantidqt/widgets/plotconfigdialog/axestabwidget/test/test_axestabwidgetpresenter.py
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/__init__.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..cdadea372702cb5d5c37052c46409724f35825c9
--- /dev/null
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/__init__.py
@@ -0,0 +1,9 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright © 2020 ISIS Rutherford Appleton Laboratory UKRI,
+#     NScD Oak Ridge National Laboratory, European Spallation Source
+#     & Institut Laue - Langevin
+# SPDX - License - Identifier: GPL - 3.0 +
+#  This file is part of the mantidqt package
+#
+#
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/add_function_dialog.ui b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/add_function_dialog.ui
new file mode 100644
index 0000000000000000000000000000000000000000..56f0cf8009ecbc7745d3ee1f394c01f973cd884d
--- /dev/null
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/add_function_dialog.ui
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="windowModality">
+   <enum>Qt::WindowModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>254</width>
+    <height>89</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Fit</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="errorMessage">
+     <property name="text">
+      <string/>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <widget class="QLabel" name="functionLabel">
+       <property name="text">
+        <string> Select function</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="functionBox">
+       <property name="editable">
+        <bool>true</bool>
+       </property>
+       <property name="insertPolicy">
+        <enum>QComboBox::NoInsert</enum>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Dialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/presenter.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/presenter.py
new file mode 100644
index 0000000000000000000000000000000000000000..73b6b8d98d23550afd42ee641af2999680d720a5
--- /dev/null
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/presenter.py
@@ -0,0 +1,27 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright &copy; 2020 ISIS Rutherford Appleton Laboratory UKRI,
+#     NScD Oak Ridge National Laboratory, European Spallation Source
+#     & Institut Laue - Langevin
+# SPDX - License - Identifier: GPL - 3.0 +
+from __future__ import (absolute_import, unicode_literals)
+
+from .view import AddFunctionDialogView
+
+
+class AddFunctionDialog(object):
+    """
+    Dialog to add function to fit property browser
+    """
+
+    def __init__(self, parent = None, function_names = None, view=None):
+        self.view = view if view else AddFunctionDialogView(parent, function_names)
+        self.view.ui.buttonBox.accepted.connect(lambda: self.action_add_function())
+
+    def action_add_function(self):
+        current_function = self.view.ui.functionBox.currentText()
+        if self.view.is_text_in_function_list(current_function):
+            self.view.function_added.emit(current_function)
+            self.view.accept()
+        else:
+            self.view.set_error_message("Function %s not found " % current_function)
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/__init__.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..cdadea372702cb5d5c37052c46409724f35825c9
--- /dev/null
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/__init__.py
@@ -0,0 +1,9 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright &copy; 2020 ISIS Rutherford Appleton Laboratory UKRI,
+#     NScD Oak Ridge National Laboratory, European Spallation Source
+#     & Institut Laue - Langevin
+# SPDX - License - Identifier: GPL - 3.0 +
+#  This file is part of the mantidqt package
+#
+#
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py
new file mode 100644
index 0000000000000000000000000000000000000000..b954e15eb25373eb6c74b91fdc88920e59a1a0ef
--- /dev/null
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py
@@ -0,0 +1,40 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright &copy; 2020 ISIS Rutherford Appleton Laboratory UKRI,
+#     NScD Oak Ridge National Laboratory, European Spallation Source
+#     & Institut Laue - Langevin
+# SPDX - License - Identifier: GPL - 3.0 +
+#  This file is part of the mantid workbench.
+
+import unittest
+
+from mantid.py3compat.mock import patch
+from mantidqt.widgets.fitpropertybrowser.addfunctiondialog.presenter import AddFunctionDialog
+from testhelpers import assertRaisesNothing
+
+
+@patch('mantidqt.widgets.fitpropertybrowser.addfunctiondialog.view.AddFunctionDialogView')
+class AddFunctionDialogPresenterTest(unittest.TestCase):
+
+    def test_initialization_does_not_raise(self, mock_view):
+        assertRaisesNothing(self, AddFunctionDialog, view=mock_view)
+
+    def test_add_function(self, mock_view):
+        dialog = AddFunctionDialog(view=mock_view)
+        with patch.object(mock_view.ui.functionBox, 'currentText', lambda: "Gaussian"):
+            with patch.object(mock_view, 'is_text_in_function_list', lambda x: True):
+                dialog.action_add_function()
+                mock_view.function_added.emit.assert_called_once_with("Gaussian")
+                self.assertEqual(1, dialog.view.accept.call_count)
+
+    def test_add_function_give_error_if_function_not_valid(self, mock_view):
+        dialog = AddFunctionDialog(view=mock_view)
+        with patch.object(mock_view, 'is_text_in_function_list', lambda x: False):
+            dialog.action_add_function()
+            self.assertEqual(1, dialog.view.set_error_message.call_count)
+            self.assertEqual(0, mock_view.function_added.emit.call_count)
+            self.assertEqual(0, dialog.view.accept.call_count)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/view.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/view.py
new file mode 100644
index 0000000000000000000000000000000000000000..a01676c6f8f125c58503a3ff1e18767e625f5bd6
--- /dev/null
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/view.py
@@ -0,0 +1,39 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright &copy; 2020 ISIS Rutherford Appleton Laboratory UKRI,
+#     NScD Oak Ridge National Laboratory, European Spallation Source
+#     & Institut Laue - Langevin
+# SPDX - License - Identifier: GPL - 3.0 +
+from __future__ import (absolute_import, unicode_literals)
+
+from qtpy.QtCore import Qt, Signal
+from qtpy.QtGui import QIcon
+from qtpy.QtWidgets import QCompleter, QDialog
+
+from mantidqt.utils.qt import load_ui
+
+
+class AddFunctionDialogView(QDialog):
+    function_added = Signal(str)
+
+    def __init__(self, parent = None, function_names = None):
+        super(AddFunctionDialogView, self).__init__(parent)
+        self.setWindowIcon(QIcon(':/images/MantidIcon.ico'))
+        self.setAttribute(Qt.WA_DeleteOnClose, True)
+        self._setup_ui(function_names)
+
+    def _setup_ui(self, function_names):
+        self.ui = load_ui(__file__, 'add_function_dialog.ui', self)
+        function_box = self.ui.functionBox
+        if function_names:
+            self.ui.functionBox.addItems(function_names)
+        function_box.completer().setCompletionMode(QCompleter.PopupCompletion)
+        function_box.completer().setFilterMode(Qt.MatchContains)
+        self.ui.errorMessage.hide()
+
+    def is_text_in_function_list(self, function):
+        return self.ui.functionBox.findText(function, Qt.MatchExactly) != -1
+
+    def set_error_message(self, text):
+        self.ui.errorMessage.setText("<span style='color:red'> %s </span>" % text)
+        self.ui.errorMessage.show()
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py b/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py
index 94c72200508840dcf1828695d5b08e14879c0113..721a492aa77270ce45c930a5f1e66c3cc1b8fc7e 100644
--- a/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py
@@ -7,10 +7,10 @@
 from __future__ import (absolute_import, unicode_literals)
 
 from qtpy.QtCore import QObject, Signal, Slot
-from qtpy.QtWidgets import QInputDialog
 
 from mantidqt.plotting.markers import PeakMarker, RangeMarker
 from .mouse_state_machine import StateMachine
+from .addfunctiondialog.presenter import AddFunctionDialog
 
 
 class FitInteractiveTool(QObject):
@@ -202,33 +202,32 @@ class FitInteractiveTool(QObject):
         A QAction callback. Start a dialog to choose a peak function name. After that the tool will expect the user
         to click on the canvas to where the peak should be placed.
         """
-        selected_name = QInputDialog.getItem(self.canvas, 'Fit', 'Select peak function', self.peak_names,
-                                             self.peak_names.index(self.current_peak_type), False)
-        if selected_name[1]:
-            self.peak_type_changed.emit(selected_name[0])
-            self.mouse_state.transition_to('add_peak')
+        dialog = AddFunctionDialog(self.canvas, self.peak_names)
+        dialog.view.ui.functionBox.setCurrentText(self.current_peak_type)
+        dialog.view.function_added.connect(self.action_peak_added)
+        dialog.view.open()
+
+    def action_peak_added(self, function_name):
+        self.peak_type_changed.emit(function_name)
+        self.mouse_state.transition_to('add_peak')
 
     def add_background_dialog(self):
         """
         A QAction callback. Start a dialog to choose a background function name. The new function is added to the
         browser.
         """
-        current_index = self.background_names.index(self.default_background)
-        if current_index < 0:
-            current_index = 0
-        selected_name = QInputDialog.getItem(self.canvas, 'Fit', 'Select background function', self.background_names,
-                                             current_index, False)
-        if selected_name[1]:
-            self.add_background_requested.emit(selected_name[0])
+        dialog = AddFunctionDialog(self.canvas, self.background_names)
+        dialog.view.function_added.connect(self.add_background_requested)
+        dialog.view.open()
 
     def add_other_dialog(self):
         """
         A QAction callback. Start a dialog to choose a name of a function except a peak or a background. The new
         function is added to the browser.
         """
-        selected_name = QInputDialog.getItem(self.canvas, 'Fit', 'Select function', self.other_names, 0, False)
-        if selected_name[1]:
-            self.add_other_requested.emit(selected_name[0])
+        dialog = AddFunctionDialog(self.canvas, self.other_names)
+        dialog.view.function_added.connect(self.add_other_requested)
+        dialog.view.open()
 
     def add_peak_marker(self, x, y_top, y_bottom=0.0, fwhm=None):
         """
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h
index 6dd0cb89943d3c9639ab097702916b0f97c1afaa..9402b621ddb22e8a79d1f8233a4773d7a543ffe2 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h
@@ -13,6 +13,7 @@
 #include "DllOption.h"
 
 #include <QDialog>
+#include <QTreeWidgetItem>
 #include <map>
 
 namespace Ui {
@@ -37,6 +38,8 @@ public:
   ~SelectFunctionDialog() override;
   /// Return selected function
   QString getFunction() const;
+  /// Clear the text in the search box
+  void clearSearchBoxText() const;
 
 protected:
   /// Ui elements form
@@ -48,6 +51,12 @@ private:
   constructFunctionTree(const std::map<std::string, std::vector<std::string>>
                             &categoryFunctionsMap,
                         const std::vector<std::string> &restrictions);
+
+private slots:
+  void searchBoxChanged(const QString &text);
+  void functionDoubleClicked(QTreeWidgetItem *item);
+  void acceptFunction();
+  void rejectFunction();
 };
 
 } // namespace MantidWidgets
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui
index 3b45639cc8989f39122b5501f8f1f42c8d15dd9e..59f208a030218fadb3c2227b324177eef0aa4923 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui
@@ -15,14 +15,45 @@
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <widget class="QTreeWidget" name="fitTree">
-     <column>
-      <property name="text">
-       <string>Fit - Select function type</string>
-      </property>
-     </column>
+    <widget class="QLabel" name="errorMessage">
+     <property name="text">
+      <string/>
+     </property>
     </widget>
    </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Fit - Select function type</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="searchBox">
+       <property name="editable">
+        <bool>true</bool>
+       </property>
+       <property name="insertPolicy">
+        <enum>QComboBox::NoInsert</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QTreeWidget" name="fitTree">
+       <attribute name="headerVisible">
+        <bool>false</bool>
+       </attribute>
+       <column>
+        <property name="text">
+         <string notr="true">1</string>
+        </property>
+       </column>
+      </widget>
+     </item>
+    </layout>
+   </item>
    <item>
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
@@ -37,22 +68,6 @@
  </widget>
  <resources/>
  <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>SelectFunctionDialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
   <connection>
    <sender>buttonBox</sender>
    <signal>rejected()</signal>
diff --git a/qt/widgets/common/src/FitPropertyBrowser.cpp b/qt/widgets/common/src/FitPropertyBrowser.cpp
index 763326d7962cd2de3aca1ed55ff4b0a7a07985aa..4c50a0663106e5a62cb3b11982ec994bef9baf1a 100644
--- a/qt/widgets/common/src/FitPropertyBrowser.cpp
+++ b/qt/widgets/common/src/FitPropertyBrowser.cpp
@@ -757,6 +757,9 @@ void FitPropertyBrowser::acceptFit() {
   if (!cf)
     return;
   auto function = m_fitSelector->getFunction();
+  if (function.isEmpty()) {
+    return;
+  }
   PropertyHandler *h = getHandler()->findHandler(cf);
   h->addFunction(function.toStdString());
   emit functionChanged();
diff --git a/qt/widgets/common/src/FunctionTreeView.cpp b/qt/widgets/common/src/FunctionTreeView.cpp
index df5efa6c406da63fb940fec37e24fbb41b124240..748715f2c85fc2ed70abfe5825e2e9119f108874 100644
--- a/qt/widgets/common/src/FunctionTreeView.cpp
+++ b/qt/widgets/common/src/FunctionTreeView.cpp
@@ -1170,6 +1170,7 @@ void FunctionTreeView::addFunctionBegin() {
     connect(m_selectFunctionDialog, SIGNAL(finished(int)), this,
             SLOT(addFunctionEnd(int)));
   }
+  m_selectFunctionDialog->clearSearchBoxText();
   m_selectedFunctionProperty = prop;
   m_selectFunctionDialog->open();
 }
diff --git a/qt/widgets/common/src/SelectFunctionDialog.cpp b/qt/widgets/common/src/SelectFunctionDialog.cpp
index b5bd7db0180807a66386964512422aab666b8f3a..53112a174a48b8b152b2a94ba698f76e32577832 100644
--- a/qt/widgets/common/src/SelectFunctionDialog.cpp
+++ b/qt/widgets/common/src/SelectFunctionDialog.cpp
@@ -18,8 +18,10 @@
 #include <QButtonGroup>
 #include <QCheckBox>
 #include <QComboBox>
+#include <QCompleter>
 #include <QGridLayout>
 #include <QGroupBox>
+#include <QIcon>
 #include <QLabel>
 #include <QPushButton>
 #include <QVBoxLayout>
@@ -42,7 +44,10 @@ SelectFunctionDialog::SelectFunctionDialog(QWidget *parent)
 SelectFunctionDialog::SelectFunctionDialog(
     QWidget *parent, const std::vector<std::string> &restrictions)
     : QDialog(parent), m_form(new Ui::SelectFunctionDialog) {
+  setWindowModality(Qt::WindowModal);
+  setWindowIcon(QIcon(":/images/MantidIcon.ico"));
   m_form->setupUi(this);
+  m_form->errorMessage->hide();
 
   auto &factory = Mantid::API::FunctionFactory::Instance();
   auto registeredFunctions = factory.getFunctionNamesGUI();
@@ -60,13 +65,27 @@ SelectFunctionDialog::SelectFunctionDialog(
     }
   }
 
+  // Set up the search box
+  m_form->searchBox->completer()->setCompletionMode(
+      QCompleter::PopupCompletion);
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
+  m_form->searchBox->completer()->setFilterMode(Qt::MatchContains);
+#endif
+  connect(m_form->searchBox, SIGNAL(editTextChanged(const QString &)), this,
+          SLOT(searchBoxChanged(const QString &)));
+
   // Construct the QTreeWidget based on the map information of categories and
   // their respective fit functions.
   constructFunctionTree(categories, restrictions);
 
   connect(m_form->fitTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
-          this, SLOT(accept()));
+          this, SLOT(functionDoubleClicked(QTreeWidgetItem *)));
   m_form->fitTree->setToolTip("Select a function type and press OK.");
+
+  connect(m_form->buttonBox, SIGNAL(accepted()), this, SLOT(acceptFunction()));
+  connect(m_form->buttonBox, SIGNAL(rejected()), this, SLOT(rejectFunction()));
+
+  m_form->searchBox->setCurrentIndex(-1);
 }
 
 /**
@@ -106,6 +125,7 @@ void SelectFunctionDialog::constructFunctionTree(
           for (const auto &function : entry.second) {
             QTreeWidgetItem *fit = new QTreeWidgetItem(catItem);
             fit->setText(0, QString::fromStdString(function));
+            m_form->searchBox->addItem(QString::fromStdString(function));
           }
         }
       } else {
@@ -141,6 +161,7 @@ void SelectFunctionDialog::constructFunctionTree(
               for (const auto &function : entry.second) {
                 QTreeWidgetItem *fit = new QTreeWidgetItem(catItem);
                 fit->setText(0, QString::fromStdString(function));
+                m_form->searchBox->addItem(QString::fromStdString(function));
               }
             }
           }
@@ -156,16 +177,54 @@ SelectFunctionDialog::~SelectFunctionDialog() { delete m_form; }
  * Return selected function
  */
 QString SelectFunctionDialog::getFunction() const {
+  const auto searchText = m_form->searchBox->currentText();
   QList<QTreeWidgetItem *> items(m_form->fitTree->selectedItems());
-  if (items.size() != 1) {
-    return "";
+  if (items.size() == 1 && items[0]->childCount() == 0) {
+    return items[0]->text(0);
+  } else if (m_form->searchBox->findText(searchText) >= 0) {
+    return searchText;
   }
+  return "";
+}
 
-  if (items[0]->parent() == nullptr) {
-    return "";
+void SelectFunctionDialog::clearSearchBoxText() const {
+  m_form->searchBox->clearEditText();
+}
+
+/**
+ * Called when the text in the search box changes
+ */
+void SelectFunctionDialog::searchBoxChanged(const QString &text) {
+  if (text.isEmpty()) {
+    return;
   }
+  m_form->fitTree->setCurrentIndex(QModelIndex());
+
+  const auto index = m_form->searchBox->findText(text);
+  if (index >= 0)
+    m_form->searchBox->setCurrentIndex(index);
+}
+
+void SelectFunctionDialog::functionDoubleClicked(QTreeWidgetItem *item) {
+  if (item->childCount() == 0)
+    acceptFunction();
+}
+
+void SelectFunctionDialog::acceptFunction() {
+  const auto func = getFunction();
+  if (func.isEmpty()) {
+    m_form->errorMessage->setText(
+        QString("<span style='color:red'> Function  not found</span> "));
+    m_form->errorMessage->show();
+  } else {
+    m_form->errorMessage->hide();
+    accept();
+  }
+}
 
-  return items[0]->text(0);
+void SelectFunctionDialog::rejectFunction() {
+  m_form->errorMessage->hide();
+  reject();
 }
 
 } // namespace MantidWidgets