diff --git a/qt/python/mantidqt/widgets/algorithmselector/widget.py b/qt/python/mantidqt/widgets/algorithmselector/widget.py
index c045540ea589d5aa3f914c61c09e0cca6a4732e8..0621d996bb685fd6577c610d77b2cdf7f814fef8 100644
--- a/qt/python/mantidqt/widgets/algorithmselector/widget.py
+++ b/qt/python/mantidqt/widgets/algorithmselector/widget.py
@@ -170,7 +170,7 @@ class AlgorithmSelectorWidget(IAlgorithmSelectorView, QWidget):
     def _on_search_box_selection_changed(self, text):
         """
         Called when text in the search box is changed by the user or script.
-        :param text: New text in the search box.
+        :param text: New text in the search box .
         """
         # if the function is called without text, avoid doing anything
         if text == '':
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h
index 6dd0cb89943d3c9639ab097702916b0f97c1afaa..e92ef5133a1039272a9528fa85c778994bed5cf7 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.h
@@ -37,6 +37,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 +50,9 @@ 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);
 };
 
 } // namespace MantidWidgets
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui
index 3b45639cc8989f39122b5501f8f1f42c8d15dd9e..9d941b7e3df2f24fc64826e685b208a3dc1eacfe 100644
--- a/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/SelectFunctionDialog.ui
@@ -15,13 +15,37 @@
   </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>
+    <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">
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..05d920087844e1f9d871b87661f4458d21372fd9 100644
--- a/qt/widgets/common/src/SelectFunctionDialog.cpp
+++ b/qt/widgets/common/src/SelectFunctionDialog.cpp
@@ -18,6 +18,7 @@
 #include <QButtonGroup>
 #include <QCheckBox>
 #include <QComboBox>
+#include <QCompleter>
 #include <QGridLayout>
 #include <QGroupBox>
 #include <QLabel>
@@ -60,6 +61,15 @@ 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);
@@ -67,6 +77,8 @@ SelectFunctionDialog::SelectFunctionDialog(
   connect(m_form->fitTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
           this, SLOT(accept()));
   m_form->fitTree->setToolTip("Select a function type and press OK.");
+
+  m_form->searchBox->setCurrentIndex(-1);
 }
 
 /**
@@ -106,6 +118,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 +154,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 +170,32 @@ 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]->parent() != nullptr) {
+    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());
 
-  return items[0]->text(0);
+  const auto index = m_form->searchBox->findText(text);
+  if (index >= 0)
+    m_form->searchBox->setCurrentIndex(index);
 }
 
 } // namespace MantidWidgets