diff --git a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
index 5d22268cef13ddf4c19ff241778eb1f4d3aba9ee..0c19119925da1001bfd9cb4bb183da8a92c95376 100644
--- a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
+++ b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
@@ -33,6 +33,7 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window):
         self.calibration_presenter = None
         self.set_on_help_clicked(self.open_help_window)
 
+        # Setup Tabs
         self.setup_calibration()
 
     def setup_calibration(self):
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py
index be536df1f753cad588066deb7a1b4615e65be2bd..b7fd4c60d96aea38090ad3ce84ae350ecd9d8643 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py
@@ -7,7 +7,46 @@
 
 from __future__ import (absolute_import, division, print_function)
 
+from Engineering.gui.engineering_diffraction.tabs.common import vanadium_corrections
+from mantid.simpleapi import EnggFocus, Load, logger
+
+SAMPLE_RUN_WORKSPACE_NAME = "engggui_focusing_input_ws"
+FOCUSED_OUTPUT_WORKSPACE_NAME = "engggui_focusing_output_ws_bank_"
+
 
 class FocusModel(object):
-    def focus_run(self, run_number, banks, plot_output, instrument, rb_number):
-        pass
+    def focus_run(self, sample_path, banks, plot_output, instrument, rb_number, current_calib):
+        vanadium_path = current_calib["vanadium_path"]
+        if vanadium_path is None:
+            return
+        integration_workspace, curves_workspace = vanadium_corrections.fetch_correction_workspaces(
+            vanadium_path, instrument)
+        sample_workspace = self._load_focus_sample_run(sample_path)
+        for name in banks:
+            output_workspace_name = FOCUSED_OUTPUT_WORKSPACE_NAME + str(name)
+            self._run_focus(sample_workspace, output_workspace_name, integration_workspace, curves_workspace, name)
+
+    @staticmethod
+    def _run_focus(input_workspace, output_workspace, vanadium_integration_ws,
+                   vanadium_curves_ws, bank):
+        try:
+            return EnggFocus(InputWorkspace=input_workspace,
+                             OutputWorkspace=output_workspace,
+                             VanIntegrationWorkspace=vanadium_integration_ws,
+                             VanCurvesWorkspace=vanadium_curves_ws,
+                             Bank=bank)
+        except RuntimeError as e:
+            logger.error(
+                "Error in focusing, Could not run the EnggFocus algorithm successfully for bank " +
+                str(bank) + ". Error Description: " + str(e))
+            raise RuntimeError()
+
+    @staticmethod
+    def _load_focus_sample_run(sample_path):
+        try:
+            return Load(Filename=sample_path, OutputWorkspace=SAMPLE_RUN_WORKSPACE_NAME)
+        except RuntimeError as e:
+            logger.error(
+                "Error while loading sample data for focusing. Could not load the sample with filename: "
+                + sample_path + ". Error Description: " + str(e))
+            raise RuntimeError
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3257003c89eb14bf09bb973ac04baf2452a80f91 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py
@@ -0,0 +1,51 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright © 2019 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 Engineering.gui.engineering_diffraction.tabs.focus import model
+
+file_path = "Engineering.gui.engineering_diffraction.tabs.focus.model"
+
+
+class FocusModelTest(unittest.TestCase):
+    def setUp(self):
+        self.model = model.FocusModel()
+        self.current_calibration = {
+            "vanadium_path": "/mocked/out/anyway",
+            "ceria_path": "this_is_mocked_out_too"
+        }
+
+    @patch(file_path + ".vanadium_corrections.fetch_correction_workspaces")
+    def test_fails_on_invalid_sample_number(self, fetch_van):
+        fetch_van.return_value = ("mocked_integ", "mocked_curves")
+        self.assertRaises(ValueError, self.model.focus_run, "FAIL", ["1", "2"], False, "ENGINX",
+                          "0", self.current_calibration)
+        fetch_van.assert_called_with("/mocked/out/anyway", "ENGINX")
+
+    @patch(file_path + ".vanadium_corrections.fetch_correction_workspaces")
+    def test_focus_cancelled_when_calibration_is_not_set(self, fetch_van):
+        fetch_van.return_value = ("mocked_integ", "mocked_curves")
+        blank_calibration = {"vanadium_path": None, "ceria_path": None}
+        self.model.focus_run("305761", ["1", "2"], False, "ENGINX", "0", blank_calibration)
+        self.assertEqual(fetch_van.call_count, 0)
+
+    @patch(file_path + ".FocusModel._run_focus")
+    @patch(file_path + ".FocusModel._load_focus_sample_run")
+    @patch(file_path + ".vanadium_corrections.fetch_correction_workspaces")
+    def test_focus_run_for_each_bank(self, fetch_van, load_focus, run_focus):
+        fetch_van.return_value = ("mocked_integ", "mocked_curves")
+        banks = ["1", "2"]
+        load_focus.return_value = "mocked_sample"
+        self.model.focus_run("305761", banks, False, "ENGINX", "0", self.current_calibration)
+        self.assertEqual(len(banks), run_focus.call_count)
+        run_focus.assert_called_with("mocked_sample",
+                                     model.FOCUSED_OUTPUT_WORKSPACE_NAME + banks[-1],
+                                     "mocked_integ", "mocked_curves", banks[-1])