diff --git a/qt/python/mantidqt/_common.sip b/qt/python/mantidqt/_common.sip
index 21157ef1a53467789f85b28e09ab0e3137511513..fba1e1c2e1bd3acd0c48948b588f75929d538061 100644
--- a/qt/python/mantidqt/_common.sip
+++ b/qt/python/mantidqt/_common.sip
@@ -833,10 +833,9 @@ public:
     double getParameter(const QString &paramName) const;
 };
 
-// ---
-//
-// ---
-
+// ---------------------------------
+// MWRunFiles
+// ---------------------------------
 class MWRunFiles : QWidget
 {
 %TypeHeaderCode
@@ -844,13 +843,18 @@ class MWRunFiles : QWidget
 %End
 public:
 MWRunFiles(QWidget *parent = nullptr);
+
+void setLabelText(const QString &text);
 void setLabelMinWidth(const int);
 void liveButtonSetChecked(bool);
 bool liveButtonIsChecked();
-QString getText() /PyName=text/;
+QString getText();
+QString getFirstFilename() const;
 bool isValid();
 void setUserInput(const QVariant &);
 void setText(const QString&);
+void setInstrumentOverride(const QString &instName);
+
 signals:
 void fileEditingFinished();
 void fileFindingFinished();
diff --git a/qt/python/mantidqt/utils/asynchronous.py b/qt/python/mantidqt/utils/asynchronous.py
index 1da5f09b4c7012688228fcba003b56a20c89bf70..44b87f2f5d097fa8fd46b51a72c341c1be51a165 100644
--- a/qt/python/mantidqt/utils/asynchronous.py
+++ b/qt/python/mantidqt/utils/asynchronous.py
@@ -58,7 +58,9 @@ class AsyncTask(threading.Thread):
         return time.time() - start
 
     def run(self):
-
+        """
+        DO NOT CALL DIRECTLY. Use .start() to begin the thread execution.
+        """
         time_start = time.time()
 
         try:
diff --git a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
index 6c7de92a3073d560db24b05e3b8a9fc3afde0755..7d4e6f65a8aa5f73e7aec133ad5082133c5d4b43 100644
--- a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
+++ b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
@@ -8,9 +8,11 @@
 from __future__ import (absolute_import, division, print_function)
 from qtpy import QtCore, QtWidgets
 
-from Engineering.gui.engineering_diffraction.tabs.calibration.presenter import CalibrationPresenter, CalibrationView, \
-    CalibrationModel
+from .tabs.calibration.presenter import CalibrationPresenter
+from .tabs.calibration.view import CalibrationView
+from .tabs.calibration.model import CalibrationModel
 
+from mantidqt.interfacemanager import InterfaceManager
 from mantidqt.utils.qt import load_ui
 
 Ui_main_window, _ = load_ui(__file__, "main_window.ui")
@@ -27,9 +29,18 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window):
         self.setupUi(self)
         self.tabs = self.tab_main
         self.setFocusPolicy(QtCore.Qt.StrongFocus)
+        self.calibration_presenter = None
 
-        # Calibration Tab
+        self.setup_calibration()
+
+    def setup_calibration(self):
         cal_model = CalibrationModel()
         cal_view = CalibrationView(parent=self.tabs)
         self.calibration_presenter = CalibrationPresenter(cal_model, cal_view)
         self.tabs.addTab(cal_view, "Calibration")
+
+    def on_help_clicked(self):
+        self.pushButton_help.connect(self.open_help_window)
+
+    def open_help_window(self):
+        InterfaceManager().showCustomInterfaceHelp(self.doc)
diff --git a/scripts/Engineering/gui/engineering_diffraction/main_window.ui b/scripts/Engineering/gui/engineering_diffraction/main_window.ui
index 9154ca2abfb63d1aa0563d66312811b28e437c42..b01ed27e38219c68a110ef6ff6cc6873702087a1 100644
--- a/scripts/Engineering/gui/engineering_diffraction/main_window.ui
+++ b/scripts/Engineering/gui/engineering_diffraction/main_window.ui
@@ -117,5 +117,22 @@
   </widget>
  </widget>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>pushButton_close</sender>
+   <signal>pressed()</signal>
+   <receiver>EngDIffMainGUI</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>589</x>
+     <y>174</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>319</x>
+     <y>98</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui
index b3a7a15d335510ad3d540c3224aba15e94995033..af73c8395d7d7e9417a450b1b596f4c074118868 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui
@@ -81,7 +81,7 @@ QGroupBox:title {
            <number>6</number>
           </property>
           <item row="6" column="0" colspan="2">
-           <widget class="QCheckBox" name="check_plotCalibWsp">
+           <widget class="QCheckBox" name="check_plotOutput">
             <property name="text">
              <string>Plot Calibrated Workspace</string>
             </property>
@@ -172,7 +172,7 @@ QGroupBox:title {
  </customwidgets>
  <tabstops>
   <tabstop>radio_newCalib</tabstop>
-  <tabstop>check_plotCalibWsp</tabstop>
+  <tabstop>check_plotOutput</tabstop>
   <tabstop>button_calibrate</tabstop>
  </tabstops>
  <resources/>
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
index 1ef299eabc490f4bec1deaf6ac183f5b1f68cc99..a032686f8b247ad16f03a56adf341d6638abcfe6 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
@@ -12,7 +12,6 @@ from mantid.kernel import logger
 from mantid.simpleapi import Load, EnggVanadiumCorrections, EnggCalibrate, DeleteWorkspace, CloneWorkspace, \
     CreateWorkspace, AppendSpectra
 from mantidqt.plotting.functions import plot
-from qtpy import QtCore
 
 
 class CalibrationModel(object):
@@ -26,11 +25,13 @@ class CalibrationModel(object):
         van_integration = vanadium_corrections[0]
         van_curves = vanadium_corrections[1]
         ceria_workspace = self.load_ceria(ceria_run_no)
-        difc, tzero = [0] * 2
-        self.run_calibration(ceria_workspace, van_integration, van_curves, difc, tzero)
+        output = self.run_calibration(ceria_workspace, van_integration, van_curves)
         if plot_output:
             self.plot_vanadium_curves()
-            self._plot_difc_zero(difc, tzero)
+            for i in range(2):
+                difc = [output[i].DIFC]
+                tzero = [output[i].TZERO]
+                self._plot_difc_zero(difc, tzero)
 
     @staticmethod
     def plot_vanadium_curves():
@@ -42,11 +43,13 @@ class CalibrationModel(object):
         van_curves_ws = Ads.retrieve(van_curve_twin_ws)
         for i in range(1, 3):
             if i == 1:
-                curve_plot_bank_1 = plot([van_curves_ws], [0, 1, 2]).activeLayer()
-                curve_plot_bank_1.setTitle("Engg GUI Vanadium Curves Bank 1")
+                curve_plot_bank_1 = plot([van_curves_ws], [0, 1, 2])
+                curve_plot_bank_1.gca().set_title("Engg GUI Vanadium Curves Bank 1")
+                curve_plot_bank_1.gca().legend(["Data", "Calc", "Diff"])
             if i == 2:
-                curve_plot_bank_2 = plot([van_curves_ws], [3, 4, 5]).activeLayer()
-                curve_plot_bank_2.setTitle("Engg GUI Vanadium Curves Bank 2")
+                curve_plot_bank_2 = plot([van_curves_ws], [3, 4, 5])
+                curve_plot_bank_2.gca().set_title("Engg GUI Vanadium Curves Bank 2")
+                curve_plot_bank_2.gca().legend(["Data", "Calc", "Diff"])
 
     @staticmethod
     def _plot_difc_zero(difc, tzero):
@@ -57,12 +60,8 @@ class CalibrationModel(object):
             y_val = []
             y2_val = []
 
-            if i == 1:
-                difc_to_plot = difc[0]
-                tzero_to_plot = tzero[0]
-            else:
-                difc_to_plot = difc[1]
-                tzero_to_plot = tzero[1]
+            difc_to_plot = difc[0]
+            tzero_to_plot = tzero[0]
 
             for irow in range(0, bank_ws.rowCount()):
                 x_val.append(bank_ws.cell(irow, 0))
@@ -83,14 +82,17 @@ class CalibrationModel(object):
             DeleteWorkspace(ws1)
             DeleteWorkspace(ws2)
 
-            difc_zero_ws = Ads.retreive(output_ws)
+            difc_zero_ws = Ads.retrieve(output_ws)
             # Create plot
-            difc_zero_plot = plot(difc_zero_ws, [0, 1]).activeLayer()
-            difc_zero_plot.setTitle("Engg Gui Difc Zero Peaks Bank " + str(i))
-            difc_zero_plot.setCurveTitle(0, "Peaks Fitted")
-            difc_zero_plot.setCurveTitle(1, "DifC/TZero Fitted Straight Line")
-            difc_zero_plot.xlabel("Expected Peaks Centre(dSpacing, A)")
-            difc_zero_plot.setCurveLineStyly(0, QtCore.Qt.DotLine)
+            difc_zero_plot = plot([difc_zero_ws], [0, 1],
+                                  plot_kwargs={
+                                      "linestyle": "--",
+                                      "marker": "o",
+                                      "markersize": "3"
+                                  })
+            difc_zero_plot.gca().set_title("Engg Gui Difc Zero Peaks Bank " + str(i))
+            difc_zero_plot.gca().legend(("Peaks Fitted", "DifC/TZero Fitted Straight Line"))
+            difc_zero_plot.gca().set_xlabel("Expected Peaks Centre(dSpacing, A)")
 
     def load_ceria(self, ceria_run_no):
         try:
@@ -102,17 +104,17 @@ class CalibrationModel(object):
                          " Please check also the previous log messages for details.")
             raise RuntimeError
 
-    def run_calibration(self, ceria_ws, van_integration, van_curves, difc, tzero):
+    def run_calibration(self, ceria_ws, van_integration, van_curves):
+        output = [None] * 2
         for i in range(2):
             table_name = self._generate_table_workspace_name(i)
-            EnggCalibrate(InputWorkspace=ceria_ws,
-                          VanIntegrationWorkspace=van_integration,
-                          VanCurvesWorkspace=van_curves,
-                          Bank=i,
-                          FittedPeaks=table_name,
-                          OutputParametersTableName=table_name,
-                          DIFC=difc[i],
-                          TZERO=tzero[i])
+            output[i] = EnggCalibrate(InputWorkspace=ceria_ws,
+                                      VanIntegrationWorkspace=van_integration,
+                                      VanCurvesWorkspace=van_curves,
+                                      Bank=str(i + 1),
+                                      FittedPeaks=table_name,
+                                      OutputParametersTableName=table_name)
+        return output
 
     def calculate_vanadium_correction(self, vanadium_run_no):
         try:
@@ -126,7 +128,7 @@ class CalibrationModel(object):
                                 OutIntegrationWorkspace=self.INTEGRATED_WORKSPACE_NAME,
                                 OutCurvesWorkspace=self.CURVES_WORKSPACE_NAME)
         Ads.remove(self.VANADIUM_INPUT_WORKSPACE_NAME)
-        integrated_workspace = Ads.Instance().retrive(self.INTEGRATED_WORKSPACE_NAME)
+        integrated_workspace = Ads.Instance().retrieve(self.INTEGRATED_WORKSPACE_NAME)
         curves_workspace = Ads.Instance().retrieve(self.CURVES_WORKSPACE_NAME)
         return integrated_workspace, curves_workspace
 
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
index d251e85d3a21c4a385175876e1f38d14d5d694ec..b3adb63ee15c4ec7b035eb01cff27853326777fd 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
@@ -6,15 +6,29 @@
 # SPDX - License - Identifier: GPL - 3.0 +
 # pylint: disable=invalid-name
 from __future__ import (absolute_import, division, print_function)
-
-from Engineering.gui.engineering_diffraction.tabs.calibration.model import CalibrationModel
-from Engineering.gui.engineering_diffraction.tabs.calibration.view import CalibrationView
+from mantidqt.utils.asynchronous import AsyncTask
+from mantid.simpleapi import logger
 
 
 class CalibrationPresenter(object):
     def __init__(self, model, view):
         self.model = model
         self.view = view
+        self.view.set_on_calibrate_clicked(self.on_calibrate_clicked)
+        self.worker = None
 
+    def on_calibrate_clicked(self):
+        vanadium_no = self.view.get_vanadium_filename()
+        calib_no = self.view.get_calib_filename()
+        plot_output = self.view.get_plot_output()
+        self.start_calibration_worker(vanadium_no, calib_no, plot_output)
 
+    def start_calibration_worker(self, vanadium_no, calib_no, plot_output):
+        self.worker = AsyncTask(self.model.create_new_calibration, (vanadium_no, calib_no),
+                                {"plot_output": plot_output},
+                                error_cb=self._on_error)
+        self.worker.start()
 
+    @staticmethod
+    def _on_error(failure_info):
+        logger.warning(str(failure_info))
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py
index e1ae5491361bf1cad6c6346b0fd783e6eade42c6..1189f5b1f6ac18becd3db8df0a3612cb4b78a505 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py
@@ -9,7 +9,7 @@ from __future__ import (absolute_import, division, print_function)
 
 import unittest
 
-from mantid.py3compat.mock import patch, MagicMock
+from mantid.py3compat.mock import patch
 from Engineering.gui.engineering_diffraction.tabs.calibration.model import CalibrationModel
 
 VANADIUM_NUMBER = 307521
@@ -53,7 +53,7 @@ class CalibrationModelTest(unittest.TestCase):
         plot_difc_zero.assert_not_called()
         self.model.create_new_calibration(VANADIUM_NUMBER, CERIUM_NUMBER, True)
         plot_van.assert_called_once()
-        plot_difc_zero.assert_called_once()
+        self.assertEqual(plot_difc_zero.call_count, 2)
 
 
 if __name__ == '__main__':
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py
new file mode 100644
index 0000000000000000000000000000000000000000..f66b5da29d8b0abbb14d2b301b949cc9fcb0bbed
--- /dev/null
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py
@@ -0,0 +1,36 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright &copy; 2018 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, division, print_function)
+
+import unittest
+
+from mantid.py3compat.mock import patch
+from mantid.py3compat import mock
+from Engineering.gui.engineering_diffraction.tabs.calibration import view, model, presenter
+
+tab_path = 'Engineering.gui.engineering_diffraction.tabs.calibration'
+
+
+class CalibrationPresenterTest(unittest.TestCase):
+    def setUp(self):
+        self.view = mock.create_autospec(view.CalibrationView)
+        self.model = mock.create_autospec(model.CalibrationModel)
+
+    @patch(tab_path + ".presenter.CalibrationPresenter.start_calibration_worker")
+    def test_worker_started_with_right_params(self, worker_method):
+        # Given
+        self.presenter = presenter.CalibrationPresenter(self.model, self.view)
+
+        # When
+        self.view.get_vanadium_filename.return_value = "307521"
+        self.view.get_calib_filename.return_value = "305738"
+        self.view.get_plot_output.return_value = True
+
+        # Then
+        self.presenter.on_calibrate_clicked()
+        worker_method.assert_called_with("307521", "305738", True)
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py
index 8bb820f371e562d7f99656ac6079841827481172..c613620cd448734ddfa8fa636982ff44d0e5d9ac 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py
@@ -18,13 +18,25 @@ class CalibrationView(QtWidgets.QWidget, Ui_calib):
     def __init__(self, parent=None):
         super(CalibrationView, self).__init__(parent)
         self.setupUi(self)
+        self.finder_calib.setLabelText("Calibration Sample #")
+        self.finder_calib.setInstrumentOverride("ENGINX")
 
-    def on_browse_vanadium_clicked(self, slot):
-        self.button_browseVanadium.clicked.connect(slot)
+        self.finder_vanadium.setLabelText("Vanadium #")
+        self.finder_vanadium.setInstrumentOverride("ENGINX")
+        self.setup_tabbing_order()
 
+    def set_on_calibrate_clicked(self, slot):
+        self.button_calibrate.clicked.connect(slot)
 
-    def on_browse_calibration_clicked(self, slot):
-        self.button_browseCalib.clicked.connect(slot)
+    def get_vanadium_filename(self):
+        return self.finder_vanadium.getFirstFilename()
 
-    def on_calibrate_clicked(self, slot):
-        self.button_calibrate.clicked.connect(slot)
+    def get_calib_filename(self):
+        return self.finder_calib.getFirstFilename()
+
+    def get_plot_output(self):
+        return self.check_plotOutput.isChecked()
+
+    def setup_tabbing_order(self):
+        # TODO
+        print()