diff --git a/catalogue/ArchiveFileBuilder.cpp b/catalogue/ArchiveFileBuilder.cpp
index cf7cea261b0dd87d3db48712f17ae192933901f9..f82727e3402f2e246c33e5849da7ecb3e1d099ae 100644
--- a/catalogue/ArchiveFileBuilder.cpp
+++ b/catalogue/ArchiveFileBuilder.cpp
@@ -83,43 +83,7 @@ std::unique_ptr<common::dataStructures::ArchiveFile> ArchiveFileBuilder::append(
     }
 
     // Append the tape file
-    const auto tapeFileMapItor = tapeFile.tapeFiles.begin();
-    const auto vid = tapeFileMapItor->second.vid;
-    const auto fSeq = tapeFileMapItor->second.fSeq;
-    const auto blockId = tapeFileMapItor->second.blockId;
-    const auto copyNbOfTapeFileToAppend = tapeFileMapItor->first;
-    if(m_archiveFile->tapeFiles.find(copyNbOfTapeFileToAppend) != m_archiveFile->tapeFiles.end()) {
-      // Found two tape files for the same archive file with the same copy
-      // number
-
-      // Ignore for now any inconsistencies in the copy number of the tape file
-      // exception::Exception ex;
-      // ex.getMessage() << __FUNCTION__ << " failed: Found two tape files for the same archive file with the same copy"
-      //   " numbers: archiveFileID=" << tapeFile.archiveFileID << " copyNb=" << copyNbOfTapeFileToAppend;
-      // throw ex;
-
-      // Create a unique copy number to replace the original duplicate
-      uint64_t maxCopyNb = 0;
-      for(const auto maplet: m_archiveFile->tapeFiles) {
-        if(maplet.first > maxCopyNb) {
-          maxCopyNb = maplet.first;
-        }
-      }
-      const uint64_t workaroundCopyNb = maxCopyNb + 1;
-      {
-        std::list<cta::log::Param> params;
-        params.push_back(cta::log::Param("archiveFileID", tapeFile.archiveFileID));
-        params.push_back(cta::log::Param("duplicateCopyNb", copyNbOfTapeFileToAppend));
-        params.push_back(cta::log::Param("workaroundCopyNb", workaroundCopyNb));
-        params.push_back(cta::log::Param("tapeVid", vid));
-        params.push_back(cta::log::Param("fSeq", fSeq));
-        params.push_back(cta::log::Param("blockId", blockId));
-        m_log(cta::log::WARNING, "Found a duplicate tape copy number when listing archive files", params);
-      }
-      m_archiveFile->tapeFiles[workaroundCopyNb] = tapeFileMapItor->second;
-    } else {
-      m_archiveFile->tapeFiles[copyNbOfTapeFileToAppend] = tapeFileMapItor->second;
-    }
+    m_archiveFile->tapeFiles.push_back(tapeFile.tapeFiles.front());
 
     // There could be more tape files so return incomplete
     return std::unique_ptr<common::dataStructures::ArchiveFile>();
diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp
index b090af865f14e82b714c8224e0f228a06932a599..bd9947300150631130c6caeb13550b0ccc2f61fd 100644
--- a/catalogue/CatalogueTest.cpp
+++ b/catalogue/CatalogueTest.cpp
@@ -6451,7 +6451,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId) {
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -6502,7 +6502,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId) {
 
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -6512,7 +6512,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId) {
 
     auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2);
     ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+    const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
     ASSERT_EQ(file2Written.vid, tapeFile2.vid);
     ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
     ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -6708,7 +6708,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -6759,7 +6759,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa
 
     const auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -6769,7 +6769,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa
 
     const auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2);
     ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+    const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
     ASSERT_EQ(file2Written.vid, tapeFile2.vid);
     ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
     ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -6830,7 +6830,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa
 
     const auto copyNbToTapeFile1Itor = queueCriteria.archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == queueCriteria.archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -6841,7 +6841,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa
 
     const auto copyNbToTapeFile2Itor = queueCriteria.archiveFile.tapeFiles.find(2);
     ASSERT_FALSE(copyNbToTapeFile2Itor == queueCriteria.archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+    const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
     ASSERT_EQ(file2Written.vid, tapeFile2.vid);
     ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
     ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -6864,7 +6864,7 @@ TEST_P(cta_catalogue_CatalogueTest, prepareToRetrieveFileUsingArchiveFileId_disa
 
     const auto copyNbToTapeFile2Itor = queueCriteria.archiveFile.tapeFiles.find(2);
     ASSERT_FALSE(copyNbToTapeFile2Itor == queueCriteria.archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+    const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
     ASSERT_EQ(file2Written.vid, tapeFile2.vid);
     ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
     ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -7369,7 +7369,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) {
     ASSERT_EQ(searchCriteria.diskFileGroup, archiveFile.diskFileInfo.group);
     ASSERT_EQ(searchCriteria.storageClass, archiveFile.storageClass);
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
-    ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->second.vid);
+    ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->vid);
   }
 
   {
@@ -7423,28 +7423,26 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) {
       {
         const auto it = archiveFile.tapeFiles.find(1);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten1.vid, it->second.vid);
-        ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten1.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten1.copyNb, it->first);
+        ASSERT_EQ(fileWritten1.vid, it->vid);
+        ASSERT_EQ(fileWritten1.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten1.blockId, it->blockId);
+        ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten1.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten1.copyNb, it->copyNb);
       }
 
       // Tape copy 2
       {
         const auto it = archiveFile.tapeFiles.find(2);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten2.vid, it->second.vid);
-        ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten2.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten2.copyNb, it->first);
+        ASSERT_EQ(fileWritten2.vid, it->vid);
+        ASSERT_EQ(fileWritten2.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten2.blockId, it->blockId);
+        ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten2.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten2.copyNb, it->copyNb);
       }
     }
   }
@@ -7501,28 +7499,26 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) {
       {
         const auto it = archiveFile.tapeFiles.find(1);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten1.vid, it->second.vid);
-        ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten1.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten1.copyNb, it->first);
+        ASSERT_EQ(fileWritten1.vid, it->vid);
+        ASSERT_EQ(fileWritten1.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten1.blockId, it->blockId);
+        ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten1.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten1.copyNb, it->copyNb);
       }
 
       // Tape copy 2
       {
         const auto it = archiveFile.tapeFiles.find(2);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten2.vid, it->second.vid);
-        ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten2.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten2.copyNb, it->first);
+        ASSERT_EQ(fileWritten2.vid, it->vid);
+        ASSERT_EQ(fileWritten2.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten2.blockId, it->blockId);
+        ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten2.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten2.copyNb, it->copyNb);
       }
     }
   }
@@ -7579,14 +7575,13 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) {
       {
         const auto it = archiveFile.tapeFiles.find(copyNb);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten.vid, it->second.vid);
-        ASSERT_EQ(fileWritten.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten.copyNb, it->first);
+        ASSERT_EQ(fileWritten.vid, it->vid);
+        ASSERT_EQ(fileWritten.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten.blockId, it->blockId);
+        ASSERT_EQ(fileWritten.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten.copyNb, it->copyNb);
       }
     }
   }
@@ -7643,14 +7638,13 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) {
       {
         const auto it = archiveFile.tapeFiles.find(copyNb);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten.vid, it->second.vid);
-        ASSERT_EQ(fileWritten.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten.copyNb, it->first);
+        ASSERT_EQ(fileWritten.vid, it->vid);
+        ASSERT_EQ(fileWritten.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten.blockId, it->blockId);
+        ASSERT_EQ(fileWritten.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten.copyNb, it->copyNb);
       }
     }
   }
@@ -7707,14 +7701,13 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_many_archive_files) {
       {
         const auto it = archiveFile.tapeFiles.find(copyNb);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten.vid, it->second.vid);
-        ASSERT_EQ(fileWritten.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten.copyNb, it->first);
+        ASSERT_EQ(fileWritten.vid, it->vid);
+        ASSERT_EQ(fileWritten.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten.blockId, it->blockId);
+        ASSERT_EQ(fileWritten.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten.copyNb, it->copyNb);
       }
     }
   }
@@ -8317,7 +8310,7 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_
     ASSERT_EQ(searchCriteria.diskFileGroup, archiveFile.diskFileInfo.group);
     ASSERT_EQ(searchCriteria.storageClass, archiveFile.storageClass);
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
-    ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->second.vid);
+    ASSERT_EQ(searchCriteria.vid, archiveFile.tapeFiles.begin()->vid);
   }
 
   auto afidToSeq = [](const uint64_t l_nbTot, const uint64_t l_batchsize, const uint64_t l_afid, uint64_t &l_seq1, uint64_t &l_seq2) {
@@ -8387,28 +8380,26 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_
       {
         const auto it = archiveFile.tapeFiles.find(1);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten1.vid, it->second.vid);
-        ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten1.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten1.copyNb, it->first);
+        ASSERT_EQ(fileWritten1.vid, it->vid);
+        ASSERT_EQ(fileWritten1.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten1.blockId, it->blockId);
+        ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten1.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten1.copyNb, it->copyNb);
       }
 
       // Tape copy 2
       {
         const auto it = archiveFile.tapeFiles.find(2);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten2.vid, it->second.vid);
-        ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten2.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten2.copyNb, it->first);
+        ASSERT_EQ(fileWritten2.vid, it->vid);
+        ASSERT_EQ(fileWritten2.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten2.blockId, it->blockId);
+        ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten2.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten2.copyNb, it->copyNb);
       }
     }
   }
@@ -8469,28 +8460,26 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_
       {
         const auto it = archiveFile.tapeFiles.find(1);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten1.vid, it->second.vid);
-        ASSERT_EQ(fileWritten1.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten1.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten1.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten1.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten1.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten1.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten1.copyNb, it->first);
+        ASSERT_EQ(fileWritten1.vid, it->vid);
+        ASSERT_EQ(fileWritten1.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten1.blockId, it->blockId);
+        ASSERT_EQ(fileWritten1.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten1.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten1.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten1.copyNb, it->copyNb);
       }
 
       // Tape copy 2
       {
         const auto it = archiveFile.tapeFiles.find(2);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten2.vid, it->second.vid);
-        ASSERT_EQ(fileWritten2.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten2.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten2.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten2.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten2.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten2.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten2.copyNb, it->first);
+        ASSERT_EQ(fileWritten2.vid, it->vid);
+        ASSERT_EQ(fileWritten2.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten2.blockId, it->blockId);
+        ASSERT_EQ(fileWritten2.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten2.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten2.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten2.copyNb, it->copyNb);
       }
     }
   }
@@ -8550,14 +8539,13 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_
       {
         const auto it = archiveFile.tapeFiles.find(copyNb);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten.vid, it->second.vid);
-        ASSERT_EQ(fileWritten.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten.copyNb, it->first);
+        ASSERT_EQ(fileWritten.vid, it->vid);
+        ASSERT_EQ(fileWritten.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten.blockId, it->blockId);
+        ASSERT_EQ(fileWritten.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten.copyNb, it->copyNb);
       }
     }
   }
@@ -8617,14 +8605,13 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_
       {
         const auto it = archiveFile.tapeFiles.find(copyNb);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten.vid, it->second.vid);
-        ASSERT_EQ(fileWritten.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten.copyNb, it->first);
+        ASSERT_EQ(fileWritten.vid, it->vid);
+        ASSERT_EQ(fileWritten.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten.blockId, it->blockId);
+        ASSERT_EQ(fileWritten.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten.copyNb, it->copyNb);
       }
     }
   }
@@ -8684,14 +8671,13 @@ TEST_P(cta_catalogue_CatalogueTest, DISABLED_concurrent_filesWrittenToTape_many_
       {
         const auto it = archiveFile.tapeFiles.find(copyNb);
         ASSERT_NE(archiveFile.tapeFiles.end(), it);
-        ASSERT_EQ(fileWritten.vid, it->second.vid);
-        ASSERT_EQ(fileWritten.fSeq, it->second.fSeq);
-        ASSERT_EQ(fileWritten.blockId, it->second.blockId);
-        ASSERT_EQ(fileWritten.compressedSize, it->second.compressedSize);
-        ASSERT_EQ(fileWritten.checksumType, it->second.checksumType);
-        ASSERT_EQ(fileWritten.checksumValue, it->second.checksumValue);
-        ASSERT_EQ(fileWritten.copyNb, it->second.copyNb);
-        ASSERT_EQ(fileWritten.copyNb, it->first);
+        ASSERT_EQ(fileWritten.vid, it->vid);
+        ASSERT_EQ(fileWritten.fSeq, it->fSeq);
+        ASSERT_EQ(fileWritten.blockId, it->blockId);
+        ASSERT_EQ(fileWritten.compressedSize, it->compressedSize);
+        ASSERT_EQ(fileWritten.checksumType, it->checksumType);
+        ASSERT_EQ(fileWritten.checksumValue, it->checksumValue);
+        ASSERT_EQ(fileWritten.copyNb, it->copyNb);
       }
     }
   }
@@ -9018,7 +9004,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -9079,7 +9065,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
 
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -9090,7 +9076,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
 
     auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2);
     ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+    const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
     ASSERT_EQ(file2Written.vid, tapeFile2.vid);
     ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
     ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -9247,7 +9233,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -9305,11 +9291,11 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group);
 
     // If there are two or more tape copies with the same copy number then
-    // only the last one read out by the database is returned by
-    // m_catalogue->getArchiveFileById()
-    ASSERT_EQ(1, archiveFile.tapeFiles.size());
+    // only one of them will be active (<=> supersededByVid.empty()).
+    ASSERT_EQ(1, std::count_if(archiveFile.tapeFiles.begin(), archiveFile.tapeFiles.end(),
+        [](const cta::common::dataStructures::TapeFile &tf){ return tf.supersededByVid.empty();}));
 
-    const auto &tapeFile = archiveFile.tapeFiles.begin()->second;
+    const auto &tapeFile = *archiveFile.tapeFiles.begin();
 
     ASSERT_TRUE(file1Written.vid == tapeFile.vid || file2Written.vid == tapeFile.vid);
 
@@ -9445,7 +9431,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -9503,11 +9489,11 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(file2Written.diskFileGroup, archiveFile.diskFileInfo.group);
 
     // If there are two or more tape copies with the same copy number then
-    // only the last one read out by the database is returned by
-    // m_catalogue->getArchiveFileById()
-    ASSERT_EQ(1, archiveFile.tapeFiles.size());
+    // only one of them will be active (<=> supersededByVid.empty()).
+    ASSERT_EQ(1, std::count_if(archiveFile.tapeFiles.begin(), archiveFile.tapeFiles.end(),
+        [](const cta::common::dataStructures::TapeFile &tf){ return tf.supersededByVid.empty();}));
 
-    const auto &tapeFile = archiveFile.tapeFiles.begin()->second;
+    const auto &tapeFile = *archiveFile.tapeFiles.begin();
 
     ASSERT_TRUE(file1Written.fSeq == tapeFile.fSeq || file2Written.fSeq == tapeFile.fSeq);
 
@@ -9671,7 +9657,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -9853,7 +9839,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10035,7 +10021,7 @@ TEST_P(cta_catalogue_CatalogueTest, filesWrittenToTape_1_archive_file_2_tape_cop
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10223,7 +10209,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) {
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10251,7 +10237,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) {
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10320,7 +10306,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) {
 
       auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
       ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-      const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+      const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
       ASSERT_EQ(file1Written.vid, tapeFile1.vid);
       ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
       ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10331,7 +10317,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) {
 
       auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2);
       ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end());
-      const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+      const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
       ASSERT_EQ(file2Written.vid, tapeFile2.vid);
       ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
       ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -10361,7 +10347,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) {
 
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10372,7 +10358,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile) {
 
     auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2);
     ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+    const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
     ASSERT_EQ(file2Written.vid, tapeFile2.vid);
     ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
     ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -10540,7 +10526,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10568,7 +10554,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10637,7 +10623,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot
 
       auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
       ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-      const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+      const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
       ASSERT_EQ(file1Written.vid, tapeFile1.vid);
       ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
       ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10648,7 +10634,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot
 
       auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2);
       ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end());
-      const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+      const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
       ASSERT_EQ(file2Written.vid, tapeFile2.vid);
       ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
       ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -10678,7 +10664,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot
 
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -10689,7 +10675,7 @@ TEST_P(cta_catalogue_CatalogueTest, deleteArchiveFile_by_archive_file_id_of_anot
 
     auto copyNbToTapeFile2Itor = archiveFile.tapeFiles.find(2);
     ASSERT_FALSE(copyNbToTapeFile2Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile2 = copyNbToTapeFile2Itor->second;
+    const common::dataStructures::TapeFile &tapeFile2 = *copyNbToTapeFile2Itor;
     ASSERT_EQ(file2Written.vid, tapeFile2.vid);
     ASSERT_EQ(file2Written.fSeq, tapeFile2.fSeq);
     ASSERT_EQ(file2Written.blockId, tapeFile2.blockId);
@@ -11032,7 +11018,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) {
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -11255,7 +11241,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file) {
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -11419,7 +11405,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_su
     ASSERT_EQ(1, archiveFile.tapeFiles.size());
     auto copyNbToTapeFile1Itor = archiveFile.tapeFiles.find(1);
     ASSERT_FALSE(copyNbToTapeFile1Itor == archiveFile.tapeFiles.end());
-    const common::dataStructures::TapeFile &tapeFile1 = copyNbToTapeFile1Itor->second;
+    const common::dataStructures::TapeFile &tapeFile1 = *copyNbToTapeFile1Itor;
     ASSERT_EQ(file1Written.vid, tapeFile1.vid);
     ASSERT_EQ(file1Written.fSeq, tapeFile1.fSeq);
     ASSERT_EQ(file1Written.blockId, tapeFile1.blockId);
@@ -11488,6 +11474,15 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_su
   file1WrittenAgain.tapeDrive            = tapeDrive;
   m_catalogue->filesWrittenToTape(file1WrittenAgainSet);
   
+  common::dataStructures::ArchiveFile repackedFile = m_catalogue->getArchiveFileById(archiveFileId);
+  ASSERT_EQ(2, repackedFile.tapeFiles.size());
+  for (auto &tf: repackedFile.tapeFiles) {
+    if (tf.vid == vid1)
+      ASSERT_EQ(vid2, tf.supersededByVid);
+    else
+      ASSERT_EQ("", tf.supersededByVid);
+  }
+  
   ASSERT_NO_THROW(m_catalogue->reclaimTape(m_admin, vid1));
  
   {
diff --git a/catalogue/MysqlCatalogue.cpp b/catalogue/MysqlCatalogue.cpp
index e947f024afdf02bcc6de7d50b79effef7743586f..b27d7095290dcb78e7e0c7ac23d9d7d2096dd417 100644
--- a/catalogue/MysqlCatalogue.cpp
+++ b/catalogue/MysqlCatalogue.cpp
@@ -406,7 +406,9 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ "
       "FROM "
         "ARCHIVE_FILE "
       "INNER JOIN STORAGE_CLASS ON "
@@ -455,10 +457,14 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons
         tapeFile.compressedSize = selectRset.columnUint64("COMPRESSED_SIZE_IN_BYTES");
         tapeFile.copyNb = selectRset.columnUint64("COPY_NB");
         tapeFile.creationTime = selectRset.columnUint64("TAPE_FILE_CREATION_TIME");
+        if (!selectRset.columnIsNull("SSBY_VID")) {
+          tapeFile.supersededByVid = selectRset.columnString("SSBY_VID");
+          tapeFile.supersededByFSeq = selectRset.columnUint64("SSBY_FSEQ");
+        }
         tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience
         tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience
 
-        archiveFile->tapeFiles[selectRset.columnUint64("COPY_NB")] = tapeFile;
+        archiveFile->tapeFiles.push_back(tapeFile);
       }
     }
 
@@ -489,15 +495,17 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons
          .add("selectFromArchiveFileTime", selectFromArchiveFileTime);
       for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
         std::stringstream tapeCopyLogStream;
-        tapeCopyLogStream << "copy number: " << it->first
-          << " vid: " << it->second.vid
-          << " fSeq: " << it->second.fSeq
-          << " blockId: " << it->second.blockId
-          << " creationTime: " << it->second.creationTime
-          << " compressedSize: " << it->second.compressedSize
-          << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-          << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-          << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+        tapeCopyLogStream << "copy number: " << it->copyNb
+          << " vid: " << it->vid
+          << " fSeq: " << it->fSeq
+          << " blockId: " << it->blockId
+          << " creationTime: " << it->creationTime
+          << " compressedSize: " << it->compressedSize
+          << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+          << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+          << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+          << " supersededByVid: " << it->supersededByVid
+          << " supersededByFSeq: " << it->supersededByFSeq;
         spc.add("TAPE FILE", tapeCopyLogStream.str());
       }
       lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that "
@@ -555,15 +563,17 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
       std::stringstream tapeCopyLogStream;
-      tapeCopyLogStream << "copy number: " << it->first
-        << " vid: " << it->second.vid
-        << " fSeq: " << it->second.fSeq
-        << " blockId: " << it->second.blockId
-        << " creationTime: " << it->second.creationTime
-        << " compressedSize: " << it->second.compressedSize
-        << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-        << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-        << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+      tapeCopyLogStream << "copy number: " << it->copyNb
+        << " vid: " << it->vid
+        << " fSeq: " << it->fSeq
+        << " blockId: " << it->blockId
+        << " creationTime: " << it->creationTime
+        << " compressedSize: " << it->compressedSize
+        << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+        << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+        << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+        << " supersededByVid: " << it->supersededByVid
+        << " supersededByFSeq: " << it->supersededByFSeq;
       spc.add("TAPE FILE", tapeCopyLogStream.str());
     }
     lc.log(log::INFO, "Archive file deleted from CTA catalogue");
diff --git a/catalogue/OracleCatalogue.cpp b/catalogue/OracleCatalogue.cpp
index 687d8f53eef26872cc5bd2762663c93768577c5c..7346a53daced7569fdd56354f96d1e7a1ba033b2 100644
--- a/catalogue/OracleCatalogue.cpp
+++ b/catalogue/OracleCatalogue.cpp
@@ -772,7 +772,9 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ "
       "FROM "
         "ARCHIVE_FILE "
       "INNER JOIN STORAGE_CLASS ON "
@@ -827,8 +829,12 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
         tapeFile.creationTime = selectRset.columnUint64("TAPE_FILE_CREATION_TIME");
         tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience
         tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience
-
-        archiveFile->tapeFiles[selectRset.columnUint64("COPY_NB")] = tapeFile;
+        if (!selectRset.columnIsNull("SSBY_VID")) {
+          tapeFile.supersededByVid = selectRset.columnString("SSBY_VID");
+          tapeFile.supersededByFSeq = selectRset.columnUint64("SSBY_FSEQ");
+        }
+        
+        archiveFile->tapeFiles.push_back(tapeFile);
       }
     }
 
@@ -859,15 +865,17 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
          .add("selectFromArchiveFileTime", selectFromArchiveFileTime);
       for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
         std::stringstream tapeCopyLogStream;
-        tapeCopyLogStream << "copy number: " << it->first
-          << " vid: " << it->second.vid
-          << " fSeq: " << it->second.fSeq
-          << " blockId: " << it->second.blockId
-          << " creationTime: " << it->second.creationTime
-          << " compressedSize: " << it->second.compressedSize
-          << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-          << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-          << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+        tapeCopyLogStream << "copy number: " << it->copyNb
+          << " vid: " << it->vid
+          << " fSeq: " << it->fSeq
+          << " blockId: " << it->blockId
+          << " creationTime: " << it->creationTime
+          << " compressedSize: " << it->compressedSize
+          << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+          << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+          << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+          << " supersededByVid: " << it->supersededByVid
+          << " supersededByFSeq: " << it->supersededByFSeq;
         spc.add("TAPE FILE", tapeCopyLogStream.str());
       }
       lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that "
@@ -922,15 +930,17 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
       std::stringstream tapeCopyLogStream;
-      tapeCopyLogStream << "copy number: " << it->first
-        << " vid: " << it->second.vid
-        << " fSeq: " << it->second.fSeq
-        << " blockId: " << it->second.blockId
-        << " creationTime: " << it->second.creationTime
-        << " compressedSize: " << it->second.compressedSize
-        << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-        << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-        << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+      tapeCopyLogStream << "copy number: " << it->copyNb
+        << " vid: " << it->vid
+        << " fSeq: " << it->fSeq
+        << " blockId: " << it->blockId
+        << " creationTime: " << it->creationTime
+        << " compressedSize: " << it->compressedSize
+        << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+        << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+        << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+        << " supersededByVid: " << it->supersededByVid
+        << " supersededByFSeq: " << it->supersededByFSeq;
       spc.add("TAPE FILE", tapeCopyLogStream.str());
     }
     lc.log(log::INFO, "Archive file deleted from CTA catalogue");
diff --git a/catalogue/PostgresCatalogue.cpp b/catalogue/PostgresCatalogue.cpp
index 56f078add90c36dc471b582c7238e683f467a082..374fcecf05f9a725af08dc2f4e677febede4adbd 100644
--- a/catalogue/PostgresCatalogue.cpp
+++ b/catalogue/PostgresCatalogue.cpp
@@ -699,7 +699,9 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ "
       "FROM "
         "ARCHIVE_FILE "
       "INNER JOIN STORAGE_CLASS ON "
@@ -752,8 +754,12 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c
         tapeFile.creationTime = selectRset.columnUint64("TAPE_FILE_CREATION_TIME");
         tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience
         tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience
+        if (!selectRset.columnIsNull("SSBY_VID")) {
+          tapeFile.supersededByVid = selectRset.columnString("SSBY_VID");
+          tapeFile.supersededByFSeq = selectRset.columnUint64("SSBY_FSEQ");
+        }
 
-        archiveFile->tapeFiles[selectRset.columnUint64("COPY_NB")] = tapeFile;
+        archiveFile->tapeFiles.push_back(tapeFile);
       }
     }
 
@@ -784,15 +790,18 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c
          .add("selectFromArchiveFileTime", selectFromArchiveFileTime);
       for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
         std::stringstream tapeCopyLogStream;
-        tapeCopyLogStream << "copy number: " << it->first
-          << " vid: " << it->second.vid
-          << " fSeq: " << it->second.fSeq
-          << " blockId: " << it->second.blockId
-          << " creationTime: " << it->second.creationTime
-          << " compressedSize: " << it->second.compressedSize
-          << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-          << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-          << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+        tapeCopyLogStream << "copy number: " << it->copyNb
+          << " vid: " << it->vid
+          << " fSeq: " << it->fSeq
+          << " blockId: " << it->blockId
+          << " creationTime: " << it->creationTime
+          << " compressedSize: " << it->compressedSize
+          << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+          << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+          << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+          << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+          << " supersededByVid: " << it->supersededByVid
+          << " supersededByFSeq: " << it->supersededByFSeq;
         spc.add("TAPE FILE", tapeCopyLogStream.str());
       }
       lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that "
@@ -848,15 +857,17 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
       std::stringstream tapeCopyLogStream;
-      tapeCopyLogStream << "copy number: " << it->first
-        << " vid: " << it->second.vid
-        << " fSeq: " << it->second.fSeq
-        << " blockId: " << it->second.blockId
-        << " creationTime: " << it->second.creationTime
-        << " compressedSize: " << it->second.compressedSize
-        << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-        << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-        << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+      tapeCopyLogStream << "copy number: " << it->copyNb
+        << " vid: " << it->vid
+        << " fSeq: " << it->fSeq
+        << " blockId: " << it->blockId
+        << " creationTime: " << it->creationTime
+        << " compressedSize: " << it->compressedSize
+        << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+        << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+        << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+        << " supersededByVid: " << it->supersededByVid
+        << " supersededByFSeq: " << it->supersededByFSeq;
       spc.add("TAPE FILE", tapeCopyLogStream.str());
     }
     lc.log(log::INFO, "Archive file deleted from CTA catalogue");
diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp
index ccd3b89e92b84453d574c53b1e8daa9363aa135c..86f09cfe9651eb9ebfdcc97d88eda2d05850f820 100644
--- a/catalogue/RdbmsCatalogue.cpp
+++ b/catalogue/RdbmsCatalogue.cpp
@@ -4116,7 +4116,9 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getFilesForRepack
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME, "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ,"
         "TAPE.TAPE_POOL_NAME AS TAPE_POOL_NAME "
       "FROM "
         "ARCHIVE_FILE "
@@ -4163,8 +4165,12 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getFilesForRepack
       tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME");
       tapeFile.checksumType = archiveFile.checksumType; // Duplicated for convenience
       tapeFile.checksumValue = archiveFile.checksumValue; // Duplicated for convenience
+      if (!rset.columnIsNull("SSBY_VID")) {
+        tapeFile.supersededByVid = rset.columnString("SSBY_VID");
+        tapeFile.supersededByFSeq = rset.columnUint64("SSBY_VID");
+      }
 
-      archiveFile.tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile;
+      archiveFile.tapeFiles.push_back(tapeFile);
 
       archiveFiles.push_back(archiveFile);
 
@@ -4911,22 +4917,7 @@ void RdbmsCatalogue::insertTapeFile(
   const common::dataStructures::TapeFile &tapeFile,
   const uint64_t archiveFileId) {
   rdbms::AutoRollback autoRollback(conn);
-  bool updateSupersededNeeded = false;
   try{
-    {
-      const char *const sql = 
-      "SELECT VID FROM TAPE_FILE "
-      "WHERE "
-      " TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID AND"
-      " TAPE_FILE.COPY_NB=:COPY_NB";
-      auto stmt = conn.createStmt(sql);
-      stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId);
-      stmt.bindUint64(":COPY_NB",tapeFile.copyNb);
-      auto result = stmt.executeQuery();
-      if(result.next()){
-        updateSupersededNeeded = true;
-      }
-    }
     {
       const time_t now = time(nullptr);
       const char *const sql =
@@ -4955,31 +4946,28 @@ void RdbmsCatalogue::insertTapeFile(
       stmt.bindUint64(":COPY_NB", tapeFile.copyNb);
       stmt.bindUint64(":CREATION_TIME", now);
       stmt.bindUint64(":ARCHIVE_FILE_ID", archiveFileId);
-
       stmt.executeNonQuery();
-      if(!updateSupersededNeeded){
-        conn.commit();
-      }
-    } 
+    }
     {
-      if(updateSupersededNeeded){
-        const char *const sql = 
-        "UPDATE TAPE_FILE SET "
-          "SUPERSEDED_BY_VID=:NEW_VID, " //VID of the new file
-          "SUPERSEDED_BY_FSEQ=:NEW_FSEQ " //FSEQ of the new file
-        "WHERE"
-        " TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID AND"
-        " TAPE_FILE.COPY_NB=:COPY_NB";
-
-        auto stmt = conn.createStmt(sql);
-        stmt.bindString(":NEW_VID",tapeFile.vid);
-        stmt.bindUint64(":NEW_FSEQ",tapeFile.fSeq);
-        stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId);
-        stmt.bindUint64(":COPY_NB",tapeFile.copyNb);
-        stmt.executeNonQuery();
-        conn.commit();
-      }
+      const char *const sql = 
+      "UPDATE TAPE_FILE SET "
+        "SUPERSEDED_BY_VID=:NEW_VID, " //VID of the new file
+        "SUPERSEDED_BY_FSEQ=:NEW_FSEQ " //FSEQ of the new file
+      "WHERE"
+      " TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID AND"
+      " TAPE_FILE.COPY_NB=:COPY_NB AND"
+      " ( TAPE_FILE.VID <> :NEW_VID2 OR TAPE_FILE.FSEQ <> :NEW_FSEQ2 )";
+
+      auto stmt = conn.createStmt(sql);
+      stmt.bindString(":NEW_VID",tapeFile.vid);
+      stmt.bindUint64(":NEW_FSEQ",tapeFile.fSeq);
+      stmt.bindString(":NEW_VID2",tapeFile.vid);
+      stmt.bindUint64(":NEW_FSEQ2",tapeFile.fSeq);
+      stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId);
+      stmt.bindUint64(":COPY_NB",tapeFile.copyNb);
+      stmt.executeNonQuery();
     }
+    conn.commit();
   } catch(exception::UserError &) {
     throw;
   } catch(exception::Exception &ex) {
@@ -5073,7 +5061,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ "
       "FROM "
         "ARCHIVE_FILE "
       "INNER JOIN STORAGE_CLASS ON "
@@ -5118,8 +5108,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME");
         tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience
         tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience
+        if (!rset.columnIsNull("SSBY_VID")) {
+          tapeFile.supersededByVid = rset.columnString("SSBY_VID");
+          tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ");
+        }
 
-        archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile;
+        archiveFile->tapeFiles.push_back(tapeFile);
       }
     }
 
@@ -5157,7 +5151,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ "
       "FROM "
         "ARCHIVE_FILE "
       "INNER JOIN STORAGE_CLASS ON "
@@ -5205,8 +5201,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME");
         tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience
         tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience
-
-        archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile;
+        if (!rset.columnIsNull("SSBY_VID")) {
+          tapeFile.supersededByVid = rset.columnString("SSBY_VID");
+          tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ");
+        }
+        
+        archiveFile->tapeFiles.push_back(tapeFile);
       }
     }
 
@@ -5246,7 +5246,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ "
       "FROM "
         "ARCHIVE_FILE "
       "INNER JOIN STORAGE_CLASS ON "
@@ -5293,8 +5295,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME");
         tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience
         tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience
-
-        archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile;
+        if (!rset.columnIsNull("SSBY_VID")) {
+          tapeFile.supersededByVid = rset.columnString("SSBY_VID");
+          tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ");
+        }
+        
+        archiveFile->tapeFiles.push_back(tapeFile);
       }
     }
 
@@ -5334,7 +5340,9 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         "TAPE_FILE.BLOCK_ID AS BLOCK_ID,"
         "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES,"
         "TAPE_FILE.COPY_NB AS COPY_NB,"
-        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME "
+        "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME,"
+        "TAPE_FILE.SUPERSEDED_BY_VID AS SSBY_VID,"
+        "TAPE_FILE.SUPERSEDED_BY_FSEQ AS SSBY_FSEQ "
       "FROM "
         "ARCHIVE_FILE "
       "INNER JOIN STORAGE_CLASS ON "
@@ -5384,8 +5392,12 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF
         tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME");
         tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience
         tapeFile.checksumValue = archiveFile->checksumValue; // Duplicated for convenience
-
-        archiveFile->tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile;
+        if (!rset.columnIsNull("SSBY_VID")) {
+          tapeFile.supersededByVid = rset.columnString("SSBY_VID");
+          tapeFile.supersededByFSeq = rset.columnUint64("SSBY_FSEQ");
+        }
+        
+        archiveFile->tapeFiles.push_back(tapeFile);
       }
     }
 
diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp
index c3895566e4b60acff18889aa11f01b86156d3b77..c7c0e920a5a0a33f54f4bdc0aa58515356f5f7d1 100644
--- a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp
+++ b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.cpp
@@ -65,7 +65,7 @@ namespace {
       tapeFile.checksumType = archiveFile.checksumType; // Duplicated for convenience
       tapeFile.checksumValue = archiveFile.checksumValue; // Duplicated for convenience
 
-      archiveFile.tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile;
+      archiveFile.tapeFiles.push_back(tapeFile);
     }
 
     return archiveFile;
diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp
index 7d3ad9a7cff3d541b536cc47164c934f39b1ae99..89cd63aa75cd8783eca9ea7f0fb3f3cbba219032 100644
--- a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp
+++ b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp
@@ -65,7 +65,7 @@ namespace {
       tapeFile.checksumType = archiveFile.checksumType; // Duplicated for convenience
       tapeFile.checksumValue = archiveFile.checksumValue; // Duplicated for convenience
 
-      archiveFile.tapeFiles[rset.columnUint64("COPY_NB")] = tapeFile;
+      archiveFile.tapeFiles.push_back(tapeFile);
     }
 
     return archiveFile;
diff --git a/catalogue/SqliteCatalogue.cpp b/catalogue/SqliteCatalogue.cpp
index 47a8e48aa3dff02cdb027f01e0ff2c17f40a8d9d..022143ee3ba2e4a66b74b495c3e352c659ddf55e 100644
--- a/catalogue/SqliteCatalogue.cpp
+++ b/catalogue/SqliteCatalogue.cpp
@@ -96,15 +96,17 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
          .add("getArchiveFileTime", getArchiveFileTime);
       for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
         std::stringstream tapeCopyLogStream;
-        tapeCopyLogStream << "copy number: " << it->first
-          << " vid: " << it->second.vid
-          << " fSeq: " << it->second.fSeq
-          << " blockId: " << it->second.blockId
-          << " creationTime: " << it->second.creationTime
-          << " compressedSize: " << it->second.compressedSize
-          << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-          << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-          << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+        tapeCopyLogStream << "copy number: " << it->copyNb
+          << " vid: " << it->vid
+          << " fSeq: " << it->fSeq
+          << " blockId: " << it->blockId
+          << " creationTime: " << it->creationTime
+          << " compressedSize: " << it->compressedSize
+          << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+          << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+          << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+          << " supersededByVid: " << it->supersededByVid
+          << " supersededByFSeq: " << it->supersededByFSeq;
         spc.add("TAPE FILE", tapeCopyLogStream.str());
       }
       lc.log(log::WARNING, "Failed to delete archive file because the disk instance of the request does not match that "
@@ -163,15 +165,17 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con
        .add("commitTime", commitTime);
     for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) {
       std::stringstream tapeCopyLogStream;
-      tapeCopyLogStream << "copy number: " << it->first
-        << " vid: " << it->second.vid
-        << " fSeq: " << it->second.fSeq
-        << " blockId: " << it->second.blockId
-        << " creationTime: " << it->second.creationTime
-        << " compressedSize: " << it->second.compressedSize
-        << " checksumType: " << it->second.checksumType //this shouldn't be here: repeated field
-        << " checksumValue: " << it->second.checksumValue //this shouldn't be here: repeated field
-        << " copyNb: " << it->second.copyNb; //this shouldn't be here: repeated field
+      tapeCopyLogStream << "copy number: " << it->copyNb
+        << " vid: " << it->vid
+        << " fSeq: " << it->fSeq
+        << " blockId: " << it->blockId
+        << " creationTime: " << it->creationTime
+        << " compressedSize: " << it->compressedSize
+        << " checksumType: " << it->checksumType //this shouldn't be here: repeated field
+        << " checksumValue: " << it->checksumValue //this shouldn't be here: repeated field
+        << " copyNb: " << it->copyNb //this shouldn't be here: repeated field
+        << " supersededByVid: " << it->supersededByVid
+        << " supersededByFSeq: " << it->supersededByFSeq;
       spc.add("TAPE FILE", tapeCopyLogStream.str());
     }
     lc.log(log::INFO, "Archive file deleted from CTA catalogue");
diff --git a/cmdline/CtaAdminCmd.cpp b/cmdline/CtaAdminCmd.cpp
index 29b59b0224914833305288a2278a19806df254a4..4a6be3ab794c8f932b90a823e38a79bc4dcb6b28 100644
--- a/cmdline/CtaAdminCmd.cpp
+++ b/cmdline/CtaAdminCmd.cpp
@@ -405,10 +405,12 @@ void CtaAdminCmd::printAfLsHeader()
              << std::setfill(' ') << std::setw(12) << std::right << "size"           << ' '
              << std::setfill(' ') << std::setw(13) << std::right << "checksum type"  << ' '
              << std::setfill(' ') << std::setw(14) << std::right << "checksum value" << ' '
-             << std::setfill(' ') << std::setw(13) << std::right << "storage class"  << ' '
+             << std::setfill(' ') << std::setw(16) << std::right << "storage class"  << ' '
              << std::setfill(' ') << std::setw(8)  << std::right << "owner"          << ' '
              << std::setfill(' ') << std::setw(8)  << std::right << "group"          << ' '
              << std::setfill(' ') << std::setw(13) << std::right << "creation time"  << ' '
+             << std::setfill(' ') << std::setw(7)  << std::right << "ss vid"         << ' '
+             << std::setfill(' ') << std::setw(7)  << std::right << "ss fseq"        << ' '
                                                                  << "path"
              << TEXT_NORMAL << std::endl;
 }
@@ -425,11 +427,19 @@ void CtaAdminCmd::print(const cta::admin::ArchiveFileLsItem &afls_item)
              << std::setfill(' ') << std::setw(12) << std::right << afls_item.af().size()          << ' '
              << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().cs().type()     << ' '
              << std::setfill(' ') << std::setw(14) << std::right << afls_item.af().cs().value()    << ' '
-             << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().storage_class() << ' '
+             << std::setfill(' ') << std::setw(16) << std::right << afls_item.af().storage_class() << ' '
              << std::setfill(' ') << std::setw(8)  << std::right << afls_item.af().df().owner()    << ' '
              << std::setfill(' ') << std::setw(8)  << std::right << afls_item.af().df().group()    << ' '
-             << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().creation_time() << ' '
-                                                                 << afls_item.af().df().path()
+             << std::setfill(' ') << std::setw(13) << std::right << afls_item.af().creation_time() << ' ';
+
+   if (afls_item.tf().superseded_by_vid().size()) {
+     std::cout << std::setfill(' ') << std::setw(7)  << std::right << afls_item.tf().superseded_by_vid()   << ' '
+               << std::setfill(' ') << std::setw(7)  << std::right << afls_item.tf().superseded_by_f_seq() << ' ';
+   } else {
+     std::cout << std::setfill(' ') << std::setw(7)  << std::right << "-" << ' '
+               << std::setfill(' ') << std::setw(7)  << std::right << "-" << ' ';
+   }
+   std::cout << afls_item.af().df().path()
              << std::endl;
 }
 
diff --git a/common/dataStructures/ArchiveFile.cpp b/common/dataStructures/ArchiveFile.cpp
index c8ee856db28d35af4805bcfe72b2c004bfff4fdb..a822c8d9a9a4920ef1152cd6e099178bf729f1aa 100644
--- a/common/dataStructures/ArchiveFile.cpp
+++ b/common/dataStructures/ArchiveFile.cpp
@@ -20,6 +20,8 @@
 #include "common/dataStructures/utils.hpp"
 #include "common/exception/Exception.hpp"
 
+#include <algorithm>
+
 namespace cta {
 namespace common {
 namespace dataStructures {
@@ -56,6 +58,42 @@ bool ArchiveFile::operator!=(const ArchiveFile &rhs) const {
   return !operator==(rhs);
 }
 
+//------------------------------------------------------------------------------
+// ArchiveFile::TapeFilesList::at()
+//------------------------------------------------------------------------------
+TapeFile& ArchiveFile::TapeFilesList::at(uint32_t copyNb) {
+  auto ret = std::find_if(begin(), end(), [=](TapeFile& tf){ return tf.isActiveCopyNb(copyNb);});
+  if (ret == end()) throw cta::exception::Exception("In ArchiveFile::TapeFilesList::at(): not found.");
+  return *ret;
+}
+
+//------------------------------------------------------------------------------
+// ArchiveFile::TapeFilesList::at() const
+//------------------------------------------------------------------------------
+const TapeFile& ArchiveFile::TapeFilesList::at(uint32_t copyNb) const {
+  auto ret = std::find_if(cbegin(), cend(), [=](const TapeFile& tf){ return tf.isActiveCopyNb(copyNb);});
+  if (ret == end()) throw cta::exception::Exception("In ArchiveFile::TapeFilesList::at(): not found.");
+  return *ret;
+}
+
+//------------------------------------------------------------------------------
+// ArchiveFile::TapeFilesList::find() 
+//------------------------------------------------------------------------------
+ArchiveFile::TapeFilesList::iterator ArchiveFile::TapeFilesList::find(uint32_t copyNb) {
+  return std::find_if(begin(), end(), [=](TapeFile& tf){ return tf.isActiveCopyNb(copyNb);});
+}
+
+//------------------------------------------------------------------------------
+// ArchiveFile::TapeFilesList::find() const
+//------------------------------------------------------------------------------
+ArchiveFile::TapeFilesList::const_iterator ArchiveFile::TapeFilesList::find(uint32_t copyNb) const {
+  return std::find_if(cbegin(), cend(), [=](const TapeFile& tf){ return tf.isActiveCopyNb(copyNb);});
+}
+
+
+
+
+
 //------------------------------------------------------------------------------
 // operator<<
 //------------------------------------------------------------------------------
diff --git a/common/dataStructures/ArchiveFile.hpp b/common/dataStructures/ArchiveFile.hpp
index f2875077e5eb02a5ee0e6d3ac82eaf026af19ca5..4f20ea68910091d0a26d2ebe646b0381b32beb40 100644
--- a/common/dataStructures/ArchiveFile.hpp
+++ b/common/dataStructures/ArchiveFile.hpp
@@ -68,7 +68,15 @@ struct ArchiveFile {
    * to be listed by the operator. For example, if the listing requested is 
    * for a single tape, the map will contain only one element. 
    */
-  std::map<uint32_t,TapeFile> tapeFiles;
+  class TapeFilesList: public std::list<TapeFile> {
+  public:
+    using std::list<TapeFile>::list;
+    TapeFile & at(uint32_t copyNb);
+    const TapeFile & at(uint32_t copyNb) const;
+    TapeFilesList::iterator find(uint32_t copyNb);
+    TapeFilesList::const_iterator find(uint32_t copyNb) const;
+  };
+  TapeFilesList tapeFiles;
   time_t creationTime;
   time_t reconciliationTime;
 
diff --git a/common/dataStructures/ArchiveFileTest.cpp b/common/dataStructures/ArchiveFileTest.cpp
index 2ba848c0035793a5e5da5ac791998e9abe0a5257..8522d1f345a08a27b17129283fc2bb5de11cacc4 100644
--- a/common/dataStructures/ArchiveFileTest.cpp
+++ b/common/dataStructures/ArchiveFileTest.cpp
@@ -19,6 +19,7 @@
 #include "common/dataStructures/ArchiveFile.hpp"
 
 #include <gtest/gtest.h>
+#include <algorithm>
 
 namespace unitTests {
 
@@ -56,7 +57,7 @@ TEST_F(cta_common_dataStructures_ArchiveFileTest, copy_constructor) {
   tapeFile1.compressedSize = 5;
   tapeFile1.copyNb = 1;
 
-  archiveFile1.tapeFiles[1] = tapeFile1;
+  archiveFile1.tapeFiles.push_back(tapeFile1);
   ASSERT_EQ(1, archiveFile1.tapeFiles.size());
 
   TapeFile tapeFile2;
@@ -66,7 +67,7 @@ TEST_F(cta_common_dataStructures_ArchiveFileTest, copy_constructor) {
   tapeFile2.compressedSize = 6;
   tapeFile2.copyNb = 2;
 
-  archiveFile1.tapeFiles[2] = tapeFile1;
+  archiveFile1.tapeFiles.push_back(tapeFile2);
   ASSERT_EQ(2, archiveFile1.tapeFiles.size());
 
   ArchiveFile archiveFile2;
@@ -88,25 +89,25 @@ TEST_F(cta_common_dataStructures_ArchiveFileTest, copy_constructor) {
   ASSERT_EQ(2, archiveFile2.tapeFiles.size());
 
   {
-    auto copyNbToTapeFileItor = archiveFile2.tapeFiles.find(1);
+    auto copyNbToTapeFileItor = std::find_if(archiveFile2.tapeFiles.begin(), archiveFile2.tapeFiles.end(),
+        [](TapeFile &tf){ return tf.copyNb == 1; });
     ASSERT_TRUE(copyNbToTapeFileItor != archiveFile2.tapeFiles.end());
-    ASSERT_EQ(1, copyNbToTapeFileItor->first);
-    ASSERT_EQ(tapeFile1.vid, copyNbToTapeFileItor->second.vid);
-    ASSERT_EQ(tapeFile1.fSeq, copyNbToTapeFileItor->second.fSeq);
-    ASSERT_EQ(tapeFile1.blockId, copyNbToTapeFileItor->second.blockId);
-    ASSERT_EQ(tapeFile1.compressedSize, copyNbToTapeFileItor->second.compressedSize);
-    ASSERT_EQ(tapeFile1.copyNb, copyNbToTapeFileItor->second.copyNb);
+    ASSERT_EQ(tapeFile1.vid, copyNbToTapeFileItor->vid);
+    ASSERT_EQ(tapeFile1.fSeq, copyNbToTapeFileItor->fSeq);
+    ASSERT_EQ(tapeFile1.blockId, copyNbToTapeFileItor->blockId);
+    ASSERT_EQ(tapeFile1.compressedSize, copyNbToTapeFileItor->compressedSize);
+    ASSERT_EQ(tapeFile1.copyNb, copyNbToTapeFileItor->copyNb);
   }
 
   {
-    auto copyNbToTapeFileItor = archiveFile2.tapeFiles.find(2);
+    auto copyNbToTapeFileItor = std::find_if(archiveFile2.tapeFiles.begin(), archiveFile2.tapeFiles.end(),
+        [](TapeFile &tf){ return tf.copyNb == 2; });
     ASSERT_TRUE(copyNbToTapeFileItor != archiveFile2.tapeFiles.end());
-    ASSERT_EQ(2, copyNbToTapeFileItor->first);
-    ASSERT_EQ(tapeFile1.vid, copyNbToTapeFileItor->second.vid);
-    ASSERT_EQ(tapeFile1.fSeq, copyNbToTapeFileItor->second.fSeq);
-    ASSERT_EQ(tapeFile1.blockId, copyNbToTapeFileItor->second.blockId);
-    ASSERT_EQ(tapeFile1.compressedSize, copyNbToTapeFileItor->second.compressedSize);
-    ASSERT_EQ(tapeFile1.copyNb, copyNbToTapeFileItor->second.copyNb);
+    ASSERT_EQ(tapeFile2.vid, copyNbToTapeFileItor->vid);
+    ASSERT_EQ(tapeFile2.fSeq, copyNbToTapeFileItor->fSeq);
+    ASSERT_EQ(tapeFile2.blockId, copyNbToTapeFileItor->blockId);
+    ASSERT_EQ(tapeFile2.compressedSize, copyNbToTapeFileItor->compressedSize);
+    ASSERT_EQ(tapeFile2.copyNb, copyNbToTapeFileItor->copyNb);
   }
 }
 
diff --git a/common/dataStructures/TapeFile.cpp b/common/dataStructures/TapeFile.cpp
index 31ea7b56ae6e2c88bd4dc76a1beca03ad2f6320f..91dc2601aa7886893f65e0f36ee6183088235632 100644
--- a/common/dataStructures/TapeFile.cpp
+++ b/common/dataStructures/TapeFile.cpp
@@ -53,6 +53,13 @@ bool TapeFile::operator!=(const TapeFile &rhs) const {
   return !operator==(rhs);
 }
 
+//------------------------------------------------------------------------------
+// TapeFile::isActiveCopyNb
+//------------------------------------------------------------------------------
+bool TapeFile::isActiveCopyNb(uint32_t cnb) const {
+  return (cnb == copyNb) && supersededByVid.empty();
+}
+
 //------------------------------------------------------------------------------
 // operator<<
 //------------------------------------------------------------------------------
diff --git a/common/dataStructures/TapeFile.hpp b/common/dataStructures/TapeFile.hpp
index 7121343503a86866cde31faab55a5cc62b075e06..64f4d350ecba41de67fc322acdc5cece62bafa54 100644
--- a/common/dataStructures/TapeFile.hpp
+++ b/common/dataStructures/TapeFile.hpp
@@ -79,6 +79,21 @@ struct TapeFile {
    * The checksum value 
    */
   std::string checksumValue;
+  
+  /**
+   * The vid of the tape file superseding this one (or empty string if not)
+   */
+  std::string supersededByVid;
+  
+  /**
+   * The FSeq of the tape file superseding this one (or empty string if not)
+   */
+  uint64_t supersededByFSeq = 0;
+  
+  /**
+   * Returns true if this tape file is both an active (not superseded) tape file and matches the copy number.
+   */
+  bool isActiveCopyNb(uint32_t copyNb) const;
 
 }; // struct TapeFile
 
diff --git a/common/dataStructures/utils.cpp b/common/dataStructures/utils.cpp
index 689026cd7ca999cfe201dd942b2086c9486618b2..9a1ffde04798eb6665a71c1ba5adea510d488a1e 100644
--- a/common/dataStructures/utils.cpp
+++ b/common/dataStructures/utils.cpp
@@ -22,10 +22,10 @@ namespace cta {
 namespace common {
 namespace dataStructures {
 
-std::ostream &operator<<(std::ostream &os, const std::map<uint32_t,TapeFile> &map) {
+std::ostream &operator<<(std::ostream &os, const std::list<TapeFile> &list) {
   os << "(";
-  for(auto it = map.begin(); it != map.end(); it++) {
-    os << " key=" << it->first << " value=" << it->second << " ";
+  for(auto & af: list) {
+    os << af << " ";
   }
   os << ")";
   return os;
diff --git a/common/dataStructures/utils.hpp b/common/dataStructures/utils.hpp
index c3e989a42d4c198ae7ecd8595823986fc42a08e9..cdc92790094274857f8de59bdab6811115c307cd 100644
--- a/common/dataStructures/utils.hpp
+++ b/common/dataStructures/utils.hpp
@@ -27,7 +27,7 @@ namespace cta {
 namespace common {
 namespace dataStructures {
   
-std::ostream &operator<<(std::ostream &os, const std::map<uint32_t,TapeFile> &map);
+std::ostream &operator<<(std::ostream &os, const std::list<TapeFile> &map);
 std::ostream &operator<<(std::ostream &os, const std::map<uint64_t,std::string> &map);
 std::ostream &operator<<(std::ostream &os, const std::pair<std::string,std::string> &pair);
 std::ostream &operator<<(std::ostream &os, const std::map<uint64_t,std::pair<std::string,std::string>> &map);
diff --git a/objectstore/AlgorithmsTest.cpp b/objectstore/AlgorithmsTest.cpp
index e14cb4c4b325bba59cd7e9257ea26943644a4abb..94999d4ed2645e11a3c76dcadaccd6439a10d3c0 100644
--- a/objectstore/AlgorithmsTest.cpp
+++ b/objectstore/AlgorithmsTest.cpp
@@ -58,13 +58,17 @@ void fillRetrieveRequests(
     rqc.archiveFile.diskInstance = "eoseos";
     rqc.archiveFile.fileSize = 1000 + i;
     rqc.archiveFile.storageClass = "sc";
-    rqc.archiveFile.tapeFiles[1].blockId = 0;
-    rqc.archiveFile.tapeFiles[1].compressedSize = 1;
-    rqc.archiveFile.tapeFiles[1].compressedSize = 1;
-    rqc.archiveFile.tapeFiles[1].copyNb = 1;
-    rqc.archiveFile.tapeFiles[1].creationTime = time(nullptr);
-    rqc.archiveFile.tapeFiles[1].fSeq = i;
-    rqc.archiveFile.tapeFiles[1].vid = "Tape0";
+    {
+      cta::common::dataStructures::TapeFile tf;
+      tf.blockId = 0;
+      tf.compressedSize = 1;
+      tf.compressedSize = 1;
+      tf.copyNb = 1;
+      tf.creationTime = time(nullptr);
+      tf.fSeq = i;
+      tf.vid = "Tape0";
+      rqc.archiveFile.tapeFiles.push_back(tf);
+    }
     rqc.mountPolicy.archiveMinRequestAge = 1;
     rqc.mountPolicy.archivePriority = 1;
     rqc.mountPolicy.creationLog.time = time(nullptr);
diff --git a/objectstore/ArchiveFileSerDeser.hpp b/objectstore/ArchiveFileSerDeser.hpp
index 2d30c6cfa3f3d0311b635047427d8ac7efedd543..3e3d205df2afb50e0bbf0dd20983ae8f7ed7f867 100644
--- a/objectstore/ArchiveFileSerDeser.hpp
+++ b/objectstore/ArchiveFileSerDeser.hpp
@@ -54,7 +54,7 @@ public:
     osaf.set_reconciliationtime(reconciliationTime);
     osaf.set_storageclass(storageClass);
     for (auto & tf: tapeFiles)
-      TapeFileSerDeser(tf.second).serialize(*osaf.add_tapefiles());
+      TapeFileSerDeser(tf).serialize(*osaf.add_tapefiles());
   }
   
   void deserialize (const cta::objectstore::serializers::ArchiveFile & osaf) {
@@ -75,7 +75,7 @@ public:
     for (auto tf: osaf.tapefiles()) {
       TapeFileSerDeser tfsd;
       tfsd.deserialize(tf);
-      tapeFiles[tfsd.copyNb]=tfsd;
+      tapeFiles.push_back(tfsd);
     }
   }
 };
diff --git a/objectstore/GarbageCollector.cpp b/objectstore/GarbageCollector.cpp
index cc7148e699724d05083adec9559bb0d46bc76b42..1d49ac4a9ed66b170a2a764691c563e3c5153edf 100644
--- a/objectstore/GarbageCollector.cpp
+++ b/objectstore/GarbageCollector.cpp
@@ -330,14 +330,17 @@ void GarbageCollector::OwnedObjectSorter::sortFetchedObjects(Agent& agent, std::
         std::set<std::string> candidateVids;
         for (auto & j: rr->dumpJobs()) {
           if(j.status==RetrieveJobStatus::RJS_ToTransferForUser) {
-            candidateVids.insert(rr->getArchiveFile().tapeFiles.at(j.copyNb).vid);
+            for (auto &tf: rr->getArchiveFile().tapeFiles) {
+              if ((tf.copyNb == j.copyNb) && (tf.supersededByVid.empty()))
+                candidateVids.insert(tf.vid);
+            }
           }
         }
         // Small parenthesis for non transfer cases.
         if (candidateVids.empty()) {
           // The request might need to be added to the failed to report of failed queue/container.
           try {
-            retrieveQueuesAndRequests[std::make_tuple(rr->getArchiveFile().tapeFiles.begin()->second.vid, rr->getQueueType())].emplace_back(rr);
+            retrieveQueuesAndRequests[std::make_tuple(rr->getArchiveFile().tapeFiles.begin()->vid, rr->getQueueType())].emplace_back(rr);
           } catch (cta::exception::Exception & ex) {
             log::ScopedParamContainer params3(lc);
             params3.add("fileId", rr->getArchiveFile().archiveFileID)
@@ -363,7 +366,7 @@ void GarbageCollector::OwnedObjectSorter::sortFetchedObjects(Agent& agent, std::
         // Find copyNb for logging
         size_t copyNb = std::numeric_limits<size_t>::max();
         uint64_t fSeq = std::numeric_limits<uint64_t>::max();
-        for (auto & tc: rr->getArchiveFile().tapeFiles) { if (tc.second.vid==vid) { copyNb=tc.first; fSeq=tc.second.fSeq; } }
+        for (auto & tc: rr->getArchiveFile().tapeFiles) { if (tc.vid==vid) { copyNb=tc.copyNb; fSeq=tc.fSeq; } }
         params3.add("fileId", rr->getArchiveFile().archiveFileID)
                .add("copyNb", copyNb)
                .add("tapeVid", vid)
@@ -553,8 +556,8 @@ void GarbageCollector::OwnedObjectSorter::lockFetchAndUpdateRetrieveJobs(Agent&
       for (auto & rr: currentJobBatch) {
         // Determine the copy number and feed the queue with it.
         for (auto &tf: rr->getArchiveFile().tapeFiles) {
-          if (tf.second.vid == vid) {
-            jta.push_back({tf.second.copyNb, tf.second.fSeq, rr->getAddressIfSet(), rr->getArchiveFile().fileSize, 
+          if (tf.vid == vid) {
+            jta.push_back({tf.copyNb, tf.fSeq, rr->getAddressIfSet(), rr->getArchiveFile().fileSize, 
                 rr->getRetrieveFileQueueCriteria().mountPolicy, rr->getEntryLog().time});
           }
         }
@@ -579,11 +582,11 @@ void GarbageCollector::OwnedObjectSorter::lockFetchAndUpdateRetrieveJobs(Agent&
         std::list<RRUpdatedParams> rrUpdatersParams;
         for (auto & rr: currentJobBatch) {
           for (auto & tf: rr->getArchiveFile().tapeFiles) {
-            if (tf.second.vid == vid) {
+            if (tf.vid == vid) {
               rrUpdatersParams.emplace_back();
               rrUpdatersParams.back().retrieveRequest = rr;
-              rrUpdatersParams.back().copyNb = tf.second.copyNb;
-              rrUpdatersParams.back().updater.reset(rr->asyncUpdateJobOwner(tf.second.copyNb,
+              rrUpdatersParams.back().copyNb = tf.copyNb;
+              rrUpdatersParams.back().updater.reset(rr->asyncUpdateJobOwner(tf.copyNb,
                   rq.getAddressIfSet(), agent.getAddressIfSet()));
             }
           }
diff --git a/objectstore/GarbageCollectorTest.cpp b/objectstore/GarbageCollectorTest.cpp
index 3696db6ca5c8a3048c3e5588e700b391ced4a906..82b2348ac59ca17bacaeae22aaa5531189d20d48 100644
--- a/objectstore/GarbageCollectorTest.cpp
+++ b/objectstore/GarbageCollectorTest.cpp
@@ -559,20 +559,28 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) {
     rqc.archiveFile.diskInstance = "eoseos";
     rqc.archiveFile.fileSize = 1000 + pass;
     rqc.archiveFile.storageClass = "sc";
-    rqc.archiveFile.tapeFiles[1].blockId=0;
-    rqc.archiveFile.tapeFiles[1].compressedSize=1;
-    rqc.archiveFile.tapeFiles[1].compressedSize=1;
-    rqc.archiveFile.tapeFiles[1].copyNb=1;
-    rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr);
-    rqc.archiveFile.tapeFiles[1].fSeq=pass;
-    rqc.archiveFile.tapeFiles[1].vid="Tape0";
-    rqc.archiveFile.tapeFiles[2].blockId=0;
-    rqc.archiveFile.tapeFiles[2].compressedSize=1;
-    rqc.archiveFile.tapeFiles[2].compressedSize=1;
-    rqc.archiveFile.tapeFiles[2].copyNb=2;
-    rqc.archiveFile.tapeFiles[2].creationTime=time(nullptr);
-    rqc.archiveFile.tapeFiles[2].fSeq=pass;
-    rqc.archiveFile.tapeFiles[2].vid="Tape1";
+    {
+      cta::common::dataStructures::TapeFile tf;
+      tf.blockId=0;
+      tf.compressedSize=1;
+      tf.compressedSize=1;
+      tf.copyNb=1;
+      tf.creationTime=time(nullptr);
+      tf.fSeq=pass;
+      tf.vid="Tape0";
+      rqc.archiveFile.tapeFiles.push_back(tf);
+    }
+    {
+      cta::common::dataStructures::TapeFile tf;
+      tf.blockId=0;
+      tf.compressedSize=1;
+      tf.compressedSize=1;
+      tf.copyNb=2;
+      tf.creationTime=time(nullptr);
+      tf.fSeq=pass;
+      tf.vid="Tape1";
+      rqc.archiveFile.tapeFiles.push_back(tf);
+    }
     rqc.mountPolicy.archiveMinRequestAge = 1;
     rqc.mountPolicy.archivePriority = 1;
     rqc.mountPolicy.creationLog.time = time(nullptr);
@@ -598,7 +606,7 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) {
       cta::objectstore::ScopedExclusiveLock rql(rq);
       rq.fetch();
       std::list <cta::objectstore::RetrieveQueue::JobToAdd> jta;
-      jta.push_back({1,rqc.archiveFile.tapeFiles[1].fSeq, rr.getAddressIfSet(), rqc.archiveFile.fileSize, rqc.mountPolicy, sReq.creationLog.time});
+      jta.push_back({1,rqc.archiveFile.tapeFiles.front().fSeq, rr.getAddressIfSet(), rqc.archiveFile.fileSize, rqc.mountPolicy, sReq.creationLog.time});
       rq.addJobsAndCommit(jta, agentRef, lc);
     }
     if (pass < 5) { pass++; continue; }
diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp
index cef85a9fb649b077840ea9949080dee964c50c4f..f0b770566cc81be48bc279c586133a3455d558f6 100644
--- a/objectstore/Helpers.cpp
+++ b/objectstore/Helpers.cpp
@@ -407,7 +407,10 @@ std::string Helpers::selectBestRetrieveQueue(const std::set<std::string>& candid
       auto tapeStatus=catalogue.getTapesByVid({v});
       // Build a minimal service  retrieve file queue criteria to query queues.
       common::dataStructures::RetrieveFileQueueCriteria rfqc;
-      rfqc.archiveFile.tapeFiles[1].vid=v;
+      common::dataStructures::TapeFile tf;
+      tf.copyNb = 1;
+      tf.vid = v;
+      rfqc.archiveFile.tapeFiles.push_back(tf);
       auto queuesStats=Helpers::getRetrieveQueueStatistics(rfqc, {v}, objectstore);
       // We now have the data we need. Update the cache.
       grqsmLock.lock();
@@ -504,14 +507,14 @@ std::list<SchedulerDatabase::RetrieveQueueStatistics> Helpers::getRetrieveQueueS
   re.fetch();
   rel.release();
   for (auto &tf:criteria.archiveFile.tapeFiles) {
-    if (!vidsToConsider.count(tf.second.vid))
+    if (!vidsToConsider.count(tf.vid))
       continue;
     std::string rqAddr;
     try {
-      std::string rqAddr = re.getRetrieveQueueAddress(tf.second.vid, JobQueueType::JobsToTransferForUser);
+      std::string rqAddr = re.getRetrieveQueueAddress(tf.vid, JobQueueType::JobsToTransferForUser);
     } catch (cta::exception::Exception &) {
       ret.push_back(SchedulerDatabase::RetrieveQueueStatistics());
-      ret.back().vid=tf.second.vid;
+      ret.back().vid=tf.vid;
       ret.back().bytesQueued=0;
       ret.back().currentPriority=0;
       ret.back().filesQueued=0;
@@ -521,7 +524,7 @@ std::list<SchedulerDatabase::RetrieveQueueStatistics> Helpers::getRetrieveQueueS
     ScopedSharedLock rql(rq);
     rq.fetch();
     rql.release();
-    if (rq.getVid() != tf.second.vid)
+    if (rq.getVid() != tf.vid)
       throw cta::exception::Exception("In OStoreDB::getRetrieveQueueStatistics(): unexpected vid for retrieve queue");
     ret.push_back(SchedulerDatabase::RetrieveQueueStatistics());
     ret.back().vid=rq.getVid();
diff --git a/objectstore/RetrieveRequest.cpp b/objectstore/RetrieveRequest.cpp
index 035a4e09f68879f2bff0d3a375e15a34e09aa5d1..3dc1365dedb7a7dfdee5787090d7b9ccf5b9750c 100644
--- a/objectstore/RetrieveRequest.cpp
+++ b/objectstore/RetrieveRequest.cpp
@@ -427,7 +427,7 @@ void RetrieveRequest::setRetrieveFileQueueCriteria(const cta::common::dataStruct
     const uint32_t hardcodedRetriesWithinMount = 3;
     const uint32_t hardcodedTotalRetries = 6;
     const uint32_t hardcodedReportRetries = 2;
-    addJob(tf.second.copyNb, hardcodedRetriesWithinMount, hardcodedTotalRetries, hardcodedReportRetries);
+    addJob(tf.copyNb, hardcodedRetriesWithinMount, hardcodedTotalRetries, hardcodedReportRetries);
   }
 }
 
diff --git a/objectstore/Sorter.cpp b/objectstore/Sorter.cpp
index e668121da69e52b69d5dc1cc39d982a2f490a2e4..606e3fa04164191107b65a2f351dba22c2317a7d 100644
--- a/objectstore/Sorter.cpp
+++ b/objectstore/Sorter.cpp
@@ -238,7 +238,7 @@ void Sorter::insertRetrieveRequest(RetrieveRequestInfosAccessorInterface& access
       std::string bestVid = getBestVidForQueueingRetrieveRequest(accessor, candidateVidsToTransfer ,lc);
 
       for (auto & tf: accessor.getArchiveFile().tapeFiles) {
-        if (tf.second.vid == bestVid) {
+        if (tf.vid == bestVid) {
           goto vidFound;
         }
       }
@@ -253,7 +253,7 @@ void Sorter::insertRetrieveRequest(RetrieveRequestInfosAccessorInterface& access
         log::ScopedParamContainer params(lc);
         size_t copyNb = std::numeric_limits<size_t>::max();
         uint64_t fSeq = std::numeric_limits<uint64_t>::max();
-        for (auto & tc: accessor.getArchiveFile().tapeFiles) { if (tc.second.vid==bestVid) { copyNb=tc.first; fSeq=tc.second.fSeq; } }
+        for (auto & tc: accessor.getArchiveFile().tapeFiles) { if (tc.vid==bestVid) { copyNb=tc.copyNb; fSeq=tc.fSeq; } }
         cta::common::dataStructures::ArchiveFile archiveFile = accessor.getArchiveFile();
         try{
           Sorter::RetrieveJob jobToAdd = accessor.createRetrieveJob(archiveFile,copyNb,fSeq,&previousOwner);
@@ -282,7 +282,7 @@ void Sorter::insertRetrieveRequest(RetrieveRequestInfosAccessorInterface& access
     log::ScopedParamContainer params(lc);
     auto rjqi = std::make_shared<RetrieveJobQueueInfo>();
     cta::common::dataStructures::ArchiveFile archiveFile = accessor.getArchiveFile();
-    cta::common::dataStructures::TapeFile jobTapeFile = archiveFile.tapeFiles[copyNb.value()];
+    cta::common::dataStructures::TapeFile jobTapeFile = archiveFile.tapeFiles.at(copyNb.value());
     try{
       Sorter::RetrieveJob jobToAdd = accessor.createRetrieveJob(archiveFile,jobTapeFile.copyNb,jobTapeFile.fSeq,&previousOwner);
       rjqi->jobToQueue = std::make_tuple(jobToAdd,std::promise<void>());
diff --git a/objectstore/SorterTest.cpp b/objectstore/SorterTest.cpp
index f4c39139ffc4c4b283b052c7bc696fe1d12c55fe..f1914d9030f237058ad5a9a4be154046ad2f7a49 100644
--- a/objectstore/SorterTest.cpp
+++ b/objectstore/SorterTest.cpp
@@ -239,20 +239,28 @@ TEST(ObjectStore,SorterInsertRetrieveRequest){
   rqc.archiveFile.diskInstance = "eoseos";
   rqc.archiveFile.fileSize = 1000;
   rqc.archiveFile.storageClass = "sc";
-  rqc.archiveFile.tapeFiles[1].blockId=0;
-  rqc.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc.archiveFile.tapeFiles[1].copyNb=1;
-  rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr);
-  rqc.archiveFile.tapeFiles[1].fSeq=2;
-  rqc.archiveFile.tapeFiles[1].vid="Tape0";
-  rqc.archiveFile.tapeFiles[2].blockId=0;
-  rqc.archiveFile.tapeFiles[2].compressedSize=2;
-  rqc.archiveFile.tapeFiles[2].compressedSize=2;
-  rqc.archiveFile.tapeFiles[2].copyNb=2;
-  rqc.archiveFile.tapeFiles[2].creationTime=time(nullptr);
-  rqc.archiveFile.tapeFiles[2].fSeq=2;
-  rqc.archiveFile.tapeFiles[2].vid="Tape1";
+  {
+    cta::common::dataStructures::TapeFile tf;
+    tf.blockId=0;
+    tf.compressedSize=1;
+    tf.compressedSize=1;
+    tf.copyNb=1;
+    tf.creationTime=time(nullptr);
+    tf.fSeq=2;
+    tf.vid="Tape0";
+    rqc.archiveFile.tapeFiles.push_back(tf);
+  }
+  {
+    cta::common::dataStructures::TapeFile tf;
+    tf.blockId=0;
+    tf.compressedSize=2;
+    tf.compressedSize=2;
+    tf.copyNb=2;
+    tf.creationTime=time(nullptr);
+    tf.fSeq=2;
+    tf.vid="Tape1";
+    rqc.archiveFile.tapeFiles.push_back(tf);
+  }
   rqc.mountPolicy.archiveMinRequestAge = 1;
   rqc.mountPolicy.archivePriority = 1;
   rqc.mountPolicy.creationLog.time = time(nullptr);
@@ -363,7 +371,7 @@ TEST(ObjectStore,SorterInsertRetrieveRequest){
     ASSERT_EQ(aFile.fileSize,rqc.archiveFile.fileSize);
     ASSERT_EQ(aFile.storageClass,rqc.archiveFile.storageClass);
     ASSERT_EQ(elt.copyNb,2);
-    ASSERT_EQ(elt.archiveFile.tapeFiles[2].compressedSize,2);
+    ASSERT_EQ(elt.archiveFile.tapeFiles.at(2).compressedSize,2);
     ASSERT_EQ(elt.bytes,1000);
     ASSERT_EQ(elt.reportType,cta::SchedulerDatabase::RetrieveJob::ReportType::NoReportRequired);
     ASSERT_EQ(elt.rr.archiveFileID,aFile.archiveFileID);
@@ -427,7 +435,7 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){
   rr.initialize();
   cta::common::dataStructures::RetrieveFileQueueCriteria rqc;
   rqc.archiveFile.archiveFileID = 1L;
-  rqc.archiveFile.diskFileId = "eos://diskFile";
+  rqc.archiveFile.diskFileId = "eos://diskFile1";
   rqc.archiveFile.checksumType = "";
   rqc.archiveFile.checksumValue = "";
   rqc.archiveFile.creationTime = 0;
@@ -436,13 +444,17 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){
   rqc.archiveFile.diskInstance = "eoseos";
   rqc.archiveFile.fileSize = 1000;
   rqc.archiveFile.storageClass = "sc";
-  rqc.archiveFile.tapeFiles[1].blockId=0;
-  rqc.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc.archiveFile.tapeFiles[1].copyNb=1;
-  rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr);
-  rqc.archiveFile.tapeFiles[1].fSeq=1;
-  rqc.archiveFile.tapeFiles[1].vid="Tape0";
+  {
+    cta::common::dataStructures::TapeFile tf;
+    tf.blockId=0;
+    tf.compressedSize=1;
+    tf.compressedSize=1;
+    tf.copyNb=1;
+    tf.creationTime=time(nullptr);
+    tf.fSeq=1;
+    tf.vid="Tape0";
+    rqc.archiveFile.tapeFiles.push_back(tf);
+  }
   rqc.mountPolicy.archiveMinRequestAge = 1;
   rqc.mountPolicy.archivePriority = 1;
   rqc.mountPolicy.creationLog.time = time(nullptr);
@@ -467,7 +479,7 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){
   rr2.initialize();
   cta::common::dataStructures::RetrieveFileQueueCriteria rqc2;
   rqc2.archiveFile.archiveFileID = 2L;
-  rqc2.archiveFile.diskFileId = "eos://diskFile";
+  rqc2.archiveFile.diskFileId = "eos://diskFile2";
   rqc2.archiveFile.checksumType = "";
   rqc2.archiveFile.checksumValue = "";
   rqc2.archiveFile.creationTime = 0;
@@ -476,13 +488,17 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){
   rqc2.archiveFile.diskInstance = "eoseos";
   rqc2.archiveFile.fileSize = 1000;
   rqc2.archiveFile.storageClass = "sc";
-  rqc2.archiveFile.tapeFiles[1].blockId=0;
-  rqc2.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc2.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc2.archiveFile.tapeFiles[1].copyNb=2;
-  rqc2.archiveFile.tapeFiles[1].creationTime=time(nullptr);
-  rqc2.archiveFile.tapeFiles[1].fSeq=2;
-  rqc2.archiveFile.tapeFiles[1].vid="Tape0";
+  {
+    cta::common::dataStructures::TapeFile tf;
+    tf.blockId=0;
+    tf.compressedSize=1;
+    tf.compressedSize=1;
+    tf.copyNb=2;
+    tf.creationTime=time(nullptr);
+    tf.fSeq=2;
+    tf.vid="Tape0";
+    rqc2.archiveFile.tapeFiles.push_back(tf);
+  }
   rqc2.mountPolicy.archiveMinRequestAge = 1;
   rqc2.mountPolicy.archivePriority = 1;
   rqc2.mountPolicy.creationLog.time = time(nullptr);
@@ -639,13 +655,13 @@ TEST(ObjectStore,SorterInsertDifferentTypesOfRequests){
     
     auto& elt = elements.elements.front();
     ASSERT_EQ(elt.copyNb,1);
-    ASSERT_EQ(elt.archiveFile.tapeFiles[1].vid,"Tape0");
-    ASSERT_EQ(elt.archiveFile.tapeFiles[1].fSeq,1);
+    ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).vid,"Tape0");
+    ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).fSeq,1);
     
     auto& elt2 = elements.elements.back();
     ASSERT_EQ(elt2.copyNb,2);
-    ASSERT_EQ(elt2.archiveFile.tapeFiles[2].vid,"Tape0");
-    ASSERT_EQ(elt2.archiveFile.tapeFiles[2].fSeq,2);
+    ASSERT_EQ(elt2.archiveFile.tapeFiles.at(2).vid,"Tape0");
+    ASSERT_EQ(elt2.archiveFile.tapeFiles.at(2).fSeq,2);
     
   }
   {
@@ -885,13 +901,17 @@ TEST(ObjectStore,SorterInsertRetrieveRequestNotFetched){
   rqc.archiveFile.diskInstance = "eoseos";
   rqc.archiveFile.fileSize = 1000;
   rqc.archiveFile.storageClass = "sc";
-  rqc.archiveFile.tapeFiles[1].blockId=0;
-  rqc.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc.archiveFile.tapeFiles[1].compressedSize=1;
-  rqc.archiveFile.tapeFiles[1].copyNb=1;
-  rqc.archiveFile.tapeFiles[1].creationTime=time(nullptr);
-  rqc.archiveFile.tapeFiles[1].fSeq=1;
-  rqc.archiveFile.tapeFiles[1].vid="Tape0";
+  {
+    cta::common::dataStructures::TapeFile tf;
+    tf.blockId=0;
+    tf.compressedSize=1;
+    tf.compressedSize=1;
+    tf.copyNb=1;
+    tf.creationTime=time(nullptr);
+    tf.fSeq=1;
+    tf.vid="Tape0";
+    rqc.archiveFile.tapeFiles.push_back(tf);
+  }
   rqc.mountPolicy.archiveMinRequestAge = 1;
   rqc.mountPolicy.archivePriority = 1;
   rqc.mountPolicy.creationLog.time = time(nullptr);
@@ -914,10 +934,10 @@ TEST(ObjectStore,SorterInsertRetrieveRequestNotFetched){
   request.archiveFile = rqc.archiveFile;
   
   for(auto& tf: request.archiveFile.tapeFiles){
-    Sorter::RetrieveJob& job = request.retrieveJobs[tf.first];
-    job.fSeq = tf.second.fSeq;
+    Sorter::RetrieveJob& job = request.retrieveJobs[tf.copyNb];
+    job.fSeq = tf.fSeq;
     job.fileSize = rqc.archiveFile.fileSize;
-    job.jobDump.copyNb = tf.first;
+    job.jobDump.copyNb = tf.copyNb;
     job.jobDump.status = serializers::RetrieveJobStatus::RJS_ToTransferForUser;
     job.jobQueueType = JobQueueType::JobsToTransferForUser;
     job.mountPolicy = rqc.mountPolicy;
@@ -956,8 +976,8 @@ TEST(ObjectStore,SorterInsertRetrieveRequestNotFetched){
     
     auto& elt = elements.elements.front();
     ASSERT_EQ(elt.copyNb,1);
-    ASSERT_EQ(elt.archiveFile.tapeFiles[1].vid,"Tape0");
-    ASSERT_EQ(elt.archiveFile.tapeFiles[1].fSeq,1);
+    ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).vid,"Tape0");
+    ASSERT_EQ(elt.archiveFile.tapeFiles.at(1).fSeq,1);
     ASSERT_EQ(elt.archiveFile.checksumValue,"checksumValue");
     ASSERT_EQ(elt.archiveFile.checksumType,"checksumType");
     ASSERT_EQ(elt.archiveFile.diskInstance,"eoseos");
diff --git a/scheduler/OStoreDB/MemQueues.cpp b/scheduler/OStoreDB/MemQueues.cpp
index d48ada3f661d78ff3d221e2515c5d589a3ad7f8d..8bef86b8a4aa9cea635a88e2a29d3836a12e1096 100644
--- a/scheduler/OStoreDB/MemQueues.cpp
+++ b/scheduler/OStoreDB/MemQueues.cpp
@@ -52,11 +52,11 @@ void MemQueue<objectstore::RetrieveRequest, objectstore::RetrieveQueue>::special
     auto & job = jta.job;
     auto & request = jta.request;
     for (auto & j: request.getArchiveFile().tapeFiles) {
-      if (j.second.copyNb == job.copyNb) {
+      if (j.copyNb == job.copyNb) {
         auto criteria = request.getRetrieveFileQueueCriteria();
-        jtal.push_back({j.second.copyNb, j.second.fSeq, request.getAddressIfSet(), criteria.archiveFile.fileSize, 
+        jtal.push_back({j.copyNb, j.fSeq, request.getAddressIfSet(), criteria.archiveFile.fileSize, 
             criteria.mountPolicy, request.getEntryLog().time});
-        request.setActiveCopyNumber(j.second.copyNb);
+        request.setActiveCopyNumber(j.copyNb);
         request.setOwner(queueAddress);
         goto jobAdded;
       }
diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp
index 2191f217b0103a40b3f6abdf8e4ccec59d14523e..6f1d126e15838c980ff3e0944b85311fa95680c5 100644
--- a/scheduler/OStoreDB/OStoreDB.cpp
+++ b/scheduler/OStoreDB/OStoreDB.cpp
@@ -1047,13 +1047,13 @@ void OStoreDB::setRetrieveJobBatchReportedToUser(std::list<cta::SchedulerDatabas
     for(auto &j : queue.second) {
       auto tf_it = j.job->archiveFile.tapeFiles.begin();
       while(tf_it != j.job->archiveFile.tapeFiles.end()) {
-        if(queue.first == tf_it->second.vid) break;
+        if(queue.first == tf_it->vid) break;
       }
       if(tf_it == j.job->archiveFile.tapeFiles.end()) throw cta::exception::Exception(
         "In OStoreDB::setRetrieveJobBatchReported(): tape copy not found"
       );
       insertedElements.emplace_back(CaRQF::InsertedElement{
-        &j.job->m_retrieveRequest, tf_it->second.copyNb, tf_it->second.fSeq, tf_it->second.compressedSize,
+        &j.job->m_retrieveRequest, tf_it->copyNb, tf_it->fSeq, tf_it->compressedSize,
         common::dataStructures::MountPolicy(), serializers::RetrieveJobStatus::RJS_Failed
       });
     }
@@ -1089,13 +1089,13 @@ std::string OStoreDB::queueRetrieve(const cta::common::dataStructures::RetrieveR
   cta::utils::Timer timer;
   // Get the best vid from the cache
   std::set<std::string> candidateVids;
-  for (auto & tf:criteria.archiveFile.tapeFiles) candidateVids.insert(tf.second.vid);
+  for (auto & tf:criteria.archiveFile.tapeFiles) candidateVids.insert(tf.vid);
   std::string bestVid=Helpers::selectBestRetrieveQueue(candidateVids, m_catalogue, m_objectStore);
   // Check that the requested retrieve job (for the provided vid) exists, and record the copynb.
   uint64_t bestCopyNb;
   for (auto & tf: criteria.archiveFile.tapeFiles) {
-    if (tf.second.vid == bestVid) {
-      bestCopyNb = tf.second.copyNb;
+    if (tf.vid == bestVid) {
+      bestCopyNb = tf.copyNb;
       goto vidFound;
     }
   }
@@ -1135,7 +1135,7 @@ std::string OStoreDB::queueRetrieve(const cta::common::dataStructures::RetrieveR
     double agentReferencingTime = timer.secs(cta::utils::Timer::reset_t::resetCounter);
     rReq->setOwner(m_agentReference->getAgentAddress());
     // "Select" an arbitrary copy number. This is needed to serialize the object.
-    rReq->setActiveCopyNumber(criteria.archiveFile.tapeFiles.begin()->second.copyNb);
+    rReq->setActiveCopyNumber(criteria.archiveFile.tapeFiles.begin()->copyNb);
     rReq->insert();
     double insertionTime = timer.secs(cta::utils::Timer::reset_t::resetCounter);
     m_taskQueueSize++;
@@ -2149,12 +2149,12 @@ void OStoreDB::RepackRequest::addSubrequests(std::list<Subrequest>& repackSubreq
       uint32_t activeCopyNumber = 0;
       // Make sure we have a copy on the vid we intend to repack.
       for (auto & tc: rsr.archiveFile.tapeFiles) {
-        if (tc.second.vid == repackInfo.vid) {
+        if (tc.vid == repackInfo.vid) {
           try {
             // Try to select the repack VID from a one-vid list.
             Helpers::selectBestRetrieveQueue({repackInfo.vid}, m_oStoreDB.m_catalogue, m_oStoreDB.m_objectStore);
             bestVid = repackInfo.vid;
-            activeCopyNumber = tc.second.copyNb;
+            activeCopyNumber = tc.copyNb;
           } catch (Helpers::NoTapeAvailableForRetrieve &) {}
           break;
         }
@@ -2162,7 +2162,7 @@ void OStoreDB::RepackRequest::addSubrequests(std::list<Subrequest>& repackSubreq
       // The repack vid was not appropriate, let's try all candidates.
       if (bestVid.empty()) {
         std::set<std::string> candidateVids;
-        for (auto & tc: rsr.archiveFile.tapeFiles) candidateVids.insert(tc.second.vid);
+        for (auto & tc: rsr.archiveFile.tapeFiles) candidateVids.insert(tc.vid);
         try {
           bestVid = Helpers::selectBestRetrieveQueue(candidateVids, m_oStoreDB.m_catalogue, m_oStoreDB.m_objectStore);
         } catch (Helpers::NoTapeAvailableForRetrieve &) {
@@ -2179,8 +2179,8 @@ void OStoreDB::RepackRequest::addSubrequests(std::list<Subrequest>& repackSubreq
         }
       }
       for (auto &tc: rsr.archiveFile.tapeFiles)
-        if (tc.second.vid == bestVid) {
-          activeCopyNumber = tc.second.copyNb;
+        if (tc.vid == bestVid) {
+          activeCopyNumber = tc.copyNb;
           goto copyNbFound;
         }
       {
@@ -3468,7 +3468,7 @@ void OStoreDB::RetrieveMount::flushAsyncSuccessReports(std::list<cta::SchedulerD
     std::map<objectstore::RetrieveRequest *, OStoreDB::RetrieveJob *> requestToJobMap;
     for (auto & req: repackRequestQueue.second) {
       insertedRequests.push_back(RQTRTRFSAlgo::InsertedElement{&req->m_retrieveRequest, req->selectedCopyNb, 
-          req->archiveFile.tapeFiles[req->selectedCopyNb].fSeq, req->archiveFile.fileSize,
+          req->archiveFile.tapeFiles.at(req->selectedCopyNb).fSeq, req->archiveFile.fileSize,
           cta::common::dataStructures::MountPolicy::s_defaultMountPolicyForRepack,
           serializers::RetrieveJobStatus::RJS_ToReportToRepackForSuccess});
       requestToJobMap[&req->m_retrieveRequest] = req;
@@ -4264,8 +4264,8 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log::
 
       std::set<std::string> candidateVids;
       for(auto &tf: af.tapeFiles) {
-        if(m_retrieveRequest.getJobStatus(tf.second.copyNb) == serializers::RetrieveJobStatus::RJS_ToReportToUserForFailure)
-          candidateVids.insert(tf.second.vid);
+        if(m_retrieveRequest.getJobStatus(tf.copyNb) == serializers::RetrieveJobStatus::RJS_ToReportToUserForFailure)
+          candidateVids.insert(tf.vid);
       }
       if(candidateVids.empty()) {
         throw cta::exception::Exception(
@@ -4278,14 +4278,14 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log::
         m_oStoreDB.m_objectStore);
 
       auto tf_it = af.tapeFiles.begin();
-      for( ; tf_it != af.tapeFiles.end() && tf_it->second.vid != bestVid; ++tf_it) ;
+      for( ; tf_it != af.tapeFiles.end() && tf_it->vid != bestVid; ++tf_it) ;
       if(tf_it == af.tapeFiles.end()) {
         std::stringstream err;
         err << "In OStoreDB::RetrieveJob::failTransfer(): no tape file for requested vid."
             << " archiveId=" << af.archiveFileID << " vid=" << bestVid;
         throw RetrieveRequestHasNoCopies(err.str());
       }
-      auto &tf = tf_it->second;
+      auto &tf = *tf_it;
 
       CaRqtr::InsertedElement::list insertedElements;
       insertedElements.push_back(CaRqtr::InsertedElement{
@@ -4328,8 +4328,8 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log::
 
       std::set<std::string> candidateVids;
       for(auto &tf : af.tapeFiles) {
-        if(m_retrieveRequest.getJobStatus(tf.second.copyNb) == serializers::RetrieveJobStatus::RJS_ToTransferForUser)
-          candidateVids.insert(tf.second.vid);
+        if(m_retrieveRequest.getJobStatus(tf.copyNb) == serializers::RetrieveJobStatus::RJS_ToTransferForUser)
+          candidateVids.insert(tf.vid);
       }
       if(candidateVids.empty()) {
         throw cta::exception::Exception(
@@ -4344,14 +4344,14 @@ void OStoreDB::RetrieveJob::failTransfer(const std::string &failureReason, log::
         m_oStoreDB.m_objectStore);
 
       auto tf_it = af.tapeFiles.begin();
-      for( ; tf_it != af.tapeFiles.end() && tf_it->second.vid != bestVid; ++tf_it) ;
+      for( ; tf_it != af.tapeFiles.end() && tf_it->vid != bestVid; ++tf_it) ;
       if(tf_it == af.tapeFiles.end()) {
         std::stringstream err;
         err << "In OStoreDB::RetrieveJob::failTransfer(): no tape file for requested vid."
             << " archiveId=" << af.archiveFileID << " vid=" << bestVid;
         throw RetrieveRequestHasNoCopies(err.str());
       }
-      auto &tf = tf_it->second;
+      auto &tf = *tf_it;
 
       CaRqtr::InsertedElement::list insertedElements;
       insertedElements.push_back(CaRqtr::InsertedElement{
@@ -4399,9 +4399,7 @@ void OStoreDB::RetrieveJob::failReport(const std::string &failureReason, log::Lo
   auto &af   = rfqc.archiveFile;
 
   // Handle report failures for all tape copies in turn
-  for(auto &aftf: af.tapeFiles) {
-    auto &tf = aftf.second;
-
+  for(auto &tf: af.tapeFiles) {
     // Add a job failure and decide what to do next
     EnqueueingNextStep enQueueingNextStep = m_retrieveRequest.addReportFailure(tf.copyNb, m_mountId, failureReason, lc);
 
diff --git a/scheduler/OStoreDB/QueueItor.cpp b/scheduler/OStoreDB/QueueItor.cpp
index d07bed698c16cc92d40530776886efb5c93e358e..dee57e6f037cf06c6c45e8f43fe7b7eaf396db27 100644
--- a/scheduler/OStoreDB/QueueItor.cpp
+++ b/scheduler/OStoreDB/QueueItor.cpp
@@ -204,13 +204,13 @@ getQueueJobs(const jobQueue_t &jobQueueChunk)
 
     // Find the copy for this Volume ID
     for(auto &tf: osrr.first.getArchiveFile().tapeFiles) {
-      if(tf.second.vid == m_jobQueuesQueueIt->vid) {
+      if(tf.vid == m_jobQueuesQueueIt->vid) {
         auto job = cta::common::dataStructures::RetrieveJob();
 
-        job.request                   = osrr.first.getSchedulerRequest();
-        job.fileSize                  = osrr.first.getArchiveFile().fileSize;
-        job.tapeCopies[tf.second.vid] = std::make_pair(tf.second.copyNb, tf.second);
-        job.failurelogs               = osrr.first.getFailures();
+        job.request            = osrr.first.getSchedulerRequest();
+        job.fileSize           = osrr.first.getArchiveFile().fileSize;
+        job.tapeCopies[tf.vid] = std::make_pair(tf.copyNb, tf);
+        job.failurelogs        = osrr.first.getFailures();
 
         m_jobCache.push_back(job);
       }
diff --git a/scheduler/RetrieveJob.cpp b/scheduler/RetrieveJob.cpp
index 21900bc27437670280eec013512ac9126b84a7e0..567119857c1b63b43f929f391077acd78987fbf2 100644
--- a/scheduler/RetrieveJob.cpp
+++ b/scheduler/RetrieveJob.cpp
@@ -84,22 +84,12 @@ void cta::RetrieveJob::transferFailed(const std::string &failureReason, log::Log
 // selectedTapeFile
 //------------------------------------------------------------------------------
 cta::common::dataStructures::TapeFile& cta::RetrieveJob::selectedTapeFile() {
-  try {
-    return archiveFile.tapeFiles.at(selectedCopyNb);
-  } catch (std::out_of_range &ex) {
-    auto __attribute__((__unused__)) & debug=ex;
-    throw std::runtime_error(std::string("cta::RetrieveJob::selectedTapeFile(): ") + ex.what());
-  }
+  return archiveFile.tapeFiles.at(selectedCopyNb);
 }
 
 //------------------------------------------------------------------------------
 // selectedTapeFile
 //------------------------------------------------------------------------------
 const cta::common::dataStructures::TapeFile& cta::RetrieveJob::selectedTapeFile() const {
-  try {
-    return archiveFile.tapeFiles.at(selectedCopyNb);
-  } catch (std::out_of_range &ex) {
-    auto __attribute__((__unused__)) & debug=ex;
-    throw std::runtime_error(std::string("cta::RetrieveJob::selectedTapeFile(): ") + ex.what());
-  }
+  return archiveFile.tapeFiles.at(selectedCopyNb);
 }
diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index 6751f0c30dec003c1312b3e12e76064ca4619c64..f2f9b67d2b58e81043a2291455ca7e567798960e 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -238,8 +238,8 @@ void Scheduler::queueRetrieve(
      .add("storageClass", queueCriteria.archiveFile.storageClass);
   for (auto & tf:queueCriteria.archiveFile.tapeFiles) {
     std::stringstream tc;
-    tc << "tapeCopy" << tf.first;
-    spc.add(tc.str(), tf.second);
+    tc << "tapeCopy" << tf.copyNb;
+    spc.add(tc.str(), tf);
   }
   spc.add("selectedVid", selectedVid)
      .add("catalogueTime", catalogueTime)
@@ -464,13 +464,13 @@ void Scheduler::expandRepackRequest(std::unique_ptr<RepackRequest>& repackReques
       // We have to determine which copynbs we want to rearchive, and under which fSeq we record this file.
       if (repackInfo.type == RepackType::MoveAndAddCopies || repackInfo.type == RepackType::MoveOnly) {
         // determine which fSeq(s) (normally only one) lives on this tape.
-        for (auto & tc: archiveFile.tapeFiles) if (tc.second.vid == repackInfo.vid) {
-          rsr.copyNbsToRearchive.insert(tc.second.copyNb);
+        for (auto & tc: archiveFile.tapeFiles) if (tc.vid == repackInfo.vid) {
+          rsr.copyNbsToRearchive.insert(tc.copyNb);
           // We make the (reasonable) assumption that the archive file only has one copy on this tape.
           // If not, we will ensure the subrequest is filed under the lowest fSeq existing on this tape.
           // This will prevent double subrequest creation (we already have such a mechanism in case of crash and 
           // restart of expansion.
-          rsr.fSeq = std::min(tc.second.fSeq, rsr.fSeq);
+          rsr.fSeq = std::min(tc.fSeq, rsr.fSeq);
           maxAddedFSeq = std::max(maxAddedFSeq, rsr.fSeq);
           totalStatsFile.totalFilesToArchive += 1;
           totalStatsFile.totalBytesToArchive += rsr.archiveFile.fileSize;
diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp
index 4e1383b6fc286f1ffe730c24bf1ef123d1e99699..7ff994ac948e6c6aefc09d73fb61c1eeb03c560a 100644
--- a/scheduler/SchedulerTest.cpp
+++ b/scheduler/SchedulerTest.cpp
@@ -1554,7 +1554,7 @@ TEST_P(SchedulerTest, expandRepackRequest) {
           cta::objectstore::RetrieveRequest retrieveRequest(job.address,schedulerDB.getBackend());
           retrieveRequest.fetchNoLock();
           uint32_t copyNb = job.copyNb;
-          common::dataStructures::TapeFile tapeFile = retrieveRequest.getArchiveFile().tapeFiles[copyNb];
+          common::dataStructures::TapeFile tapeFile = retrieveRequest.getArchiveFile().tapeFiles.at(copyNb);
           common::dataStructures::RetrieveRequest schedulerRetrieveRequest = retrieveRequest.getSchedulerRequest();
           common::dataStructures::ArchiveFile archiveFile = retrieveRequest.getArchiveFile();
 
diff --git a/scheduler/testingMocks/MockRetrieveJob.hpp b/scheduler/testingMocks/MockRetrieveJob.hpp
index fb8128aadde9f806bab026ae55f6df51a9bf76ab..65acd9c3c8a323f97cc29f7258453be77f025a1b 100644
--- a/scheduler/testingMocks/MockRetrieveJob.hpp
+++ b/scheduler/testingMocks/MockRetrieveJob.hpp
@@ -31,7 +31,9 @@ namespace cta {
     cta::common::dataStructures::RetrieveRequest(), 
     cta::common::dataStructures::ArchiveFile(), 1,
     cta::PositioningMethod::ByBlock), completes(0), failures(0) {
-      archiveFile.tapeFiles[1];
+      common::dataStructures::TapeFile tf;
+      tf.copyNb = 1;
+      archiveFile.tapeFiles.push_back(tf);
     } 
     virtual void asyncSetSuccessful() override { completes++;  }
     void transferFailed(const std::string &failureReason, cta::log::LogContext&) override { failures++; };
diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp
index 9165dbac7e6f919275202f251c2e3ddf9311117a..9739ae3a9185d518cd8b9f233b82d871ba5ec6b9 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp
@@ -111,7 +111,9 @@ namespace unitTests{
     std::unique_ptr<TestingRetrieveJob> fileToRecall(new TestingRetrieveJob(mrm));
     fileToRecall->retrieveRequest.archiveFileID = 1;
     fileToRecall->selectedCopyNb=1;
-    fileToRecall->archiveFile.tapeFiles[1];
+    cta::common::dataStructures::TapeFile tf;
+    tf.copyNb = 1;
+    fileToRecall->archiveFile.tapeFiles.push_back(tf);
     DiskWriteTask t(fileToRecall.release(),mm);
     for(int i=0;i<6;++i){
       MemBlock* mb=mm.getFreeBlock();
diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp
index 92b9206f0676838abe2e4c0b0799079e42556392..2fff5e769f016d9118971c56a1cad2ebcd4f947d 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp
@@ -117,7 +117,9 @@ namespace unitTests{
       fileToRecall->retrieveRequest.archiveFileID = i+1;
       fileToRecall->retrieveRequest.dstURL = "/dev/null";
       fileToRecall->selectedCopyNb=1;
-      fileToRecall->archiveFile.tapeFiles[1];
+      cta::common::dataStructures::TapeFile tf;
+      tf.copyNb = 1;
+      fileToRecall->archiveFile.tapeFiles.push_back(tf);
       fileToRecall->selectedTapeFile().blockId = 1;
       DiskWriteTask* t=new DiskWriteTask(fileToRecall.release(),mm);
       MemBlock* mb=mm.getFreeBlock();
diff --git a/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp b/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp
index 683f1f9545445be1d4446da5c47b5923c522bcdd..12b63097edabc5889509ae00c5fa282858d2a446 100644
--- a/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp
+++ b/tapeserver/castor/tape/tapeserver/file/BasicReadWriteTest.cpp
@@ -217,7 +217,7 @@ int main (int argc, char *argv[])
 
                 BasicRetrieveJob fileToRecall;
                 fileToRecall.selectedCopyNb=1;
-                fileToRecall.archiveFile.tapeFiles[1];
+                fileToRecall.archiveFile.tapeFiles.push_back(cta::common::dataStructures::TapeFile());
                 fileToRecall.selectedTapeFile().blockId = 110; // here should be the block ID of HDR1
                 fileToRecall.selectedTapeFile().fSeq = 2;
                 fileToRecall.retrieveRequest.archiveFileID = 2;
diff --git a/tapeserver/castor/tape/tapeserver/file/FileTest.cpp b/tapeserver/castor/tape/tapeserver/file/FileTest.cpp
index 1045ace1b565f546e4e08bd985481e328863b5d3..f9d05ae973c1bc4140e59af6c58578cd07a369d0 100644
--- a/tapeserver/castor/tape/tapeserver/file/FileTest.cpp
+++ b/tapeserver/castor/tape/tapeserver/file/FileTest.cpp
@@ -60,9 +60,11 @@ namespace unitTests {
       block_size = 262144;
       label = "K00001";
       fileToRecall.selectedCopyNb=1;
-      fileToRecall.archiveFile.tapeFiles[1];
-      fileToRecall.selectedTapeFile().blockId = 0;
-      fileToRecall.selectedTapeFile().fSeq = 1;
+      cta::common::dataStructures::TapeFile tf;
+      tf.blockId = 0;
+      tf.fSeq = 1;
+      tf.copyNb = 1;
+      fileToRecall.archiveFile.tapeFiles.push_back(tf);
       fileToRecall.retrieveRequest.archiveFileID = 1;
       fileToMigrate.archiveFile.fileSize = 500;
       fileToMigrate.archiveFile.archiveFileID = 1;
diff --git a/xroot_plugins/XrdCtaArchiveFileLs.hpp b/xroot_plugins/XrdCtaArchiveFileLs.hpp
index 4e7b1caf4196aecc45ae6546808a002daaa37258..99ccaca1df4c883c78c39a12559771b28ebb6ee1 100644
--- a/xroot_plugins/XrdCtaArchiveFileLs.hpp
+++ b/xroot_plugins/XrdCtaArchiveFileLs.hpp
@@ -112,10 +112,12 @@ public:
 
           // Tape file
           auto tf = record.mutable_afls_item()->mutable_tf();
-          tf->set_vid(jt->second.vid);
-          tf->set_f_seq(jt->second.fSeq);
-          tf->set_block_id(jt->second.blockId);
-          record.mutable_afls_item()->set_copy_nb(jt->second.copyNb);
+          tf->set_vid(jt->vid);
+          tf->set_f_seq(jt->fSeq);
+          tf->set_block_id(jt->blockId);
+          tf->set_superseded_by_vid(jt->supersededByVid);
+          tf->set_superseded_by_f_seq(jt->supersededByFSeq);
+          record.mutable_afls_item()->set_copy_nb(jt->copyNb);
 
           // is_buffer_full is set to true when we have one full block of data in the buffer, i.e.
           // enough data to send to the client. The actual buffer size is double the block size,