diff --git a/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py b/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py
index c32ecb2bba8e042907eaee77df8abdc35289ba01..7a6704398d27b02db4a86f8ec976a9a7eacd65f4 100644
--- a/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py
+++ b/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py
@@ -110,14 +110,17 @@ def _clean_up():
 
 def setup_polaris_instrument():
     user_name = "Test"
+    calibration_mapping_file_name = "polaris_calibration.yaml"
 
     calibration_dir = _get_calibration_dir()
-    path_to_add = os.path.join(DIRS[0], "POLARIS")
-    config['datasearch.directories'] += ";" + path_to_add
+    calibration_mapping_path = os.path.join(calibration_dir, calibration_mapping_file_name)
     output_dir = _get_output_dir()
 
+    path_to_add = os.path.join(DIRS[0], "POLARIS")
+    config['datasearch.directories'] += ";" + path_to_add
     polaris_obj = polaris.Polaris(user_name=user_name, chopper_on=True, apply_solid_angle=False,
-                                  calibration_directory=calibration_dir, output_directory=output_dir)
+                                  calibration_directory=calibration_dir, output_directory=output_dir,
+                                  calibration_mapping_file=calibration_mapping_path)
     return polaris_obj
 
 
diff --git a/Testing/SystemTests/tests/analysis/reference/ISIS_Powder-POLARIS78338_Van_Cal.nxs.md5 b/Testing/SystemTests/tests/analysis/reference/ISIS_Powder-POLARIS78338_Van_Cal.nxs.md5
deleted file mode 100644
index 76e055cb075a06a960d13796e52829829e3fb141..0000000000000000000000000000000000000000
--- a/Testing/SystemTests/tests/analysis/reference/ISIS_Powder-POLARIS78338_Van_Cal.nxs.md5
+++ /dev/null
@@ -1 +0,0 @@
-7e80088fe9a61995c18fa1f9156321b9
diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py
index d6749fcfcf32bce48356bb93c25109974c47e937..794bdc7096eb271960918093c5bf6a4073c02292 100644
--- a/scripts/Diffraction/isis_powder/abstract_inst.py
+++ b/scripts/Diffraction/isis_powder/abstract_inst.py
@@ -114,9 +114,6 @@ class AbstractInst(object):
     def attenuate_workspace(self, input_workspace):
         return input_workspace
 
-    def calculate_focus_binning_params(self, sample):
-        return None
-
     def correct_sample_vanadium(self, focus_spectra, vanadium_spectra=None):
         raise NotImplementedError("Cannot process the sample with a vanadium run for this instrument")
 
@@ -138,7 +135,7 @@ class AbstractInst(object):
     def pearl_focus_tof_rebinning(self, input_workspace):
         return input_workspace
 
-    def crop_data_tail(self, ws_to_crop):
+    def crop_to_sane_tof(self, ws_to_crop):
         return ws_to_crop
 
     def pearl_rebin_to_workspace(self, ws_to_rebin, ws_to_match):
@@ -147,9 +144,6 @@ class AbstractInst(object):
     def spline_vanadium_ws(self, focused_vanadium_ws):
         return None
 
-    def extract_and_crop_spectra(self, focused_ws):
-        raise NotImplemented("Extract spectra and crop in tof not implemented")
-
 
 # ----- Private Implementation ----- #
 # These should only be called by the abstract instrument class
diff --git a/scripts/Diffraction/isis_powder/pearl.py b/scripts/Diffraction/isis_powder/pearl.py
index 20609f3482704277389ceef0141593fe91601fdc..de9c8200e817c3cab2fe6d9fda94cd8f2d411807 100644
--- a/scripts/Diffraction/isis_powder/pearl.py
+++ b/scripts/Diffraction/isis_powder/pearl.py
@@ -6,7 +6,7 @@ import mantid.simpleapi as mantid
 from isis_powder.routines import common, yaml_parser
 from isis_powder.routines.common_enums import InputBatchingEnum
 from isis_powder.abstract_inst import AbstractInst
-from isis_powder.pearl_routines import pearl_algs, pearl_calibration_algs, pearl_output, pearl_spline, PearlRunSettings
+from isis_powder.pearl_routines import pearl_algs, pearl_output, pearl_spline, PearlRunSettings
 
 
 class Pearl(AbstractInst):
@@ -116,14 +116,8 @@ class Pearl(AbstractInst):
         grouped_d_spacing = mantid.GroupWorkspaces(InputWorkspaces=output_spectra, OutputWorkspace=group_name)
         return grouped_d_spacing
 
-    def extract_and_crop_spectra(self, focused_ws):
-        ws_spectra = common.extract_ws_spectra(ws_to_split=focused_ws)
-        ws_spectra = common.crop_in_tof(ws_to_rebin=ws_spectra, x_min=1500, x_max=19900)
-        return ws_spectra
-
-    def crop_data_tail(self, ws_to_crop):
-        # TODO move this param into advanced config
-        out_ws = mantid.CropWorkspace(XMax="19900", InputWorkspace=ws_to_crop, OutputWorkspace=ws_to_crop)
+    def crop_to_sane_tof(self, ws_to_crop):
+        out_ws = common.crop_in_tof(ws_to_rebin=ws_to_crop, x_min=1500, x_max=19900)
         return out_ws
 
     def generate_vanadium_absorb_corrections(self, run_details, ws_to_match):
diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py
index 1e2c6db6fa465a47b10047af4d28cc156d64bf12..37dca70f7c1601d463900be5fdbf57771fda40fe 100644
--- a/scripts/Diffraction/isis_powder/polaris.py
+++ b/scripts/Diffraction/isis_powder/polaris.py
@@ -39,8 +39,8 @@ class Polaris(AbstractInst):
 
     def create_calibration_vanadium(self, run_in_range, do_absorb_corrections=True, gen_absorb_correction=False):
         run_details = self.get_run_details(run_number=int(run_in_range))
-        return self._create_calibration_vanadium(vanadium_runs=run_details.vanadium,
-                                                 empty_runs=run_details.sample_empty,
+        return self._create_calibration_vanadium(vanadium_runs=run_details.vanadium_run_numbers,
+                                                 empty_runs=run_details.empty_runs,
                                                  do_absorb_corrections=do_absorb_corrections,
                                                  gen_absorb_correction=gen_absorb_correction)
 
@@ -115,16 +115,6 @@ class Polaris(AbstractInst):
     def generate_vanadium_absorb_corrections(self, calibration_full_paths, ws_to_match):
         return polaris_algs.generate_absorb_corrections(ws_to_match=ws_to_match)
 
-    def extract_and_crop_spectra(self, focused_ws):
-        ws_spectra = common.extract_ws_spectra(ws_to_split=focused_ws)
-        ws_spectra = common.crop_in_tof(ws_to_rebin=ws_spectra, x_min=800, x_max=20000)
-        return ws_spectra
-
-    def calculate_focus_binning_params(self, sample):
-        calculated_binning_params = polaris_algs.calculate_focus_binning_params(sample_ws=sample,
-                                                                                num_of_banks=self._number_of_banks)
-        return calculated_binning_params
-
     def output_focused_ws(self, processed_spectra, run_details, output_mode=None):
         d_spacing_group, tof_group = polaris_algs.split_into_tof_d_spacing_groups(processed_spectra)
         output_paths = self._generate_out_file_paths(run_details=run_details)
@@ -133,3 +123,7 @@ class Polaris(AbstractInst):
                                                  output_paths=output_paths, run_number=run_details.run_number)
 
         return d_spacing_group
+
+    def crop_to_sane_tof(self, ws_to_crop):
+        cropped_ws = common.crop_in_tof(ws_to_rebin=ws_to_crop, x_min=800, x_max=20000)
+        return cropped_ws
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
index c282a8e3d54dcfe57c814c4a640c9d7a76e64419..bdee806ac53801d91835358267a1f57f3da1340c 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
@@ -8,14 +8,14 @@ from isis_powder.routines.common_enums import InputBatchingEnum
 from isis_powder.routines.RunDetails import RunDetails
 
 
-def calculate_focus_binning_params(sample_ws, num_of_banks):
-    # TODO move these out to config file
+def calculate_focus_binning_params(sample_ws):
+    # TODO remove this if they only want sane TOF values and not consistent binning
     focus_bin_widths = [-0.0050, -0.0010, -0.0010, -0.0010, -0.00050]
     focus_crop_start = 2  # These are used when calculating binning range
     focus_crop_end = 0.95
 
     calculated_binning_params = []
-
+    num_of_banks = sample_ws.getNumberHistograms()
     for i in range(0, num_of_banks):
         sample_data = sample_ws.readX(i)
         starting_bin = sample_data[0] * (1 + focus_crop_start)
@@ -60,8 +60,8 @@ def generate_absorb_corrections(ws_to_match):
 
 
 def generate_solid_angle_corrections(run_details, instrument):
-    vanadium_ws = common.load_current_normalised_ws_list(run_number_string=run_details.vanadium, instrument=instrument,
-                                                         input_batching=InputBatchingEnum.Summed)
+    vanadium_ws = common.load_current_normalised_ws_list(run_number_string=run_details.vanadium_run_numbers,
+                                                         instrument=instrument, input_batching=InputBatchingEnum.Summed)
     corrections = _calculate_solid_angle_efficiency_corrections(vanadium_ws[0])
     mantid.SaveNexusProcessed(InputWorkspace=corrections, Filename=run_details.solid_angle_corr)
     common.remove_intermediate_workspace(vanadium_ws)
@@ -92,10 +92,13 @@ def get_run_details(chopper_on, sac_on, run_number_string, calibration_dir, mapp
     solid_angle_file_path = os.path.join(in_calib_dir, solid_angle_file_name)
     splined_vanadium = os.path.join(in_calib_dir, splined_vanadium_name)
 
-    run_details = RunDetails(calibration_path=calibration_full_path, grouping_path=grouping_full_path,
-                             vanadium_runs=vanadium_runs, run_number=run_number_string)
-    run_details.label = label
+    run_details = RunDetails(run_number=run_number_string)
     run_details.empty_runs = empty_runs
+    run_details.vanadium_run_numbers = vanadium_runs
+    run_details.label = label
+
+    run_details.calibration_file_path = calibration_full_path
+    run_details.grouping_file_path = grouping_full_path
     run_details.splined_vanadium_file_path = splined_vanadium
     run_details.solid_angle_corr = solid_angle_file_path
 
@@ -103,8 +106,6 @@ def get_run_details(chopper_on, sac_on, run_number_string, calibration_dir, mapp
 
 
 def split_into_tof_d_spacing_groups(processed_spectra):
-    import pydevd
-    pydevd.settrace('localhost', port=51205, stdoutToServer=True, stderrToServer=True)
     name_index = 1
     d_spacing_output = []
     tof_output = []
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml b/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml
index de8c5bfe984b0afe55e3cd04825a2b2dda5a54f7..ffba88488a36e68106dc603b9d13807eff3bd24b 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml
@@ -24,6 +24,13 @@
     vanadium_run_numbers : "93105"
     empty_run_numbers : "93106"
 
+95597-95599:
+  offset_file_name : "cycle_16_3_silicon_all_spectra.cal"
+  label : "16_3"
+  chopper_on:
+    vanadium_run_numbers : "95598"
+    empty_run_numbers : "95597"
+
 95600- :  #95614
   # Calibration run
   offset_file_name : "offsets_2011_cycle111b.cal"
diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py
index 0368120c99dd31fa246027b85963b193007d601f..9b8ca5c551679b9e561a1615edd2c02634b678b1 100644
--- a/scripts/Diffraction/isis_powder/routines/calibrate.py
+++ b/scripts/Diffraction/isis_powder/routines/calibrate.py
@@ -16,7 +16,7 @@ def create_van(instrument, van, empty, absorb, gen_absorb):
                                                     instrument=instrument)
 
     # Crop the tail end of the data on PEARL if they are not capturing slow neutrons
-    corrected_van_ws = instrument.crop_data_tail(ws_to_crop=corrected_van_ws)
+    corrected_van_ws = instrument.crop_to_sane_tof(ws_to_crop=corrected_van_ws)
 
     corrected_van_ws = mantid.AlignDetectors(InputWorkspace=corrected_van_ws,
                                              CalibrationFile=run_details.calibration_file_path)
@@ -31,7 +31,7 @@ def create_van(instrument, van, empty, absorb, gen_absorb):
     focused_vanadium = mantid.DiffractionFocussing(InputWorkspace=corrected_van_ws,
                                                    GroupingFileName=run_details.grouping_file_path)
 
-    focused_cropped_spectra = instrument.extract_and_crop_spectra(focused_ws=focused_vanadium)
+    focused_cropped_spectra = common.extract_and_crop_spectra(focused_ws=focused_vanadium, instrument=instrument)
     d_spacing_group = _save_focused_vanadium(instrument=instrument, run_details=run_details,
                                              cropped_spectra=focused_cropped_spectra)
     _create_vanadium_splines(focused_cropped_spectra, instrument, run_details)
diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py
index 4f1f585ac71758aedbbcbb1801b698b74a629aff..0a08d938be55563d1358ecbbc302880d2d7d7299 100644
--- a/scripts/Diffraction/isis_powder/routines/common.py
+++ b/scripts/Diffraction/isis_powder/routines/common.py
@@ -52,6 +52,12 @@ def extract_ws_spectra(ws_to_split):
     return spectra_bank_list
 
 
+def extract_and_crop_spectra(focused_ws, instrument):
+    ws_spectra = extract_ws_spectra(ws_to_split=focused_ws)
+    ws_spectra = instrument.crop_to_sane_tof(ws_to_crop=ws_spectra)
+    return ws_spectra
+
+
 def generate_run_numbers(run_number_string):
     # Check its not a single run
     if isinstance(run_number_string, int) or run_number_string.isdigit():
diff --git a/scripts/Diffraction/isis_powder/routines/focus.py b/scripts/Diffraction/isis_powder/routines/focus.py
index 44886de7380a0b447f96df6a7ea9d2c6e025139c..f86e51c49ebba86120b6ddc8a0efb80e41e9aa4e 100644
--- a/scripts/Diffraction/isis_powder/routines/focus.py
+++ b/scripts/Diffraction/isis_powder/routines/focus.py
@@ -15,73 +15,35 @@ def focus(run_number, instrument, input_batching, perform_vanadium_norm=True):
         return _batched_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number)
 
 
-def _batched_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number):
-    read_ws_list = common.load_current_normalised_ws_list(run_number_string=run_number,
-                                                          input_batching=input_batching, instrument=instrument)
-    output = None
-    for ws in read_ws_list:
-        output = _focus_one_ws(ws=ws, run_number=run_number, instrument=instrument,
-                               perform_vanadium_norm=perform_vanadium_norm)
-        common.remove_intermediate_workspace(ws)
-    return output
-
-
-def _divide_sample_by_vanadium(instrument, run_number, input_workspace, perform_vanadium_norm):
-    processed_spectra = []
-    run_details = instrument.get_run_details(run_number=run_number)
-    split_ws = common.extract_ws_spectra(ws_to_split=input_workspace)
-
-    if perform_vanadium_norm:
-        vanadium_ws_list = mantid.LoadNexus(Filename=run_details.splined_vanadium)
-        for focus_spectra, van_spectra in zip(split_ws, vanadium_ws_list[1:]):
-            processed_spectra.append(
-                instrument.correct_sample_vanadium(focus_spectra=focus_spectra, vanadium_spectra=van_spectra))
-        common.remove_intermediate_workspace(vanadium_ws_list[0])
-
-    else:
-        for focus_spectra in split_ws:
-            processed_spectra.append(instrument.correct_sample_vanadium(focus_spectra=focus_spectra))
-
-    for ws in split_ws:
-        common.remove_intermediate_workspace(ws)
-
-    return processed_spectra
-
-
 def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm):
     run_details = instrument.get_run_details(run_number=run_number)
 
     # Check the necessary splined vanadium file has been created
-    if not os.path.isfile(run_details.splined_vanadium):
+    if not os.path.isfile(run_details.splined_vanadium_file_path):
         raise ValueError("Processed vanadium runs not found at this path: "
-                         + str(run_details.splined_vanadium) +
+                         + str(run_details.splined_vanadium_file_path) +
                          " \nHave you created a vanadium calibration with these settings yet?\n")
 
-    in_ws_name = ws.name()  # Setup for later check that ws doesn't shadow
-
     ws = instrument.pearl_focus_tof_rebinning(ws)  # Rebins for PEARL
     # Compensate for empty sample if specified
     input_workspace = common.subtract_sample_empty(ws_to_correct=ws, instrument=instrument,
-                                                   empty_sample_ws_string=run_details.sample_empty)
+                                                   empty_sample_ws_string=run_details.empty_runs)
+    input_workspace = instrument.crop_to_sane_tof(ws_to_crop=input_workspace)
+
     # Align / Focus
     input_workspace = mantid.AlignDetectors(InputWorkspace=input_workspace,
-                                            CalibrationFile=run_details.calibration)
+                                            CalibrationFile=run_details.calibration_file_path)
 
     input_workspace = instrument.apply_solid_angle_efficiency_corr(ws_to_correct=input_workspace,
                                                                    run_details=run_details)
 
     focused_ws = mantid.DiffractionFocussing(InputWorkspace=input_workspace,
-                                             GroupingFileName=run_details.grouping)
-
-    # Process
-    rebinning_params = instrument.calculate_focus_binning_params(sample=focused_ws)
+                                             GroupingFileName=run_details.grouping_file_path)
 
     calibrated_spectra = _divide_sample_by_vanadium(instrument=instrument, run_number=run_number,
                                                     input_workspace=focused_ws,
                                                     perform_vanadium_norm=perform_vanadium_norm)
 
-    _apply_binning_to_spectra(spectra_list=calibrated_spectra, binning_list=rebinning_params)
-
     # Output
     processed_nexus_files = instrument.output_focused_ws(calibrated_spectra, run_details=run_details)
 
@@ -90,11 +52,39 @@ def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm):
     common.remove_intermediate_workspace(focused_ws)
     common.remove_intermediate_workspace(calibrated_spectra)
 
-    if ws.name() != in_ws_name:
-        # We have rebinned and will leak a workspace as there is now two 'ws' variables shadowing one ADS entry
+    return processed_nexus_files
+
+
+def _batched_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number):
+    read_ws_list = common.load_current_normalised_ws_list(run_number_string=run_number,
+                                                          input_batching=input_batching, instrument=instrument)
+    output = None
+    for ws in read_ws_list:
+        output = _focus_one_ws(ws=ws, run_number=run_number, instrument=instrument,
+                               perform_vanadium_norm=perform_vanadium_norm)
         common.remove_intermediate_workspace(ws)
+    return output
 
-    return processed_nexus_files
+
+def _divide_sample_by_vanadium(instrument, run_number, input_workspace, perform_vanadium_norm):
+    processed_spectra = []
+    run_details = instrument.get_run_details(run_number=run_number)
+    split_ws = common.extract_and_crop_spectra(input_workspace, instrument=instrument)
+
+    if perform_vanadium_norm:
+        vanadium_ws_list = mantid.LoadNexus(Filename=run_details.splined_vanadium_file_path)
+        for focus_spectra, van_spectra in zip(split_ws, vanadium_ws_list[1:]):
+            processed_spectra.append(
+                instrument.correct_sample_vanadium(focus_spectra=focus_spectra, vanadium_spectra=van_spectra))
+        common.remove_intermediate_workspace(vanadium_ws_list[0])
+
+    else:
+        for focus_spectra in split_ws:
+            processed_spectra.append(instrument.correct_sample_vanadium(focus_spectra=focus_spectra))
+
+    common.remove_intermediate_workspace(split_ws)
+
+    return processed_spectra
 
 
 def _individual_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number):
@@ -106,15 +96,4 @@ def _individual_run_focusing(input_batching, instrument, perform_vanadium_norm,
                                                     input_batching=input_batching)
         output = _focus_one_ws(ws=ws[0], run_number=run, instrument=instrument,
                                perform_vanadium_norm=perform_vanadium_norm)
-        common.remove_intermediate_workspace(ws)
     return output
-
-
-def _apply_binning_to_spectra(spectra_list, binning_list):
-    if not binning_list:
-        return
-
-    for ws, bin_params in zip(spectra_list, binning_list):
-        # Starting bin edge / bin width / last bin edge
-        rebin_string = bin_params[0] + ',' + bin_params[1] + ',' + bin_params[2]
-        mantid.Rebin(InputWorkspace=ws, OutputWorkspace=ws, Params=rebin_string)
diff --git a/scripts/Diffraction/isis_powder/routines/yaml_parser.py b/scripts/Diffraction/isis_powder/routines/yaml_parser.py
index cc59d6fc424fb10cdb3a5e9b24d6d566ef7a87cf..cb013ca6150fcc567f4c33cbfc92c1c136481322 100644
--- a/scripts/Diffraction/isis_powder/routines/yaml_parser.py
+++ b/scripts/Diffraction/isis_powder/routines/yaml_parser.py
@@ -52,17 +52,16 @@ def _open_yaml_file_as_dictionary(file_path):
 
 
 def _find_dictionary_key(dict_to_search, run_number):
-
     for key in dict_to_search:
         if is_run_range_key_unbounded(key):  # Have an unbounded run don't generate numbers
             split_key = str(key).split('-')
             lower_key_bound = int(split_key[-2])
             if run_number > lower_key_bound:
                 return key
-
-        generated_runs = common.generate_run_numbers(run_number_string=key)
-        if run_number in generated_runs:
-            return key
+        else:
+            generated_runs = common.generate_run_numbers(run_number_string=key)
+            if run_number in generated_runs:
+                return key
 
     return None