diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
index eae2500fd741347e0c7b709067b017c07b1aaad6..ec0d26f9efa2e57c90a277f1f3c725902d80d04c 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
@@ -46,23 +46,12 @@ public:
    * @param uChan
    * @param bMasked
   */
-  void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
+  virtual void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
 
   /** @brief Set a predefined monitor @param monitor predefined unpacking monitor */
   void SetMonitor(std::shared_ptr<CbmStsUnpackMonitor> monitor) { fMonitor = monitor; }
 
 protected:
-  // /** @brief Add the sts-xyter-hits to the output buffer as Digis */
-  // void AddHitsToDigiVect(std::vector<stsxyter::FinalHit>* vmHitsIn, std::vector<CbmStsDigi>* vDigiVectOut);
-
-
-  /** @brief Finish function for this algorithm base clase */
-  void finish()
-  {
-    if (fMonitor) fMonitor->Finish();
-    return;
-  }
-
   /**
    * @brief Get the Asic Index
    *
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
index a1576547ad67f422aebbfc0b3aea0df6e3f4c9b6..379c30452452f4f6e8f97cde6d2ee679f0be4d3d 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
@@ -23,11 +23,4 @@ std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
   return &fParContVec;
 }
 
-// -------------------------------------------------------------------------
-void CbmStsUnpackAlgoBase::SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn)
-{
-  if (uAsicIdx >= fvdTimeOffsetNsAsics.size()) { fvdTimeOffsetNsAsics.resize(uAsicIdx + 1, 0.0); }
-  fvdTimeOffsetNsAsics[uAsicIdx] = dOffsetIn;
-}
-
 ClassImp(CbmStsUnpackAlgoBase)
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
index 319044d2774ee3e9f54976c68cc66974f9e1d5ac..d6a8acace16ef945e00eaa4b1f77b92c5c9b0285 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
@@ -62,9 +62,6 @@ public:
   /** @brief Set the time offset per Asic */
   void SetAsicTimeOffsetVec(std::vector<double> value) { fvdTimeOffsetNsAsics.swap(value); }
 
-  /** @brief Set the time offset per Asic */
-  void SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn = 0.0);
-
   /**
    * @brief Get the requested parameter containers. To be defined in the derived classes!
    * Return the required parameter containers together with the paths to the ascii
@@ -92,6 +89,13 @@ public:
   };
 
 protected:
+  /** @brief Finish function for this algorithm base clase */
+  virtual void finish()
+  {
+    if (fMonitor) fMonitor->Finish();
+    return;
+  }
+
   // Monitoring
   /** @brief Potential (online) monitor for the unpacking process */
   std::shared_ptr<CbmStsUnpackMonitor> fMonitor = nullptr;
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
index 57480fd737fd8470f67de6e819bbe27edf343c30..4332a646c695ce68ecabb1fb0552d721e142f530 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
@@ -33,9 +33,7 @@ CbmStsUnpackAlgoLegacy::CbmStsUnpackAlgoLegacy()
   : CbmStsUnpackAlgoBase("CbmStsUnpackAlgoLegacy")
   ,
   /// From the class itself
-  fbMonitorMode(false)
-  , fbDebugMonitorMode(false)
-  , fvbMaskedComponents()
+  fvbMaskedComponents()
   , fUnpackPar(nullptr)
   , fuNbFebs(0)
   , fDpbIdIndexMap()
@@ -78,12 +76,6 @@ bool CbmStsUnpackAlgoLegacy::init()
 // -------------------------------------------------------------------------
 void CbmStsUnpackAlgoLegacy::reset() {}
 
-// -------------------------------------------------------------------------
-void CbmStsUnpackAlgoLegacy::finish()
-{
-  /// Printout Goodbye message and stats
-  /// Write Output histos
-}
 
 // ---- initParSet(FairParGenericSet* parset) ----
 Bool_t CbmStsUnpackAlgoLegacy::initParSet(FairParGenericSet* parset)
@@ -342,33 +334,6 @@ void CbmStsUnpackAlgoLegacy::InitInternalStatus()
   }
 }
 
-/*
-// -------------------------------------------------------------------------
-bool CbmStsUnpackAlgoLegacy::Unpack(const fles::Timeslice& ts, const uint32_t uMsComp)
-{
-  fTsIndex = ts.index();
-
-  /// Loop over core microslices (and overlap ones if chosen)
-  for (uint32_t uMsIndex = 0; uMsIndex < fuNbMsLoop; uMsIndex++) {
-    if (false == ProcessMs(ts, uMsComp, uMsIndex)) {
-      LOG(error) << "Failed to process ts " << fTsIndex << " MS " << uMsIndex << " for component " << uMsComp;
-      return false;
-    }
-  }
-  /// Sort the buffers of hits
-  /// => Commented out as for now problems at MS borders due to offsets
-  //      std::sort( fvmHitsInMs.begin(), fvmHitsInMs.end() );
-
-  /// Add the hits to the output buffer as Digis
-  AddHitsToDigiVect(&fvmHitsInMs, &fOutputVec);
-
-  /// Clear the buffer of hits
-  fvmHitsInMs.clear();
-
-  return true;
-}
-*/
-
 void CbmStsUnpackAlgoLegacy::AddHitsToDigiVect(std::vector<stsxyter::FinalHit>* vmHitsIn,
                                                std::vector<CbmStsDigi>* vDigiVectOut)
 {
@@ -419,12 +384,12 @@ bool CbmStsUnpackAlgoLegacy::unpack(const fles::Timeslice* ts, std::uint16_t uMs
   //Temp holder until current equipment ID is properly filled in MS
   const uint32_t uCurrDpbId = static_cast<uint32_t>(uCurrentEquipmentId & 0xFFFF);
 
-  if (fbMonitorMode && fbDebugMonitorMode) {
+  if (fMonitor && fMonitor->GetDebugMode()) {
     const double dMsTime = (1e-9) * static_cast<double>(fulCurrentMsIdx);
-    if (uMsCompIdx < fUnpackMonitor->GetMaxNbFlibLinks()) {
+    if (uMsCompIdx < fMonitor->GetMaxNbFlibLinks()) {
       if (fdStartTimeMsSz < 0) fdStartTimeMsSz = dMsTime;
-      fUnpackMonitor->FillMsSize(uMsCompIdx, uSize);
-      fUnpackMonitor->FillMsSizeTime(uMsCompIdx, dMsTime - fdStartTimeMsSz, uSize);
+      fMonitor->FillMsSize(uMsCompIdx, uSize);
+      fMonitor->FillMsSizeTime(uMsCompIdx, dMsTime - fdStartTimeMsSz, uSize);
     }
   }
 
@@ -452,25 +417,25 @@ bool CbmStsUnpackAlgoLegacy::unpack(const fles::Timeslice* ts, std::uint16_t uMs
   else
     fuCurrDpbIdx = fDpbIdIndexMap[uCurrDpbId];
 
-  if (fbMonitorMode || fbDebugMonitorMode) fUnpackMonitor->FillMsCntEvo(fulCurrentMsIdx);
+  if (fMonitor) fMonitor->FillMsCntEvo(fulCurrentMsIdx);
 
   // Check the current TS_MSb cycle and correct it if wrong
   RefreshTsMsbFields(uMsIdx);
 
   //Reset internal monitor variables for debugging info
-  if (fbMonitorMode && fbDebugMonitorMode) { fUnpackMonitor->ResetDebugInfo(); }
+  if (fMonitor && fMonitor->GetDebugMode()) { fMonitor->ResetDebugInfo(); }
 
   //Main processing of MS content
   LoopMsMessages(msContent, uSize, uMsIdx);
 
   //Output debugging info
-  if (fbMonitorMode) {
-    if (fbDebugMonitorMode) { fUnpackMonitor->PrintDebugInfo(fulCurrentMsIdx, fTsIndex, msDescriptor.flags, uSize); }
+  if (fMonitor) {
+    if (fMonitor->GetDebugMode()) { fMonitor->PrintDebugInfo(fulCurrentMsIdx, fTsIndex, msDescriptor.flags, uSize); }
     for (auto itHit = fOutputVec.begin(); itHit != fOutputVec.end(); ++itHit) {
-      fUnpackMonitor->FillDigisTimeInRun(itHit->GetTime());  //check whether this does what it should
+      fMonitor->FillDigisTimeInRun(itHit->GetTime());  //check whether this does what it should
     }
-    fUnpackMonitor->FillVectorSize(ts->index(), fOutputVec.size());  //check whether this does what it should
-    //fUnpackMonitor->DrawCanvases();
+    fMonitor->FillVectorSize(ts->index(), fOutputVec.size());  //check whether this does what it should
+    //fMonitor->DrawCanvases();
   }
 
   AddHitsToDigiVect(&fvmHitsInMs, &fOutputVec);
@@ -531,7 +496,7 @@ void CbmStsUnpackAlgoLegacy::LoopMsMessages(const uint8_t* msContent, const uint
     /// Get message type
     const stsxyter::MessType typeMess = pMess[uIdx].GetMessType();
 
-    if (fbMonitorMode && fbDebugMonitorMode) { fUnpackMonitor->ProcessDebugInfo(pMess[uIdx], fuCurrDpbIdx); }
+    if (fMonitor && fMonitor->GetDebugMode()) { fMonitor->ProcessDebugInfo(pMess[uIdx], fuCurrDpbIdx); }
     switch (typeMess) {
       case stsxyter::MessType::Hit: {
         ProcessHitInfo(pMess[uIdx]);
@@ -627,19 +592,18 @@ void CbmStsUnpackAlgoLegacy::ProcessHitInfo(const stsxyter::Message& mess)
     fOptOutAVec->push_back(
       CbmErrorMessage(ECbmModuleId::kSts, dHitTimeNs, uAsicIdx, 1 << stsxyter::kusLenStatStatus, usChan));
 
-  if (fbMonitorMode) {
+  if (fMonitor) {
     // Check Starting point of histos with time as X axis
     if (-1 == fdStartTime) { fdStartTime = dHitTimeNs; }
-    if (fbDebugMonitorMode) {
-      fUnpackMonitor->FillHitDebugMonitoringHistos(uAsicIdx, usChan, usRawAdc, usRawTs, mess.IsHitMissedEvts());
+    if (fMonitor->GetDebugMode()) {
+      fMonitor->FillHitDebugMonitoringHistos(uAsicIdx, usChan, usRawAdc, usRawTs, mess.IsHitMissedEvts());
     }
     const uint32_t uAsicInFeb       = uAsicIdx % fUnpackPar->GetNbAsicsPerFeb();
     const double dTimeSinceStartSec = (dHitTimeNs - fdStartTime) * 1e-9;
     const double dCalAdc            = fvdFebAdcOffs[uFebIdx] + (usRawAdc - 1) * fvdFebAdcGain[uFebIdx];
-    fUnpackMonitor->FillHitMonitoringHistos(uFebIdx, usChan, uChanInFeb, usRawAdc, dCalAdc, usRawTs,
-                                            mess.IsHitMissedEvts());
-    fUnpackMonitor->FillHitEvoMonitoringHistos(uFebIdx, uAsicIdx, uAsicInFeb, uChanInFeb, dTimeSinceStartSec,
-                                               mess.IsHitMissedEvts());
+    fMonitor->FillHitMonitoringHistos(uFebIdx, usChan, uChanInFeb, usRawAdc, dCalAdc, usRawTs, mess.IsHitMissedEvts());
+    fMonitor->FillHitEvoMonitoringHistos(uFebIdx, uAsicIdx, uAsicInFeb, uChanInFeb, dTimeSinceStartSec,
+                                         mess.IsHitMissedEvts());
   }
 }
 
@@ -681,10 +645,10 @@ void CbmStsUnpackAlgoLegacy::ProcessTsMsbInfo(const stsxyter::Message& mess, uin
   else
     fvulCurrentTsMsb[fuCurrDpbIdx] = uVal;
 
-  if (fbMonitorMode && fbDebugMonitorMode) {  //also if( 1 < uMessIdx )?
-    fUnpackMonitor->FillStsDpbRawTsMsb(fuCurrDpbIdx, fvulCurrentTsMsb[fuCurrDpbIdx]);
-    fUnpackMonitor->FillStsDpbRawTsMsbSx(fuCurrDpbIdx, fvulCurrentTsMsb[fuCurrDpbIdx]);
-    fUnpackMonitor->FillStsDpbRawTsMsbDpb(fuCurrDpbIdx, fvulCurrentTsMsb[fuCurrDpbIdx]);
+  if (fMonitor && fMonitor->GetDebugMode()) {  //also if( 1 < uMessIdx )?
+    fMonitor->FillStsDpbRawTsMsb(fuCurrDpbIdx, fvulCurrentTsMsb[fuCurrDpbIdx]);
+    fMonitor->FillStsDpbRawTsMsbSx(fuCurrDpbIdx, fvulCurrentTsMsb[fuCurrDpbIdx]);
+    fMonitor->FillStsDpbRawTsMsbDpb(fuCurrDpbIdx, fvulCurrentTsMsb[fuCurrDpbIdx]);
   }
 }
 
@@ -698,7 +662,7 @@ void CbmStsUnpackAlgoLegacy::ProcessEpochInfo(const stsxyter::Message& /*mess*/)
 // -------------------------------------------------------------------------
 void CbmStsUnpackAlgoLegacy::ProcessStatusInfo(const stsxyter::Message& mess, uint32_t uIdx)
 {
-  if (fbMonitorMode && fbDebugMonitorMode) {
+  if (fMonitor && fMonitor->GetDebugMode()) {
     std::cout << Form("DPB %2u TS %12u MS %12u mess %5u ", fuCurrDpbIdx, fTsIndex, fulCurrentMsIdx, uIdx);
     mess.PrintMess(std::cout, stsxyter::MessagePrintMask::msg_print_Human);
   }
@@ -715,9 +679,9 @@ void CbmStsUnpackAlgoLegacy::ProcessStatusInfo(const stsxyter::Message& mess, ui
     (fuCurrDpbIdx * fUnpackPar->GetNbCrobsPerDpb() + uCrobIdx) * fUnpackPar->GetNbAsicsPerCrob()
     + fUnpackPar->ElinkIdxToAsicIdx(1 == fviFebType[fuCurrDpbIdx][uCrobIdx][uFebIdx], usElinkIdx);
 
-  if (fbMonitorMode) {
+  if (fMonitor) {
     const uint16_t usStatusField = mess.GetStatusStatus();
-    fUnpackMonitor->FillStsStatusMessType(uAsicIdx, usStatusField);
+    fMonitor->FillStsStatusMessType(uAsicIdx, usStatusField);
   }
   /// Compute the Full time stamp
   const int64_t ulTime = GetFullTimeStamp(0);
@@ -745,11 +709,11 @@ int64_t CbmStsUnpackAlgoLegacy::GetFullTimeStamp(const uint16_t usRawTs)
 void CbmStsUnpackAlgoLegacy::ProcessErrorInfo(const stsxyter::Message& mess)
 {
   if (mess.IsMsErrorFlagOn()) {
-    if (fbMonitorMode || fbDebugMonitorMode) {
-      fUnpackMonitor->FillMsErrorsEvo(fulCurrentMsIdx, mess.GetMsErrorType());
+    if (fMonitor) { fMonitor->FillMsErrorsEvo(fulCurrentMsIdx, mess.GetMsErrorType()); }
+    if (fOptOutAVec) {
+      fOptOutAVec->push_back(
+        CbmErrorMessage(ECbmModuleId::kSts, fulCurrentMsIdx, fuCurrDpbIdx, 0x20, mess.GetMsErrorType()));
     }
-    fOptOutAVec->push_back(
-      CbmErrorMessage(ECbmModuleId::kSts, fulCurrentMsIdx, fuCurrDpbIdx, 0x20, mess.GetMsErrorType()));
   }
 }
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
index f75b05e5507c849f86099fd064256945a316ee1f..b38f4b9a20ffe666e5182770c035a47f7493b03c 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
@@ -39,18 +39,13 @@ public:
 
   virtual bool init();
   virtual void reset();
-  virtual void finish();
 
   bool InitParameters();
 
   //virtual bool Unpack(const fles::Timeslice& ts, const uint32_t uMsComp);
 
-  inline void SetMonitorMode(bool bFlagIn = true) { fbMonitorMode = bFlagIn; }
-  inline void SetDebugMonitorMode(bool bFlagIn = true) { fbDebugMonitorMode = bFlagIn; }
   inline void SetTimeOffsetNs(double dOffsetIn = 0.0) { fdTimeOffsetNs = dOffsetIn; }
-  void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
-
-  void SetUnpackStsMonitor(CbmStsUnpackMonitor* inMonitor) { fUnpackMonitor = inMonitor; }
+  virtual void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
 
 protected:
   /**
@@ -68,13 +63,8 @@ protected:
 
 private:
   /// Control flags
-  bool fbMonitorMode;       //! Switch ON the filling of a minimal set of histograms
-  bool fbDebugMonitorMode;  //! Switch ON the filling of a additional set of histograms
   std::vector<bool> fvbMaskedComponents;
 
-  /// Storage of monitoring histograms
-  CbmStsUnpackMonitor* fUnpackMonitor = nullptr;
-
   /// Settings from parameter file
   CbmMcbm2018StsPar* fUnpackPar;                //!
                                                 /// Readout chain dimensions and mapping
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx b/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
index c4dea57ece3cc081257bf8cb0b2d2435c3f71efb..c862b1d93f7fa217c6f911ed48878bebb65ded04 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
@@ -47,13 +47,13 @@ void CbmStsUnpackConfig::InitUnpacker()
   // Set the single asics time offsets
   algo->SetAsicTimeOffsetVec(fvdTimeOffsetNsAsics);
 
+  // Now we have all information required to initialise the algorithm
+  algo->Init();
+
   // Mask the noisy channels set by the user
   for (auto chmask : fvChanMasks)
     algo->MaskNoisyChannel(chmask.uFeb, chmask.uChan, chmask.bMasked);
 
-  // Now we have all information required to initialise the algorithm
-  algo->Init();
-
   if (fMonitor) {
     fMonitor->Init(static_cast<CbmMcbm2018StsPar*>(reqparvec->at(0).second.get()));
     algo->SetMonitor(fMonitor);
@@ -71,7 +71,8 @@ std::shared_ptr<CbmStsUnpackAlgoBase> CbmStsUnpackConfig::chooseAlgo()
   // Default unpacker selection
   // Unpacker algo from mcbm 2021 on and hopefully default for a long time.
   auto algo = std::make_shared<CbmStsUnpackAlgo>();
-  //auto algo = std::make_shared<CbmStsUnpackAlgoLegacy>();
+  //auto algo = std::make_shared<CbmStsUnpackAlgoLegacy>();  // for 2020 runs
+
   LOG(info) << fName << "::chooseAlgo() - selected algo = " << algo->Class_Name();
   return algo;