diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
index d6d0c8cbad25b8bc1ec2fd15019f9de4648313e3..75bc5735c66b2628039c38a4ddacb909b8037f45 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py
@@ -15,6 +15,8 @@ from mantid.simpleapi import Load, EnggVanadiumCorrections, EnggCalibrate, Delet
     CreateWorkspace, AppendSpectra, CreateEmptyTableWorkspace
 from mantidqt.plotting.functions import plot
 from Engineering.EnggUtils import write_ENGINX_GSAS_iparam_file
+from Engineering.gui.engineering_diffraction.tabs.common import vanadium_corrections
+from Engineering.gui.engineering_diffraction.tabs.common import path_handling
 
 
 VANADIUM_INPUT_WORKSPACE_NAME = "engggui_vanadium_ws"
@@ -22,8 +24,7 @@ CURVES_WORKSPACE_NAME = "engggui_vanadium_curves"
 INTEGRATED_WORKSPACE_NAME = "engggui_vanadium_integration"
 CALIB_PARAMS_WORKSPACE_NAME = "engggui_calibration_banks_parameters"
 
-OUT_FILES_ROOT_DIR = path.join(path.expanduser("~"), "Engineering_Mantid")
-CALIBRATION_DIR = path.join(OUT_FILES_ROOT_DIR, "Calibration", "")
+CALIBRATION_DIR = path.join(path_handling.OUT_FILES_ROOT_DIR, "Calibration", "")
 
 NORTH_BANK_TEMPLATE_FILE = "template_ENGINX_241391_236516_North_bank.prm"
 SOUTH_BANK_TEMPLATE_FILE = "template_ENGINX_241391_236516_South_bank.prm"
@@ -44,9 +45,7 @@ class CalibrationModel(object):
         :param instrument: The instrument the data relates to.
         :param rb_num: The RB number for file creation.
         """
-        vanadium_corrections = self.calculate_vanadium_correction(vanadium_path)
-        van_integration = vanadium_corrections[0]
-        van_curves = vanadium_corrections[1]
+        van_integration, van_curves = vanadium_corrections.fetch_correction_workspaces(vanadium_path, instrument)
         ceria_workspace = self.load_ceria(ceria_path)
         output = self.run_calibration(ceria_workspace, van_integration, van_curves)
         if plot_output:
@@ -66,7 +65,7 @@ class CalibrationModel(object):
         self.create_output_files(CALIBRATION_DIR, difc, tzero, ceria_path, vanadium_path,
                                  instrument)
         if rb_num:
-            user_calib_dir = path.join(OUT_FILES_ROOT_DIR, "User", rb_num, "Calibration", "")
+            user_calib_dir = path.join(path_handling.OUT_FILES_ROOT_DIR, "User", rb_num, "Calibration", "")
             self.create_output_files(user_calib_dir, difc, tzero, ceria_path, vanadium_path,
                                      instrument)
 
@@ -180,28 +179,6 @@ class CalibrationModel(object):
                                       OutputParametersTableName=table_name)
         return output
 
-    @staticmethod
-    def calculate_vanadium_correction(vanadium_path):
-        """
-        Runs the vanadium correction algorithm.
-        :param vanadium_path: The path to the vanadium data.
-        :return: The integrated workspace and the curves generated by the algorithm.
-        """
-        try:
-            Load(Filename=vanadium_path, OutputWorkspace=VANADIUM_INPUT_WORKSPACE_NAME)
-        except Exception as e:
-            logger.error("Error when loading vanadium sample data. "
-                         "Could not run Load algorithm with vanadium run number: " +
-                         str(vanadium_path) + ". Error description: " + str(e))
-            raise RuntimeError
-        EnggVanadiumCorrections(VanadiumWorkspace=VANADIUM_INPUT_WORKSPACE_NAME,
-                                OutIntegrationWorkspace=INTEGRATED_WORKSPACE_NAME,
-                                OutCurvesWorkspace=CURVES_WORKSPACE_NAME)
-        Ads.remove(VANADIUM_INPUT_WORKSPACE_NAME)
-        integrated_workspace = Ads.Instance().retrieve(INTEGRATED_WORKSPACE_NAME)
-        curves_workspace = Ads.Instance().retrieve(CURVES_WORKSPACE_NAME)
-        return integrated_workspace, curves_workspace
-
     def create_output_files(self, calibration_dir, difc, tzero, ceria_path, vanadium_path,
                             instrument):
         """
@@ -257,8 +234,8 @@ class CalibrationModel(object):
         :param bank: The bank being saved.
         :return: The filename, the vanadium run number, and ceria run number.
         """
-        vanadium_no = path.splitext(path.basename(vanadium_path))[0].replace(instrument, '').lstrip('0')
-        ceria_no = path.splitext(path.basename(ceria_path))[0].replace(instrument, '').lstrip('0')
+        vanadium_no = path_handling.get_run_number_from_path(vanadium_path, instrument)
+        ceria_no = path_handling.get_run_number_from_path(ceria_path, instrument)
         filename = instrument + "_" + vanadium_no + "_" + ceria_no + "_"
         if bank == "all":
             filename = filename + "all_banks.prm"
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/common/__init__.py b/scripts/Engineering/gui/engineering_diffraction/tabs/common/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/common/path_handling.py b/scripts/Engineering/gui/engineering_diffraction/tabs/common/path_handling.py
new file mode 100644
index 0000000000000000000000000000000000000000..35da5482bfb72effedfcd22855f0363533fd28c5
--- /dev/null
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/common/path_handling.py
@@ -0,0 +1,16 @@
+# 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)
+
+from os import path
+
+OUT_FILES_ROOT_DIR = path.join(path.expanduser("~"), "Engineering_Mantid")
+
+
+def get_run_number_from_path(run_path, instrument):
+    return path.splitext(path.basename(run_path))[0].replace(instrument, '').lstrip('0')
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/common/vanadium_corrections.py b/scripts/Engineering/gui/engineering_diffraction/tabs/common/vanadium_corrections.py
new file mode 100644
index 0000000000000000000000000000000000000000..5c479608e6e7f43ed93e034a5f642c797dc5eaed
--- /dev/null
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/common/vanadium_corrections.py
@@ -0,0 +1,76 @@
+# 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)
+
+from os import path
+from os import makedirs
+
+from mantid.simpleapi import logger, Load, EnggVanadiumCorrections, SaveNexus
+from mantid.simpleapi import AnalysisDataService as Ads
+
+from Engineering.gui.engineering_diffraction.tabs.common import path_handling
+
+VANADIUM_INPUT_WORKSPACE_NAME = "engggui_vanadium_ws"
+CURVES_WORKSPACE_NAME = "engggui_vanadium_curves"
+INTEGRATED_WORKSPACE_NAME = "engggui_vanadium_integration"
+
+SAVED_FILE_CURVE_SUFFIX = "_precalculated_vanadium_run_bank_curves.nxs"
+SAVED_FILE_INTEG_SUFFIX = "_precalculated_vanadium_run_integration.nxs"
+
+
+def _calculate_vanadium_correction(vanadium_path):
+    """
+    Runs the vanadium correction algorithm.
+    :param vanadium_path: The path to the vanadium data.
+    :return: The integrated workspace and the curves generated by the algorithm.
+    """
+    try:
+        Load(Filename=vanadium_path, OutputWorkspace=VANADIUM_INPUT_WORKSPACE_NAME)
+    except Exception as e:
+        logger.error("Error when loading vanadium sample data. "
+                     "Could not run Load algorithm with vanadium run number: " +
+                     str(vanadium_path) + ". Error description: " + str(e))
+        raise RuntimeError
+    EnggVanadiumCorrections(VanadiumWorkspace=VANADIUM_INPUT_WORKSPACE_NAME,
+                            OutIntegrationWorkspace=INTEGRATED_WORKSPACE_NAME,
+                            OutCurvesWorkspace=CURVES_WORKSPACE_NAME)
+    Ads.remove(VANADIUM_INPUT_WORKSPACE_NAME)
+    integrated_workspace = Ads.Instance().retrieve(INTEGRATED_WORKSPACE_NAME)
+    curves_workspace = Ads.Instance().retrieve(CURVES_WORKSPACE_NAME)
+    return integrated_workspace, curves_workspace
+
+
+def fetch_correction_workspaces(vanadium_path, instrument):
+    vanadium_number = path_handling.get_run_number_from_path(vanadium_path, instrument)
+    integ_path, curves_path = _generate_saved_workspace_file_paths(vanadium_number)
+    if path.exists(curves_path) and path.exists(integ_path):  # Check if the cached files exist.
+        try:
+            integ_workspace = Load(Filename=integ_path, OutputWorkspace=INTEGRATED_WORKSPACE_NAME)
+            curves_workspace = Load(Filename=curves_path, OutputWorkspace=CURVES_WORKSPACE_NAME)
+            return integ_workspace, curves_workspace
+        except RuntimeError as e:
+            logger.error(
+                "Problem loading existing vanadium calculations. Creating new cached files. Description: "
+                + str(e))
+    integ_workspace, curves_workspace = _calculate_vanadium_correction(vanadium_path)
+    _save_correction_files(integ_workspace, integ_path, curves_workspace, curves_path)
+    return integ_workspace, curves_workspace
+
+
+def _save_correction_files(integration_workspace, integration_path, curves_workspace, curves_path):
+    SaveNexus(InputWorkspace=integration_workspace, Filename=integration_path)
+    SaveNexus(InputWorkspace=curves_workspace, Filename=curves_path)
+
+
+def _generate_saved_workspace_file_paths(vanadium_number):
+    integrated_filename = vanadium_number + SAVED_FILE_INTEG_SUFFIX
+    curves_filename = vanadium_number + SAVED_FILE_CURVE_SUFFIX
+    vanadium_dir = path.join(path_handling.OUT_FILES_ROOT_DIR, "Vanadium_Runs")
+    if not path.exists(vanadium_dir):
+        makedirs(vanadium_dir)
+    return path.join(vanadium_dir, integrated_filename), path.join(vanadium_dir, curves_filename)