diff --git a/algo/detectors/bmon/UnpackMS.cxx b/algo/detectors/bmon/UnpackMS.cxx
index 4841b63c756230f96d737536f5e97b5e0d1b871b..b4fbf123e176991049b236c672beec4fa2a8e26a 100644
--- a/algo/detectors/bmon/UnpackMS.cxx
+++ b/algo/detectors/bmon/UnpackMS.cxx
@@ -89,7 +89,14 @@ namespace cbm::algo::bmon
           break;
         }
         case critof001::MSG_EPOCH: {
-          ProcessEpochMessage(message[messageNr], time);
+          if (critof001::kuChipIdMergedEpoch == message[messageNr].getGet4Idx()) {
+            ProcessEpochMessage(message[messageNr], time);
+          }  // if this epoch message is a merged one valid for all chips
+          else {
+            /// FIXME: Should be checked in/forwarded to <some> monitor <task?>, here we just jump it
+            std::get<1>(result).fNumErrInvalidAsicEpochs++;
+            continue;
+          }  // if single chip epoch message
           break;
         }
         case critof001::MSG_SLOWC: {
diff --git a/algo/detectors/bmon/UnpackMS.h b/algo/detectors/bmon/UnpackMS.h
index 9c893c5318222a63117868835e0620d530fe74ef..8ba772dbb78b6a0fb39953acb6bb724904da7c7a 100644
--- a/algo/detectors/bmon/UnpackMS.h
+++ b/algo/detectors/bmon/UnpackMS.h
@@ -54,11 +54,12 @@ namespace cbm::algo::bmon
     uint32_t fNumErrInvalidMsSize       = 0;  ///< Microslice size is not multiple of message size
     uint32_t fNumErrTimestampOverflow   = 0;  ///< Overflow in 64 bit time stamp
     uint32_t fNumErrInvalidStartEpoch   = 0;  ///< Microslice index doesn't match first epoch
+    uint32_t fNumErrInvalidAsicEpochs   = 0;  ///< Epoch did not match merged one for an asic
     bool HasErrors()
     {
       uint32_t numErrors = fNumNonHitOrTsbMessage + fNumErrElinkOutOfRange + fNumErrInvalidFirstMessage
                            + fNumErrInvalidLastMessage + fNumErrInvalidMsSize + fNumErrTimestampOverflow
-                           + fNumErrInvalidStartEpoch;
+                           + fNumErrInvalidStartEpoch + fNumErrInvalidAsicEpochs;
       return (numErrors > 0 ? true : false);
     }
     std::string print()
@@ -66,7 +67,7 @@ namespace cbm::algo::bmon
       std::stringstream ss;
       ss << "errors " << fNumNonHitOrTsbMessage << " | " << fNumErrElinkOutOfRange << " | "
          << fNumErrInvalidFirstMessage << " | " << fNumErrInvalidLastMessage << " | " << fNumErrInvalidMsSize << " | "
-         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | ";
+         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | " << fNumErrInvalidAsicEpochs << " | ";
       return ss.str();
     }
   };
diff --git a/algo/detectors/tof/UnpackMS.cxx b/algo/detectors/tof/UnpackMS.cxx
index b9cd5dcf017f30054b4e71eeeb7818565d97f3bf..0c11fe61634648730d5a7fa5c4c7a834650ac33b 100644
--- a/algo/detectors/tof/UnpackMS.cxx
+++ b/algo/detectors/tof/UnpackMS.cxx
@@ -82,7 +82,14 @@ namespace cbm::algo::tof
           break;
         }
         case critof001::MSG_EPOCH: {
-          ProcessEpochMessage(message[messageNr], time);
+          if (critof001::kuChipIdMergedEpoch == message[messageNr].getGet4Idx()) {
+            ProcessEpochMessage(message[messageNr], time);
+          }  // if this epoch message is a merged one valid for all chips
+          else {
+            /// FIXME: Should be checked in/forwarded to <some> monitor <task?>, here we just jump it
+            std::get<1>(result).fNumErrInvalidAsicEpochs++;
+            continue;
+          }  // if single chip epoch message
           break;
         }
         case critof001::MSG_SLOWC: {
diff --git a/algo/detectors/tof/UnpackMS.h b/algo/detectors/tof/UnpackMS.h
index 1a1033cc6bf1d6db7cf2cb6b6efaf9cd1e2eb87d..591a4deee1072cddf554c55ea34df3f0ad03cc3e 100644
--- a/algo/detectors/tof/UnpackMS.h
+++ b/algo/detectors/tof/UnpackMS.h
@@ -52,11 +52,12 @@ namespace cbm::algo::tof
     uint32_t fNumErrInvalidMsSize       = 0;  ///< Microslice size is not multiple of message size
     uint32_t fNumErrTimestampOverflow   = 0;  ///< Overflow in 64 bit time stamp
     uint32_t fNumErrInvalidStartEpoch   = 0;  ///< Microslice index doesn't match first epoch
+    uint32_t fNumErrInvalidAsicEpochs   = 0;  ///< Epoch did not match merged one for an asic
     bool HasErrors()
     {
       uint32_t numErrors = fNumNonHitOrTsbMessage + fNumErrElinkOutOfRange + fNumErrInvalidFirstMessage
                            + fNumErrInvalidLastMessage + fNumErrInvalidMsSize + fNumErrTimestampOverflow
-                           + fNumErrInvalidStartEpoch;
+                           + fNumErrInvalidStartEpoch + fNumErrInvalidAsicEpochs;
       return (numErrors > 0 ? true : false);
     }
     std::string print()
@@ -64,7 +65,7 @@ namespace cbm::algo::tof
       std::stringstream ss;
       ss << "errors " << fNumNonHitOrTsbMessage << " | " << fNumErrElinkOutOfRange << " | "
          << fNumErrInvalidFirstMessage << " | " << fNumErrInvalidLastMessage << " | " << fNumErrInvalidMsSize << " | "
-         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | ";
+         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | " << fNumErrInvalidAsicEpochs << " | ";
       return ss.str();
     }
   };