diff --git a/macro/run/run_reco.C b/macro/run/run_reco.C
index 2fb2490c557afa704d4d15ea4bf345107f6bc2fb..5fb13de91be96a717f5f458905d685d236b2343e 100644
--- a/macro/run/run_reco.C
+++ b/macro/run/run_reco.C
@@ -221,9 +221,6 @@ void run_reco(TString input = "", Int_t nTimeSlices = -1, Int_t firstTimeSlice =
                   << "building using ``Real2019'' option. Terminating macro." << std::endl;
         return;
       }
-      // Remove STS as it will be our reference
-      evBuildRaw->RemoveDetector(kEventBuilderDetSts);
-
       // Set STS as reference detector
       evBuildRaw->SetReferenceDetector(kEventBuilderDetSts);
       evBuildRaw->SetTsParameters(0.0, 1.e7, 0.0);
@@ -256,9 +253,6 @@ void run_reco(TString input = "", Int_t nTimeSlices = -1, Int_t firstTimeSlice =
                   << "building using ``Real2019'' option. Terminating macro." << std::endl;
         return;
       }
-      // Remove STS as it will be our reference
-      evBuildRaw->RemoveDetector(kRawEventBuilderDetSts);
-
       // Set STS as reference detector
       evBuildRaw->SetReferenceDetector(kRawEventBuilderDetSts);
       evBuildRaw->SetTsParameters(0.0, 1.e7, 0.0);
diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
index a8dc141b4f6d15c54581d482666e3099fba750e2..6d052c64dc234094aca7954b2c24cc0ecaa449cb 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
@@ -31,15 +31,6 @@
 #include "TH2.h"
 #include "THttpServer.h"
 
-/// C/C++ headers
-
-// ---- Default constructor --------------------------------------------
-CbmAlgoBuildRawEvents::CbmAlgoBuildRawEvents() {}
-
-// ---- Destructor -----------------------------------------------------
-CbmAlgoBuildRawEvents::~CbmAlgoBuildRawEvents() {}
-
-// ---- Init -----------------------------------------------------------
 Bool_t CbmAlgoBuildRawEvents::InitAlgo()
 {
   LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Starting sequence";
@@ -48,16 +39,14 @@ Bool_t CbmAlgoBuildRawEvents::InitAlgo()
   FairRootManager* ioman = FairRootManager::Instance();
 
   /// Check if reference detector data are available
-  if (kFALSE == CheckDataAvailable(fRefDet)) {
-    LOG(fatal) << "No digi input for reference detector, stopping there!";
-  }  // if( kFALSE == CheckDataAvailable( fRefDet ) )
+  if (kFALSE == CheckDataAvailable(fRefDet)) { LOG(fatal) << "No digi input for reference detector, stopping there!"; }
 
   /// Check if data for detectors in selection list are available
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     if (kFALSE == CheckDataAvailable(*det)) {
       LOG(fatal) << "No digi input for one of selection detector, stopping there!";
-    }  // if( kFALSE == CheckDataAvailable( *det ) )
-  }    // for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det)
+    }
+  }
 
   /// Access the TS metadata to know TS start time if needed
   if (fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0) {
@@ -68,23 +57,19 @@ Bool_t CbmAlgoBuildRawEvents::InitAlgo()
                     "present!"
                  << std::endl
                  << "source->SetWriteOutputFlag(kTRUE);  // For writing TS metadata";
-    }  // if (!fTimeSliceMetaDataArray)
-  }    // if ( fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0 )
-
-  if (fbFillHistos) { CreateHistograms(); }  // if( fbFillHistos )
+    }
+  }
 
+  if (fbFillHistos) { CreateHistograms(); }
   LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Done";
-
   return kTRUE;
 }
 
-// ---- ProcessTs ------------------------------------------------------
 void CbmAlgoBuildRawEvents::ProcessTs()
 {
   LOG_IF(info, fuNrTs % 1000 == 0) << "Begin of TS " << fuNrTs;
-
   InitTs();
-
+  InitSeedWindow();
   BuildEvents();
 
   /// Store last event with trigger if not done by other seed
@@ -97,14 +82,13 @@ void CbmAlgoBuildRawEvents::ProcessTs()
 
     /// Prevent building over TS edge
     fCurrentEvent = nullptr;
-  }  // if( nullptr != fCurrentEvent )
+  }
 
   LOG(debug) << "Found " << fEventVector.size() << " triggered events";
-
-  if (fbFillHistos) { FillHistos(); }  // if( fbFillHistos )
-
+  if (fbFillHistos) { FillHistos(); }
   fuNrTs++;
 }
+
 void CbmAlgoBuildRawEvents::ClearEventVector()
 {
   /// Need to delete the object the pointer points to first
@@ -113,17 +97,14 @@ void CbmAlgoBuildRawEvents::ClearEventVector()
     LOG(debug) << "Event " << counter << " has " << event->GetNofData() << " digis";
     delete event;
     counter++;
-  }  // for( CbmEvent* event: fEventVector)
-
+  }
   fEventVector.clear();
 }
-// ---- Finish ---------------------------------------------------------
+
 void CbmAlgoBuildRawEvents::Finish() { LOG(info) << "Total errors: " << fuErrors; }
 
-// ---------------------------------------------------------------------
 Bool_t CbmAlgoBuildRawEvents::CheckDataAvailable(RawEventBuilderDetector& det)
 {
-
   if (ECbmModuleId::kT0 == det.detId) {
     if (!fT0DigiVec) {
       LOG(info) << "No T0 digi input found.";
@@ -168,7 +149,7 @@ Bool_t CbmAlgoBuildRawEvents::CheckDataAvailable(RawEventBuilderDetector& det)
   }
   return kTRUE;
 }
-// ---------------------------------------------------------------------
+
 void CbmAlgoBuildRawEvents::InitTs()
 {
   /// Reset TS based variables (analysis per TS = no building over the border)
@@ -179,7 +160,45 @@ void CbmAlgoBuildRawEvents::InitTs()
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     (*det).fuStartIndex = 0;
     (*det).fuEndIndex   = 0;
-  }  // for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det)
+  }
+}
+
+void CbmAlgoBuildRawEvents::InitSeedWindow()
+{
+  /// Access the TS metadata if needed to know TS start time and overlap size
+  Double_t dTsStartTime  = fdTsStartTime;
+  Double_t dOverlapStart = fdTsStartTime + fdTsLength;
+  Double_t dOverlapSize  = fdTsOverLength;
+
+  if (fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0) {
+    pTsMetaData = dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0));
+    if (nullptr == pTsMetaData)
+      LOG(fatal) << Form("CbmAlgoBuildRawEvents::LoopOnSeeds => "
+                         "No TS metadata found for TS %6u.",
+                         fuNrTs);
+    dTsStartTime  = pTsMetaData->GetStartTime();
+    dOverlapStart = pTsMetaData->GetOverlapStartTime();
+    dOverlapSize  = pTsMetaData->GetOverlapDuration();
+  }
+
+  /// Print warning in first TS if time window borders out of potential overlap
+  if ((0.0 < fdEarliestTimeWinBeg && dOverlapSize < fdLatestTimeWinEnd) || (dOverlapSize < fdWidestTimeWinRange)) {
+    LOG(warning) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
+                 << Form("Event window not fitting in TS overlap, risk of "
+                         "incomplete events: %f %f %f %f",
+                         fdEarliestTimeWinBeg, fdLatestTimeWinEnd, fdWidestTimeWinRange, dOverlapSize);
+  }  // if end of event window does not fit in overlap for a seed at edge of TS core
+
+  /// Define an acceptance window for the seeds in order to use the overlap
+  /// part of the TS to avoid incomplete events
+  if (fbIgnoreTsOverlap) {
+    fdSeedWindowBeg = dTsStartTime;
+    fdSeedWindowEnd = dOverlapStart;
+  }
+  else {
+    fdSeedWindowBeg = dTsStartTime + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg);
+    fdSeedWindowEnd = dOverlapStart + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg);
+  }
 }
 
 void CbmAlgoBuildRawEvents::BuildEvents()
@@ -189,40 +208,40 @@ void CbmAlgoBuildRawEvents::BuildEvents()
     case ECbmModuleId::kSts: {
       LoopOnSeeds<CbmStsDigi>();
       break;
-    }  // case ECbmModuleId::kSts:
+    }
     case ECbmModuleId::kMuch: {
-      if (fbUseMuchBeamtimeDigi) { LoopOnSeeds<CbmMuchBeamTimeDigi>(); }  // if (fbUseMuchBeamtimeDigi)
+      if (fbUseMuchBeamtimeDigi) { LoopOnSeeds<CbmMuchBeamTimeDigi>(); }
       else {
         LoopOnSeeds<CbmMuchDigi>();
-      }  // else of if (fbUseMuchBeamtimeDigi)
+      }
       break;
-    }  // case ECbmModuleId::kMuch:
+    }
     case ECbmModuleId::kTrd: {
       LoopOnSeeds<CbmTrdDigi>();
       break;
-    }  // case ECbmModuleId::kTrd:
+    }
     case ECbmModuleId::kTof: {
       LoopOnSeeds<CbmTofDigi>();
       break;
-    }  // case ECbmModuleId::kTof:
+    }
     case ECbmModuleId::kRich: {
       LoopOnSeeds<CbmRichDigi>();
       break;
-    }  // case ECbmModuleId::kRich:
+    }
     case ECbmModuleId::kPsd: {
       LoopOnSeeds<CbmPsdDigi>();
       break;
-    }  // case ECbmModuleId::kPsd:
+    }
     case ECbmModuleId::kT0: {
       LoopOnSeeds<CbmTofDigi>();
       break;
-    }  // case ECbmModuleId::kT0:
+    }
     default: {
       LOG(fatal) << "CbmAlgoBuildRawEvents::BuildEvents => "
                  << "Trying to search event seeds with unsupported det: " << fRefDet.sName;
       break;
-    }  // default:
-  }    // switch( *det )
+    }
+  }  // switch( *det )
 }
 
 UInt_t CbmAlgoBuildRawEvents::GetNofDigis(ECbmModuleId detId)
@@ -334,78 +353,33 @@ const CbmPsdDigi* CbmAlgoBuildRawEvents::GetDigi(UInt_t uDigi)
 template<class DigiSeed>
 void CbmAlgoBuildRawEvents::LoopOnSeeds()
 {
-  /// Access the TS metadata if needed to know TS start time and overlap size
-  Double_t dTsStartTime  = fdTsStartTime;
-  Double_t dOverlapStart = fdTsStartTime + fdTsLength;
-  Double_t dOverlapSize  = fdTsOverLength;
-  if (fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0) {
-    pTsMetaData = dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0));
-    if (nullptr == pTsMetaData)
-      LOG(fatal) << Form("CbmAlgoBuildRawEvents::LoopOnSeeds => "
-                         "No TS metadata found for TS %6u.",
-                         fuNrTs);
-
-    dTsStartTime  = pTsMetaData->GetStartTime();
-    dOverlapStart = pTsMetaData->GetOverlapStartTime();
-    dOverlapSize  = pTsMetaData->GetOverlapDuration();
-  }  // if ( fdTsStartTime < 0 || fdTsLength < 0  || fdTsOverLength < 0 )
-
-  /// Print warning in first TS if time window borders out of potential overlap
-  if ((0.0 < fdEarliestTimeWinBeg && dOverlapSize < fdLatestTimeWinEnd) || (dOverlapSize < fdWidestTimeWinRange)) {
-    LOG(warning) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
-                 << Form("Event window not fitting in TS overlap, risk of "
-                         "incomplete events: %f %f %f %f",
-                         fdEarliestTimeWinBeg, fdLatestTimeWinEnd, fdWidestTimeWinRange, dOverlapSize);
-  }  // if end of event window does not fit in overlap for a seed at edge of TS core
-
-  /// Define an acceptance window for the seeds in order to use the overlap
-  /// part of the TS to avoid incomplete events
-  Double_t dSeedWindowBeg = dTsStartTime + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg);
-  Double_t dSeedWindowEnd = dOverlapStart + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg);
-  if (fbIgnoreTsOverlap) {
-    dSeedWindowBeg = dTsStartTime;
-    dSeedWindowEnd = dOverlapStart;
-  }  // if( fbIgnoreTsOverlap )
-
   if (ECbmModuleId::kT0 == fRefDet.detId) {
-    if (fT0DigiVec) {
-      /// Loop on size of vector
-      UInt_t uNbRefDigis = fT0DigiVec->size();
-      /// Loop on size of vector
-      for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
-        LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
-
-        Double_t dTime = fT0DigiVec->at(uDigi).GetTime();
-
-        /// Check Seed and build event if needed
-        CheckSeed(dTime, uDigi);
-      }  // for( UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi )
-    }    // if ( fT0DigiVec )
-    else
-      LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
-                 << "T0 as reference detector but vector not found!";
-  }  // if (ECbmModuleId::kT0 == fRefDet.detId)
+    const UInt_t uNbRefDigis = fT0DigiVec->size();
+    /// Loop on size of vector
+    for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
+      LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
+      Double_t dTime = fT0DigiVec->at(uDigi).GetTime();
+      /// Check Seed and build event if needed
+      CheckSeed(dTime, uDigi);
+    }
+  }
   else {
-    UInt_t uNbRefDigis = (0 < GetNofDigis(fRefDet.detId) ? GetNofDigis(fRefDet.detId) : 0);
+    const UInt_t uNbRefDigis = (0 < GetNofDigis(fRefDet.detId) ? GetNofDigis(fRefDet.detId) : 0);
     /// Loop on size of vector
     for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
       LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
       const DigiSeed* pDigi = GetDigi<DigiSeed>(uDigi);
-      /// Check that _entry is not out of range
-      if (nullptr != pDigi) {
-        Double_t dTime = pDigi->GetTime();
-
-        /// Check if seed in acceptance window
-        if (dTime < dSeedWindowBeg) { continue; }  // if( dTime < dSeedWindowBeg )
-        else if (dSeedWindowEnd < dTime) {
-          break;
-        }  // else if( dSeedWindowEnd < dTime )
-
-        /// Check Seed and build event if needed
-        CheckSeed(dTime, uDigi);
-      }  // if( nullptr != pDigi )
-    }    // for( UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi )
-  }      // else of if (ECbmModuleId::kT0 == fRefDet.detId) => Digi containers controlled by DigiManager
+      const Double_t dTime  = pDigi->GetTime();
+
+      /// Check if seed in acceptance window
+      if (dTime < fdSeedWindowBeg) { continue; }
+      else if (fdSeedWindowEnd < dTime) {
+        break;
+      }
+      /// Check Seed and build event if needed
+      CheckSeed(dTime, uDigi);
+    }
+  }
 }
 
 void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx)
@@ -422,20 +396,20 @@ void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx)
         LOG(debug1) << "Reject seed due to overlap";
         return;
         break;
-      }  // case EOverlapModeRaw::NoOverlap:
+      }
       case EOverlapModeRaw::MergeOverlap: {
         /// Merge overlap mode => do nothing and go on filling current event
         break;
-      }  // case EOverlapModeRaw::MergeOverlap:
+      }
       case EOverlapModeRaw::AllowOverlap: {
         /// In allow overlap mode => reject only if reference det is in overlap
         /// to avoid cloning events due to single seed cluster
         LOG(debug1) << "Reject seed because part of cluster of previous one";
         return;
         break;
-      }  // case EOverlapModeRaw::AllowOverlap:
-    }    // switch( fOverMode )
-  }      // if( prev Event exists and mode forbiden overlap present )
+      }
+    }
+  }  // if( prev Event exists and mode forbiden overlap present )
   else {
     /// Out of overlap range or in overlap allowed mode
     /// => store previous event if not empty and create new one
@@ -445,129 +419,70 @@ void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx)
       fCurrentEvent->SetEndTime(fdPrevEvtEndTime);
       fEventVector.push_back(fCurrentEvent);
       fuCurEv++;
-    }  // if( nullptr != fCurrentEvent )
+    }
     fCurrentEvent = new CbmEvent(fuCurEv, dSeedTime, 0.);
   }  // else of if( prev Event exists and mode forbiden overlap present )
 
   /// If window open for reference detector, search for other reference Digis matching it
   /// Otherwise only add the current seed
   if (fRefDet.fdTimeWinBeg < fRefDet.fdTimeWinEnd) {
-    switch (fRefDet.detId) {
-      case ECbmModuleId::kSts: {
-        SearchMatches<CbmStsDigi>(dSeedTime, fRefDet);
-        break;
-      }  // case ECbmModuleId::kSts:
-      case ECbmModuleId::kMuch: {
-        if (fbUseMuchBeamtimeDigi) {
-          SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, fRefDet);
-        }  // if (fbUseMuchBeamtimeDigi)
-        else {
-          SearchMatches<CbmMuchDigi>(dSeedTime, fRefDet);
-        }  // else of if (fbUseMuchBeamtimeDigi)
-        break;
-      }  // case ECbmModuleId::kMuch:
-      case ECbmModuleId::kTrd: {
-        SearchMatches<CbmTrdDigi>(dSeedTime, fRefDet);
-        break;
-      }  // case ECbmModuleId::kTrd:
-      case ECbmModuleId::kTof: {
-        SearchMatches<CbmTofDigi>(dSeedTime, fRefDet);
-        break;
-      }  // case ECbmModuleId::kTof:
-      case ECbmModuleId::kRich: {
-        SearchMatches<CbmRichDigi>(dSeedTime, fRefDet);
-        break;
-      }  // case ECbmModuleId::kRich:
-      case ECbmModuleId::kPsd: {
-        SearchMatches<CbmPsdDigi>(dSeedTime, fRefDet);
-        break;
-      }  // case ECbmModuleId::kPsd:
-      case ECbmModuleId::kT0: {
-        SearchMatches<CbmTofDigi>(dSeedTime, fRefDet);
-        break;
-      }  // case ECbmModuleId::kT0:
-      default: {
-        LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
-                   << "Trying to search matches with unsupported det: " << fRefDet.sName << std::endl
-                   << "You may want to add support for it in the method.";
-        break;
-      }  // default:
-    }    // switch( fRefDet )
-
+    SearchMatches(dSeedTime, fRefDet);
     /// Also add the seed if the window starts after the seed
     if (0 < fRefDet.fdTimeWinBeg) AddDigiToEvent(fRefDet, uSeedDigiIdx);
-  }  // if( fdRefTimeWinBeg < fdRefTimeWinEnd )
+  }
   else {
     AddDigiToEvent(fRefDet, uSeedDigiIdx);
-  }  // else of if( fdRefTimeWinBeg < fdRefTimeWinEnd )
+  }
 
   /// Search for matches for each detector in selection list
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
-    switch ((*det).detId) {
-      case ECbmModuleId::kSts: {
-        SearchMatches<CbmStsDigi>(dSeedTime, *det);
-        break;
-      }  // case ECbmModuleId::kSts:
-      case ECbmModuleId::kMuch: {
-        if (fbUseMuchBeamtimeDigi) {
-          SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, *det);
-        }  // if (fbUseMuchBeamtimeDigi)
-        else {
-          SearchMatches<CbmMuchDigi>(dSeedTime, *det);
-        }  // else of if (fbUseMuchBeamtimeDigi)
-        break;
-      }  // case ECbmModuleId::kMuch:
-      case ECbmModuleId::kTrd: {
-        SearchMatches<CbmTrdDigi>(dSeedTime, *det);
-        break;
-      }  // case ECbmModuleId::kTrd:
-      case ECbmModuleId::kTof: {
-        SearchMatches<CbmTofDigi>(dSeedTime, *det);
-        break;
-      }  // case ECbmModuleId::kTof:
-      case ECbmModuleId::kRich: {
-        SearchMatches<CbmRichDigi>(dSeedTime, *det);
-        break;
-      }  // case ECbmModuleId::kRich:
-      case ECbmModuleId::kPsd: {
-        SearchMatches<CbmPsdDigi>(dSeedTime, *det);
-        break;
-      }  // case ECbmModuleId::kPsd:
-      case ECbmModuleId::kT0: {
-        SearchMatches<CbmTofDigi>(dSeedTime, *det);
-        break;
-      }  // case ECbmModuleId::kT0:
-      default: {
-        LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
-                   << "Trying to search matches with unsupported det: " << (*det).sName << std::endl
-                   << "You may want to add support for it in the method.";
-        break;
-      }  // default:
-    }    // switch( *det )
-  }      // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-
-  /// Check if event is filling trigger conditions and clear it if not
-  if (HasTrigger(fCurrentEvent)) {
-    fdPrevEvtTime = dSeedTime;
-
-    /// In case of NoOverlap or MergeOverlap, we can and should start checking the next window
-    /// from end of current window in order to save CPU and avoid duplicating
-    if (EOverlapModeRaw::NoOverlap == fOverMode || EOverlapModeRaw::MergeOverlap == fOverMode) {
+    SearchMatches(dSeedTime, *det);
+  }
 
-      /// Update reference detector
-      fRefDet.fuStartIndex = fRefDet.fuEndIndex;
+  CheckTriggerCondition(dSeedTime);
+}
 
-      /// Loop on selection detectors
-      for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
-        (*det).fuStartIndex = (*det).fuEndIndex;
-      }  // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-    }    // If no overlap or merge overlap
-  }      // if( !HasTrigger( fCurrentEvent ) )
-  else {
-    LOG(debug1) << "Reject seed due to Trigger requirements";
-    delete fCurrentEvent;
-    fCurrentEvent = nullptr;  /// delete does NOT set a pointer to nullptr...
-  }                           // else of if( !HasTrigger( fCurrentEvent ) )
+void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDetector& detMatch)
+{
+  switch (detMatch.detId) {
+    case ECbmModuleId::kSts: {
+      SearchMatches<CbmStsDigi>(dSeedTime, detMatch);
+      break;
+    }
+    case ECbmModuleId::kMuch: {
+      if (fbUseMuchBeamtimeDigi) { SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, detMatch); }
+      else {
+        SearchMatches<CbmMuchDigi>(dSeedTime, detMatch);
+      }
+      break;
+    }
+    case ECbmModuleId::kTrd: {
+      SearchMatches<CbmTrdDigi>(dSeedTime, detMatch);
+      break;
+    }
+    case ECbmModuleId::kTof: {
+      SearchMatches<CbmTofDigi>(dSeedTime, detMatch);
+      break;
+    }
+    case ECbmModuleId::kRich: {
+      SearchMatches<CbmRichDigi>(dSeedTime, detMatch);
+      break;
+    }
+    case ECbmModuleId::kPsd: {
+      SearchMatches<CbmPsdDigi>(dSeedTime, detMatch);
+      break;
+    }
+    case ECbmModuleId::kT0: {
+      SearchMatches<CbmTofDigi>(dSeedTime, detMatch);
+      break;
+    }
+    default: {
+      LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => "
+                 << "Trying to search matches with unsupported det: " << detMatch.sName << std::endl
+                 << "You may want to add support for it in the method.";
+      break;
+    }
+  }
 }
 
 template<class DigiCheck>
@@ -579,78 +494,87 @@ void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDet
 
   /// Check the Digis until out of window
   if (ECbmModuleId::kT0 == detMatch.detId) {
-    if (fT0DigiVec) {
-      /// Loop on size of vector
-      UInt_t uNbSelDigis = fT0DigiVec->size();
-      /// Loop on size of vector
-      for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
-        Double_t dTime = fT0DigiVec->at(uDigi).GetTime();
-
-        Double_t dTimeDiff = dTime - dSeedTime;
-
-        /// Check if within time window, update start/stop indices if needed
-        if (dTimeDiff < detMatch.fdTimeWinBeg) {
-          ++uLocalIndexStart;
-          continue;
-        }  // if( dTimeDiff < detMatch.fdTimeWinBeg )
-        else if (detMatch.fdTimeWinEnd < dTimeDiff) {
-          /// Store as end the first digi out of window to avoid double counting in case of
-          /// merged overlap event mode
-          uLocalIndexEnd = uDigi;
-          break;
-        }  // else if( detMatch.fdTimeWinEnd < dTimeDiff ) of if( dTimeDiff < detMatch.fdTimeWinBeg )
-
-        AddDigiToEvent(detMatch, uDigi);
-
-        if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
-      }  // for( UInt_t uDigi = 0; uDigi < uNbSelDigis; ++uDigi )
-
-      /// catch the case where we reach the end of the vector before being out of the time window
-      if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
-    }  // if ( fT0DigiVec )
-    else
-      LOG(fatal) << "CbmAlgoBuildRawEvents::SearchMatches => "
-                 << "T0 as selection detector but vector not found!";
-  }  // if( ECbmModuleId::kT0 == detMatch.detId )
-  else {
-    UInt_t uNbSelDigis = (0 < GetNofDigis(detMatch.detId) ? GetNofDigis(detMatch.detId) : 0);
+
     /// Loop on size of vector
+    const UInt_t uNbSelDigis = fT0DigiVec->size();
     for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
-      const DigiCheck* pDigi = GetDigi<DigiCheck>(uDigi);
-      /// Check that _entry is not out of range
-      if (nullptr != pDigi) {
-        Double_t dTime     = pDigi->GetTime();
-        Double_t dTimeDiff = dTime - dSeedTime;
-
-        LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff);
-
-        /// Check if within time window, update start/stop indices if needed
-        if (dTimeDiff < detMatch.fdTimeWinBeg) {
-          ++uLocalIndexStart;
-          continue;
-        }  // if( dTimeDiff < detMatch.fdTimeWinBeg )
-        else if (detMatch.fdTimeWinEnd < dTimeDiff) {
-          /// Store as end the first digi out of window to avoid double counting in case of
-          /// merged overlap event mode
-          uLocalIndexEnd = uDigi;
-          break;
-        }  // else if( detMatch.fdTimeWinEnd < dTimeDiff ) of if( dTimeDiff < detMatch.fdTimeWinBeg )
-
-        AddDigiToEvent(detMatch, uDigi);
-
-        if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
-      }  // if( nullptr != pDigi )
-    }    // for( UInt_t uDigi = 0; uDigi < uNbSelDigis; ++uDigi )
+      const Double_t dTime     = fT0DigiVec->at(uDigi).GetTime();
+      const Double_t dTimeDiff = dTime - dSeedTime;
+
+      /// Check if within time window, update start/stop indices if needed
+      if (dTimeDiff < detMatch.fdTimeWinBeg) {
+        ++uLocalIndexStart;
+        continue;
+      }
+      else if (detMatch.fdTimeWinEnd < dTimeDiff) {
+        /// Store as end the first digi out of window to avoid double counting in case of
+        /// merged overlap event mode
+        uLocalIndexEnd = uDigi;
+        break;
+      }
+      AddDigiToEvent(detMatch, uDigi);
+      if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
+    }
 
     /// catch the case where we reach the end of the vector before being out of the time window
     if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
-  }  // else of if( ECbmModuleId::kT0 == detMatch.detId ) => Digi containers controlled by DigiManager
+  }
+  else {
+    const UInt_t uNbSelDigis = (0 < GetNofDigis(detMatch.detId) ? GetNofDigis(detMatch.detId) : 0);
+    /// Loop on size of vector
+    for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
+      const DigiCheck* pDigi   = GetDigi<DigiCheck>(uDigi);
+      const Double_t dTime     = pDigi->GetTime();
+      const Double_t dTimeDiff = dTime - dSeedTime;
+      LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff);
+
+      /// Check if within time window, update start/stop indices if needed
+      if (dTimeDiff < detMatch.fdTimeWinBeg) {
+        ++uLocalIndexStart;
+        continue;
+      }
+      else if (detMatch.fdTimeWinEnd < dTimeDiff) {
+        /// Store as end the first digi out of window to avoid double counting in case of
+        /// merged overlap event mode
+        uLocalIndexEnd = uDigi;
+        break;
+      }
+      AddDigiToEvent(detMatch, uDigi);
+      if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
+    }
+    /// catch the case where we reach the end of the vector before being out of the time window
+    if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
+  }
 
   /// Update the StartIndex and EndIndex for the next event seed
   detMatch.fuStartIndex = uLocalIndexStart;
   detMatch.fuEndIndex   = uLocalIndexEnd;
 }
 
+void CbmAlgoBuildRawEvents::CheckTriggerCondition(Double_t dSeedTime)
+{
+  /// Check if event is filling trigger conditions and clear it if not
+  if (HasTrigger(fCurrentEvent)) {
+    fdPrevEvtTime = dSeedTime;
+
+    /// In case of NoOverlap or MergeOverlap, we can and should start checking the next window
+    /// from end of current window in order to save CPU and avoid duplicating
+    if (EOverlapModeRaw::NoOverlap == fOverMode || EOverlapModeRaw::MergeOverlap == fOverMode) {
+      /// Update reference detector
+      fRefDet.fuStartIndex = fRefDet.fuEndIndex;
+      /// Loop on selection detectors
+      for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
+        (*det).fuStartIndex = (*det).fuEndIndex;
+      }
+    }
+  }
+  else {
+    LOG(debug1) << "Reject seed due to Trigger requirements";
+    delete fCurrentEvent;
+    fCurrentEvent = nullptr;  /// delete does NOT set a pointer to nullptr...
+  }
+}
+
 void CbmAlgoBuildRawEvents::AddDigiToEvent(RawEventBuilderDetector& det, Int_t _entry)
 {
   fCurrentEvent->AddData(det.dataType, _entry);
@@ -659,15 +583,11 @@ void CbmAlgoBuildRawEvents::AddDigiToEvent(RawEventBuilderDetector& det, Int_t _
 Bool_t CbmAlgoBuildRawEvents::HasTrigger(CbmEvent* event)
 {
   /// Check first reference detector
-  if (kFALSE == CheckTriggerConditions(event, fRefDet)) {
-    return kFALSE;
-  }  // if (kFALSE == CheckTriggerConditions(event, fRefDet) )
-
+  if (kFALSE == CheckTriggerConditions(event, fRefDet)) { return kFALSE; }
   /// Loop on selection detectors
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     if (kFALSE == CheckTriggerConditions(event, *det)) return kFALSE;
-  }  // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-
+  }
   /// All Ok, trigger is there
   return kTRUE;
 }
@@ -675,9 +595,7 @@ Bool_t CbmAlgoBuildRawEvents::HasTrigger(CbmEvent* event)
 Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, RawEventBuilderDetector& det)
 {
   /// Check if both Trigger conditions disabled for this detector
-  if (0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0) {
-    return kTRUE;
-  }  // if( 0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0 )
+  if (0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0) { return kTRUE; }
 
   /// Check if detector present
   if (ECbmModuleId::kT0 == det.detId) {
@@ -687,108 +605,89 @@ Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, RawEventBu
                    << " while the following trigger minimum are defined: " << det.fuTriggerMinDigis << " "
                    << det.fiTriggerMaxDigis;
       return kFALSE;
-    }  // if( !(fT0DigiVec) )
-  }    // if( ECbmDataType::kT0Digi == det.detId )
+    }
+  }
   else {
     if (!DetIsPresent(det.detId)) {
       LOG(warning) << "Event does not have digis storage for " << det.sName
                    << " while the following trigger min/max are defined: " << det.fuTriggerMinDigis << " "
                    << det.fiTriggerMaxDigis;
       return kFALSE;
-    }  // if( !fDigiMan->IsPresent( det ) )
-  }    // else of if( ECbmDataType::kT0Digi == det )
+    }
+  }
 
   /// Check trigger rejection by minimal number or absence
-  Int_t iNbDigis = event->GetNofData(det.dataType);
+  const Int_t iNbDigis = event->GetNofData(det.dataType);
   if ((-1 == iNbDigis) || (static_cast<UInt_t>(iNbDigis) < det.fuTriggerMinDigis)) {
     LOG(debug2) << "Event does not have enough digis: " << iNbDigis << " vs " << det.fuTriggerMinDigis << " for "
                 << det.sName;
     return kFALSE;
-  }  // if((-1 == iNbDigis) || (static_cast<UInt_t>(iNbDigis) < det.fuTriggerMinDigis))
+  }
+
   /// Check trigger rejection by maximal number
   else if (0 < det.fiTriggerMaxDigis && det.fiTriggerMaxDigis < iNbDigis) {
     LOG(debug2) << "Event Has too many digis: " << iNbDigis << " vs " << det.fiTriggerMaxDigis << " for " << det.sName;
     return kFALSE;
-  }  // else if( iNbDigis < det.fiTriggerMaxDigis )
+  }
   else {
     return kTRUE;
-  }  // else of else if( iNbDigis < det.fiTriggerMaxDigis )
+  }
 }
 //----------------------------------------------------------------------
 void CbmAlgoBuildRawEvents::CreateHistograms()
 {
-  /// FIXME: Disable clang formatting for histograms declaration for now
-  /* clang-format off */
-  fhEventTime = new TH1F("hEventTime",
-                         "seed time of the events; Seed time [s]; Events",
-                         60000, 0, 600);
-  fhEventDt   = new TH1F( "fhEventDt",
-                          "interval in seed time of consecutive events; Seed time [s]; Events",
-                          2100, -100.5, 1999.5);
-  fhEventSize =
-    new TH1F("hEventSize",
-             "nb of all  digis in the event; Nb Digis []; Events []",
-             10000, 0, 10000);
-  fhNbDigiPerEvtTime =
-    new TH2I("hNbDigiPerEvtTime",
-             "nb of all  digis per event vs seed time of the events; Seed time "
-             "[s]; Nb Digis []; Events []",
-              600, 0,   600,
-             1000, 0, 10000);
+  fhEventTime = new TH1F("hEventTime", "seed time of the events; Seed time [s]; Events", 60000, 0, 600);
+  fhEventDt =
+    new TH1F("fhEventDt", "interval in seed time of consecutive events; Seed time [s]; Events", 2100, -100.5, 1999.5);
+  fhEventSize        = new TH1F("hEventSize", "nb of all  digis in the event; Nb Digis []; Events []", 10000, 0, 10000);
+  fhNbDigiPerEvtTime = new TH2I("hNbDigiPerEvtTime",
+                                "nb of all  digis per event vs seed time of the events; Seed time "
+                                "[s]; Nb Digis []; Events []",
+                                600, 0, 600, 1000, 0, 10000);
 
   /// Loop on selection detectors
-  for (std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
+  for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     /// In case name not provided, do not create the histo to avoid name conflicts!
-    if( "Invalid" == (*det).sName )
-    {
-      fvhNbDigiPerEvtTimeDet.push_back( nullptr );
+    if ("Invalid" == (*det).sName) {
+      fvhNbDigiPerEvtTimeDet.push_back(nullptr);
       continue;
-    } // if( "Invalid" == (*det).sName )
-
-    fvhNbDigiPerEvtTimeDet.push_back(
-      new TH2I( Form( "hNbDigiPerEvtTime%s", (*det).sName.data() ),
-                Form( "nb of %s digis per event vs seed time of the events; Seed time "
-                      "[s]; Nb Digis []; Events []",
-                      (*det).sName.data() ),
-                 600, 0,  600,
-                4000, 0, 4000) );
-  }  // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-
-  AddHistoToVector(fhEventTime,            "evtbuild");
-  AddHistoToVector(fhEventDt,              "evtbuild");
-  AddHistoToVector(fhEventSize,            "evtbuild");
-  AddHistoToVector(fhNbDigiPerEvtTime,     "evtbuild");
-  for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin();
-       itHist != fvhNbDigiPerEvtTimeDet.end();
+    }
+
+    fvhNbDigiPerEvtTimeDet.push_back(new TH2I(Form("hNbDigiPerEvtTime%s", (*det).sName.data()),
+                                              Form("nb of %s digis per event vs seed time of the events; Seed time "
+                                                   "[s]; Nb Digis []; Events []",
+                                                   (*det).sName.data()),
+                                              600, 0, 600, 4000, 0, 4000));
+  }
+
+  AddHistoToVector(fhEventTime, "evtbuild");
+  AddHistoToVector(fhEventDt, "evtbuild");
+  AddHistoToVector(fhEventSize, "evtbuild");
+  AddHistoToVector(fhNbDigiPerEvtTime, "evtbuild");
+  for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end();
        ++itHist) {
-    if( nullptr != (*itHist) )
-    {
-      AddHistoToVector((*itHist),   "evtbuild");
-    } // if( nullptr != (*itHist) )
-  }  // for( std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist )
-
-  /// FIXME: Re-enable clang formatting after histograms declaration
-  /* clang-format on */
+    if (nullptr != (*itHist)) { AddHistoToVector((*itHist), "evtbuild"); }
+  }
 }
+
 void CbmAlgoBuildRawEvents::FillHistos()
 {
   Double_t dPreEvtTime = -1.0;
   for (CbmEvent* evt : fEventVector) {
     fhEventTime->Fill(evt->GetStartTime() * 1e-9);
-    if (0.0 <= dPreEvtTime) { fhEventDt->Fill(evt->GetStartTime() - dPreEvtTime); }  // if( 0.0 <= dPreEvtTime )
+    if (0.0 <= dPreEvtTime) { fhEventDt->Fill(evt->GetStartTime() - dPreEvtTime); }
     fhEventSize->Fill(evt->GetNofData());
     fhNbDigiPerEvtTime->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData());
 
     /// Loop on selection detectors
     for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
       if (nullptr == fvhNbDigiPerEvtTimeDet[uDetIdx]) continue;
-
       fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(fvDets[uDetIdx].dataType));
-    }  // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-
+    }
     dPreEvtTime = evt->GetStartTime();
-  }  // for( CbmEvent * evt: fEventVector )
+  }
 }
+
 void CbmAlgoBuildRawEvents::ResetHistograms(Bool_t /*bResetTime*/)
 {
   fhEventTime->Reset();
@@ -800,22 +699,20 @@ void CbmAlgoBuildRawEvents::ResetHistograms(Bool_t /*bResetTime*/)
   for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end();
        ++itHist) {
     (*itHist)->Reset();
-  }  // for( std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist )
-
+  }
   /*
    if( kTRUE == bResetTime )
    {
       /// Also reset the Start time for the evolution plots!
       fdStartTime = -1.0;
-   } // if( kTRUE == bResetTime )
-*/
+   } 
+   */
 }
-//----------------------------------------------------------------------
+
 void CbmAlgoBuildRawEvents::SetReferenceDetector(ECbmModuleId refDet, ECbmDataType dataTypeIn, std::string sNameIn,
                                                  UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn,
                                                  Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn)
 {
-
   /// FIXME: Deprecated method to be removed later. For now create temp object.
   SetReferenceDetector(RawEventBuilderDetector(refDet, dataTypeIn, sNameIn, uTriggerMinDigisIn, iTriggerMaxDigisIn,
                                                fdTimeWinBegIn, fdTimeWinEndIn));
@@ -824,13 +721,11 @@ void CbmAlgoBuildRawEvents::AddDetector(ECbmModuleId selDet, ECbmDataType dataTy
                                         UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn,
                                         Double_t fdTimeWinEndIn)
 {
-
   /// FIXME: Deprecated method to be removed later. For now create temp object.
   AddDetector(RawEventBuilderDetector(selDet, dataTypeIn, sNameIn, uTriggerMinDigisIn, iTriggerMaxDigisIn,
                                       fdTimeWinBegIn, fdTimeWinEndIn));
 }
-//----------------------------------------------------------------------
-//----------------------------------------------------------------------
+
 void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetIn)
 {
   /// Loop on selection detectors
@@ -845,13 +740,13 @@ void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetI
                       "Please also remember to update the selection windows to store "
                       "clusters!";
       RemoveDetector(refDetIn);
-    }  // if( (*det)  == refDetIn )
-  }    // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+    }
+  }
 
   if (fRefDet == refDetIn) {
     LOG(warning) << "CbmAlgoBuildRawEvents::SetReferenceDetector => "
                     "Doing nothing, identical reference detector already in use";
-  }  // if( fRefDet == refDetIn )
+  }
   else {
     LOG(info) << "CbmAlgoBuildRawEvents::SetReferenceDetector => "
               << "Replacing " << fRefDet.sName << " with " << refDetIn.sName << " as reference detector";
@@ -861,7 +756,7 @@ void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetI
                  << refDetIn.sName;
     LOG(warning) << "                                                         => "
                     "Please also remember to update the selection windows!";
-  }  // else of if( fRefDet == refDetIn )
+  }
   fRefDet = refDetIn;
 
   /// Update the variables storing the earliest and latest time window boundaries
@@ -869,6 +764,7 @@ void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetI
   /// Update the variable storing the size if widest time window for overlap detection
   UpdateWidestTimeWinRange();
 }
+
 void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet)
 {
   if (fRefDet == selDet) {
@@ -877,7 +773,7 @@ void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet)
                << std::endl
                << "=> Maybe first change the reference detector with "
                   "SetReferenceDetector?";
-  }  // if( fRefDet == selDet )
+  }
 
   /// Loop on selection detectors
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
@@ -886,8 +782,8 @@ void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet)
                       "Doing nothing, selection detector already in list!"
                    << selDet.sName;
       return;
-    }  // if( (*det)  == selDet )
-  }    // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+    }
+  }
   fvDets.push_back(selDet);
 
   /// Update the variables storing the earliest and latest time window boundaries
@@ -895,6 +791,7 @@ void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet)
   /// Update the variable storing the size if widest time window for overlap detection
   UpdateWidestTimeWinRange();
 }
+
 void CbmAlgoBuildRawEvents::RemoveDetector(RawEventBuilderDetector selDet)
 {
   /// Loop on selection detectors
@@ -902,103 +799,95 @@ void CbmAlgoBuildRawEvents::RemoveDetector(RawEventBuilderDetector selDet)
     if ((*det) == selDet) {
       fvDets.erase(det);
       return;
-    }  // if( (*det)  == selDet )
-  }    // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+    }
+  }
   LOG(warning) << "CbmAlgoBuildRawEvents::RemoveDetector => Doing "
                   "nothing, selection detector not in list!"
                << selDet.sName;
 }
-//----------------------------------------------------------------------
+
 void CbmAlgoBuildRawEvents::SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal)
 {
   /// Check first if reference detector
   if (fRefDet.detId == selDet) {
     fRefDet.fuTriggerMinDigis = uVal;
-
     LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to " << uVal;
-
     return;
-  }  // if( fRefDet == selDet )
+  }
 
   /// Loop on selection detectors
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     if ((*det).detId == selDet) {
       (*det).fuTriggerMinDigis = uVal;
-
       LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to " << uVal;
-
       return;
-    }  // if( (*det).detId  == selDet )
-  }    // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-
+    }
+  }
   LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerMinNumber => "
                   "Doing nothing, detector neither reference nor in selection list!"
                << selDet;
 }
+
 void CbmAlgoBuildRawEvents::SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal)
 {
   /// Check first if reference detector
   if (fRefDet.detId == selDet) {
     fRefDet.fiTriggerMaxDigis = iVal;
-
     LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to " << iVal;
-
     return;
-  }  // if( fRefDet == selDet )
+  }
 
   /// Loop on selection detectors
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     if ((*det).detId == selDet) {
       (*det).fiTriggerMaxDigis = iVal;
-
       LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to " << iVal;
-
       return;
-    }  // if( (*det).detId  == selDet )
-  }    // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-
+    }
+  }
   LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerMaxNumber => "
                   "Doing nothing, detector neither reference nor in selection list!"
                << selDet;
 }
+
 void CbmAlgoBuildRawEvents::SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd)
 {
   /// Check if valid time window: end strictly after beginning
-  if (dWinEnd <= dWinBeg)
+  if (dWinEnd <= dWinBeg) {
     LOG(fatal) << "CbmAlgoBuildRawEvents::SetTriggerWindow => "
                   "Invalid time window: [ "
                << dWinBeg << ", " << dWinEnd << " ]";
+  }
 
   Bool_t bFound = kFALSE;
   /// Check first if reference detector
   if (fRefDet.detId == selDet) {
     fRefDet.fdTimeWinBeg = dWinBeg;
     fRefDet.fdTimeWinEnd = dWinEnd;
-
-    bFound = kTRUE;
-  }  // if( fRefDet == selDet )
+    bFound               = kTRUE;
+  }
 
   /// Loop on selection detectors
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     if ((*det).detId == selDet) {
       (*det).fdTimeWinBeg = dWinBeg;
       (*det).fdTimeWinEnd = dWinEnd;
-
-      bFound = kTRUE;
-    }  // if( (*det).detId  == selDet )
-  }    // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+      bFound              = kTRUE;
+    }
+  }
 
   if (kFALSE == bFound) {
     LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerWindow => "
                     "Doing nothing, detector neither reference nor in selection list!"
                  << selDet;
-  }  // if( kFALSE == bFound )
+  }
 
   /// Update the variables storing the earliest and latest time window boundaries
   UpdateTimeWinBoundariesExtrema();
   /// Update the variable storing the size if widest time window for overlap detection
   UpdateWidestTimeWinRange();
 }
+
 void CbmAlgoBuildRawEvents::UpdateTimeWinBoundariesExtrema()
 {
   /// Initialize with reference detector
@@ -1009,8 +898,9 @@ void CbmAlgoBuildRawEvents::UpdateTimeWinBoundariesExtrema()
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     fdEarliestTimeWinBeg = std::min(fdEarliestTimeWinBeg, (*det).fdTimeWinBeg);
     fdLatestTimeWinEnd   = std::max(fdLatestTimeWinEnd, (*det).fdTimeWinEnd);
-  }  // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+  }
 }
+
 void CbmAlgoBuildRawEvents::UpdateWidestTimeWinRange()
 {
   /// Initialize with reference detector
@@ -1019,8 +909,7 @@ void CbmAlgoBuildRawEvents::UpdateWidestTimeWinRange()
   /// Loop on selection detectors
   for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) {
     fdWidestTimeWinRange = std::max(fdWidestTimeWinRange, (*det).fdTimeWinEnd - (*det).fdTimeWinBeg);
-  }  // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
+  }
 }
-//----------------------------------------------------------------------
 
 ClassImp(CbmAlgoBuildRawEvents)
diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
index efe156513b60a8ff9ea0defa2e49e7925928deb7..9cff5c5c4a3a1f3688669f26e8a118e0a878b4a1 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
@@ -49,22 +49,23 @@ enum class EOverlapModeRaw
 
 class RawEventBuilderDetector {
 public:
-  RawEventBuilderDetector() { ; }
+  RawEventBuilderDetector() = default;
+
   RawEventBuilderDetector(ECbmModuleId detIdIn, ECbmDataType dataTypeIn, std::string sNameIn)
+    : detId {detIdIn}
+    , dataType {dataTypeIn}
+    , sName {sNameIn}
   {
-    detId    = detIdIn;
-    dataType = dataTypeIn;
-    sName    = sNameIn;
   }
+
   RawEventBuilderDetector(ECbmModuleId detIdIn, ECbmDataType dataTypeIn, std::string sNameIn, UInt_t uTriggerMinDigisIn,
                           Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn)
     : RawEventBuilderDetector(detIdIn, dataTypeIn, sNameIn)
   {
     fuTriggerMinDigis = uTriggerMinDigisIn;
     fiTriggerMaxDigis = iTriggerMaxDigisIn;
-
-    fdTimeWinBeg = fdTimeWinBegIn;
-    fdTimeWinEnd = fdTimeWinEndIn;
+    fdTimeWinBeg      = fdTimeWinBegIn;
+    fdTimeWinEnd      = fdTimeWinEndIn;
   }
 
   bool operator==(const RawEventBuilderDetector& other) const { return (other.detId == this->detId); }
@@ -83,7 +84,6 @@ public:
   /// Selection Window
   Double_t fdTimeWinBeg = -100;
   Double_t fdTimeWinEnd = 100;
-
   /// Book-keeping variables
   UInt_t fuStartIndex = 0;
   UInt_t fuEndIndex   = 0;
@@ -110,13 +110,13 @@ static const RawEventBuilderDetector kRawEventBuilderDetUndef = RawEventBuilderD
 class CbmAlgoBuildRawEvents {
 public:
   /** Default constructor **/
-  CbmAlgoBuildRawEvents();
+  CbmAlgoBuildRawEvents() = default;
 
   CbmAlgoBuildRawEvents(const CbmAlgoBuildRawEvents&) = delete;
   CbmAlgoBuildRawEvents operator=(const CbmAlgoBuildRawEvents&) = delete;
 
   /** Destructor **/
-  ~CbmAlgoBuildRawEvents();
+  ~CbmAlgoBuildRawEvents() {};
 
   /** Initiliazation at the beginning of a run **/
   Bool_t InitAlgo();
@@ -142,7 +142,6 @@ public:
 
   void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal);
   void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal);
-
   void SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd);
 
   void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength)
@@ -191,6 +190,7 @@ private:
   /// Internal methods
   Bool_t CheckDataAvailable(RawEventBuilderDetector& det);
   void InitTs();
+  void InitSeedWindow();
   void BuildEvents();
 
   void CreateHistograms();
@@ -199,8 +199,11 @@ private:
   template<class DigiSeed>
   void LoopOnSeeds();
   void CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx);
+  void CheckTriggerCondition(Double_t dSeedTime);
+
   template<class DigiCheck>
   void SearchMatches(Double_t dSeedTime, RawEventBuilderDetector& detMatch);
+  void SearchMatches(Double_t dSeedTime, RawEventBuilderDetector& detMatch);
   void AddDigiToEvent(RawEventBuilderDetector& det, Int_t uIdx);
   Bool_t HasTrigger(CbmEvent*);
   Bool_t CheckTriggerConditions(CbmEvent* event, RawEventBuilderDetector& det);
@@ -232,6 +235,9 @@ private:
   Double_t fdEarliestTimeWinBeg = kdDefaultTimeWinBeg;
   Double_t fdLatestTimeWinEnd   = kdDefaultTimeWinEnd;
   Double_t fdWidestTimeWinRange = kdDefaultTimeWinEnd - kdDefaultTimeWinBeg;
+  ///Seed window
+  Double_t fdSeedWindowBeg = 0;
+  Double_t fdSeedWindowEnd = 0;
 
   Double_t fdTsStartTime  = -1;
   Double_t fdTsLength     = -1;
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
index 9aae78088d832636ea0530961fa87128be410c58..ed71ed01e9dbd4d0cd332050e00d2b1ff3e66303 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
@@ -7,7 +7,6 @@
  ********************************************************************************/
 #include "CbmTaskBuildRawEvents.h"
 
-#include "CbmAlgoBuildRawEvents.h"
 #include "CbmDigiManager.h"
 #include "CbmEvent.h"
 
@@ -21,23 +20,16 @@
 #include "THttpServer.h"
 #include <TFile.h>
 
-// ---- Default constructor -------------------------------------------
 CbmTaskBuildRawEvents::CbmTaskBuildRawEvents() : FairTask("CbmTaskBuildRawEvents")
 {
   /// Create Algo. To be made generic/switchable when more event building algo are available!
   fpAlgo = new CbmAlgoBuildRawEvents();
 }
 
-// ---- Destructor ----------------------------------------------------
 CbmTaskBuildRawEvents::~CbmTaskBuildRawEvents() {}
 
-// ----  Initialisation  ----------------------------------------------
-void CbmTaskBuildRawEvents::SetParContainers()
-{
-  /// Nothing to do
-}
+void CbmTaskBuildRawEvents::SetParContainers() {}
 
-// ---- Init ----------------------------------------------------------
 InitStatus CbmTaskBuildRawEvents::Init()
 {
   /// Get a handle from the IO manager
@@ -113,7 +105,6 @@ InitStatus CbmTaskBuildRawEvents::Init()
   /// Register output array (CbmEvent)
   fEvents = new TClonesArray("CbmEvent", 100);
   ioman->Register("CbmEvent", "Cbm_Event", fEvents, IsOutputBranchPersistent("CbmEvent"));
-
   if (!fEvents) LOG(fatal) << "Output branch was not created";
 
   /// Call Algo Init method
@@ -122,10 +113,8 @@ InitStatus CbmTaskBuildRawEvents::Init()
     return kFATAL;
 }
 
-// ---- ReInit  -------------------------------------------------------
 InitStatus CbmTaskBuildRawEvents::ReInit() { return kSUCCESS; }
 
-// ---- Exec ----------------------------------------------------------
 void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
 {
   LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence";
@@ -135,7 +124,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
     fStsDigis->clear();
     for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kSts); i++) {
       const CbmStsDigi* Digi = fDigiMan->Get<CbmStsDigi>(i);
-      fStsDigis->insert(fStsDigis->begin() + i, *Digi);
+      fStsDigis->push_back(*Digi);
     }
     LOG(debug) << "Read: " << fStsDigis->size() << " STS digis.";
     LOG(debug) << "In DigiManager: " << fDigiMan->GetNofDigis(ECbmModuleId::kSts) << " STS digis.";
@@ -147,7 +136,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
       fMuchBeamTimeDigis->clear();
       for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) {
         const CbmMuchBeamTimeDigi* Digi = fDigiMan->Get<CbmMuchBeamTimeDigi>(i);
-        fMuchBeamTimeDigis->insert(fMuchBeamTimeDigis->begin() + i, *Digi);
+        fMuchBeamTimeDigis->push_back(*Digi);
       }
       LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis.";
       LOG(debug) << "In DigiManager: " << fMuchBeamTimeDigis->size() << " MUCH digis.";
@@ -156,7 +145,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
       fMuchDigis->clear();
       for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) {
         const CbmMuchDigi* Digi = fDigiMan->Get<CbmMuchDigi>(i);
-        fMuchDigis->insert(fMuchDigis->begin() + i, *Digi);
+        fMuchDigis->push_back(*Digi);
       }
       LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis.";
       LOG(debug) << "In DigiManager: " << fMuchDigis->size() << " MUCH digis.";
@@ -168,7 +157,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
     fTrdDigis->clear();
     for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTrd); i++) {
       const CbmTrdDigi* Digi = fDigiMan->Get<CbmTrdDigi>(i);
-      fTrdDigis->insert(fTrdDigis->begin() + i, *Digi);
+      fTrdDigis->push_back(*Digi);
     }
     LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTrd) << " TRD digis.";
     LOG(debug) << "In DigiManager: " << fTrdDigis->size() << " TRD digis.";
@@ -179,7 +168,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
     fTofDigis->clear();
     for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTof); i++) {
       const CbmTofDigi* Digi = fDigiMan->Get<CbmTofDigi>(i);
-      fTofDigis->insert(fTofDigis->begin() + i, *Digi);
+      fTofDigis->push_back(*Digi);
     }
     LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTof) << " TOF digis.";
     LOG(debug) << "In DigiManager: " << fTofDigis->size() << " TOF digis.";
@@ -190,7 +179,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
     fRichDigis->clear();
     for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kRich); i++) {
       const CbmRichDigi* Digi = fDigiMan->Get<CbmRichDigi>(i);
-      fRichDigis->insert(fRichDigis->begin() + i, *Digi);
+      fRichDigis->push_back(*Digi);
     }
     LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kRich) << " RICH digis.";
     LOG(debug) << "In DigiManager: " << fRichDigis->size() << " RICH digis.";
@@ -201,12 +190,11 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
     fPsdDigis->clear();
     for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kPsd); i++) {
       const CbmPsdDigi* Digi = fDigiMan->Get<CbmPsdDigi>(i);
-      fPsdDigis->insert(fPsdDigis->begin() + i, *Digi);
+      fPsdDigis->push_back(*Digi);
     }
     LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kPsd) << " PSD digis.";
     LOG(debug) << "In DigiManager: " << fPsdDigis->size() << " PSD digis.";
   }
-
   /// Call Algo ProcessTs method
   fpAlgo->ProcessTs();
 
@@ -215,17 +203,13 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
   LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done";
 }
 
-
-// ---- Finish --------------------------------------------------------
 void CbmTaskBuildRawEvents::Finish()
 {
-  if (fbFillHistos) { SaveHistos(); }  // if( fbFillHistos )
-
   /// Call Algo finish method
   fpAlgo->Finish();
+  if (fbFillHistos) { SaveHistos(); }
 }
 
-//----------------------------------------------------------------------
 void CbmTaskBuildRawEvents::FillOutput()
 {
   /// Clear TClonesArray before usage.
@@ -239,12 +223,11 @@ void CbmTaskBuildRawEvents::FillOutput()
     LOG(debug) << "Vector: " << event->ToString();
     new ((*fEvents)[fEvents->GetEntriesFast()]) CbmEvent(std::move(*event));
     LOG(debug) << "TClonesArray: " << static_cast<CbmEvent*>(fEvents->At(fEvents->GetEntriesFast() - 1))->ToString();
-  }  // for( CbmEvent* event: vEvents )
-
+  }
   /// Clear event vector after usage
   fpAlgo->ClearEventVector();
 }
-//----------------------------------------------------------------------
+
 void CbmTaskBuildRawEvents::SaveHistos()
 {
   /// Obtain vector of pointers on each histo from the algo (+ optionally desired folder)
@@ -262,75 +245,19 @@ void CbmTaskBuildRawEvents::SaveHistos()
   /// Save all plots and create folders if needed
   for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
     /// Make sure we end up in chosen folder
-    TString sFolder = vHistos[uHisto].second.data();
+    const TString sFolder = vHistos[uHisto].second.data();
     if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
     gDirectory->cd(sFolder);
 
     /// Write plot
     vHistos[uHisto].first->Write();
-
     histoFile->cd();
-  }  // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
+  }
 
   /// Restore original directory position
   oldDir->cd();
   histoFile->Close();
 }
-//----------------------------------------------------------------------
-void CbmTaskBuildRawEvents::SetFillHistos(Bool_t bFlag)
-{
-  fbFillHistos = bFlag;
-  if (nullptr != fpAlgo) fpAlgo->SetFillHistos(fbFillHistos);
-}
-void CbmTaskBuildRawEvents::SetOutFilename(TString sNameIn) { fsOutFileName = sNameIn; }
-
-void CbmTaskBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDet)
-{
-  if (nullptr != fpAlgo) fpAlgo->SetReferenceDetector(refDet);
-}
-void CbmTaskBuildRawEvents::AddDetector(RawEventBuilderDetector selDet)
-{
-  if (nullptr != fpAlgo) fpAlgo->AddDetector(selDet);
-}
-void CbmTaskBuildRawEvents::RemoveDetector(RawEventBuilderDetector selDet)
-{
-  if (nullptr != fpAlgo) fpAlgo->RemoveDetector(selDet);
-}
-
-void CbmTaskBuildRawEvents::SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal)
-{
-  if (nullptr != fpAlgo) fpAlgo->SetTriggerMinNumber(selDet, uVal);
-}
-void CbmTaskBuildRawEvents::SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal)
-{
-  if (nullptr != fpAlgo) fpAlgo->SetTriggerMaxNumber(selDet, iVal);
-}
-
-void CbmTaskBuildRawEvents::SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd)
-{
-  if (nullptr != fpAlgo) fpAlgo->SetTriggerWindow(det, dWinBeg, dWinEnd);
-}
-
-
-void CbmTaskBuildRawEvents::SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength)
-{
-  if (nullptr != fpAlgo) fpAlgo->SetTsParameters(dTsStartTime, dTsLength, dTsOverLength);
-}
-
-void CbmTaskBuildRawEvents::SetEventOverlapMode(EOverlapModeRaw mode)
-{
-  if (nullptr != fpAlgo) fpAlgo->SetEventOverlapMode(mode);
-}
-void CbmTaskBuildRawEvents::SetIgnoreTsOverlap(Bool_t bFlagIn)
-{
-  if (nullptr != fpAlgo) fpAlgo->SetIgnoreTsOverlap(bFlagIn);
-}
-void CbmTaskBuildRawEvents::ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn)
-{
-  if (nullptr != fpAlgo) fpAlgo->ChangeMuchBeamtimeDigiFlag(bFlagIn);
-  fbUseMuchBeamtimeDigi = bFlagIn;
-}
 
-//----------------------------------------------------------------------
 
 ClassImp(CbmTaskBuildRawEvents)
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index d79b95c89f51e7afc21f2af788b2c1b00e22b4cc..e736d634a227c7afe60aa552b4e25c6365854baa 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -14,6 +14,7 @@
 /// FAIRSOFT headers (geant, boost, ...)
 
 /// C/C++ headers
+#include "CbmAlgoBuildRawEvents.h"
 #include "CbmMuchBeamTimeDigi.h"
 #include "CbmMuchDigi.h"
 #include "CbmPsdDigi.h"
@@ -30,7 +31,6 @@
 #include <vector>
 
 class CbmDigiManager;
-class CbmAlgoBuildRawEvents;
 class RawEventBuilderDetector;
 class TClonesArray;
 
@@ -47,18 +47,15 @@ public:
   /** Constructor with parameters (Optional) **/
   //  CbmTaskBuildRawEvents(Int_t verbose);
 
-
   /** Destructor **/
   ~CbmTaskBuildRawEvents();
 
-
   /** Initiliazation of task at the beginning of a run **/
   virtual InitStatus Init();
 
   /** ReInitiliazation of task when the runID changes **/
   virtual InitStatus ReInit();
 
-
   /** Executed for each event. **/
   virtual void Exec(Option_t*);
 
@@ -68,24 +65,55 @@ public:
   /** Finish task called at the end of the run **/
   virtual void Finish();
 
-  void SetFillHistos(Bool_t bFlag = kTRUE);
-  void SetOutFilename(TString sNameIn);
-
-  void SetReferenceDetector(RawEventBuilderDetector refDet);
-  void AddDetector(RawEventBuilderDetector selDet);
-  void RemoveDetector(RawEventBuilderDetector selDet);
-
-  void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal);
-  void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal);
-
-  void SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd);
-
-  void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength);
-
-  void SetEventOverlapMode(EOverlapModeRaw mode);
-  void SetIgnoreTsOverlap(Bool_t bFlagIn);
-
-  void ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn = kFALSE);
+  /** Setters **/
+  void SetOutFilename(TString sNameIn) { fsOutFileName = sNameIn; }
+
+  void SetFillHistos(Bool_t bFlag = kTRUE)
+  {
+    fbFillHistos = bFlag;
+    if (nullptr != fpAlgo) fpAlgo->SetFillHistos(fbFillHistos);
+  }
+  void SetReferenceDetector(RawEventBuilderDetector refDet)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetReferenceDetector(refDet);
+  }
+  void AddDetector(RawEventBuilderDetector selDet)
+  {
+    if (nullptr != fpAlgo) fpAlgo->AddDetector(selDet);
+  }
+  void RemoveDetector(RawEventBuilderDetector selDet)
+  {
+    if (nullptr != fpAlgo) fpAlgo->RemoveDetector(selDet);
+  }
+  void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetTriggerMinNumber(selDet, uVal);
+  }
+  void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetTriggerMaxNumber(selDet, iVal);
+  }
+  void SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetTriggerWindow(det, dWinBeg, dWinEnd);
+  }
+  void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetTsParameters(dTsStartTime, dTsLength, dTsOverLength);
+  }
+  void SetEventOverlapMode(EOverlapModeRaw mode)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetEventOverlapMode(mode);
+  }
+  void SetIgnoreTsOverlap(Bool_t bFlagIn)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetIgnoreTsOverlap(bFlagIn);
+  }
+  void ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn = kFALSE)
+  {
+    if (nullptr != fpAlgo) fpAlgo->ChangeMuchBeamtimeDigiFlag(bFlagIn);
+    fbUseMuchBeamtimeDigi = bFlagIn;
+  }
 
 private:
   void FillOutput();