diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5c30b61ea7bc79c3c5cd3f7308db2c725f255a45..8973e9a81fedf822a2669ecca30e7082510754ec 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -71,7 +71,7 @@ include:
     #  - local: 'benchmarks/rich/config.yml'
   - local: 'benchmarks/imaging_ecal/config.yml'
   - local: 'benchmarks/imaging_shower_ML/config.yml'
-  - local: 'benchmarks/B0/config.yml'
+  - local: 'benchmarks/far_forward/config.yml'
 
 final_report:
   stage: finish
diff --git a/benchmarks/B0/config.yml b/benchmarks/far_forward/config.yml
similarity index 62%
rename from benchmarks/B0/config.yml
rename to benchmarks/far_forward/config.yml
index d5444920337f31192bcd1fb37ec15d9f76859497..21347be9428d80c592e17512c6f421b697c7d8e8 100644
--- a/benchmarks/B0/config.yml
+++ b/benchmarks/far_forward/config.yml
@@ -3,4 +3,4 @@ B0_far_forward_protons:
   stage: run
   timeout: 24 hours
   script:
-    - bash benchmarks/B0/far_forward_protons.sh
+    - bash benchmarks/far_forward/far_forward_protons.sh
diff --git a/benchmarks/B0/far_forward_protons.sh b/benchmarks/far_forward/far_forward_protons.sh
similarity index 85%
rename from benchmarks/B0/far_forward_protons.sh
rename to benchmarks/far_forward/far_forward_protons.sh
index 16f77c00ad35b07c49372180cc8b04284dc6793f..a319809f12de2daee06c7befd0b826927ef42bf0 100644
--- a/benchmarks/B0/far_forward_protons.sh
+++ b/benchmarks/far_forward/far_forward_protons.sh
@@ -70,7 +70,7 @@ if [[ -z "${REC_ONLY}" && -z "${ANALYSIS_ONLY}" ]] ;
 then
 
   ## generate the input events
-  root -b -q "benchmarks/B0/scripts/gen_far_forward_protons.cxx(${JUGGLER_N_EVENTS}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")"
+  root -b -q "benchmarks/far_forward/scripts/gen_far_forward_protons.cxx(${JUGGLER_N_EVENTS}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")"
   if [[ "$?" -ne "0" ]] ; then
     echo "ERROR running script"
     exit 1
@@ -96,22 +96,25 @@ rootls -t ${JUGGLER_SIM_FILE}
 if [[ -z "${ANALYSIS_ONLY}" ]] ;
 then
   # Need to figure out how to pass file name to juggler from the commandline
-  xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv gaudirun.py benchmarks/B0/options/B0_tracker_reconstruction.py
+  xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv gaudirun.py benchmarks/far_forward/options/far_forward_reconstruction.py
   if [[ "$?" -ne "0" ]] ; then
     echo "ERROR running juggler"
     exit 1
   fi
 fi
 
-mkdir -p results/B0
+mkdir -p results/far_forward
+mkdir -p results/far_forward/B0
+mkdir -p results/far_forward/RomanPot
+mkdir -p results/far_forward/OffMTracker
 
-root -b -q "benchmarks/B0/scripts/rec_far_forward_protons.cxx(\"${JUGGLER_REC_FILE}\")"
+root -b -q "benchmarks/far_forward/scripts/rec_far_forward_protons.cxx(\"${JUGGLER_REC_FILE}\")"
 if [[ "$?" -ne "0" ]] ; then
   echo "ERROR running root script"
   exit 1
 fi
 
-root -b -q "benchmarks/B0/scripts/hits_far_forward_protons.cxx(\"${JUGGLER_SIM_FILE}\")"
+root -b -q "benchmarks/far_forward/scripts/hits_far_forward_protons.cxx(\"${JUGGLER_SIM_FILE}\")"
 if [[ "$?" -ne "0" ]] ; then
   echo "ERROR running root script"
   exit 1
diff --git a/benchmarks/B0/options/B0_tracker_reconstruction.py b/benchmarks/far_forward/options/far_forward_reconstruction.py
similarity index 68%
rename from benchmarks/B0/options/B0_tracker_reconstruction.py
rename to benchmarks/far_forward/options/far_forward_reconstruction.py
index 5db97e3bb6db71b941b543aff8c966601d67ee5c..c03d7c5ff6d8bbcbc348378a07fd88c120ac6231 100644
--- a/benchmarks/B0/options/B0_tracker_reconstruction.py
+++ b/benchmarks/far_forward/options/far_forward_reconstruction.py
@@ -28,39 +28,77 @@ from Configurables import Jug__Reco__TrackFindingAlgorithm as TrackFindingAlgori
 from Configurables import Jug__Reco__ParticlesFromTrackFit as ParticlesFromTrackFit
 from Configurables import Jug__Base__InputCopier_dd4pod__Geant4ParticleCollection_dd4pod__Geant4ParticleCollection_ as MCCopier
 
+from Configurables import Jug__Reco__TrackerHitReconstruction as TrackerHitReconstruction
 
 sim_colls = [
     "mcparticles",
-    "B0TrackerHits"
+    "B0TrackerHits",
+    "ForwardRomanPotHits",
+    "ForwardOffMTrackerHits"
 ]
+
+# list of algorithms
+algorithms = []
+
+# input
 podin = PodioInput("PodioReader", collections=sim_colls)
-podout = PodioOutput("out", filename=output_rec)
+algorithms.append(podin)
 
 ## copiers to get around input --> output copy bug. Note the "2" appended to the output collection.
 mccopier = MCCopier("MCCopier",
         inputCollection="mcparticles",
         outputCollection="mcparticles2")
-
+algorithms.append(mccopier)
+
+## Roman pots
+ffi_romanpot_digi = TrackerDigi("ffi_romanpot_digi",
+        inputHitCollection = "ForwardRomanPotHits",
+        outputHitCollection = "ForwardRomanPotRawHits",
+        timeResolution = 8)
+algorithms.append(ffi_romanpot_digi)
+
+ffi_romanpot_reco = TrackerHitReconstruction("ffi_romanpot_reco",
+        inputHitCollection = ffi_romanpot_digi.outputHitCollection,
+        outputHitCollection = "ForwardRomanPotRecHits")
+algorithms.append(ffi_romanpot_reco)
+
+## Off momentum tracker
+ffi_offmtracker_digi = TrackerDigi("ffi_offmtracker_digi",
+        inputHitCollection = "ForwardOffMTrackerHits",
+        outputHitCollection = "ForwardOffMTrackerRawHits",
+        timeResolution = 8)
+algorithms.append(ffi_offmtracker_digi)
+
+ffi_offmtracker_reco = TrackerHitReconstruction("ffi_offmtracker_reco",
+        inputHitCollection = ffi_offmtracker_digi.outputHitCollection,
+        outputHitCollection = "ForwardOffMTrackerRedHits")
+algorithms.append(ffi_offmtracker_reco)
+
+## B0 tracker
 trk_b0_digi = TrackerDigi("trk_b0_digi",
         inputHitCollection="B0TrackerHits",
         outputHitCollection="B0TrackerRawHits",
         timeResolution=8)
+algorithms.append(trk_b0_digi)
 
 trk_b0_reco = TrackerReco("trk_b_reco",
         inputHitCollection = trk_b0_digi.outputHitCollection,
         outputHitCollection="B0TrackerRecHits")
+algorithms.append(trk_b0_reco)
 
 sourcelinker = TrackerSourcesLinker("trk_srcslnkr",
-        inputHitCollections=["B0TrackerRecHits"],
+        inputHitCollections=[trk_b0_reco.outputHitCollection],
         outputSourceLinks="B0TrackerSourceLinks",
         outputMeasurements="B0TrackerMeasurements",
         OutputLevel=INFO)
+algorithms.append(sourcelinker)
 
 ## Track param init
 truth_trk_init = TrackParamTruthInit("truth_trk_init",
         inputMCParticles="mcparticles",
         outputInitialTrackParameters="InitTrackParams",
         OutputLevel=INFO)
+algorithms.append(truth_trk_init)
 
 # Tracking algorithms
 trk_find_alg = TrackFindingAlgorithm("trk_find_alg",
@@ -69,13 +107,17 @@ trk_find_alg = TrackFindingAlgorithm("trk_find_alg",
         inputInitialTrackParameters= truth_trk_init.outputInitialTrackParameters,
         outputTrajectories="trajectories",
         OutputLevel=INFO)
+algorithms.append(trk_find_alg)
 
 parts_from_fit = ParticlesFromTrackFit("parts_from_fit",
         inputTrajectories=trk_find_alg.outputTrajectories,
         outputParticles="ReconstructedParticles",
         outputTrackParameters="outputTrackParameters",
         OutputLevel=INFO)
+algorithms.append(parts_from_fit)
 
+# output
+podout = PodioOutput("out", filename=output_rec)
 podout.outputCommands = [
     "keep *",
     "drop InitTrackParams",
@@ -84,19 +126,12 @@ podout.outputCommands = [
     "drop outputInitialTrackParameters",
     "drop mcparticles",
 ]
+algorithms.append(podout)
 
 ApplicationMgr(
-    TopAlg = [podin, mccopier,
-              trk_b0_digi,
-              trk_b0_reco,
-              sourcelinker,
-              truth_trk_init,
-              trk_find_alg,
-              parts_from_fit,
-              podout
-              ],
+    TopAlg = algorithms,
     EvtSel = 'NONE',
-    EvtMax   = n_events,
+    EvtMax = n_events,
     ExtSvc = [podioevent, geo_service],
     OutputLevel=WARNING
  )
diff --git a/benchmarks/B0/scripts/gen_far_forward_protons.cxx b/benchmarks/far_forward/scripts/gen_far_forward_protons.cxx
similarity index 100%
rename from benchmarks/B0/scripts/gen_far_forward_protons.cxx
rename to benchmarks/far_forward/scripts/gen_far_forward_protons.cxx
diff --git a/benchmarks/B0/scripts/hits_far_forward_protons.cxx b/benchmarks/far_forward/scripts/hits_far_forward_protons.cxx
similarity index 91%
rename from benchmarks/B0/scripts/hits_far_forward_protons.cxx
rename to benchmarks/far_forward/scripts/hits_far_forward_protons.cxx
index cb6adfdcb9e2084c8b9b692167166f3a0f4ac87c..29ee91f1964ad726b740f3ffcf2bb6dc8081badf 100644
--- a/benchmarks/B0/scripts/hits_far_forward_protons.cxx
+++ b/benchmarks/far_forward/scripts/hits_far_forward_protons.cxx
@@ -139,8 +139,8 @@ int hits_far_forward_protons(const char* fname = "sim_far_forward_protons.root")
   //hs->Add(h1);
   hs->Draw("nostack, hist");
   c->BuildLegend();
-  c->SaveAs("results/B0/hits_far_forward_protons_n_hits_vs_theta.png");
-  c->SaveAs("results/B0/hits_far_forward_protons_n_hits_vs_theta.pdf");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_n_hits_vs_theta.png");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_n_hits_vs_theta.pdf");
 
   c  = new TCanvas();
   hs = new THStack("theta","; #theta  ");
@@ -161,8 +161,8 @@ int hits_far_forward_protons(const char* fname = "sim_far_forward_protons.root")
   //hs->Add(h1);
   hs->Draw("nostack hist");
   c->BuildLegend();
-  c->SaveAs("results/B0/hits_far_forward_protons_theta.png");
-  c->SaveAs("results/B0/hits_far_forward_protons_theta.pdf");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_theta.png");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_theta.pdf");
 
   c  = new TCanvas();
   hs = new THStack("hits","; hits  ");
@@ -179,12 +179,12 @@ int hits_far_forward_protons(const char* fname = "sim_far_forward_protons.root")
   //hs->Add(h1);
   //hs->Draw("nostack hist");
   c->BuildLegend();
-  c->SaveAs("results/B0/hits_far_forward_protons_nhits.png");
-  c->SaveAs("results/B0/hits_far_forward_protons_nhits.pdf");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_nhits.png");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_nhits.pdf");
 
   c = new TCanvas();
   hBarrel_x_vs_y->DrawCopy("colz");
-  c->SaveAs("results/B0/hits_far_forward_protons_xy.png");
-  c->SaveAs("results/B0/hits_far_forward_protons_xy.pdf");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_xy.png");
+  c->SaveAs("results/far_forward/B0/hits_far_forward_protons_xy.pdf");
   return 0;
 }
diff --git a/benchmarks/B0/scripts/rec_far_forward_protons.cxx b/benchmarks/far_forward/scripts/rec_far_forward_protons.cxx
similarity index 88%
rename from benchmarks/B0/scripts/rec_far_forward_protons.cxx
rename to benchmarks/far_forward/scripts/rec_far_forward_protons.cxx
index e9c43514376022a6841d6494af6104edbab095f9..493ae13a9703eee171b4fee241fed9e31d997259 100644
--- a/benchmarks/B0/scripts/rec_far_forward_protons.cxx
+++ b/benchmarks/far_forward/scripts/rec_far_forward_protons.cxx
@@ -130,12 +130,12 @@ int rec_far_forward_protons(const char* fname = "topside/rec_far_forward_protons
   auto c = new TCanvas();
 
   h_nTracks->DrawCopy();
-  c->SaveAs("results/B0/rec_far_forward_protons_nTracks.png");
-  c->SaveAs("results/B0/rec_far_forward_protons_nTracks.pdf");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_nTracks.png");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_nTracks.pdf");
 
   h_pTracks->DrawCopy();
-  c->SaveAs("results/B0/rec_far_forward_protons_pTracks.png");
-  c->SaveAs("results/B0/rec_far_forward_protons_pTracks.pdf");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_pTracks.png");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_pTracks.pdf");
 
   c = new TCanvas();
   THStack * hs = new THStack("hs_delta_p","; GeV/c ");
@@ -151,8 +151,8 @@ int rec_far_forward_protons(const char* fname = "topside/rec_far_forward_protons
   //hs->Add(h1);
   hs->Draw("nostack");
   c->BuildLegend();
-  c->SaveAs("results/B0/rec_far_forward_protons_delta_p.png");
-  c->SaveAs("results/B0/rec_far_forward_protons_delta_p.pdf");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_delta_p.png");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_delta_p.pdf");
 
   c  = new TCanvas();
   hs = new THStack("hs_delta_p_over_p","; delta p/p ");
@@ -168,8 +168,8 @@ int rec_far_forward_protons(const char* fname = "topside/rec_far_forward_protons
   //hs->Add(h1);
   hs->Draw("nostack");
   c->BuildLegend();
-  c->SaveAs("results/B0/rec_far_forward_protons_delta_p_over_p.png");
-  c->SaveAs("results/B0/rec_far_forward_protons_delta_p_over_p.pdf");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_delta_p_over_p.png");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_delta_p_over_p.pdf");
 
   c  = new TCanvas();
   hs = new THStack("n_hits","; #theta  ");
@@ -189,8 +189,8 @@ int rec_far_forward_protons(const char* fname = "topside/rec_far_forward_protons
   //hs->Add(h1);
   hs->Draw("nostack, hist");
   c->BuildLegend();
-  c->SaveAs("results/B0/rec_far_forward_protons_n_hits_vs_theta.png");
-  c->SaveAs("results/B0/rec_far_forward_protons_n_hits_vs_theta.pdf");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_n_hits_vs_theta.png");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_n_hits_vs_theta.pdf");
 
   c  = new TCanvas();
   hs = new THStack("theta","; #theta  ");
@@ -211,8 +211,8 @@ int rec_far_forward_protons(const char* fname = "topside/rec_far_forward_protons
   //hs->Add(h1);
   hs->Draw("nostack hist");
   c->BuildLegend();
-  c->SaveAs("results/B0/rec_far_forward_protons_theta.png");
-  c->SaveAs("results/B0/rec_far_forward_protons_theta.pdf");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_theta.png");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_theta.pdf");
 
   c  = new TCanvas();
   hs = new THStack("hits","; hits  ");
@@ -229,8 +229,8 @@ int rec_far_forward_protons(const char* fname = "topside/rec_far_forward_protons
   //hs->Add(h1);
   //hs->Draw("nostack hist");
   c->BuildLegend();
-  c->SaveAs("results/B0/rec_far_forward_protons_nhits.png");
-  c->SaveAs("results/B0/rec_far_forward_protons_nhits.pdf");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_nhits.png");
+  c->SaveAs("results/far_forward/B0/rec_far_forward_protons_nhits.pdf");
 
 
   return 0;