diff --git a/algo/base/Definitions.h b/algo/base/Definitions.h
index e77cbea124c2dd87a8f423b207a06f84b566d8ac..dee31c8dcee4d8256f1c570e18dde9573676389c 100644
--- a/algo/base/Definitions.h
+++ b/algo/base/Definitions.h
@@ -54,6 +54,31 @@ namespace cbm::algo
     mCBM2024_05,
   };
 
+  enum class QaStep
+  {
+    BeamBmon,
+    UnpackBmon,
+    UnpackSts,
+    UnpackMvd,
+    UnpackRich,
+    UnpackTrd1d,
+    UnpackTrd2d,
+    UnpackMuch,
+    UnpackTof,
+    UnpackFsd,
+    EventBuilding,
+    RecoBmon,
+    RecoSts,
+    RecoMvd,
+    RecoRich,
+    RecoTrd1d,
+    RecoTrd2d,
+    RecoMuch,
+    RecoTof,
+    RecoFsd,
+    Tracking,
+  };
+
 }  // namespace cbm::algo
 
 CBM_ENUM_DICT(fles::Subsystem,
@@ -100,4 +125,28 @@ CBM_ENUM_DICT(cbm::algo::Setup,
   {"mCBM2024_05", cbm::algo::Setup::mCBM2024_05}
 );
 
+CBM_ENUM_DICT(cbm::algo::QaStep,
+  {"BeamBmon", cbm::algo::QaStep::BeamBmon},
+  {"UnpackBmon", cbm::algo::QaStep::UnpackBmon},
+  {"UnpackSts", cbm::algo::QaStep::UnpackSts},
+  {"UnpackMvd", cbm::algo::QaStep::UnpackMvd},
+  {"UnpackRich", cbm::algo::QaStep::UnpackRich},
+  {"UnpackTrd1d", cbm::algo::QaStep::UnpackTrd1d},
+  {"UnpackTrd2d", cbm::algo::QaStep::UnpackTrd2d},
+  {"UnpackMuch", cbm::algo::QaStep::UnpackMuch},
+  {"UnpackTof", cbm::algo::QaStep::UnpackTof},
+  {"UnpackFsd", cbm::algo::QaStep::UnpackFsd},
+  {"EventBuilding", cbm::algo::QaStep::EventBuilding},
+  {"RecoBmon", cbm::algo::QaStep::RecoBmon},
+  {"RecoSts", cbm::algo::QaStep::RecoSts},
+  {"RecoMvd", cbm::algo::QaStep::RecoMvd},
+  {"RecoRich", cbm::algo::QaStep::RecoRich},
+  {"RecoTrd1d", cbm::algo::QaStep::RecoTrd1d},
+  {"RecoTrd2d", cbm::algo::QaStep::RecoTrd2d},
+  {"RecoMuch", cbm::algo::QaStep::RecoMuch},
+  {"RecoTof", cbm::algo::QaStep::RecoTof},
+  {"RecoFsd", cbm::algo::QaStep::RecoFsd},
+  {"Tracking", cbm::algo::QaStep::Tracking}
+);
+
 #endif
diff --git a/algo/base/Options.cxx b/algo/base/Options.cxx
index d289178361a80f60abb168d37adb49588a67cd64..662b21080bd8e240f3334216f3dc3319f7b00248 100644
--- a/algo/base/Options.cxx
+++ b/algo/base/Options.cxx
@@ -77,15 +77,17 @@ Options::Options(int argc, char** argv)
      " 0 = no buffering, num = nb updates kept in buffer if not pulled by server \n"
      " Tune to avoid too high memory usage but also adapt to server load!")
     ("aux-data", po::value(&fCollectAuxData)->implicit_value(true), "Enables collecting of auxiliary data from algorithms")
+    ("qa", po::value(&fQaSteps)->multitoken()->default_value({QaStep::UnpackSts, QaStep::EventBuilding, QaStep::Tracking})->value_name("<qa steps>"),
+      "space separated list of QA Steps to enable (BeamBmon, UnpackSts, EventBuilding, Tracking, ...)")
     ("log-file,L", po::value(&fLogFile)->value_name("<file>"),
       "write log messages to file")
     ("output-types,O", po::value(&fOutputTypes)->multitoken()->value_name("<types>"),
       "space separated list of reconstruction output types (Hit, Tracks, DigiTimeslice, DigiEvent, ...)")
     ("compress-archive", po::bool_switch(&fCompressArchive)->default_value(false), "Enable compression for output archives")
     ("steps", po::value(&fRecoSteps)->multitoken()->default_value({Step::Unpack, Step::DigiTrigger, Step::LocalReco, Step::Tracking})->value_name("<steps>"),
-      "space seperated list of reconstruction steps (unpack, digitrigger, localreco, ...)")
+      "space separated list of reconstruction steps (unpack, digitrigger, localreco, ...)")
     ("systems,s", po::value(&fDetectors)->multitoken()->default_value({Subsystem::STS, Subsystem::TOF, Subsystem::BMON, Subsystem::MUCH, Subsystem::RICH, Subsystem::TRD, Subsystem::TRD2D})->value_name("<detectors>"),
-      "space seperated list of detectors to process (sts, mvd, ...)")
+      "space separated list of detectors to process (sts, mvd, ...)")
     ("child-id,c", po::value(&fChildId)->default_value("00")->value_name("<id>"), "online process id on node")
     ("run-id,r", po::value(&fRunId)->default_value(2391)->value_name("<RunId>"), "Run ID, for now flesctl run index, later run start time")
     ("num-ts,n", po::value(&fNumTimeslices)->default_value(-1)->value_name("<num>"),
@@ -143,3 +145,5 @@ bool Options::HasOutput(RecoData recoData) const { return Contains(fOutputTypes,
 bool Options::Has(fles::Subsystem detector) const { return Contains(fDetectors, detector); }
 
 bool Options::Has(Step step) const { return Contains(fRecoSteps, step); }
+
+bool Options::Has(QaStep qastep) const { return Contains(fQaSteps, qastep); }
diff --git a/algo/base/Options.h b/algo/base/Options.h
index bb67de3defd5d9f6b9550b2b6009b89bd8eab855..d6e693d1569000cf596cdc51a6dc3783b4cf2a7b 100644
--- a/algo/base/Options.h
+++ b/algo/base/Options.h
@@ -62,6 +62,8 @@ namespace cbm::algo
 
     bool Has(Step step) const;
 
+    bool Has(QaStep qastep) const;
+
    private:                  // members
     std::string fParamsDir;  // TODO: can we make this a std::path?
     std::string fInputLocator;
@@ -72,6 +74,7 @@ namespace cbm::algo
     std::string fMonitorUri;
     std::string fHistogramUri;
     int32_t fHistogramHwm;
+    std::vector<QaStep> fQaSteps;
     bool fDumpArchive              = false;
     bool fReleaseMode              = false;
     ProfilingLevel fProfilingLevel = ProfilingNone;
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index faa3a29d466f5049cbcd0002d8c8277e7cecec65..c200260f4433c21b5bfe713be9593a5c11d3040a 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -128,7 +128,7 @@ void Reco::Init(const Options& opts)
     sts::ReadoutConfig readout{readoutSetup, chanMask};
     sts::Unpack::Config cfg{.readout = readout, .walkMap = walkMap, .bCollectAuxData = bCollectAux};
     fStsUnpack = std::make_unique<sts::Unpack>(cfg);
-    if (fSender != nullptr) {
+    if (fSender != nullptr && Opts().Has(QaStep::UnpackSts)) {
       fStsDigiQa = std::make_unique<sts::DigiQa>(fSender);
       fStsDigiQa->SetUseAuxData(bCollectAux);
       fStsDigiQa->RegisterReadoutSetup(readoutSetup);
@@ -164,7 +164,8 @@ void Reco::Init(const Options& opts)
   if (Opts().Has(Step::DigiTrigger)) {
     fs::path configFile = opts.ParamsDir() / "EventbuildConfig.yaml";
     evbuild::Config config(YAML::LoadFile(configFile.string()));
-    fEventBuild = std::make_unique<evbuild::EventbuildChain>(config, fSender);
+    fEventBuild =
+      std::make_unique<evbuild::EventbuildChain>(config, (Opts().Has(QaStep::EventBuilding) ? fSender : nullptr));
     fEventBuild->RegisterTrackingSetup(pTrackingSetup);
   }
 
@@ -199,7 +200,7 @@ void Reco::Init(const Options& opts)
 
   // Tracking
   if (Opts().Has(Step::Tracking)) {
-    fTracking = std::make_unique<TrackingChain>(fSender);
+    fTracking = std::make_unique<TrackingChain>(Opts().Has(QaStep::Tracking) ? fSender : nullptr);
     fTracking->RegisterSetup(pTrackingSetup);
     fTracking->SetContext(&fContext);
     fTracking->Init();