diff --git a/Database/IOVDbTPCnv/IOVDbTPCnv/IOVPayloadContainerCnv_p1.h b/Database/IOVDbTPCnv/IOVDbTPCnv/IOVPayloadContainerCnv_p1.h
index a14506500f67da174d3629b50d38c2bb6ac1428b..7efe2af13a05aff3c5e49d31f47f3b5b8fe826e5 100755
--- a/Database/IOVDbTPCnv/IOVDbTPCnv/IOVPayloadContainerCnv_p1.h
+++ b/Database/IOVDbTPCnv/IOVDbTPCnv/IOVPayloadContainerCnv_p1.h
@@ -48,6 +48,9 @@ private:
     // Attribute types
     std::map<std::string, unsigned int>    m_attributeTypeMap;
     std::vector<std::string>               m_attributeTypes;
+
+    unsigned int m_objIndexOffset[IOVPayloadContainer_p1::ATTR_TIME_STAMP+1];
+
 };
 
 #endif
diff --git a/Database/IOVDbTPCnv/src/IOVPayloadContainerCnv_p1.cxx b/Database/IOVDbTPCnv/src/IOVPayloadContainerCnv_p1.cxx
index 86b7145a2880a2bfead5653d88d7d9a064b4c4bf..345cc48903e3b1b67a9e28ebf70f9846384c2dc2 100755
--- a/Database/IOVDbTPCnv/src/IOVPayloadContainerCnv_p1.cxx
+++ b/Database/IOVDbTPCnv/src/IOVPayloadContainerCnv_p1.cxx
@@ -23,6 +23,10 @@ IOVPayloadContainerCnv_p1::persToTrans(const IOVPayloadContainer_p1* persObj,
             << endmsg;
     }
 
+    for( auto & offset : m_objIndexOffset ) {
+        offset = 1; // this is just the initial value before first use 
+    }
+
     IOVPayloadContainer::payloadVec& payloadVec = transObj->m_payloadVec;
     
     // Make sure transient container is empty - may be reused
@@ -135,7 +139,7 @@ IOVPayloadContainerCnv_p1::persToTrans(const IOVPayloadContainer_p1* persObj,
                     }
                 }
             }
-            
+
 
 //             std::ostringstream attrStr;
 //             attrList.toOutputStream(attrStr);       
@@ -560,53 +564,85 @@ IOVPayloadContainerCnv_p1::fillAttributeData(const IOVPayloadContainer_p1* persO
                                              coral::AttributeList& attrList,
                                              MsgStream & log)
 {
+    /*
+       this offset calculation solves the problem reported in
+       ATR-22116 trying to get past the limitation introduced by
+       AttrListIndexes::m_objIndex being of type short, which doesn't
+       cover the full length of the type-wise data vectors
+
+       It is assumed that when reading the persistent object entries,
+       the objIndex starts at 0, and increases by 1 each read for a given type.
+
+       One must also not call fillAttributeData multiple times for the
+       same (AttrListIndexes index), nor call them out of order
+
+       * There is one offset per type, initialized to 1
+       * In the first read of a type the offset is set to 0
+       * In all later reads the offset is not changed unless the objIndex equals 0
+         - if objIndex is fixed to be unsigned int, then objIndex should never be 0 in later reads
+         - if objIndex is unsigned short, then objIndex==0 only when it runs into the 65536 boundary
+           and the offset then gets increased by this amount
+
+       So this will work also when objIndex is integer
+     */
+
+    unsigned int objIndex = index.objIndex();
+    unsigned int & offset = m_objIndexOffset[index.typeIndex()];
+    if(offset == 1) {
+        offset = 0;
+    } else {
+        if(objIndex == 0) {
+            offset += 65536;
+        }
+    }
+
     // Fill persistent object with attribute data - must use switch
     // for all possible types
     switch (index.typeIndex()) {
         case IOVPayloadContainer_p1::ATTR_BOOL:
-            attrList[name].setValue(persObj->m_bool[index.objIndex()]);
+            attrList[name].setValue(persObj->m_bool[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_CHAR:                
-            attrList[name].setValue(persObj->m_char[index.objIndex()]);
+            attrList[name].setValue(persObj->m_char[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_UNSIGNED_CHAR:       
-            attrList[name].setValue(persObj->m_unsignedChar[index.objIndex()]);
+            attrList[name].setValue(persObj->m_unsignedChar[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_SHORT:
-            attrList[name].setValue(persObj->m_short[index.objIndex()]);
+            attrList[name].setValue(persObj->m_short[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_UNSIGNED_SHORT:      
-            attrList[name].setValue(persObj->m_unsignedShort[index.objIndex()]);
+            attrList[name].setValue(persObj->m_unsignedShort[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_INT:                 
-            attrList[name].setValue(persObj->m_int[index.objIndex()]);
+            attrList[name].setValue(persObj->m_int[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_UNSIGNED_INT:        
-            attrList[name].setValue(persObj->m_unsignedInt[index.objIndex()]);
+            attrList[name].setValue(persObj->m_unsignedInt[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_LONG:                
-            attrList[name].setValue(persObj->m_long[index.objIndex()]);
+            attrList[name].setValue(persObj->m_long[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_UNSIGNED_LONG:       
-            attrList[name].setValue(persObj->m_unsignedLong[index.objIndex()]);
+            attrList[name].setValue(persObj->m_unsignedLong[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_LONG_LONG:           
-            attrList[name].setValue(persObj->m_longLong[index.objIndex()]);
+            attrList[name].setValue(persObj->m_longLong[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_UNSIGNED_LONG_LONG: 
-            attrList[name].setValue(persObj->m_unsignedLongLong[index.objIndex()]);
+            attrList[name].setValue(persObj->m_unsignedLongLong[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_FLOAT:               
-            attrList[name].setValue(persObj->m_float[index.objIndex()]);
+            attrList[name].setValue(persObj->m_float[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_DOUBLE:              
-            attrList[name].setValue(persObj->m_double[index.objIndex()]);
+            attrList[name].setValue(persObj->m_double[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_LONG_DOUBLE:         
-//             attrList[name].setValue(persObj->m_longDouble[index.objIndex()]);
+//             attrList[name].setValue(persObj->m_longDouble[objIndex + offset]);
             break;
-        case IOVPayloadContainer_p1::ATTR_STRING:              
-            attrList[name].setValue(persObj->m_string[index.objIndex()]);
+        case IOVPayloadContainer_p1::ATTR_STRING:
+            attrList[name].setValue(persObj->m_string[objIndex + offset]);
             break;
         case IOVPayloadContainer_p1::ATTR_BLOB:                
             log << MSG::ERROR 
@@ -615,14 +651,14 @@ IOVPayloadContainerCnv_p1::fillAttributeData(const IOVPayloadContainer_p1* persO
             return;
         case IOVPayloadContainer_p1::ATTR_DATE:
           {
-            coral::TimeStamp::ValueType  ns( persObj->m_date[index.objIndex()] ); 
+            coral::TimeStamp::ValueType  ns( persObj->m_date[objIndex + offset] );
             attrList[name].setValue( coral::Date(coral::TimeStamp(ns).time()) );
             break;
           }
         case IOVPayloadContainer_p1::ATTR_TIME_STAMP:
           {
             coral::TimeStamp::ValueType  ns =
-              coral::TimeStamp::ValueType( persObj->m_timeStamp[index.objIndex()] ); 
+              coral::TimeStamp::ValueType( persObj->m_timeStamp[objIndex + offset] );
             attrList[name].setValue( coral::TimeStamp(ns) );
             break;
           }