diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp
index 1925fbc383a38372d832294235c8b77cbbe3ae42..f66237dc701c0a1b094a69a9996320b8eef0b2c6 100644
--- a/objectstore/Helpers.cpp
+++ b/objectstore/Helpers.cpp
@@ -101,6 +101,7 @@ void Helpers::getLockedAndFetchedQueue<ArchiveQueue>(ArchiveQueue& archiveQueue,
       // We also need to make sure the lock on the queue is released (it is in
       // an object and hence not scoped).
       if (archiveQueueLock.isLocked()) archiveQueueLock.release();
+      archiveQueue.resetAddress();
       log::ScopedParamContainer params(lc);
       params.add("attemptNb", i+1)
             .add("exceptionMessage", ex.getMessageValue())
@@ -118,11 +119,13 @@ void Helpers::getLockedAndFetchedQueue<ArchiveQueue>(ArchiveQueue& archiveQueue,
     } catch (...) {
       // Also release the lock if needed here.
       if (archiveQueueLock.isLocked()) archiveQueueLock.release();
+      archiveQueue.resetAddress();
       throw;
     }
   }
   // Also release the lock if needed here.
   if (archiveQueueLock.isLocked()) archiveQueueLock.release();
+  archiveQueue.resetAddress();
   throw cta::exception::Exception(std::string(
       "In OStoreDB::getLockedAndFetchedArchiveQueue(): failed to find or create and lock archive queue after 5 retries for tapepool: ")
       + tapePool);
diff --git a/objectstore/ObjectOps.hpp b/objectstore/ObjectOps.hpp
index 598b2483aecaad3a24d25c2334696d7d3a9c7c0d..727b1abf1ac161cb4ed7ba51236fbfe6737ec4ea 100644
--- a/objectstore/ObjectOps.hpp
+++ b/objectstore/ObjectOps.hpp
@@ -52,6 +52,7 @@ public:
   CTA_GENERATE_EXCEPTION_CLASS(AddressAlreadySet);
   CTA_GENERATE_EXCEPTION_CLASS(InvalidAddress);
   CTA_GENERATE_EXCEPTION_CLASS(FailedToSerialize);
+  CTA_GENERATE_EXCEPTION_CLASS(StillLocked);
 protected:
   void checkHeaderWritable() {
     if (!m_headerInterpreted) 
@@ -91,13 +92,24 @@ public:
   
   void setAddress(const std::string & name) {
     if (m_nameSet)
-      throw AddressAlreadySet("In ObjectOps::setName: trying to overwrite an already set name");
+      throw AddressAlreadySet("In ObjectOps::setAddress(): trying to overwrite an already set name");
     if (name.empty())
-      throw InvalidAddress("In ObjectOps::setName: empty name");
+      throw InvalidAddress("In ObjectOps::setAddress(): empty name");
     m_name = name;
     m_nameSet = true;
   }
   
+  void resetAddress() {
+    if (m_locksCount || m_locksForWriteCount) {
+      throw StillLocked("In ObjectOps::resetAddress: reset the address of a locked object");
+    }
+    m_nameSet = false;
+    m_name = "";
+    m_headerInterpreted = false;
+    m_payloadInterpreted = false;
+    m_existingObject = false;
+  }
+  
   std::string & getAddressIfSet() {
     if (!m_nameSet) {
       throw AddressNotSet("In ObjectOpsBase::getNameIfSet: name not set yet");