diff --git a/algo/detectors/bmon/ReadoutConfig.cxx b/algo/detectors/bmon/ReadoutConfig.cxx
index 4d5b79bf0190abc5d54870fbfac573bedf73d656..975e8206f3475e7bee141e204157e16b329fba91 100644
--- a/algo/detectors/bmon/ReadoutConfig.cxx
+++ b/algo/detectors/bmon/ReadoutConfig.cxx
@@ -61,6 +61,22 @@ namespace cbm::algo::bmon
   }
   // ------------------------------------------------------------------------------------
 
+
+  // ---  Mapping (equimentId, elink) -> time offset  -------------------------------------
+  int64_t ReadoutConfig::TimeOffsetMap(uint16_t equipmentId, uint16_t elinkId)
+  {
+    int64_t result = 0;
+    auto equipIter = fTimeOffsetMap.find(equipmentId);
+    if (equipIter != fTimeOffsetMap.end()) {
+      if (elinkId < equipIter->second.size()) {
+        result = equipIter->second.at(elinkId);
+      }
+    }
+    return result;
+  }
+  // ------------------------------------------------------------------------------------
+
+
   void ReadoutConfig::Init(const ReadoutSetup& pars)
   {
     // Constructing the map (equipmentId, eLink, channel) -> (TOF address)
@@ -73,10 +89,14 @@ namespace cbm::algo::bmon
 
       uint16_t equipment = pars.eqIds.at(comp);
       fReadoutMap[equipment].resize(pars.NElinksPerComponent());
+      fTimeOffsetMap[equipment].resize(pars.NElinksPerComponent());
 
       for (uint16_t elink = 0; elink < pars.NElinksPerComponent(); elink++) {
         fReadoutMap[equipment][elink].resize(pars.nChannelsPerAsic);
 
+        const uint32_t crob              = elink / pars.NElinksPerCrob() + comp * pars.NCrobsPerComponent();
+        fTimeOffsetMap[equipment][elink] = pars.crobs[crob].timeOffset;
+
         for (uint16_t channel = 0; channel < pars.nChannelsPerAsic; channel++) {
 
           const uint32_t chanInComp = elink * pars.nChannelsPerAsic + channel;
diff --git a/algo/detectors/bmon/ReadoutConfig.h b/algo/detectors/bmon/ReadoutConfig.h
index 64496ead00851655daedcd66e6b480a1dab0f786..a4048bde5cf9f604ca567fb8f927e72e02a32332 100644
--- a/algo/detectors/bmon/ReadoutConfig.h
+++ b/algo/detectors/bmon/ReadoutConfig.h
@@ -23,12 +23,14 @@ namespace cbm::algo::bmon
       i32 rpcType;
       i32 rpcSide;
       i32 nRPC;
+      i64 timeOffset;
 
       CBM_YAML_PROPERTIES(
         yaml::Property(&CROB::moduleId, "moduleId", "Unique ID of module the CROB resides in"),
         yaml::Property(&CROB::rpcType, "rpcType", "add explanation."),
         yaml::Property(&CROB::rpcSide, "rpcSide", "add explanation."),
-        yaml::Property(&CROB::nRPC, "nRPC", "number of RPCs."));
+        yaml::Property(&CROB::nRPC, "nRPC", "number of RPCs."),
+	yaml::Property(&CROB::timeOffset, "timeOffset", "time offset for CROB"));
     };
 
     i32 nFebsPerComponent;
@@ -52,6 +54,7 @@ namespace cbm::algo::bmon
     i32 NChansPerComponent() const { return nChannelsPerAsic * NElinksPerComponent(); }
     i32 NElinksPerCrob() const { return nAsicsPerFeb * NFebsPerCrob(); }
     i32 NElinksPerComponent() const { return NElinksPerCrob() * nCrobPerComponent; }
+    i32 NCrobsPerComponent() const { return nCrobPerComponent; }
 
     bool CheckBmonComp(uint32_t uCompId) const { return ((uCompId & 0xFFF0) == 0xABF0); }
     bool CheckInnerComp(uint32_t uCompId) const { return ((uCompId & 0xFFF0) == 0xBBC0); }
@@ -85,7 +88,18 @@ namespace cbm::algo::bmon
      */
     std::vector<uint32_t> Map(uint16_t equipId, uint16_t elink);
 
+    /** @brief API: Mapping from component and elink to time offset
+     ** @param equipId     Equipment identifier (component)
+     ** @param elink       Elink number within component
+     ** @return Time Offset
+     */
+    int64_t TimeOffsetMap(uint16_t equipId, uint16_t elink);
+
    private:
+    // --- Bmon elink time offsets
+    // --- Map index: (equipment, elink), map value: (time offset)
+    std::map<uint16_t, std::vector<uint64_t>> fTimeOffsetMap = {};
+
     // --- Bmon readout map
     // --- Map index: (equipment, elink, channel), map value: (TOF address)
     std::map<uint16_t, std::vector<std::vector<uint32_t>>> fReadoutMap = {};
diff --git a/algo/detectors/bmon/Unpack.cxx b/algo/detectors/bmon/Unpack.cxx
index dc1bccb95fd9938f2ad34a1f991a4c4716807a72..165098afeabc7b3f1ba265d84ad33e4a700534a8 100644
--- a/algo/detectors/bmon/Unpack.cxx
+++ b/algo/detectors/bmon/Unpack.cxx
@@ -11,8 +11,7 @@ using fles::Subsystem;
 
 Unpack::Unpack(const ReadoutConfig& readout) : fReadout(readout)
 {
-  constexpr i64 SystemTimeOffset = 0;
-  constexpr u8 SystemVersion     = 0x00;
+  constexpr u8 SystemVersion = 0x00;
 
   // Create one algorithm per component for Bmon and configure it with parameters
   auto equipIdsBmon = fReadout.GetEquipmentIds();
@@ -21,8 +20,8 @@ Unpack::Unpack(const ReadoutConfig& readout) : fReadout(readout)
     const size_t numElinks = fReadout.GetNumElinks(equip);
     for (size_t elink = 0; elink < numElinks; elink++) {
       bmon::UnpackElinkPar elinkPar;
-      elinkPar.fChannelUId = fReadout.Map(equip, elink);  // Vector of Bmon addresses for this elink
-      elinkPar.fTimeOffset = SystemTimeOffset;
+      elinkPar.fChannelUId = fReadout.Map(equip, elink);            // Vector of Bmon addresses for this elink
+      elinkPar.fTimeOffset = fReadout.TimeOffsetMap(equip, elink);  // Time offset for this elink
       par.fElinkParams.push_back(elinkPar);
     }
     auto algo                      = std::make_unique<UnpackMS>(par);