diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
index f9992f794ad3cebcad198198b654af452e2b892b..917c66b4aeb7fab8b4d5bb29ba40e5eb3ddc93bd 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
@@ -48,22 +48,6 @@ uint64_t CbmStsUnpackAlgo::getFullTimeStamp(const uint16_t usRawTs)
   return ulTime;
 }
 
-
-// ---- GetParContainerRequest ----
-std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
-  CbmStsUnpackAlgo::GetParContainerRequest(std::string /*geoTag*/, std::uint32_t /*runId*/)
-{
-  // Basepath for default Trd parameter sets (those connected to a geoTag)
-  std::string basepath = Form("%s", fParFilesBasePath.data());
-  std::string temppath = "";
-
-  // // Get parameter container
-  temppath = basepath + "mStsPar.par";
-  fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmMcbm2018StsPar>()));
-
-  return &fParContVec;
-}
-
 // ---- init
 Bool_t CbmStsUnpackAlgo::init() { return kTRUE; }
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
index b59acc51392576084ca67cea889dba49a1054aea..eae2500fd741347e0c7b709067b017c07b1aaad6 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
@@ -39,18 +39,6 @@ public:
   /** @brief Assignment operator - not implemented **/
   CbmStsUnpackAlgo& operator=(const CbmStsUnpackAlgo&) = delete;
 
-  /**
-   * @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
-   * files to.
-   *
-   * @param[in] std::string geoTag as used in CbmSetup
-   * @param[in] std::uint32_t runId for runwise defined parameters
-   * @return fParContVec
-  */
-  virtual std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
-  GetParContainerRequest(std::string geoTag, std::uint32_t runId);
-
   /**
    * @brief Mask a Noisy Channel
    *
@@ -60,12 +48,6 @@ public:
   */
   void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
 
-  /** @brief Set the minimum adc cut value @param[in] value */
-  void SetMinAdcCut(uint32_t value) { fdAdcCut = value; }
-
-  /** @brief Set the minimum adc cut value @param[in] value */
-  void SetAsicTimeOffsetVec(std::vector<double> value) { fvdTimeOffsetNsAsics.swap(value); }
-
   /** @brief Set a predefined monitor @param monitor predefined unpacking monitor */
   void SetMonitor(std::shared_ptr<CbmStsUnpackMonitor> monitor) { fMonitor = monitor; }
 
@@ -241,12 +223,6 @@ protected:
   /** @brief Vector used for the translation between eLink index and Asic index first is feb type A second is feb type b*/
   std::vector<std::pair<uint32_t, uint32_t>> fElinkIdxToAsicIdxVec = {};
 
-  /** @brief Minimum adc cut to store a hit */
-  uint32_t fdAdcCut = 0;
-
-  /** @brief Time offsets per Asic??? @todo expert confirmation required */
-  std::vector<double> fvdTimeOffsetNsAsics = {};
-
   /** @brief flag if channel mask is to be used or not. Set automatically via MaskNoisyChannels */
   bool fbUseChannelMask = false;
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
index a4af6daa95486c2cee81273db0019ea92aae3eaa..a1576547ad67f422aebbfc0b3aea0df6e3f4c9b6 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
@@ -8,5 +8,26 @@ CbmStsUnpackAlgoBase::CbmStsUnpackAlgoBase(std::string name) : CbmRecoUnpackAlgo
 
 CbmStsUnpackAlgoBase::~CbmStsUnpackAlgoBase() {}
 
+// ---- GetParContainerRequest ----
+std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
+  CbmStsUnpackAlgoBase::GetParContainerRequest(std::string /*geoTag*/, std::uint32_t /*runId*/)
+{
+  // Basepath for default Trd parameter sets (those connected to a geoTag)
+  std::string basepath = Form("%s", fParFilesBasePath.data());
+  std::string temppath = "";
+
+  // // Get parameter container
+  temppath = basepath + "mStsPar.par";
+  fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmMcbm2018StsPar>()));
+
+  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 32634cff69e7f94eb308d1c93a45783eb8f0895a..319044d2774ee3e9f54976c68cc66974f9e1d5ac 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
@@ -56,12 +56,51 @@ public:
   /** @brief Set a predefined monitor @param monitor predefined unpacking monitor */
   void SetMonitor(std::shared_ptr<CbmStsUnpackMonitor> monitor) { fMonitor = monitor; }
 
+  /** @brief Set the minimum adc cut value @param[in] value */
+  void SetMinAdcCut(uint32_t value) { fdAdcCut = value; }
+
+  /** @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
+   * files to.
+   *
+   * @param[in] std::string geoTag as used in CbmSetup
+   * @param[in] std::uint32_t runId for runwise defined parameters
+   * @return fParContVec
+  */
+  virtual std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
+  GetParContainerRequest(std::string geoTag, std::uint32_t runId);
+
+  /**
+   * @brief Mask a Noisy Channel
+   *
+   * @param uFeb
+   * @param uChan
+   * @param bMasked
+  */
+  virtual void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true)
+  {
+    (void) uFeb;
+    (void) uChan;
+    (void) bMasked;
+  };
 
 protected:
   // Monitoring
   /** @brief Potential (online) monitor for the unpacking process */
   std::shared_ptr<CbmStsUnpackMonitor> fMonitor = nullptr;
 
+  /** @brief Minimum adc cut to store a hit */
+  uint32_t fdAdcCut = 0;
+
+  /** @brief Time offsets per Asic??? @todo expert confirmation required */
+  std::vector<double> fvdTimeOffsetNsAsics = {};
 
 private:
   ClassDef(CbmStsUnpackAlgoBase, 2)
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
index 0561a7295b8a35633fb5f182ce9a808c0949bd27..57480fd737fd8470f67de6e819bbe27edf343c30 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
@@ -45,10 +45,8 @@ CbmStsUnpackAlgoLegacy::CbmStsUnpackAlgoLegacy()
   , fvdFebAdcGain()
   , fvdFebAdcOffs()
   , fdTimeOffsetNs(0.0)
-  , fvdTimeOffsetNsAsics()
   , fbUseChannelMask(false)
   , fvvbMaskedChannels()
-  , fdAdcCut(0)
   , fulCurrentMsIdx(0)
   , fuCurrDpbIdx(0)
   , fvulCurrentTsMsb()
@@ -402,6 +400,9 @@ void CbmStsUnpackAlgoLegacy::AddHitsToDigiVect(std::vector<stsxyter::FinalHit>*
 
 bool CbmStsUnpackAlgoLegacy::unpack(const fles::Timeslice* ts, std::uint16_t uMsCompIdx, UInt_t uMsIdx)
 {
+  /// Ignore First TS as first MS is typically corrupt
+  if (0 == fTsIndex) { return true; }
+
   auto msDescriptor = ts->descriptor(uMsCompIdx, uMsIdx);
 
   //Current equipment ID, tells from which DPB the current MS is originating
@@ -529,6 +530,7 @@ void CbmStsUnpackAlgoLegacy::LoopMsMessages(const uint8_t* msContent, const uint
   for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
     /// Get message type
     const stsxyter::MessType typeMess = pMess[uIdx].GetMessType();
+
     if (fbMonitorMode && fbDebugMonitorMode) { fUnpackMonitor->ProcessDebugInfo(pMess[uIdx], fuCurrDpbIdx); }
     switch (typeMess) {
       case stsxyter::MessType::Hit: {
@@ -621,7 +623,7 @@ void CbmStsUnpackAlgoLegacy::ProcessHitInfo(const stsxyter::Message& mess)
   const double dHitTimeNs = ulHitTime * stsxyter::kdClockCycleNs;
 
   /// If EM flag ON, store a corresponding error message with the next flag after all other possible status flags set
-  if (mess.IsHitMissedEvts())
+  if (mess.IsHitMissedEvts() && fOptOutAVec != nullptr)
     fOptOutAVec->push_back(
       CbmErrorMessage(ECbmModuleId::kSts, dHitTimeNs, uAsicIdx, 1 << stsxyter::kusLenStatStatus, usChan));
 
@@ -751,13 +753,6 @@ void CbmStsUnpackAlgoLegacy::ProcessErrorInfo(const stsxyter::Message& mess)
   }
 }
 
-// -------------------------------------------------------------------------
-void CbmStsUnpackAlgoLegacy::SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn)
-{
-  if (uAsicIdx >= fvdTimeOffsetNsAsics.size()) { fvdTimeOffsetNsAsics.resize(uAsicIdx + 1, 0.0); }
-  fvdTimeOffsetNsAsics[uAsicIdx] = dOffsetIn;
-}
-
 // -------------------------------------------------------------------------
 void CbmStsUnpackAlgoLegacy::MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked)
 {
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
index 34c1af708468d649bc34173ab8d3c0f539925029..f75b05e5507c849f86099fd064256945a316ee1f 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
@@ -48,9 +48,7 @@ public:
   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 SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn = 0.0);
   void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
-  void SetMinAdcCut(uint32_t uAdc) { fdAdcCut = uAdc; }
 
   void SetUnpackStsMonitor(CbmStsUnpackMonitor* inMonitor) { fUnpackMonitor = inMonitor; }
 
@@ -125,11 +123,9 @@ private:
 
   /// User settings: Data correction parameters
   double fdTimeOffsetNs;
-  std::vector<double> fvdTimeOffsetNsAsics;
   bool fbUseChannelMask;
   std::vector<std::vector<bool>>
     fvvbMaskedChannels;  //! Vector of channel masks, [ NbFeb ][ NbCHanInFeb ], used only if fbUseChannelMask is true
-  uint32_t fdAdcCut;
 
   /// Running indices
   /// TS/MS info
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx b/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
index 513cf2a0632e9330906bcc0a596a0b9e60b5f3c1..c4dea57ece3cc081257bf8cb0b2d2435c3f71efb 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
@@ -5,6 +5,7 @@
 #include "CbmStsUnpackConfig.h"
 
 #include "CbmStsUnpackAlgo.h"
+#include "CbmStsUnpackAlgoLegacy.h"
 
 #include <Logger.h>
 
@@ -50,7 +51,6 @@ void CbmStsUnpackConfig::InitUnpacker()
   for (auto chmask : fvChanMasks)
     algo->MaskNoisyChannel(chmask.uFeb, chmask.uChan, chmask.bMasked);
 
-
   // Now we have all information required to initialise the algorithm
   algo->Init();
 
@@ -64,13 +64,14 @@ void CbmStsUnpackConfig::InitUnpacker()
 }
 
 // ---- chooseAlgo ----
-std::shared_ptr<CbmStsUnpackAlgo> CbmStsUnpackConfig::chooseAlgo()
+std::shared_ptr<CbmStsUnpackAlgoBase> CbmStsUnpackConfig::chooseAlgo()
 {
   if (fDoLog) LOG(info) << fName << "::Init - 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>();
   LOG(info) << fName << "::chooseAlgo() - selected algo = " << algo->Class_Name();
   return algo;
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackConfig.h b/reco/detectors/sts/unpack/CbmStsUnpackConfig.h
index a930aa0aa610db3761fd3f3a14d19fe0d5e96f19..8fb6d904689ee0c898a9b2efa1a9e47eae9f0c51 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackConfig.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackConfig.h
@@ -35,7 +35,7 @@
 #include <memory>
 #include <vector>
 
-class CbmStsUnpackConfig : public CbmRecoUnpackConfig<CbmStsUnpackAlgo, CbmStsDigi, CbmErrorMessage> {
+class CbmStsUnpackConfig : public CbmRecoUnpackConfig<CbmStsUnpackAlgoBase, CbmStsDigi, CbmErrorMessage> {
 
 public:
   /**
@@ -107,7 +107,7 @@ protected:
    * 
    * @return Bool_t initOk 
   */
-  virtual std::shared_ptr<CbmStsUnpackAlgo> chooseAlgo();
+  virtual std::shared_ptr<CbmStsUnpackAlgoBase> chooseAlgo();
 
   /** @brief pointer to the monitor object */
   std::shared_ptr<CbmStsUnpackMonitor> fMonitor = nullptr;
@@ -121,7 +121,6 @@ protected:
   /// Temporary storage of user parameters
   std::vector<FebChanMaskReco> fvChanMasks = {};
 
-
   /** @brief Geometry setup tag for the given detector as used by CbmSetup objects */
   std::string fGeoSetupTag = "";