diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx
index 9e50d2ec1179c07b7e0dbbdb1d9a9608cec27c86..e70f580f2c9a0da6b60265c08b8722122504bcf3 100644
--- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx
+++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx
@@ -661,6 +661,7 @@ StatusCode SCT_RodDecoder::processHeader(const uint16_t inData,
   // This is the real calculation for the offline
   data.linkNumber = (((rodlinkNumber >>4)&0x7)*12+(rodlinkNumber &0xF));
   const uint32_t onlineID{(robID & 0xFFFFFF) | (data.linkNumber << 24)};
+  IdentifierHash hash;
   if ((onlineID ==0) or (data.linkNumber > 95)) {
     ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
     hasError = true;
@@ -670,7 +671,15 @@ StatusCode SCT_RodDecoder::processHeader(const uint16_t inData,
     return sc;
   }
   else {
-    data.setCollection(m_sctID, m_cabling->getHashFromOnlineId(onlineID, ctx), rdoIDCont, errs);
+    hash = m_cabling->getHashFromOnlineId(onlineID, ctx);
+    if (hash.is_valid()) {
+       data.setCollection(m_sctID, hash, rdoIDCont, errs);
+    }
+    else {
+       std::stringstream msg;
+       msg <<std::hex << onlineID;
+       ATH_MSG_ERROR("Rob fragment (rob=" << robID << ") with invalid onlineID  " << msg.str() << " -> " << hash  << ".");
+    }
   }
   // Look for masked off links - bit 7
   if ((inData >> 7) & 0x1) {
@@ -712,6 +721,12 @@ StatusCode SCT_RodDecoder::processHeader(const uint16_t inData,
     ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::FormatterError, errs));
     hasError = true;
   }
+  if (!hasError and not hash.is_valid())  {
+    std::stringstream msg;
+    msg <<std::hex << onlineID;
+    ATH_MSG_ERROR("Rob fragment (rob=" << robID << ") with invalid onlineID  " << msg.str() << " -> " << hash  << ".");
+    hasError = true;
+  }
 
   data.condensedMode = static_cast<bool>(inData & 0x100);
 
@@ -991,19 +1006,13 @@ StatusCode SCT_RodDecoder::processExpandedHit(const uint16_t inData,
   }
   else { // Next hits cluster expanded
     if (inData & 0x80) { // Paired hits
-      if (data.strip >= N_STRIPS_PER_SIDE) {
+      if (data.strip >= N_STRIPS_PER_SIDE-2) {
         ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
         hasError = true;
         ATH_MSG_DEBUG("Expanded mode - strip number out of range");
         return sc;
       }
       m_evenExpHitNumber++;
-      if (chip>=N_CHIPS_PER_SIDE) {
-        ATH_MSG_DEBUG("Expanded Hit: paired hits xxx ERROR chip Nb = " << chip << " >= " << N_CHIPS_PER_SIDE);
-        m_chipNumberError++;
-        ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
-        return sc;
-      }
       // First hit from the pair
       data.strip++;
       data.timeBin = (inData & 0x7);
@@ -1031,10 +1040,10 @@ StatusCode SCT_RodDecoder::processExpandedHit(const uint16_t inData,
     }
     else { // Last hit of the cluster
       m_lastExpHitNumber++;
-      if (chip>=N_CHIPS_PER_SIDE) {
-        ATH_MSG_DEBUG("Expanded Hit: last hit xxx ERROR chip Nb = " << chip << " >= " << N_CHIPS_PER_SIDE);
-        m_chipNumberError++;
+      if (data.strip >= N_STRIPS_PER_SIDE-1) {
         ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
+        hasError = true;
+        ATH_MSG_DEBUG("Expanded mode - strip number out of range");
         return sc;
       }
       data.strip++;
diff --git a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h
index 5825fdcfb0f9b978e8be996b9ddd9a013d3f5732..c938780a0a937bab637a9160dfd20528aa444d30 100644
--- a/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h
+++ b/InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.h
@@ -1,7 +1,7 @@
 // -*- C++ -*-
 
 /*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef INDETRAWDATABYTESTREAM_SCT_RODDECODER_H 
@@ -147,12 +147,19 @@ class SCT_RodDecoder : public extends<AthAlgTool, ISCT_RodDecoder>
     // For MissingLinkHeaderError
     bool foundMissingLinkHeaderError{false};
     std::unordered_set<IdentifierHash> foundHashes;
-
-    std::unordered_map<IdentifierHash, std::unique_ptr<SCT_RDO_Collection>> rdoCollMap; // If SCT_RDO_Collection* is nullptr, it means the collection is already present in the container.
-    std::unordered_map<IdentifierHash, SCT_RDO_Container::IDC_WriteHandle> writeHandleMap;
+    struct Hasher {
+         std::size_t operator()(const IdentifierHash &hash) const { return hash.value();}
+    };
+    std::unordered_map<IdentifierHash, std::unique_ptr<SCT_RDO_Collection>, Hasher> rdoCollMap; // If SCT_RDO_Collection* is nullptr, it means the collection is already present in the container.
+    std::unordered_map<IdentifierHash, SCT_RDO_Container::IDC_WriteHandle, Hasher> writeHandleMap;
 
     bool foundHeader{false};
 
+    SharedData() {
+      writeHandleMap.reserve( 72);
+      rdoCollMap.reserve( 72 );
+    }
+
     void reset() {
       strip = 0;
       oldStrip = -1;
@@ -169,18 +176,20 @@ class SCT_RodDecoder : public extends<AthAlgTool, ISCT_RodDecoder>
     }
     void setSaved(const bool isOld, const int code) {
       if (isOld) {
-        saved[oldSide*N_STRIPS_PER_SIDE + oldStrip] = code;
+        saved.at(oldSide*N_STRIPS_PER_SIDE + oldStrip) = code;
       }
       else {
-        saved[   side*N_STRIPS_PER_SIDE +    strip] = code;
+        saved.at(   side*N_STRIPS_PER_SIDE +    strip) = code;
       }
     }
     bool isSaved(const bool isOld) {
       if (isOld) {
-        return saved[oldSide*N_STRIPS_PER_SIDE + oldStrip];
+        unsigned int idx = static_cast<std::size_t>(oldSide*N_STRIPS_PER_SIDE + oldStrip);
+        return idx  < saved.size() ? saved[idx] : false;
       }
       else {
-        return saved[   side*N_STRIPS_PER_SIDE +    strip];
+        const unsigned int  idx = static_cast<unsigned int>(side*N_STRIPS_PER_SIDE +    strip);
+        return idx < saved.size() ? saved[idx] : false;
       }
     }
     void setCollection(const SCT_ID* sctID,