diff --git a/algo/unpack/Unpack.cxx b/algo/unpack/Unpack.cxx
index b4df2a746c341ba74b14b5c645eaff856f1cefaa..3a4b0141251bf4bc906206098bf60dcd065aac0b 100644
--- a/algo/unpack/Unpack.cxx
+++ b/algo/unpack/Unpack.cxx
@@ -33,6 +33,11 @@ namespace cbm::algo
       ParallelMsLoop(fParallelStsSetup, digiTs.fData.fSts.fDigis, monitor.fSts, *timeslice, fAlgoSts, 0x20);
     }
 
+    if (DetectorEnabled(fles::SubsystemIdentifier::RPC)) {
+      xpu::scoped_timer t1("TOF");
+      ParallelMsLoop(fParallelTofSetup, digiTs.fData.fTof.fDigis, monitor.fTof, *timeslice, fAlgoTof, 0x00);
+    }
+
     // ---  Component loop
     for (uint64_t comp = 0; comp < timeslice->num_components(); comp++) {
 
@@ -57,9 +62,9 @@ namespace cbm::algo
       if (systemId == fles::SubsystemIdentifier::MUCH) {
         MsLoop(timeslice, fAlgoMuch, comp, equipmentId, &digiTs.fData.fMuch.fDigis, monitor, &monitor.fMuch, 0x20);
       }
-      if (systemId == fles::SubsystemIdentifier::RPC) {
-        MsLoop(timeslice, fAlgoTof, comp, equipmentId, &digiTs.fData.fTof.fDigis, monitor, &monitor.fTof, 0x00);
-      }
+      // if (systemId == fles::SubsystemIdentifier::RPC) {
+      //   MsLoop(timeslice, fAlgoTof, comp, equipmentId, &digiTs.fData.fTof.fDigis, monitor, &monitor.fTof, 0x00);
+      // }
       if (systemId == fles::SubsystemIdentifier::T0) {
         MsLoop(timeslice, fAlgoBmon, comp, equipmentId, &digiTs.fData.fT0.fDigis, monitor, &monitor.fBmon, 0x00);
       }
@@ -317,30 +322,43 @@ namespace cbm::algo
     xpu::scoped_timer t("ParallelInit");
 
     fParallelStsSetup = {};
+    fParallelTofSetup = {};
 
-    size_t numMs       = 0;
-    size_t maxNumDigis = 0;
     for (uint64_t comp = 0; comp < timeslice.num_components(); comp++) {
       auto systemId = static_cast<fles::SubsystemIdentifier>(timeslice.descriptor(comp, 0).sys_id);
-      if (systemId == fles::SubsystemIdentifier::STS) {
-        uint64_t numMsInComp = timeslice.num_microslices(comp);
-        numMs += numMsInComp;
-        u16 componentId = timeslice.descriptor(comp, 0).eq_id;
-        for (uint64_t mslice = 0; mslice < numMsInComp; mslice++) {
-          uint64_t msByteSize     = timeslice.descriptor(comp, mslice).size;
-          uint64_t numDigisInComp = msByteSize / sizeof(CbmStsDigi);
-          if (numDigisInComp > maxNumDigis) maxNumDigis = numDigisInComp;
-          fParallelStsSetup.msEquipmentIds.push_back(componentId);
-          fParallelStsSetup.msDescriptors.push_back(timeslice.descriptor(comp, mslice));
-          fParallelStsSetup.msContent.push_back(timeslice.content(comp, mslice));
-        }
+      switch (systemId) {
+        case fles::SubsystemIdentifier::STS: ParallelInitComponent(fParallelStsSetup, timeslice, comp); break;
+        case fles::SubsystemIdentifier::RPC: ParallelInitComponent(fParallelTofSetup, timeslice, comp); break;
+        default: break;
       }
     }
-    fParallelStsSetup.msDigis.resize(numMs);
-    fParallelStsSetup.msMonitorData.resize(numMs);
+    fParallelStsSetup.msDigis.resize(fParallelStsSetup.numMs);
+    fParallelStsSetup.msMonitorData.resize(fParallelStsSetup.numMs);
+    fParallelTofSetup.msDigis.resize(fParallelTofSetup.numMs);
+    fParallelTofSetup.msMonitorData.resize(fParallelTofSetup.numMs);
   }
   // ----------------------------------------------------------------------------
 
+  // ----------------------------------------------------------------------------
+  template<class Digi, class Monitor>
+  void Unpack::ParallelInitComponent(ParallelSetup<Digi, Monitor>& setup, const fles::Timeslice& timeslice,
+                                     u64 component)
+  {
+    auto& msDesc    = setup.msDescriptors;
+    auto& msEqIds   = setup.msEquipmentIds;
+    auto& msContent = setup.msContent;
+
+    u64 numMsInComp = timeslice.num_microslices(component);
+    u16 componentId = timeslice.descriptor(component, 0).eq_id;
+    setup.numMs += numMsInComp;
+    for (u64 mslice = 0; mslice < numMsInComp; mslice++) {
+      uint64_t msByteSize = timeslice.descriptor(component, mslice).size;
+      msEqIds.push_back(componentId);
+      msDesc.push_back(timeslice.descriptor(component, mslice));
+      msContent.push_back(timeslice.content(component, mslice));
+    }
+  }
+
   // ----------------------------------------------------------------------------
   template<class Digi, class UnpackAlgo, class Monitor>
   void Unpack::ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut,
@@ -357,7 +375,7 @@ namespace cbm::algo
     xpu::push_timer("Unpack");
 #pragma omp parallel for schedule(dynamic)
     for (size_t i = 0; i < numMs; i++) {
-      auto result = fAlgoSts.at(msEqIds[i])(msContent[i], msDesc[i], ts.start_time());
+      auto result = algos.at(msEqIds[i])(msContent[i], msDesc[i], ts.start_time());
       msDigis[i]  = std::move(result.first);
       monitor[i]  = std::move(result.second);
     }
diff --git a/algo/unpack/Unpack.h b/algo/unpack/Unpack.h
index dd87b0dd2da0a9f50400be8a2d834d0d485aa3c4..94dce34b0d091079e456db7a749583811bda09db 100644
--- a/algo/unpack/Unpack.h
+++ b/algo/unpack/Unpack.h
@@ -133,6 +133,7 @@ namespace cbm::algo
   private:  // types
     template<class Digi, class Monitor>
     struct ParallelSetup {
+      size_t numMs = 0;
       std::vector<u16> msEquipmentIds;
       std::vector<fles::MicrosliceDescriptor> msDescriptors;
       std::vector<const u8*> msContent;
@@ -150,6 +151,9 @@ namespace cbm::algo
     /** Init parallel unpacker */
     void ParallelInit(const fles::Timeslice& timeslice);
 
+    template<class Digi, class Monitor>
+    void ParallelInitComponent(ParallelSetup<Digi, Monitor>& setup, const fles::Timeslice& timeslice, u64 component);
+
     /** @brief Parallel microslice loop **/
     template<class Digi, class UnpackAlgo, class Monitor>
     void ParallelMsLoop(ParallelSetup<Digi, Monitor>& setup, std::vector<Digi>& digisOut, std::vector<Monitor>& monitor,
@@ -188,7 +192,8 @@ namespace cbm::algo
       {fles::SubsystemIdentifier::T0, 0},      {fles::SubsystemIdentifier::TRD, 1300},
       {fles::SubsystemIdentifier::TRD2D, -510}};
     /** @brief Parallel STS Setup */
-    ParallelSetup<sts::Digi, UnpackStsMonitorData> fParallelStsSetup = {};
+    ParallelSetup<sts::Digi, UnpackStsMonitorData> fParallelStsSetup  = {};
+    ParallelSetup<CbmTofDigi, UnpackTofMonitorData> fParallelTofSetup = {};
   };
 }  // namespace cbm::algo