diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
index 23445eda840c42a1f671783e5975d2cd195d4b1c..2d3888b9b1488691fade1b2e0f0d80b39d14d70c 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
@@ -20,6 +20,8 @@
 #include "THttpServer.h"
 #include <TFile.h>
 
+#include <iomanip>
+
 CbmTaskBuildRawEvents::CbmTaskBuildRawEvents() : FairTask("CbmTaskBuildRawEvents")
 {
   /// Create Algo. To be made generic/switchable when more event building algo are available!
@@ -30,6 +32,35 @@ CbmTaskBuildRawEvents::~CbmTaskBuildRawEvents() {}
 
 void CbmTaskBuildRawEvents::SetParContainers() {}
 
+void CbmTaskBuildRawEvents::SetSeedTimeFiller(RawEventBuilderDetector seedDet)
+{
+  if (fSeedTimeDetList.size() > 0) { LOG(fatal) << "Cannot use seed detector list and single instance together."; }
+
+  fSeedTimeDet = seedDet;
+  if (fSeedTimeDet != kRawEventBuilderDetUndef) {
+    if (fSeedTimes == nullptr) { fSeedTimes = new std::vector<Double_t>; }
+  }
+  else {
+    if (fSeedTimes != nullptr) {
+      fSeedTimes->clear();
+      delete fSeedTimes;
+      fSeedTimes = nullptr;
+    }
+  }
+  fpAlgo->SetSeedTimes(fSeedTimes);
+}
+
+void CbmTaskBuildRawEvents::AddSeedTimeFillerToList(RawEventBuilderDetector seedDet)
+{
+  if (fSeedTimeDet != kRawEventBuilderDetUndef) {
+    LOG(fatal) << "Cannot use seed detector list and single instance together.";
+  }
+  if (fSeedTimes == nullptr) { fSeedTimes = new std::vector<Double_t>; }
+
+  fSeedTimeDetList.push_back(seedDet);
+  fpAlgo->SetSeedTimes(fSeedTimes);
+}
+
 InitStatus CbmTaskBuildRawEvents::Init()
 {
   /// Get a handle from the IO manager
@@ -123,8 +154,12 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
   //as the digi manager can return -1, which would be casted to +1
   //during comparison, leading to an error.
 
+  if (fSeedTimeDet != kRawEventBuilderDetUndef && fSeedTimeDetList.size() > 0) {
+    LOG(fatal) << "Cannot use seed detector list and single instance together.";
+  }
+
   //Reset explicit seed times if set
-  if (fSeedTimeDet != kRawEventBuilderDetUndef) { fSeedTimes->clear(); }
+  if (fSeedTimeDet != kRawEventBuilderDetUndef || fSeedTimeDetList.size() > 0) { fSeedTimes->clear(); }
 
   //Read STS digis
   if (fDigiMan->IsPresent(ECbmModuleId::kSts)) {
@@ -210,6 +245,9 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
     LOG(debug) << "In DigiManager: " << fPsdDigis->size() << " PSD digis.";
   }
 
+  if (fSeedTimeDetList.size() > 0) { FillSeedTimesFromDetList(); }
+  //DumpSeedTimesFromDetList();
+
   /// Call Algo ProcessTs method
   fpAlgo->ProcessTs();
 
@@ -218,6 +256,102 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
   LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done";
 }
 
+void CbmTaskBuildRawEvents::FillSeedTimesFromDetList()
+{
+  std::map<ECbmModuleId, UInt_t> DigiNumbers;
+  std::map<ECbmModuleId, UInt_t> DigiCounters;
+  fSeedTimes->clear();
+
+  for (RawEventBuilderDetector& system : fSeedTimeDetList) {
+    DigiNumbers[system.detId]  = GetNofDigis(system.detId);
+    DigiCounters[system.detId] = 0;
+  }
+
+  do {
+    ECbmModuleId nextAddedSystem;
+    Double_t earliestTime = -1;
+
+    for (RawEventBuilderDetector& system : fSeedTimeDetList) {
+      if (DigiCounters[system.detId] < DigiNumbers[system.detId]) {
+        Double_t thisTime = GetDigiTime(system.detId, DigiCounters[system.detId]);
+        if (thisTime < earliestTime || earliestTime == -1) {
+          nextAddedSystem = system.detId;
+          earliestTime    = thisTime;
+        }
+      }
+    }
+    if (earliestTime != -1) {
+      fSeedTimes->push_back(earliestTime);
+      DigiCounters[nextAddedSystem]++;
+    }
+    else {
+      break;
+    }
+  } while (true);
+}
+
+void CbmTaskBuildRawEvents::DumpSeedTimesFromDetList()
+{
+  std::ofstream timesUnsorted("digiTimesUnsorted.dat", std::ofstream::out);
+  timesUnsorted << std::setprecision(16);
+
+  for (RawEventBuilderDetector& system : fSeedTimeDetList) {
+    for (UInt_t i = 0; i < GetNofDigis(system.detId); i++) {
+      timesUnsorted << GetDigiTime(system.detId, i) << std::endl;
+    }
+  }
+  timesUnsorted.close();
+  LOG(info) << "Completed write of unsorted digi list.";
+
+  std::ofstream timesSorted("digiTimesSorted.dat", std::ofstream::out);
+  timesSorted << std::setprecision(16);
+
+  for (UInt_t i = 0; i < fSeedTimes->size(); i++) {
+    timesSorted << fSeedTimes->at(i) << std::endl;
+  }
+  timesSorted.close();
+  LOG(info) << "Completed DumpSeedTimesFromDetList(). Closing.";
+  exit(0);  //terminate as this method should only be used for diagnostics
+}
+
+Double_t CbmTaskBuildRawEvents::GetDigiTime(ECbmModuleId _system, UInt_t _entry)
+{
+  switch (_system) {
+    case ECbmModuleId::kMuch:
+      if (fbUseMuchBeamtimeDigi) { return (fMuchBeamTimeDigis->at(_entry)).GetTime(); }
+      else {
+        return (fMuchDigis->at(_entry)).GetTime();
+      }
+    case ECbmModuleId::kSts: return (fStsDigis->at(_entry)).GetTime();
+    case ECbmModuleId::kTrd: return (fTrdDigis->at(_entry)).GetTime();
+    case ECbmModuleId::kTof: return (fTofDigis->at(_entry)).GetTime();
+    case ECbmModuleId::kRich: return (fRichDigis->at(_entry)).GetTime();
+    case ECbmModuleId::kPsd: return (fPsdDigis->at(_entry)).GetTime();
+    case ECbmModuleId::kHodo: return (fT0Digis->at(_entry)).GetTime();
+    default: break;
+  }
+  return -1;
+}
+
+UInt_t CbmTaskBuildRawEvents::GetNofDigis(ECbmModuleId _system)
+{
+  switch (_system) {
+    case ECbmModuleId::kMuch:
+      if (fbUseMuchBeamtimeDigi) { return fMuchBeamTimeDigis->size(); }
+      else {
+        return fMuchDigis->size();
+      }
+    case ECbmModuleId::kSts: return fStsDigis->size();
+    case ECbmModuleId::kTrd: return fTrdDigis->size();
+    case ECbmModuleId::kTof: return fTofDigis->size();
+    case ECbmModuleId::kRich: return fRichDigis->size();
+    case ECbmModuleId::kPsd: return fPsdDigis->size();
+    case ECbmModuleId::kHodo: return fT0Digis->size();
+    default: break;
+  }
+  return 0;
+}
+
 void CbmTaskBuildRawEvents::Finish()
 {
   /// Call Algo finish method
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index 267fa861411b6b26e6c8bda126ebba489037cbd6..c896aa3a8e581faf5c412d4f07fd25562c0d94ab 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -114,27 +114,17 @@ public:
     if (nullptr != fpAlgo) fpAlgo->ChangeMuchBeamtimeDigiFlag(bFlagIn);
     fbUseMuchBeamtimeDigi = bFlagIn;
   }
-  void SetSeedTimeFiller(RawEventBuilderDetector seedDet)
-  {
-    fSeedTimeDet = seedDet;
-    if (fSeedTimeDet != kRawEventBuilderDetUndef) {
-      if (fSeedTimes == nullptr) { fSeedTimes = new std::vector<Double_t>; }
-    }
-    else {
-      if (fSeedTimes != nullptr) {
-        fSeedTimes->clear();
-        delete fSeedTimes;
-        fSeedTimes = nullptr;
-      }
-    }
-    fpAlgo->SetSeedTimes(fSeedTimes);
-  }
+  void SetSeedTimeFiller(RawEventBuilderDetector seedDet);
+  void AddSeedTimeFillerToList(RawEventBuilderDetector seedDet);
+  void DumpSeedTimesFromDetList();
   void SetSeedTimeWindow(Double_t beg, Double_t end) { fpAlgo->SetSeedTimeWindow(beg, end); }
 
 private:
   void FillOutput();
   void SaveHistos();
 
+  Bool_t fbUseMuchBeamtimeDigi = kTRUE;  //! Switch between MUCH digi classes
+
   CbmDigiManager* fDigiMan                             = nullptr;
   const std::vector<CbmTofDigi>* fT0Digis              = nullptr;
   std::vector<CbmMuchDigi>* fMuchDigis                 = nullptr;
@@ -144,12 +134,15 @@ private:
   std::vector<CbmTofDigi>* fTofDigis                   = nullptr;
   std::vector<CbmRichDigi>* fRichDigis                 = nullptr;
   std::vector<CbmPsdDigi>* fPsdDigis                   = nullptr;
+  std::vector<Double_t>* fSeedTimes                    = nullptr;
 
-  std::vector<Double_t>* fSeedTimes = nullptr;
+  std::vector<RawEventBuilderDetector> fSeedTimeDetList;            //if multiple are desired
+  RawEventBuilderDetector fSeedTimeDet = kRawEventBuilderDetUndef;  //single seed det
 
-  Bool_t fbUseMuchBeamtimeDigi = kTRUE;  //! Switch between MUCH digi classes
+  Double_t GetDigiTime(ECbmModuleId _system, UInt_t _entry);
+  UInt_t GetNofDigis(ECbmModuleId _system);
 
-  RawEventBuilderDetector fSeedTimeDet = kRawEventBuilderDetUndef;
+  void FillSeedTimesFromDetList();
 
   CbmAlgoBuildRawEvents* fpAlgo = nullptr;