diff --git a/algo/unpack/Unpack.cxx b/algo/unpack/Unpack.cxx
index b0b1c2aa95768a19acf3cc8464e0730131d9574f..b4df2a746c341ba74b14b5c645eaff856f1cefaa 100644
--- a/algo/unpack/Unpack.cxx
+++ b/algo/unpack/Unpack.cxx
@@ -30,7 +30,7 @@ namespace cbm::algo
 
     if (DetectorEnabled(fles::SubsystemIdentifier::STS)) {
       xpu::scoped_timer t1("STS");
-      ParallelMsLoop(digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, 0x20);
+      ParallelMsLoop(fParallelStsSetup, digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, fAlgoSts, 0x20);
     }
 
     // ---  Component loop
@@ -342,14 +342,16 @@ namespace cbm::algo
   // ----------------------------------------------------------------------------
 
   // ----------------------------------------------------------------------------
-  void Unpack::ParallelMsLoop(std::vector<CbmStsDigi>& digisOut, std::vector<UnpackStsMonitorData>& monitorOut,
-                              const fles::Timeslice& ts, u8 sys_ver)
+  template<class Digi, class UnpackAlgo, class Monitor>
+  void Unpack::ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut,
+                              std::vector<Monitor>& monitorOut, const fles::Timeslice& ts,
+                              const std::map<u16, UnpackAlgo>& algos, u8 sys_ver)
   {
-    const auto& msContent = fParallelStsSetup.msContent;
-    const auto& msDesc    = fParallelStsSetup.msDescriptors;
-    const auto& msEqIds   = fParallelStsSetup.msEquipmentIds;
-    auto& monitor         = fParallelStsSetup.msMonitorData;
-    auto& msDigis         = fParallelStsSetup.msDigis;
+    const auto& msContent = setup.msContent;
+    const auto& msDesc    = setup.msDescriptors;
+    const auto& msEqIds   = setup.msEquipmentIds;
+    auto& monitor         = setup.msMonitorData;
+    auto& msDigis         = setup.msDigis;
     size_t numMs          = msDigis.size();
 
     xpu::push_timer("Unpack");
diff --git a/algo/unpack/Unpack.h b/algo/unpack/Unpack.h
index 26189dd835a9bbfe6e606653d837f66bcf4e7810..dd87b0dd2da0a9f50400be8a2d834d0d485aa3c4 100644
--- a/algo/unpack/Unpack.h
+++ b/algo/unpack/Unpack.h
@@ -131,12 +131,13 @@ namespace cbm::algo
     }
 
   private:  // types
+    template<class Digi, class Monitor>
     struct ParallelSetup {
       std::vector<u16> msEquipmentIds;
       std::vector<fles::MicrosliceDescriptor> msDescriptors;
       std::vector<const u8*> msContent;
-      std::vector<std::vector<sts::Digi>> msDigis;
-      std::vector<UnpackStsMonitorData> msMonitorData;
+      std::vector<std::vector<Digi>> msDigis;
+      std::vector<Monitor> msMonitorData;
     };
 
   private:  // methods
@@ -150,8 +151,9 @@ namespace cbm::algo
     void ParallelInit(const fles::Timeslice& timeslice);
 
     /** @brief Parallel microslice loop **/
-    void ParallelMsLoop(std::vector<CbmStsDigi>& digisOut, std::vector<UnpackStsMonitorData>& monitor,
-                        const fles::Timeslice& ts, u8 sys_ver);
+    template<class Digi, class UnpackAlgo, class Monitor>
+    void ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut, std::vector<Monitor>& monitor,
+                        const fles::Timeslice& ts, const std::map<u16, UnpackAlgo>& algos, u8 sys_ver);
 
 
   private:                                                  // members
@@ -186,7 +188,7 @@ namespace cbm::algo
       {fles::SubsystemIdentifier::T0, 0},      {fles::SubsystemIdentifier::TRD, 1300},
       {fles::SubsystemIdentifier::TRD2D, -510}};
     /** @brief Parallel STS Setup */
-    ParallelSetup fParallelStsSetup = {};
+    ParallelSetup<sts::Digi, UnpackStsMonitorData> fParallelStsSetup = {};
   };
 }  // namespace cbm::algo