diff --git a/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py b/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py
index 5f1af19df0f1e4c021b799854f06401082bece8b..2235e03d1c90dbda4b6de63ea73e3052e873eb34 100755
--- a/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py
+++ b/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py
@@ -243,13 +243,25 @@ if useCKF:
 
     #
     # Kalman Filter for tracking
+
+    # Do both forward and backward tracking
     from FaserActsKalmanFilter.CKF2Config import CKF2Cfg
     if not args.isOverlay:
+        # 4-station tracks
         acc.merge(CKF2Cfg(ConfigFlags, noDiagnostics=True))
 
     # Add tracking collection with no IFT 
     acc.merge(CKF2Cfg(ConfigFlags, maskedLayers=[0, 1, 2], name="CKF_woIFT", 
-                      OutputCollection="CKFTrackCollectionWithoutIFT", noDiagnostics=True))
+                      OutputCollection="CKFTrackCollectionWithoutIFT", 
+                      BackwardPropagation=False,
+                      noDiagnostics=True))
+
+
+    # Backward tracking with no IFT
+    acc.merge(CKF2Cfg(ConfigFlags, maskedLayers=[0, 1, 2], name="CKF_Back_woIFT", 
+                      OutputCollection="CKFTrackCollectionBackwardWithoutIFT", 
+                      BackwardPropagation=True,
+                      noDiagnostics=True))
 
 #
 # Configure output
diff --git a/PhysicsAnalysis/NtupleDumper/scripts/faser_ntuple_maker.py b/PhysicsAnalysis/NtupleDumper/scripts/faser_ntuple_maker.py
index f98772332778a43e148bdc1c5fb24544edc18982..8020e7ba12d265ecc715b5bab2d9dfa404a9b2b3 100755
--- a/PhysicsAnalysis/NtupleDumper/scripts/faser_ntuple_maker.py
+++ b/PhysicsAnalysis/NtupleDumper/scripts/faser_ntuple_maker.py
@@ -53,6 +53,8 @@ parser.add_argument("--scintFilt", action='store_true',
                     help="apply scintillator event filter")
 parser.add_argument("--NoTrackFilt", action='store_true',
                     help="Don't apply track event filter (default: do)")
+parser.add_argument("--noStable", action='store_true',
+                    help="Don't apply stable beam requirement (default: do)")
 
 parser.add_argument("--unblind", action='store_true',
                     help="Don't apply signal blinding (default: do)")
@@ -218,6 +220,7 @@ print(f"Scintillator Filter  = {args.scintFilt}")
 print(f"Track Filter = {not args.NoTrackFilt}")
 print(f"Blind = {not args.unblind}")
 print(f"OnlyBlinded = {args.onlyblind}")
+print(f"Stable Beams = {not args.noStable}")
 print(f"GRL = {args.grl}")
 
 # OK, lets run the job here
@@ -276,7 +279,7 @@ if args.isMC:
     acc.merge(NtupleDumperAlgCfg(ConfigFlags, outfile, **mc_kwargs))
 
 else:
-    acc.merge(NtupleDumperAlgCfg(ConfigFlags, outfile, DoBlinding=(not args.unblind), OnlyBlinded=args.onlyblind, DoScintFilter = args.scintFilt, DoTrackFilter = (not args.NoTrackFilt), DoTrigFilter = args.trigFilt, **grl_kwargs))
+    acc.merge(NtupleDumperAlgCfg(ConfigFlags, outfile, DoBlinding=(not args.unblind), OnlyBlinded=args.onlyblind, DoScintFilter = args.scintFilt, DoTrackFilter = (not args.NoTrackFilt), DoTrigFilter = args.trigFilt, StableOnly = (not args.noStable), **grl_kwargs) )
 
 if not args.verbose:
     from AthenaConfiguration.ComponentFactory import CompFactory
diff --git a/PhysicsAnalysis/NtupleDumper/scripts/submit_faser_ntuple_maker.sh b/PhysicsAnalysis/NtupleDumper/scripts/submit_faser_ntuple_maker.sh
index 01fe05f49e3cc5c5355d1ddf64689d669fcb5650..d50950316dd4528ac4d74a1ad0782c2fa21c1fbe 100755
--- a/PhysicsAnalysis/NtupleDumper/scripts/submit_faser_ntuple_maker.sh
+++ b/PhysicsAnalysis/NtupleDumper/scripts/submit_faser_ntuple_maker.sh
@@ -35,6 +35,7 @@ mergestr=""
 flukastr=""
 geniestr=""
 unblindstr=""
+stablestr=""
 #
 # Parse command-line options
 while [ -n "$1" ]
@@ -76,6 +77,10 @@ do
 	  unblindstr="--unblind";
 	  shift;;
 
+      --no_stable)
+	  stablestr="--noStable";
+	  shift;;
+
       --) # End of options
 	  shift; # Eat this
 	  break;; # And stop parsing
@@ -258,7 +263,7 @@ export EOS_MGM_URL=root://eospublic.cern.ch
 #
 # Run job
 #
-faser_ntuple_maker.py $last_file_str $partialstr $tagstr $ismc --slice $slice --files $nfiles $mergestr $flukastr $geniestr $unblindstr $dir_path
+faser_ntuple_maker.py $last_file_str $partialstr $tagstr $ismc --slice $slice --files $nfiles $mergestr $flukastr $geniestr $unblindstr $stablestr $dir_path
 ntup_code=$?
 echo "Return code: $ntup_code"
 #
diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
index 0e88d1e46f6d84ed87bda1b669c9f4ca35aa3ea6..a7b7d434a35cfff95a22a25e55cd0535f0a3fc3c 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx
@@ -621,8 +621,10 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const
     // load in LHC data
     SG::ReadHandle<xAOD::FaserLHCData> lhcData { m_lhcData, ctx };
     ATH_CHECK(lhcData.isValid());
+
     // don't process events that were not taken during "Stable Beams"
-    if ( !(lhcData->stableBeams()) ) return StatusCode::SUCCESS;
+    if (!(lhcData->stableBeams()) && m_stableOnly) return StatusCode::SUCCESS;
+
     // store interesting data in ntuple variables
     m_fillNumber = lhcData->fillNumber();
     m_betaStar = lhcData->betaStar();
diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
index a741bcbe55097ba754a256fe3804f0e6cc170db9..c30d246504358701ba89eb80c8c4831b0b699f06 100644
--- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
+++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h
@@ -114,7 +114,8 @@ private:
   BooleanProperty m_onlyBlinded          { this, "OnlyBlinded", false, "Only events that would be blinded are saved" };
   BooleanProperty m_doTrigFilter         { this, "DoTrigFilter", false, "Only events that pass trigger cuts are passed" };
   BooleanProperty m_doScintFilter        { this, "DoScintFilter", false, "Only events that pass scintillator coincidence cuts are passed" };
-  BooleanProperty m_doTrackFilter        { this, "DoTrackFilter", true, "Only events that have >= 1 long track are passed, also non-colliding events with a track or calo signal are passed" };
+  BooleanProperty m_doTrackFilter        { this, "DoTrackFilter", true, "Only events that have >= 1 long track are passed, also non-colliding events with a track or calo signal are passed (default)" };
+  BooleanProperty m_stableOnly           { this, "StableOnly", true, "Only events recorded during stable beams are saved (default)" };
 
   BooleanProperty m_useFlukaWeights      { this, "UseFlukaWeights", false, "Flag to weight events according to value stored in HepMC::GenEvent" };
   BooleanProperty m_useGenieWeights      { this, "UseGenieWeights", false, "Flag to weight events according to Genie luminosity" };
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
index 57d78d9d5e8df222d3e3af5bcb9423b3484132c8..87380dd7e41cb3d5b38d2f4b92ca784b95eca8b2 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
@@ -73,6 +73,7 @@ StatusCode CKF2::initialize() {
   } else {
     m_logger = Acts::getDefaultLogger("KalmanFitter", Acts::Logging::INFO);
   }
+
   return StatusCode::SUCCESS;
 }
 
@@ -279,6 +280,7 @@ StatusCode CKF2::execute() {
 
 StatusCode CKF2::finalize() {
   ATH_MSG_INFO("CombinatorialKalmanFilterAlg::finalize()");
+  ATH_MSG_INFO("BackwardPropagation: " << m_backwardPropagation);
   ATH_MSG_INFO(m_numberOfEvents << " events processed.");
   ATH_MSG_INFO(m_numberOfTrackSeeds << " seeds.");
   ATH_MSG_INFO(m_numberOfFittedTracks << " fitted tracks.");