diff --git a/Control/CalypsoExample/Digitization/scripts/faser_digi.py b/Control/CalypsoExample/Digitization/scripts/faser_digi.py
index 0e48e1e27dee3b1e17ecddd3fcdef4c17fc0936e..0da1361cec9191f96014543a68aaca777e0acff8 100755
--- a/Control/CalypsoExample/Digitization/scripts/faser_digi.py
+++ b/Control/CalypsoExample/Digitization/scripts/faser_digi.py
@@ -25,6 +25,8 @@ parser.add_argument("-g", "--geom", default="TI12MC",
                     help="Specify geometry (default: TI12MC, alt: TestBeamMC)")
 parser.add_argument("-t", "--tag", default="",
                     help="Specify digi tag (to append to output filename)")
+parser.add_argument("--subtractTime", type=float, default=-999.,
+                    help="Subtract time parameter for SCT RDOs")
 parser.add_argument("--digiTag", default="",
                     help="Specify tag for waveform digi folder")
 parser.add_argument("--short", default="",
@@ -161,6 +163,10 @@ acc.merge(FaserGeometryCfg(ConfigFlags))
 from FaserSCT_Digitization.FaserSCT_DigitizationConfigNew import FaserSCT_DigitizationCfg
 acc.merge(FaserSCT_DigitizationCfg(ConfigFlags))
 
+# Set the time offset for SCT RDOs
+pualg = acc.getEventAlgo("StandardPileUpToolsAlg")
+pualg.PileUpTools['FaserSCT_DigitizationTool'].SurfaceChargesGenerator.SubtractTime = args.subtractTime
+
 # Pass something to set folder tag
 from CaloDigiAlgs.CaloDigiAlgsConfig import CaloWaveformDigitizationCfg
 acc.merge(CaloWaveformDigitizationCfg(ConfigFlags, digiTag=args.digiTag))
diff --git a/Control/CalypsoExample/Digitization/scripts/faser_digi_merge.py b/Control/CalypsoExample/Digitization/scripts/faser_digi_merge.py
index a99c51eecdc4a813901085de67d792be40f73cb6..b945ffbbd19c024d549d0d0f84fdfca768759f68 100755
--- a/Control/CalypsoExample/Digitization/scripts/faser_digi_merge.py
+++ b/Control/CalypsoExample/Digitization/scripts/faser_digi_merge.py
@@ -33,6 +33,8 @@ parser.add_argument("--complete", action="store_true",
                     help="This is the complete run, remove segment numbers")
 parser.add_argument("-t", "--tag", default="",
                     help="Specify digi tag (to append to output filename)")
+parser.add_argument("--subtractTime", type=float, default=-999.,
+                    help="Subtract time parameter for SCT RDOs")
 parser.add_argument("--digiTag", default="",
                     help="Specify tag for waveform digi folder")
 parser.add_argument("--short", default="",
@@ -231,6 +233,10 @@ acc.merge(FaserGeometryCfg(ConfigFlags))
 from FaserSCT_Digitization.FaserSCT_DigitizationConfigNew import FaserSCT_DigitizationCfg
 acc.merge(FaserSCT_DigitizationCfg(ConfigFlags))
 
+# Set the time offset for SCT RDOs
+pualg = acc.getEventAlgo("StandardPileUpToolsAlg")
+pualg.PileUpTools['FaserSCT_DigitizationTool'].SurfaceChargesGenerator.SubtractTime = args.subtractTime
+
 # Pass something to set folder tag
 from CaloDigiAlgs.CaloDigiAlgsConfig import CaloWaveformDigitizationCfg
 acc.merge(CaloWaveformDigitizationCfg(ConfigFlags, digiTag=args.digiTag))
diff --git a/Control/CalypsoExample/Digitization/scripts/submit_faser_digi.sh b/Control/CalypsoExample/Digitization/scripts/submit_faser_digi.sh
index 532bf0b5d0701b2839649682569ea56028ea897f..fcf5e2045b192ef913a9fc1ea0b75c8fae4074bd 100644
--- a/Control/CalypsoExample/Digitization/scripts/submit_faser_digi.sh
+++ b/Control/CalypsoExample/Digitization/scripts/submit_faser_digi.sh
@@ -34,6 +34,12 @@ do
 	  shift;
 	  shift;;
 
+      --subtractTime)
+	  echo "Subtract $2 ns from SCT RDOs"
+	  timestr="--subtractTime $2"
+	  shift;
+	  shift;;
+
       -g | --geom)
 	  geomstr="--geom $2";
 	  shift;
@@ -115,6 +121,7 @@ echo `date` - $HOSTNAME
 echo "File: $file_name"
 echo "Geom: $geomstr"
 echo "Gain: $gainstr"
+echo "Time: $timestr"
 echo "Release: $release_directory"
 echo "Output: $output_directory"
 echo "Starting: $starting_directory"
@@ -178,9 +185,10 @@ cd "$file_stem"
 #
 # Run job
 #
-faser_digi.py $geomstr $gainstr $tagstr "$file_path"
+faser_digi.py $geomstr $gainstr $timestr $tagstr "$file_path"
 digi_code=$?
 echo "Return code: $digi_code"
+
 #
 # Print out ending time
 date
diff --git a/Control/CalypsoExample/Digitization/scripts/submit_faser_digi_merge.sh b/Control/CalypsoExample/Digitization/scripts/submit_faser_digi_merge.sh
index d8ac88cffd016230d6445b346df4a9c3cbc2bc69..50278c33e2435236fff3bc2b6a94c13aa5794817 100755
--- a/Control/CalypsoExample/Digitization/scripts/submit_faser_digi_merge.sh
+++ b/Control/CalypsoExample/Digitization/scripts/submit_faser_digi_merge.sh
@@ -29,6 +29,7 @@ SECONDS=0
 #
 # Job options strings
 gainstr=""
+timestr=""
 partialstr=""
 geomstr=""
 #
@@ -42,6 +43,12 @@ do
 	  shift;
 	  shift;;
 
+      --subtractTime)
+	  echo "Subtract $2 ns from SCT RDOs"
+	  timestr="--subtractTime $2"
+	  shift;
+	  shift;;
+
       --partial)
 	  echo "Allowing partial merge"
 	  partialstr="--partial"
@@ -147,6 +154,7 @@ echo `date` - $HOSTNAME
 echo "Directory: $dir_path"
 echo "Geom: $geomstr"
 echo "Gain: $gainstr"
+echo "Time: $timestr"
 echo "Slice: $slice"
 echo "NFiles: $nfiles"
 echo "Release: $release_directory"
@@ -213,7 +221,7 @@ cd "$file_stem"
 #
 # Run job
 #
-faser_digi_merge.py $partialstr $geomstr $gainstr $tagstr --slice $slice --files $nfiles $dir_path
+faser_digi_merge.py $partialstr $geomstr $gainstr $timestr $tagstr --slice $slice --files $nfiles $dir_path
 digi_code=$?
 echo "Return code: $digi_code"
 #
diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.cxx b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.cxx
index ea353da6c61a80535c20a3f92f3598a227b65b0f..bada70e4db0f3e105788e0042f3986ffef3e4bef 100644
--- a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.cxx
+++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.cxx
@@ -170,6 +170,20 @@ StatusCode FaserSCT_SurfaceChargesGenerator::initialize() {
 // ----------------------------------------------------------------------
 StatusCode FaserSCT_SurfaceChargesGenerator::finalize() {
   ATH_MSG_DEBUG("FaserSCT_SurfaceChargesGenerator::finalize()");
+
+  if (m_tofNum > 0) {
+    float mean_TOF = m_tofSum / m_tofNum;
+    float rms_TOF = sqrt(m_tofSum2 / m_tofNum - mean_TOF*mean_TOF);
+    ATH_MSG_INFO("TOF hits: " << m_tofNum); 
+    ATH_MSG_INFO("Mean TOF: " << mean_TOF);
+    ATH_MSG_INFO("RMS  TOF: " << rms_TOF);
+
+  }
+
+  if (m_tfix > -998.) {
+    ATH_MSG_INFO("Used fixed value: " << m_tfix.value());
+  }
+
   return StatusCode::SUCCESS;
 }
 
@@ -335,13 +349,22 @@ void FaserSCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* ele
   float timeOfFlight{p_eventTime + hitTime(phit)};
 
   // Kondo 19/09/2007: Use the coordinate of the center of the module to calculate the time of flight
-  timeOfFlight -= (element->center().mag()) / CLHEP::c_light;
+  // Torrence 19/02/2023: Use global z coordinate rather than distance to origin for FASER
+  timeOfFlight -= (element->center().z()) / CLHEP::c_light;
   // !< extract the distance to the origin of the module to Time of flight
 
   // !< timing set from jo to adjust (subtract) the timing
   if (m_tsubtract > -998.) {
     timeOfFlight -= m_tsubtract;
   }
+
+  ATH_MSG_DEBUG("Time of flight: " << timeOfFlight);
+
+  // Keep some stats
+  m_tofNum += 1;
+  m_tofSum += timeOfFlight;
+  m_tofSum2 += (timeOfFlight * timeOfFlight);
+
   // ---**************************************
 
   const CLHEP::Hep3Vector pos{phit.localStartPosition()};
@@ -512,6 +535,7 @@ void FaserSCT_SurfaceChargesGenerator::processSiHit(const SiDetectorElement* ele
             const float sdist{static_cast<float>(design->scaledDistanceToNearestDiode(position))}; // !< dist on the surface from the hit point to the nearest strip (diode)
             const float t_surf{surfaceDriftTime(2.0 * sdist)}; // !< Surface drift time
             const float totaltime{(m_tfix > -998.) ? m_tfix.value() : t_drift + timeOfFlight + t_surf}; // !< Total drift time
+	    ATH_MSG_VERBOSE(std::fixed << std::setprecision(4) << "Surface time: " << t_surf << " Drift time: " << t_drift << " TOF: " << timeOfFlight << " Total: " << totaltime);
             inserter(SiSurfaceCharge(position, SiCharge(q1, totaltime, hitproc, trklink)));
           } else {
             ATH_MSG_VERBOSE(std::fixed << std::setprecision(8) << "Local position (phi, eta, depth): ("
diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.h b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.h
index b84f584c52ad1ac182f237d62a7639aeb0fe2f13..4e9ec5775edc2c3b90fd095c411e66435bc7d754 100644
--- a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.h
+++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_SurfaceChargesGenerator.h
@@ -137,6 +137,12 @@ class FaserSCT_SurfaceChargesGenerator : public extends<AthAlgTool, ISCT_Surface
 
   bool m_SurfaceDriftFlag{false}; //!< surface drift ON/OFF
 
+  // Keep track of TOF 
+  // These are updated in processSiHit which is const, so make mutable
+  mutable int m_tofNum{0};
+  mutable float m_tofSum{0.};
+  mutable float m_tofSum2{0.};
+
   // -- Histograms
   // TProfile* m_h_efieldz{nullptr};
   // TH1F* m_h_efield{nullptr};