diff --git a/algo/base/Options.cxx b/algo/base/Options.cxx
index 9e3a72dcf4c18cde4e11be85e798a2ecc07d8dbe..0bdeba45012d0176b7006b6932d72a1e2d07fc4d 100644
--- a/algo/base/Options.cxx
+++ b/algo/base/Options.cxx
@@ -69,9 +69,9 @@ Options::Options(int argc, char** argv)
       "write log messages to file")
     ("output,o", po::value(&fOutputTypes)->multitoken()->default_value({RecoData::Hit})->value_name("<types>"),
       "comma seperated list of reconstruction output types (hit, digi, ...)")
-    ("steps", po::value(&fRecoSteps)->multitoken()->default_value({Step::LocalReco})->value_name("<steps>"),
+    ("steps", po::value(&fRecoSteps)->multitoken()->default_value({Step::Unpack, Step::LocalReco})->value_name("<steps>"),
       "comma seperated list of reconstruction steps (upack, digitrigger, localreco, ...)")
-    ("systems,s", po::value(&fDetectors)->multitoken()->default_value({fles::Subsystem::STS})->value_name("<detectors>"),
+    ("systems,s", po::value(&fDetectors)->multitoken()->default_value({fles::Subsystem::STS, fles::Subsystem::TOF, fles::Subsystem::BMON})->value_name("<detectors>"),
       "comma seperated list of detectors to process (sts, mvd, ...)")
     ("num-ts,n", po::value(&fNumTimeslices)->default_value(-1)->value_name("<num>"),
       "Stop after <num> timeslices (-1 = all)")
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index dfad5dc7a5650b61631853209d5b159c8cb515af..835e25b503358293e1f9b058526618017c397e79 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -27,6 +27,8 @@ void Reco::Validate(const Options& opts)
   for (auto detector : opts.Detectors()) {
     switch (detector) {
       case fles::Subsystem::STS: break;
+      case fles::Subsystem::TOF: break;
+      case fles::Subsystem::BMON: break;
       default: throw std::runtime_error(fmt::format("Unsupported system: {}", ToString(detector)));
     }
   }
@@ -85,15 +87,19 @@ void Reco::Run(const fles::Timeslice& ts)
   xpu::set<cbm::algo::Params>(Params());
 
   std::vector<CbmStsDigi> digis;
-  switch (Params().sts.unpackMode) {
-    case RecoParams::UnpackMode::XPU:
-      // digis = fUnpackXpu.Exec(ts);
-      throw std::runtime_error("XPU unpacker currently not implemented");
-      break;
-    default:
-    case RecoParams::UnpackMode::CPU: digis = fUnpack.Run(ts).first.fData.fSts.fDigis; break;
+
+  if (Opts().HasStep(Step::Unpack)) {
+    switch (Params().sts.unpackMode) {
+      case RecoParams::UnpackMode::XPU:
+        // digis = fUnpackXpu.Exec(ts);
+        throw std::runtime_error("XPU unpacker currently not implemented");
+        break;
+      default:
+      case RecoParams::UnpackMode::CPU: digis = fUnpack.Run(ts).first.fData.fSts.fDigis; break;
+    }
   }
-  fStsHitFinder(digis);
+
+  if (Opts().HasStep(Step::LocalReco) && Opts().HasDetector(fles::Subsystem::STS)) fStsHitFinder(digis);
 
   xpu::timings ts_times = xpu::pop_timer();
 
diff --git a/algo/unpack/UnpackChain.cxx b/algo/unpack/UnpackChain.cxx
index 3132c5d775dd56feda9ca5313ef11ac7f2090d38..52efc0a03d3c1078c4399b978f3838a0cedf50b5 100644
--- a/algo/unpack/UnpackChain.cxx
+++ b/algo/unpack/UnpackChain.cxx
@@ -7,15 +7,8 @@ using namespace cbm::algo;
 
 void UnpackChain::Init()
 {
-  // Disable walk correction for now. 2022 data crashes unpacker with hardcoded 2021 params.
   fUnpack.SetApplyWalkCorrection(true);
-  fUnpack.Init(std::vector<fles::Subsystem> {
-    fles::Subsystem::STS,
-    // fles::Subsystem::MUCH,
-    fles::Subsystem::TOF, fles::Subsystem::BMON,
-    // fles::Subsystem::TRD,
-    // fles::Subsystem::TRD2D,
-  });
+  fUnpack.Init(Opts().Detectors());
 }
 
 Unpack::resultType UnpackChain::Run(const fles::Timeslice& timeslice)