diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
index 79c9f59fcb8cc7509203082dddbcb19fab7aecfc..7a1eb026551ead4fc9e3a907bb562fd03c412f5e 100644
--- a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
+++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
@@ -279,12 +279,12 @@ try {
 
   /// Digis storage
   fpAlgo->SetT0Digis(fvDigiT0);
-  fpAlgo->SetStsDigis(fvDigiSts);
-  fpAlgo->SetMuchDigis(fvDigiMuch);
-  fpAlgo->SetTrdDigis(fvDigiTrd);
-  fpAlgo->SetTofDigis(fvDigiTof);
-  fpAlgo->SetRichDigis(fvDigiRich);
-  fpAlgo->SetPsdDigis(fvDigiPsd);
+  fpAlgo->SetDigis(fvDigiSts);
+  fpAlgo->SetDigis(fvDigiMuch);
+  fpAlgo->SetDigis(fvDigiTrd);
+  fpAlgo->SetDigis(fvDigiTof);
+  fpAlgo->SetDigis(fvDigiRich);
+  fpAlgo->SetDigis(fvDigiPsd);
 
   // Mvd currently not implemented in event builder
   //std::vector<CbmMvdDigi>* pMvdDigi = new std::vector<CbmMvdDigi>();
diff --git a/MQ/mcbm/CbmDeviceBuildRawEvents.cxx b/MQ/mcbm/CbmDeviceBuildRawEvents.cxx
index 993be7537a90c3d708bb6b6cbfd20c761a633178..e4fccbfee340fa20a9c0f9d430c554dbc814511d 100644
--- a/MQ/mcbm/CbmDeviceBuildRawEvents.cxx
+++ b/MQ/mcbm/CbmDeviceBuildRawEvents.cxx
@@ -282,12 +282,12 @@ try {
 
   /// Digis storage
   fpAlgo->SetT0Digis(fvDigiT0);
-  fpAlgo->SetStsDigis(fvDigiSts);
-  fpAlgo->SetMuchBeamTimeDigis(fvDigiMuch);
-  fpAlgo->SetTrdDigis(fvDigiTrd);
-  fpAlgo->SetTofDigis(fvDigiTof);
-  fpAlgo->SetRichDigis(fvDigiRich);
-  fpAlgo->SetPsdDigis(fvDigiPsd);
+  fpAlgo->SetDigis(fvDigiSts);
+  fpAlgo->SetDigis(fvDigiMuch);
+  fpAlgo->SetDigis(fvDigiTrd);
+  fpAlgo->SetDigis(fvDigiTof);
+  fpAlgo->SetDigis(fvDigiRich);
+  fpAlgo->SetDigis(fvDigiPsd);
 
   // Mvd currently not implemented in event builder
   //std::vector<CbmMvdDigi>* pMvdDigi = new std::vector<CbmMvdDigi>();
diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
index fda3e2835c62413fb1ddb9fd9cc792252619f06f..a4cd0b5099807c96924bc92abbcd39042a8618e2 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
@@ -184,16 +184,13 @@ public:
 
   /// Set digi containers
   void SetT0Digis(const std::vector<CbmTofDigi>* T0DigiVec) { fT0DigiVec = T0DigiVec; }
-  void SetStsDigis(std::vector<CbmStsDigi>* StsDigis) { fStsDigis = StsDigis; }
-  void SetMuchDigis(std::vector<CbmMuchDigi>* MuchDigis) { fMuchDigis = MuchDigis; }
-  void SetTrdDigis(std::vector<CbmTrdDigi>* TrdDigis) { fTrdDigis = TrdDigis; }
-  void SetTofDigis(std::vector<CbmTofDigi>* TofDigis) { fTofDigis = TofDigis; }
-  void SetRichDigis(std::vector<CbmRichDigi>* RichDigis) { fRichDigis = RichDigis; }
-  void SetPsdDigis(std::vector<CbmPsdDigi>* PsdDigis) { fPsdDigis = PsdDigis; }
-  void SetMuchBeamTimeDigis(std::vector<CbmMuchBeamTimeDigi>* MuchBeamTimeDigis)
-  {
-    fMuchBeamTimeDigis = MuchBeamTimeDigis;
-  }
+  void SetDigis(std::vector<CbmStsDigi>* StsDigis) { fStsDigis = StsDigis; }
+  void SetDigis(std::vector<CbmMuchDigi>* MuchDigis) { fMuchDigis = MuchDigis; }
+  void SetDigis(std::vector<CbmTrdDigi>* TrdDigis) { fTrdDigis = TrdDigis; }
+  void SetDigis(std::vector<CbmTofDigi>* TofDigis) { fTofDigis = TofDigis; }
+  void SetDigis(std::vector<CbmRichDigi>* RichDigis) { fRichDigis = RichDigis; }
+  void SetDigis(std::vector<CbmPsdDigi>* PsdDigis) { fPsdDigis = PsdDigis; }
+  void SetDigis(std::vector<CbmMuchBeamTimeDigi>* MuchBeamTimeDigis) { fMuchBeamTimeDigis = MuchBeamTimeDigis; }
 
   void SetSeedTimes(std::vector<Double_t>* SeedTimes) { fSeedTimes = SeedTimes; }
 
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
index fbbced420d682de1d2bfaab622fa19bf02783d02..28a6cf3d795b25bfa59188625bc1a0fd917cca0d 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
@@ -7,6 +7,7 @@
 #include "CbmDigiManager.h"
 #include "CbmEvent.h"
 #include "CbmMatch.h"
+#include "CbmModuleList.h"
 #include "CbmSeedFinderSlidingWindow.h"
 
 #include <FairLogger.h>
@@ -83,6 +84,18 @@ void CbmTaskBuildRawEvents::SetSeedFinderQa(Bool_t bFlagIn)
   if (fSeedFinderSlidingWindow != nullptr) fSeedFinderSlidingWindow->SetQa(bFlagIn);
 }
 
+template<class TDigi>
+void CbmTaskBuildRawEvents::InitDigis(ECbmModuleId detId, std::vector<TDigi>** vDigi)
+{
+  TString detName = CbmModuleList::GetModuleNameCaps(detId);
+  if (!fDigiMan->IsPresent(detId)) { LOG(info) << "No " << detName << " digi input."; }
+  else {
+    LOG(info) << detName << " digi input.";
+    *vDigi = new std::vector<TDigi>;
+    fpAlgo->SetDigis(*vDigi);
+  }
+}
+
 InitStatus CbmTaskBuildRawEvents::Init()
 {
   if (fbGetTimings) {
@@ -108,59 +121,16 @@ InitStatus CbmTaskBuildRawEvents::Init()
   if (fbUseMuchBeamtimeDigi) { fDigiMan->UseMuchBeamTimeDigi(); }
   fDigiMan->Init();
 
-  //Init STS digis
-  if (!fDigiMan->IsPresent(ECbmModuleId::kSts)) { LOG(info) << "No STS digi input."; }
-  else {
-    LOG(info) << "STS digi input.";
-    fStsDigis = new std::vector<CbmStsDigi>;
-    fpAlgo->SetStsDigis(fStsDigis);
-  }
-
-  //Init MUCH digis
-  if (!fDigiMan->IsPresent(ECbmModuleId::kMuch)) { LOG(info) << "No MUCH digi input."; }
-  else {
-    LOG(info) << "MUCH digi input.";
-    if (fbUseMuchBeamtimeDigi) {
-      fMuchBeamTimeDigis = new std::vector<CbmMuchBeamTimeDigi>;
-      fpAlgo->SetMuchBeamTimeDigis(fMuchBeamTimeDigis);
-    }
-    else {
-      fMuchDigis = new std::vector<CbmMuchDigi>;
-      fpAlgo->SetMuchDigis(fMuchDigis);
-    }
-  }
-
-  //Init TRD digis
-  if (!fDigiMan->IsPresent(ECbmModuleId::kTrd)) { LOG(info) << "No TRD digi input."; }
-  else {
-    LOG(info) << "TRD digi input.";
-    fTrdDigis = new std::vector<CbmTrdDigi>;
-    fpAlgo->SetTrdDigis(fTrdDigis);
-  }
-
-  //Init TOF digis
-  if (!fDigiMan->IsPresent(ECbmModuleId::kTof)) { LOG(info) << "No TOF digi input."; }
-  else {
-    LOG(info) << "TOF digi input.";
-    fTofDigis = new std::vector<CbmTofDigi>;
-    fpAlgo->SetTofDigis(fTofDigis);
-  }
-
-  //Init RICH digis
-  if (!fDigiMan->IsPresent(ECbmModuleId::kRich)) { LOG(info) << "No RICH digi input."; }
-  else {
-    LOG(info) << "RICH digi input.";
-    fRichDigis = new std::vector<CbmRichDigi>;
-    fpAlgo->SetRichDigis(fRichDigis);
-  }
-
-  //Init PSD digis
-  if (!fDigiMan->IsPresent(ECbmModuleId::kPsd)) { LOG(info) << "No PSD digi input."; }
+  //Init digis
+  if (fbUseMuchBeamtimeDigi) { InitDigis(ECbmModuleId::kMuch, &fMuchBeamTimeDigis); }
   else {
-    LOG(info) << "PSD digi input.";
-    fPsdDigis = new std::vector<CbmPsdDigi>;
-    fpAlgo->SetPsdDigis(fPsdDigis);
+    InitDigis(ECbmModuleId::kMuch, &fMuchDigis);
   }
+  InitDigis(ECbmModuleId::kSts, &fStsDigis);
+  InitDigis(ECbmModuleId::kTrd, &fTrdDigis);
+  InitDigis(ECbmModuleId::kTof, &fTofDigis);
+  InitDigis(ECbmModuleId::kRich, &fRichDigis);
+  InitDigis(ECbmModuleId::kPsd, &fPsdDigis);
 
   /// Register output array (CbmEvent)
   fEvents = new TClonesArray("CbmEvent", 100);
@@ -188,115 +158,40 @@ InitStatus CbmTaskBuildRawEvents::Init()
 
 InitStatus CbmTaskBuildRawEvents::ReInit() { return kSUCCESS; }
 
-void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
+template<class TDigi>
+void CbmTaskBuildRawEvents::ReadDigis(ECbmModuleId detId, std::vector<TDigi>* vDigis)
 {
-  if (fTimer != nullptr) { fTimer->Start(kFALSE); }
-  TStopwatch timer;
-  timer.Start();
-
-  LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence";
   //Warning: Int_t must be used for the loop counters instead of UInt_t,
   //as the digi manager can return -1, which would be casted to +1
   //during comparison, leading to an error.
-
-  //Reset explicit seed times if set
-  if (fSeedTimes != nullptr) { fSeedTimes->clear(); }
-
   if (fCopyTimer != nullptr) { fCopyTimer->Start(kFALSE); }
 
-  //Read STS digis
-  if (fDigiMan->IsPresent(ECbmModuleId::kSts)) {
-    fStsDigis->clear();
-    for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kSts); i++) {
-      const CbmStsDigi* Digi = fDigiMan->Get<CbmStsDigi>(i);
-      fStsDigis->push_back(*Digi);
-    }
-    LOG(debug) << "Read: " << fStsDigis->size() << " STS digis.";
-    LOG(debug) << "In DigiManager: " << fDigiMan->GetNofDigis(ECbmModuleId::kSts) << " STS digis.";
-  }
-
-  //Read MUCH digis
-  if (fDigiMan->IsPresent(ECbmModuleId::kMuch)) {
-    if (fbUseMuchBeamtimeDigi) {
-      fMuchBeamTimeDigis->clear();
-      for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) {
-        const CbmMuchBeamTimeDigi* Digi = fDigiMan->Get<CbmMuchBeamTimeDigi>(i);
-        fMuchBeamTimeDigis->push_back(*Digi);
-      }
-      LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis.";
-      LOG(debug) << "In DigiManager: " << fMuchBeamTimeDigis->size() << " MUCH digis.";
-    }
-    else {
-      fMuchDigis->clear();
-      for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) {
-        const CbmMuchDigi* Digi = fDigiMan->Get<CbmMuchDigi>(i);
-        fMuchDigis->push_back(*Digi);
-      }
-      LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis.";
-      LOG(debug) << "In DigiManager: " << fMuchDigis->size() << " MUCH digis.";
-    }
-  }
-
-  //Read TRD digis
-  if (fDigiMan->IsPresent(ECbmModuleId::kTrd)) {
-    fTrdDigis->clear();
-    for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTrd); i++) {
-      const CbmTrdDigi* Digi = fDigiMan->Get<CbmTrdDigi>(i);
-      fTrdDigis->push_back(*Digi);
-    }
-    LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTrd) << " TRD digis.";
-    LOG(debug) << "In DigiManager: " << fTrdDigis->size() << " TRD digis.";
-  }
-
-  //Read TOF digis
-  if (fDigiMan->IsPresent(ECbmModuleId::kTof)) {
-    fTofDigis->clear();
-    for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTof); i++) {
-      const CbmTofDigi* Digi = fDigiMan->Get<CbmTofDigi>(i);
-      fTofDigis->push_back(*Digi);
-    }
-    LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTof) << " TOF digis.";
-    LOG(debug) << "In DigiManager: " << fTofDigis->size() << " TOF digis.";
-  }
+  const TString detName = CbmModuleList::GetModuleNameCaps(detId);
 
-  //Read RICH digis
-  if (fDigiMan->IsPresent(ECbmModuleId::kRich)) {
-    fRichDigis->clear();
-    for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kRich); i++) {
-      const CbmRichDigi* Digi = fDigiMan->Get<CbmRichDigi>(i);
-      fRichDigis->push_back(*Digi);
-    }
-    LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kRich) << " RICH digis.";
-    LOG(debug) << "In DigiManager: " << fRichDigis->size() << " RICH digis.";
-  }
+  if (fDigiMan->IsPresent(detId)) {
+    vDigis->clear();
+    const Int_t nDigis = fDigiMan->GetNofDigis(detId);
 
-  //Read PSD digis
-  if (fDigiMan->IsPresent(ECbmModuleId::kPsd)) {
-    fPsdDigis->clear();
-    for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kPsd); i++) {
-      const CbmPsdDigi* Digi = fDigiMan->Get<CbmPsdDigi>(i);
-      fPsdDigis->push_back(*Digi);
+    for (Int_t i = 0; i < nDigis; i++) {
+      const TDigi* Digi = fDigiMan->Get<TDigi>(i);
+      vDigis->push_back(*Digi);
     }
-    LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kPsd) << " PSD digis.";
-    LOG(debug) << "In DigiManager: " << fPsdDigis->size() << " PSD digis.";
+    LOG(debug) << "Read: " << vDigis->size() << " " << detName << " digis.";
+    LOG(debug) << "In DigiManager: " << nDigis << " " << detName << " digis.";
   }
 
   if (fCopyTimer != nullptr) { fCopyTimer->Stop(); }
+}
 
-  if (fSeedFinderSlidingWindow != nullptr) { FillSeedTimesFromSlidingWindow(); }
-  else if (fSeedTimeDetList.size() > 0) {
-    FillSeedTimesFromDetList(fSeedTimes);
-  }
-
-  //DumpSeedTimesFromDetList();
-
-  /// Call Algo ProcessTs method
-  fpAlgo->ProcessTs();
-
-  /// Save the resulting vector of events in TClonesArray
-  FillOutput();
-  LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done";
+void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
+{
+  if (fTimer != nullptr) { fTimer->Start(kFALSE); }
+  TStopwatch timer;
+  timer.Start();
+  LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence";
 
+  // Process Timeslice
+  BuildEvents();
   if (fTimer != nullptr) { fTimer->Stop(); }
 
   // --- Timeslice log and statistics
@@ -315,6 +210,38 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
   fNofTs++;
   fNofEvents += fEvents->GetEntriesFast();
   fTime += timer.RealTime();
+
+  LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done";
+}
+
+void CbmTaskBuildRawEvents::BuildEvents()
+{
+  //Reset explicit seed times if set
+  if (fSeedTimes != nullptr) { fSeedTimes->clear(); }
+
+  //Read digis
+  if (fbUseMuchBeamtimeDigi) { ReadDigis(ECbmModuleId::kMuch, fMuchBeamTimeDigis); }
+  else {
+    ReadDigis(ECbmModuleId::kMuch, fMuchDigis);
+  }
+  ReadDigis(ECbmModuleId::kSts, fStsDigis);
+  ReadDigis(ECbmModuleId::kTrd, fTrdDigis);
+  ReadDigis(ECbmModuleId::kTof, fTofDigis);
+  ReadDigis(ECbmModuleId::kRich, fRichDigis);
+  ReadDigis(ECbmModuleId::kPsd, fPsdDigis);
+
+  //Fill seeds
+  if (fSeedFinderSlidingWindow != nullptr) { FillSeedTimesFromSlidingWindow(); }
+  else if (fSeedTimeDetList.size() > 0) {
+    FillSeedTimesFromDetList(fSeedTimes);
+  }
+  //DumpSeedTimesFromDetList();
+
+  /// Call Algo ProcessTs method
+  fpAlgo->ProcessTs();
+
+  /// Save the resulting vector of events in TClonesArray
+  FillOutput();
 }
 
 void CbmTaskBuildRawEvents::FillSeedTimesFromDetList(std::vector<Double_t>* vdSeedTimes,
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index 54c8b536767711e947ad0dc48dfac186b85b358d..39b18c2f498a1a9cb390a7693eae7e42edccf95f 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -129,6 +129,9 @@ public:
   void SetSeedTimeWindow(Double_t beg, Double_t end) { fpAlgo->SetSeedTimeWindow(beg, end); }
 
 private:
+  /** Read digis from input, call seed finder, then build events **/
+  void BuildEvents();
+
   void FillOutput();
   void SaveHistos();
 
@@ -147,11 +150,19 @@ private:
   std::vector<CbmPsdDigi>* fPsdDigis                   = nullptr;
   std::vector<Double_t>* fSeedTimes                    = nullptr;
 
+  /** Create digi vector and pass to algo **/
+  template<class TDigi>
+  void InitDigis(ECbmModuleId detId, std::vector<TDigi>** vDigi);
+
   std::vector<Double_t>* fTempDigiTimes =
     nullptr;  //used when multiple seed detectors are combined with sliding window seed finder
 
   std::vector<RawEventBuilderDetector> fSeedTimeDetList;  //for multiple seed detectors
 
+  /** Read digis from digi manager **/
+  template<class TDigi>
+  void ReadDigis(ECbmModuleId detId, std::vector<TDigi>* vDigis);
+
   // Store digi matches for QA tasks
   std::vector<CbmMatch>* fvDigiMatchQa = nullptr;