diff --git a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
index 2deffb5a05d616603b9b4e79e768f8dca914f2e1..db15335bc5f7492df9960a08fa395676b754ef46 100644
--- a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
+++ b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
@@ -39,10 +39,21 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window):
         cal_model = CalibrationModel()
         cal_view = CalibrationView(parent=self.tabs)
         self.calibration_presenter = CalibrationPresenter(cal_model, cal_view)
+        self.set_on_instrument_changed(self.calibration_presenter.set_instrument_override)
+        self.set_on_rb_num_changed(self.calibration_presenter.set_rb_number)
         self.tabs.addTab(cal_view, "Calibration")
 
     def set_on_help_clicked(self, slot):
         self.pushButton_help.clicked.connect(slot)
 
+    def set_on_rb_num_changed(self, slot):
+        self.lineEdit_RBNumber.textChanged.connect(slot)
+
+    def set_on_instrument_changed(self, slot):
+        self.comboBox_instrument.currentTextChanged.connect(slot)
+
     def open_help_window(self):
         InterfaceManager().showCustomInterfaceHelp(self.doc)
+
+    def get_rb_no(self):
+        return self.lineEdit_RBNumber.text()
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
index a032686f8b247ad16f03a56adf341d6638abcfe6..01be60fd3a104c4bb96ec49f710fdd6565667eeb 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
@@ -7,11 +7,15 @@
 
 from __future__ import (absolute_import, division, print_function)
 
+from os import path, makedirs
+from ntpath import basename
+
 from mantid.api import AnalysisDataService as Ads
 from mantid.kernel import logger
 from mantid.simpleapi import Load, EnggVanadiumCorrections, EnggCalibrate, DeleteWorkspace, CloneWorkspace, \
     CreateWorkspace, AppendSpectra
 from mantidqt.plotting.functions import plot
+from Engineering.EnggUtils import write_ENGINX_GSAS_iparam_file
 
 
 class CalibrationModel(object):
@@ -19,22 +23,38 @@ class CalibrationModel(object):
         self.VANADIUM_INPUT_WORKSPACE_NAME = "engggui_vanadium_ws"
         self.CURVES_WORKSPACE_NAME = "engggui_vanadium_curves"
         self.INTEGRATED_WORKSPACE_NAME = "engggui_vanadium_integration"
-
-    def create_new_calibration(self, vanadium_run_no, ceria_run_no, plot_output):
-        vanadium_corrections = self.calculate_vanadium_correction(vanadium_run_no)
+        self.out_files_root_dir = path.join(path.expanduser("~"), "Engineering_Mantid/")
+
+    def create_new_calibration(self,
+                               vanadium_path,
+                               ceria_path,
+                               plot_output,
+                               instrument,
+                               rb_num=None):
+        vanadium_corrections = self.calculate_vanadium_correction(vanadium_path)
         van_integration = vanadium_corrections[0]
         van_curves = vanadium_corrections[1]
-        ceria_workspace = self.load_ceria(ceria_run_no)
+        ceria_workspace = self.load_ceria(ceria_path)
         output = self.run_calibration(ceria_workspace, van_integration, van_curves)
         if plot_output:
-            self.plot_vanadium_curves()
+            self._plot_vanadium_curves()
             for i in range(2):
                 difc = [output[i].DIFC]
                 tzero = [output[i].TZERO]
                 self._plot_difc_zero(difc, tzero)
+        difc = [output[0].DIFC, output[1].DIFC]
+        tzero = [output[0].TZERO, output[1].TZERO]
+
+        calibration_dir = self.out_files_root_dir + "Calibration/"
+        self.create_output_files(calibration_dir, difc, tzero, ceria_path, vanadium_path,
+                                 instrument)
+        if rb_num:
+            calibration_dir = self.out_files_root_dir + "User/" + rb_num + "/Calibration/"
+            self.create_output_files(calibration_dir, difc, tzero, ceria_path, vanadium_path,
+                                     instrument)
 
     @staticmethod
-    def plot_vanadium_curves():
+    def _plot_vanadium_curves():
         van_curve_twin_ws = "__engggui_vanadium_curves_twin_ws"
 
         if Ads.doesExist(van_curve_twin_ws):
@@ -132,6 +152,53 @@ class CalibrationModel(object):
         curves_workspace = Ads.Instance().retrieve(self.CURVES_WORKSPACE_NAME)
         return integrated_workspace, curves_workspace
 
+    def create_output_files(self, calibration_dir, difc, tzero, ceria_path, vanadium_path,
+                            instrument):
+        if not path.exists(calibration_dir):
+            makedirs(calibration_dir)
+        filename, vanadium_no, ceria_no = self._generate_output_file_name(ceria_path,
+                                                                          vanadium_path,
+                                                                          instrument,
+                                                                          bank="all")
+        # Both Banks
+        file_path = calibration_dir + filename
+        write_ENGINX_GSAS_iparam_file(file_path,
+                                      difc,
+                                      tzero,
+                                      ceria_run=ceria_no,
+                                      vanadium_run=vanadium_no)
+        # North Bank
+        file_path = calibration_dir + self._generate_output_file_name(
+            ceria_path, vanadium_path, instrument, bank="north")[0]
+        write_ENGINX_GSAS_iparam_file(file_path, [difc[0]], [tzero[0]],
+                                      ceria_run=ceria_no,
+                                      vanadium_run=vanadium_no,
+                                      template_file="template_ENGINX_241391_236516_North_bank.prm",
+                                      bank_names=["North"])
+        # South Bank
+        file_path = calibration_dir + self._generate_output_file_name(
+            ceria_path, vanadium_path, instrument, bank="south")[0]
+        write_ENGINX_GSAS_iparam_file(file_path, [difc[1]], [tzero[1]],
+                                      ceria_run=ceria_no,
+                                      vanadium_run=vanadium_no,
+                                      template_file="template_ENGINX_241391_236516_South_bank.prm",
+                                      bank_names=["South"])
+
     @staticmethod
     def _generate_table_workspace_name(bank_num):
         return "engggui_calibration_bank_" + str(bank_num + 1)
+
+    @staticmethod
+    def _generate_output_file_name(ceria_path, vanadium_path, instrument, bank):
+        vanadium_no = path.splitext(basename(vanadium_path))[0].replace(instrument, '').lstrip('0')
+        ceria_no = path.splitext(basename(ceria_path))[0].replace(instrument, '').lstrip('0')
+        filename = instrument + "_" + vanadium_no + "_" + ceria_no + "_"
+        if bank == "all":
+            filename = filename + "all_banks.prm"
+        elif bank == "north":
+            filename = filename + "bank_North.prm"
+        elif bank == "south":
+            filename = filename + "bank_South.prm"
+        else:
+            raise ValueError("Invalid bank name entered")
+        return filename, vanadium_no, ceria_no
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
index b3adb63ee15c4ec7b035eb01cff27853326777fd..431b7ca9d93c559fd67cea90d628f41e1007a713 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
@@ -6,6 +6,9 @@
 # SPDX - License - Identifier: GPL - 3.0 +
 # pylint: disable=invalid-name
 from __future__ import (absolute_import, division, print_function)
+
+from qtpy import QtCore
+
 from mantidqt.utils.asynchronous import AsyncTask
 from mantid.simpleapi import logger
 
@@ -16,19 +19,37 @@ class CalibrationPresenter(object):
         self.view = view
         self.view.set_on_calibrate_clicked(self.on_calibrate_clicked)
         self.worker = None
+        self.instrument = "ENGINX"
+        self.rb_num = 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)
+        self.start_calibration_worker(vanadium_no, calib_no, plot_output, self.rb_num)
 
-    def start_calibration_worker(self, vanadium_no, calib_no, plot_output):
+    def start_calibration_worker(self, vanadium_no, calib_no, plot_output, rb_num):
         self.worker = AsyncTask(self.model.create_new_calibration, (vanadium_no, calib_no),
-                                {"plot_output": plot_output},
-                                error_cb=self._on_error)
+                                {"plot_output": plot_output, "instrument": self.instrument, "rb_num": rb_num},
+                                error_cb=self._on_error, finished_cb=self.calibration_finished)
         self.worker.start()
+        self.calibration_started()
+
+    def set_instrument_override(self, instrument):
+        self.view.set_instrument_override(instrument)
+        self.instrument = instrument
+
+    def set_rb_number(self, rb_number):
+        self.rb_num = rb_number
+
+    def calibration_started(self):
+        self.view.set_calibrate_button_enabled(False)
+        self.view.set_check_plot_output_enabled(False)
+
+    def calibration_finished(self):
+        self.view.set_calibrate_button_enabled(True)
+        self.view.set_check_plot_output_enabled(True)
 
-    @staticmethod
-    def _on_error(failure_info):
+    def _on_error(self, failure_info):
         logger.warning(str(failure_info))
+        self.calibration_finished()
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
index f66b5da29d8b0abbb14d2b301b949cc9fcb0bbed..4049f2461429a7ee364edc70714d7fb947f9f278 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py
@@ -34,3 +34,24 @@ class CalibrationPresenterTest(unittest.TestCase):
         # Then
         self.presenter.on_calibrate_clicked()
         worker_method.assert_called_with("307521", "305738", True)
+
+    def test_controls_disabled_while_running(self):
+        self.presenter = presenter.CalibrationPresenter(self.model, self.view)
+
+        self.presenter.calibration_started()
+
+        self.view.set_calibrate_button_enabled.assert_called_with(False)
+        self.view.set_check_plot_output_enabled.assert_called_with(False)
+
+    def test_controls_enabled_when_done_running(self):
+        self.presenter = presenter.CalibrationPresenter(self.model, self.view)
+
+        self.presenter.calibration_started()
+
+        self.view.set_calibrate_button_enabled.assert_called_with(False)
+        self.view.set_check_plot_output_enabled.assert_called_with(False)
+
+        self.presenter.calibration_finished()
+
+        self.view.set_calibrate_button_enabled.assert_called_with(True)
+        self.view.set_check_plot_output_enabled.assert_called_with(True)
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py
index c613620cd448734ddfa8fa636982ff44d0e5d9ac..95855bab1a8f0c012a095cbc83f4abaf46a43e36 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py
@@ -7,7 +7,6 @@
 # pylint: disable=invalid-name
 from __future__ import (absolute_import, division, print_function)
 from qtpy import QtWidgets
-from mantidqt.widgets.filefinder import FileFinder
 
 from mantidqt.utils.qt import load_ui
 
@@ -15,19 +14,29 @@ Ui_calib, _ = load_ui(__file__, "calibration_tab.ui")
 
 
 class CalibrationView(QtWidgets.QWidget, Ui_calib):
-    def __init__(self, parent=None):
+    def __init__(self, parent=None, instrument="ENGINX"):
         super(CalibrationView, self).__init__(parent)
         self.setupUi(self)
         self.finder_calib.setLabelText("Calibration Sample #")
-        self.finder_calib.setInstrumentOverride("ENGINX")
+        self.finder_calib.setInstrumentOverride(instrument)
 
         self.finder_vanadium.setLabelText("Vanadium #")
-        self.finder_vanadium.setInstrumentOverride("ENGINX")
+        self.finder_vanadium.setInstrumentOverride(instrument)
         self.setup_tabbing_order()
 
     def set_on_calibrate_clicked(self, slot):
         self.button_calibrate.clicked.connect(slot)
 
+    def set_calibrate_button_enabled(self, enabled):
+        self.button_calibrate.setEnabled(enabled)
+
+    def set_check_plot_output_enabled(self, enabled):
+        self.check_plotOutput.setEnabled(enabled)
+
+    def set_instrument_override(self, instrument):
+        self.finder_vanadium.setInstrumentOverride(instrument)
+        self.finder_calib.setInstrumentOverride(instrument)
+
     def get_vanadium_filename(self):
         return self.finder_vanadium.getFirstFilename()
 
@@ -37,6 +46,5 @@ class CalibrationView(QtWidgets.QWidget, Ui_calib):
     def get_plot_output(self):
         return self.check_plotOutput.isChecked()
 
-    def setup_tabbing_order(self):
-        # TODO
+    def setup_tabbing_order(self):  # TODO
         print()