diff --git a/objectstore/Agent.cpp b/objectstore/Agent.cpp
index 679ba05743dea76b161c2c506e88edbbf429cd18..8653aab3de26d3aba763b574fe723cb3723cf312 100644
--- a/objectstore/Agent.cpp
+++ b/objectstore/Agent.cpp
@@ -47,7 +47,7 @@ void cta::objectstore::Agent::initialize() {
   m_payloadInterpreted = true;
 }
 
-void cta::objectstore::Agent::insertAndRegisterSelf() {
+void cta::objectstore::Agent::insertAndRegisterSelf(log::LogContext & lc) {
   // We suppose initialize was already called, and that the agent name
   // is set.
   // We need to get hold of the agent register, which we suppose is available
diff --git a/objectstore/Agent.hpp b/objectstore/Agent.hpp
index 67b45820f38731d514ea2ae7d4649aac32c8aac2..61ddcd080deca9b42835bb7c57964d38460903ee 100644
--- a/objectstore/Agent.hpp
+++ b/objectstore/Agent.hpp
@@ -50,7 +50,7 @@ public:
 
   void initialize();
 
-  void insertAndRegisterSelf();
+  void insertAndRegisterSelf(log::LogContext & lc);
   
   void removeAndUnregisterSelf(log::LogContext & lc);
   
diff --git a/objectstore/AgentRegister.cpp b/objectstore/AgentRegister.cpp
index 6febd1f85f64a1c95ea446e9f15f216a3ea3e2c1..433006ce5eb82fe12b30b9b5319aa254d1a58bcb 100644
--- a/objectstore/AgentRegister.cpp
+++ b/objectstore/AgentRegister.cpp
@@ -47,10 +47,10 @@ void cta::objectstore::AgentRegister::garbageCollect(const std::string &presumed
   if (!isEmpty()) {
     throw (NotEmpty("Trying to garbage collect a non-empty AgentRegister: internal error"));
   }
+  remove();
   log::ScopedParamContainer params(lc);
   params.add("agentRegisterObject", getAddressIfSet());
-  lc.log(log::INFO, "In AgentRegister::garbageCollect(): Garbage collected and moved agent register object.");
-  remove();
+  lc.log(log::INFO, "In AgentRegister::garbageCollect(): Garbage collected and removed agent register object.");
 }
 
 
diff --git a/objectstore/ArchiveQueue.cpp b/objectstore/ArchiveQueue.cpp
index 313ff38258ea88eaea55470cbdb3c4d47bab58a4..57fef41d6e5444d15df99c9ca9290990ef1c8dfe 100644
--- a/objectstore/ArchiveQueue.cpp
+++ b/objectstore/ArchiveQueue.cpp
@@ -131,7 +131,7 @@ void ArchiveQueue::garbageCollect(const std::string &presumedOwner, AgentReferen
   remove();
   log::ScopedParamContainer params(lc);
   params.add("archiveQueueObject", getAddressIfSet());
-  lc.log(log::INFO, "In ArchiveQueue::garbageCollect(): Garbage collected and moved archive queue object.");
+  lc.log(log::INFO, "In ArchiveQueue::garbageCollect(): Garbage collected and removed archive queue object.");
 }
 
 void ArchiveQueue::setTapePool(const std::string& name) {
diff --git a/objectstore/ArchiveRequest.cpp b/objectstore/ArchiveRequest.cpp
index 2741808ec023867e8e83bcdb5a369e4d1913401e..0d509cb72a20d67dce05faf8de42194d662fa408 100644
--- a/objectstore/ArchiveRequest.cpp
+++ b/objectstore/ArchiveRequest.cpp
@@ -566,7 +566,7 @@ bool ArchiveRequest::finishIfNecessary(log::LogContext & lc) {
   remove();
   log::ScopedParamContainer params(lc);
   params.add("archiveRequestObject", getAddressIfSet());
-  lc.log(log::INFO, "In ArchiveRequest::finishIfNecessary(): Removing completed request.");
+  lc.log(log::INFO, "In ArchiveRequest::finishIfNecessary(): Removed completed request.");
   return true;
 }
 
diff --git a/objectstore/BackendPopulator.cpp b/objectstore/BackendPopulator.cpp
index 95f5067d6bf501bc553064b0f8b3012d2c68d73f..8576fcb3b8760ae1a2d2366c7dfc0e6f17124ea5 100644
--- a/objectstore/BackendPopulator.cpp
+++ b/objectstore/BackendPopulator.cpp
@@ -32,17 +32,18 @@ BackendPopulator::BackendPopulator(cta::objectstore::Backend & be,
   re.fetchNoLock();
   cta::objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL));
   // We might have to create the agent register (but this is unlikely)
+  log::LogContext lc2(lc);
   try {
     re.getAgentRegisterAddress();
   } catch (...) {
     RootEntry re2(m_backend);
     ScopedExclusiveLock rel(re2);
     re2.fetch();
-    re2.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl);
+    re2.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl, lc2);
   }
   Agent agent(m_agentReference.getAgentAddress(), m_backend);
   agent.initialize();
-  agent.insertAndRegisterSelf();
+  agent.insertAndRegisterSelf(lc2);
   // Likewise, make sure the drive register is around.
   try {
     re.getDriveRegisterAddress();
diff --git a/objectstore/DriveRegister.cpp b/objectstore/DriveRegister.cpp
index dc8ca4558bd1077b03ad257a2b47d9c8f6cdea03..5fb36acd46b281e94c8e923d3e70eac06cc17713 100644
--- a/objectstore/DriveRegister.cpp
+++ b/objectstore/DriveRegister.cpp
@@ -98,6 +98,9 @@ void DriveRegister::garbageCollect(const std::string &presumedOwner, AgentRefere
     throw (NotEmpty("Trying to garbage collect a non-empty AgentRegister: internal error"));
   }
   remove();
+  log::ScopedParamContainer params(lc);
+  params.add("driveRegisterObject", getAddressIfSet());
+  lc.log(log::INFO, "In DriveRegister::garbageCollect(): Garbage collected and removed drive register object.");
 }
 
 //------------------------------------------------------------------------------
diff --git a/objectstore/DriveState.cpp b/objectstore/DriveState.cpp
index 000ef415a98cc8ace77127480276eae447ca295f..4ee44117dc3a15e7cde082b7345f711405a7fde7 100644
--- a/objectstore/DriveState.cpp
+++ b/objectstore/DriveState.cpp
@@ -35,6 +35,9 @@ void DriveState::garbageCollect(const std::string& presumedOwner, AgentReference
   if (presumedOwner != m_header.owner())
     return;
   remove();
+  log::ScopedParamContainer params(lc);
+  params.add("driveStateObject", getAddressIfSet());
+  lc.log(log::INFO, "In DriveState::garbageCollect(): Garbage collected and removed drive state object.");
 }
 
 void DriveState::initialize(const std::string & driveName) {
diff --git a/objectstore/GarbageCollectorTest.cpp b/objectstore/GarbageCollectorTest.cpp
index 14ea0a465e03ead71a93f5d2ce63b776701a9b83..5b3e6edbc98705fe92973a44b7a15ffe09bf7d9c 100644
--- a/objectstore/GarbageCollectorTest.cpp
+++ b/objectstore/GarbageCollectorTest.cpp
@@ -59,7 +59,7 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) {
     cta::objectstore::EntryLogSerDeser el("user0",
       "unittesthost", time(NULL));
   cta::objectstore::ScopedExclusiveLock rel(re);
-  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el);
+  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc);
   rel.release();
   // Create 2 agents, A and B and register them
   // The agents are set with a timeout of 0, so they will be delclared
@@ -68,16 +68,16 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) {
   cta::objectstore::Agent agA(agrA.getAgentAddress(), be), agB(agrB.getAgentAddress(), be);
   agA.initialize();
   agA.setTimeout_us(0);
-  agA.insertAndRegisterSelf();
+  agA.insertAndRegisterSelf(lc);
   agB.initialize();
   agB.setTimeout_us(0);
-  agB.insertAndRegisterSelf();
+  agB.insertAndRegisterSelf(lc);
   // Create the garbage colletor and run it twice.
   cta::objectstore::AgentReference gcAgentRef("unitTestGarbageCollector", dl);
   cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be);
   gcAgent.initialize();
   gcAgent.setTimeout_us(0);
-  gcAgent.insertAndRegisterSelf();
+  gcAgent.insertAndRegisterSelf(lc);
   {
     cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue);
     gc.runOnePass(lc);
@@ -90,8 +90,8 @@ TEST(ObjectStore, GarbageCollectorBasicFuctionnality) {
   // We should not be able to remove the agent register (as it should be empty)
   rel.lock(re);
   re.fetch();
-  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit());
-  ASSERT_NO_THROW(re.removeIfEmpty());
+  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc));
+  ASSERT_NO_THROW(re.removeIfEmpty(lc));
 }
 
 TEST(ObjectStore, GarbageCollectorRegister) {
@@ -111,14 +111,14 @@ TEST(ObjectStore, GarbageCollectorRegister) {
     cta::objectstore::EntryLogSerDeser el("user0",
       "unittesthost", time(NULL));
   cta::objectstore::ScopedExclusiveLock rel(re);
-  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el);
+  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc);
   rel.release();
   // Create an agent and add and agent register to it as an owned object
   cta::objectstore::AgentReference agrA("unitTestAgentA", dl);
   cta::objectstore::Agent agA(agrA.getAgentAddress(), be);
   agA.initialize();
   agA.setTimeout_us(0);
-  agA.insertAndRegisterSelf();
+  agA.insertAndRegisterSelf(lc);
   // Create a new agent register, owned by agA (by hand as it is not an usual
   // situation)
   std::string arName;
@@ -135,7 +135,7 @@ TEST(ObjectStore, GarbageCollectorRegister) {
   cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be);
   gcAgent.initialize();
   gcAgent.setTimeout_us(0);
-  gcAgent.insertAndRegisterSelf();
+  gcAgent.insertAndRegisterSelf(lc);
   {
     cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue);
     gc.runOnePass(lc);
@@ -149,8 +149,8 @@ TEST(ObjectStore, GarbageCollectorRegister) {
   // We should not be able to remove the agent register (as it should be empty)
   rel.lock(re);
   re.fetch();
-  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit());
-  ASSERT_NO_THROW(re.removeIfEmpty());
+  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc));
+  ASSERT_NO_THROW(re.removeIfEmpty(lc));
 }
 
 TEST(ObjectStore, GarbageCollectorArchiveQueue) {
@@ -171,14 +171,14 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) {
     cta::objectstore::EntryLogSerDeser el("user0",
       "unittesthost", time(NULL));
   cta::objectstore::ScopedExclusiveLock rel(re);
-  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el);
+  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc);
   rel.release();
   // Create an agent and add and agent register to it as an owned object
   cta::objectstore::AgentReference agrA("unitTestAgentA", dl);
   cta::objectstore::Agent agA(agrA.getAgentAddress(), be);
   agA.initialize();
   agA.setTimeout_us(0);
-  agA.insertAndRegisterSelf();
+  agA.insertAndRegisterSelf(lc);
   // Create a new agent register, owned by agA (by hand as it is not an usual
   // situation)
   std::string tpName;
@@ -195,7 +195,7 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) {
   cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be);
   gcAgent.initialize();
   gcAgent.setTimeout_us(0);
-  gcAgent.insertAndRegisterSelf();
+  gcAgent.insertAndRegisterSelf(lc);
   {
     cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue);
     gc.runOnePass(lc);
@@ -209,8 +209,8 @@ TEST(ObjectStore, GarbageCollectorArchiveQueue) {
   // We should not be able to remove the agent register (as it should be empty)
   rel.lock(re);
   re.fetch();
-  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit());
-  ASSERT_NO_THROW(re.removeIfEmpty());
+  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc));
+  ASSERT_NO_THROW(re.removeIfEmpty(lc));
 }
 
 TEST(ObjectStore, GarbageCollectorDriveRegister) {
@@ -231,14 +231,14 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) {
     cta::objectstore::EntryLogSerDeser el("user0",
       "unittesthost", time(NULL));
   cta::objectstore::ScopedExclusiveLock rel(re);
-  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el);
+  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc);
   rel.release();
   // Create an agent and add the drive register to it as an owned object
   cta::objectstore::AgentReference agrA("unitTestAgentA", dl);
   cta::objectstore::Agent agA(agrA.getAgentAddress(), be);
   agA.initialize();
   agA.setTimeout_us(0);
-  agA.insertAndRegisterSelf();
+  agA.insertAndRegisterSelf(lc);
   // Create a new drive register, owned by agA (by hand as it is not an usual
   // situation)
   std::string tpName;
@@ -255,7 +255,7 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) {
   cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be);
   gcAgent.initialize();
   gcAgent.setTimeout_us(0);
-  gcAgent.insertAndRegisterSelf();
+  gcAgent.insertAndRegisterSelf(lc);
   {
     cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue);
     gc.runOnePass(lc);
@@ -269,8 +269,8 @@ TEST(ObjectStore, GarbageCollectorDriveRegister) {
   // We should not be able to remove the agent register (as it should be empty)
   rel.lock(re);
   re.fetch();
-  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit());
-  ASSERT_NO_THROW(re.removeIfEmpty());
+  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc));
+  ASSERT_NO_THROW(re.removeIfEmpty(lc));
 }
 
 TEST(ObjectStore, GarbageCollectorArchiveRequest) {
@@ -296,19 +296,19 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) {
   // Create the agent for objects creation
   cta::objectstore::AgentReference agentRef("unitTestCreateEnv", dl);
   // Finish root creation.
-  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el);
+  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc);
   rel.release();
   // continue agent creation.
   cta::objectstore::Agent agent(agentRef.getAgentAddress(), be);
   agent.initialize();
   agent.setTimeout_us(0);
-  agent.insertAndRegisterSelf();
+  agent.insertAndRegisterSelf(lc);
   // Create an agent to garbage collected
   cta::objectstore::AgentReference agrA("unitTestAgentA", dl);
   cta::objectstore::Agent agA(agrA.getAgentAddress(), be);
   agA.initialize();
   agA.setTimeout_us(0);
-  agA.insertAndRegisterSelf();
+  agA.insertAndRegisterSelf(lc);
   // Several use cases are present for the ArchiveRequests:
   // - just referenced in agent ownership list, but not yet created.
   // - just created but not linked to any tape pool
@@ -325,7 +325,7 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) {
     re.fetch();
     std::stringstream tapePoolName;
     tapePoolName << "TapePool" << i;
-    tpAddr[i] = re.addOrGetArchiveQueueAndCommit(tapePoolName.str(), agentRef);
+    tpAddr[i] = re.addOrGetArchiveQueueAndCommit(tapePoolName.str(), agentRef, lc);
     cta::objectstore::ArchiveQueue aq(tpAddr[i], be);
   }
   // Create the various ATFR's, stopping one step further each time.
@@ -419,7 +419,7 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) {
   cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be);
   gcAgent.initialize();
   gcAgent.setTimeout_us(0);
-  gcAgent.insertAndRegisterSelf();
+  gcAgent.insertAndRegisterSelf(lc);
   {
     cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue);
     gc.runOnePass(lc);
@@ -460,11 +460,11 @@ TEST(ObjectStore, GarbageCollectorArchiveRequest) {
     aq.commit();
     aql.release();
     // Remove queues from root
-    re.removeArchiveQueueAndCommit(tp);
+    re.removeArchiveQueueAndCommit(tp, lc);
   }
 
-  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit());
-  ASSERT_NO_THROW(re.removeIfEmpty());
+  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc));
+  ASSERT_NO_THROW(re.removeIfEmpty(lc));
   // TODO: this unit test still leaks tape pools and requests
 }
 
@@ -491,19 +491,19 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) {
   // Create the agent for objects creation
   cta::objectstore::AgentReference agentRef("unitTestCreateEnv", dl);
   // Finish root creation.
-  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el);
+  re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc);
   rel.release();
   // continue agent creation.
   cta::objectstore::Agent agent(agentRef.getAgentAddress(), be);
   agent.initialize();
   agent.setTimeout_us(0);
-  agent.insertAndRegisterSelf();
+  agent.insertAndRegisterSelf(lc);
   // Create an agent to garbage be collected
   cta::objectstore::AgentReference agrA("unitTestAgentA", dl);
   cta::objectstore::Agent agA(agrA.getAgentAddress(), be);
   agA.initialize();
   agA.setTimeout_us(0);
-  agA.insertAndRegisterSelf();
+  agA.insertAndRegisterSelf(lc);
   // Several use cases are present for the RetrieveRequests:
   // - just referenced in agent ownership list, but not yet created.
   // - just created but not linked to any tape
@@ -605,7 +605,7 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) {
   cta::objectstore::Agent gcAgent(gcAgentRef.getAgentAddress(), be);
   gcAgent.initialize();
   gcAgent.setTimeout_us(0);
-  gcAgent.insertAndRegisterSelf();
+  gcAgent.insertAndRegisterSelf(lc);
   {
     cta::objectstore::GarbageCollector gc(be, gcAgentRef, catalogue);
     gc.runOnePass(lc);
@@ -641,11 +641,11 @@ TEST(ObjectStore, GarbageCollectorRetrieveRequest) {
     rq.commit();
     rql.release();
     // Remove queues from root
-    re.removeRetrieveQueueAndCommit(vid);
+    re.removeRetrieveQueueAndCommit(vid, lc);
   }
 
-  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit());
-  ASSERT_NO_THROW(re.removeIfEmpty());
+  ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc));
+  ASSERT_NO_THROW(re.removeIfEmpty(lc));
   // TODO: this unit test still leaks tape pools and requests
 }
 
diff --git a/objectstore/Helpers.cpp b/objectstore/Helpers.cpp
index c59e20bd61da8ec5aa823fa107048674086e847d..29aa3150ef073aa8e5bdcde3c014ee2f363ee716 100644
--- a/objectstore/Helpers.cpp
+++ b/objectstore/Helpers.cpp
@@ -62,7 +62,7 @@ void Helpers::getLockedAndFetchedQueue<ArchiveQueue>(ArchiveQueue& archiveQueue,
         rootRelockExclusiveTime = t.secs(utils::Timer::resetCounter);
         re.fetch();
         rootRefetchTime = t.secs(utils::Timer::resetCounter);
-        archiveQueue.setAddress(re.addOrGetArchiveQueueAndCommit(tapePool, agentReference));
+        archiveQueue.setAddress(re.addOrGetArchiveQueueAndCommit(tapePool, agentReference, lc));
         addOrGetQueueandCommitTime = t.secs(utils::Timer::resetCounter);
       }
     }
diff --git a/objectstore/RetrieveQueue.cpp b/objectstore/RetrieveQueue.cpp
index 18d98f4d980adb06cd1df1b9b13835e860a8ff6b..9caeb93a6d901a36cffe53d6ea25aefd133771e1 100644
--- a/objectstore/RetrieveQueue.cpp
+++ b/objectstore/RetrieveQueue.cpp
@@ -73,12 +73,15 @@ bool cta::objectstore::RetrieveQueue::isEmpty() {
   return !m_payload.retrievejobs_size();
 }
 
-void cta::objectstore::RetrieveQueue::removeIfEmpty() {
+void cta::objectstore::RetrieveQueue::removeIfEmpty(log::LogContext & lc) {
   checkPayloadWritable();
   if (!isEmpty()) {
-    throw NotEmpty("In TapeQueue::removeIfEmpty: trying to remove an tape with retrieves queued");
+    throw NotEmpty("In RetrieveQueue::removeIfEmpty: trying to remove an tape with retrieves queued");
   }
   remove();
+  log::ScopedParamContainer params(lc);
+  params.add("retrieveQueueObject", getAddressIfSet());
+  lc.log(log::INFO, "In RetrieveQueue::removeIfEmpty(): removed the queue.");
 }
 
 std::string cta::objectstore::RetrieveQueue::getVid() {
diff --git a/objectstore/RetrieveQueue.hpp b/objectstore/RetrieveQueue.hpp
index 825bc7c618db3c2757282548b6474f3a5b56ba89..e816303a72dbcdb18c4524a90c3456508ac41dd1 100644
--- a/objectstore/RetrieveQueue.hpp
+++ b/objectstore/RetrieveQueue.hpp
@@ -41,7 +41,7 @@ public:
     cta::catalogue::Catalogue & catalogue) override;
   bool isEmpty();
   CTA_GENERATE_EXCEPTION_CLASS(NotEmpty);
-  void removeIfEmpty();
+  void removeIfEmpty(log::LogContext & lc);
   std::string dump();
   
   // Retrieve jobs management ==================================================
diff --git a/objectstore/RetrieveQueueTest.cpp b/objectstore/RetrieveQueueTest.cpp
index d0c6f165cf8f7fc5fba10d0ff3b4b917a0a767b2..fff8a3fb8473bed8a57ddf353971806e0a88fb29 100644
--- a/objectstore/RetrieveQueueTest.cpp
+++ b/objectstore/RetrieveQueueTest.cpp
@@ -27,6 +27,7 @@ namespace unitTests {
 TEST(ObjectStore, RetrieveQueueBasicAccess) {
   cta::objectstore::BackendVFS be;
   cta::log::DummyLogger dl("dummyLogger");
+  cta::log::LogContext lc(dl);
   cta::objectstore::AgentReference agentRef("unitTest", dl);
   std::string retrieveQueueAddress = agentRef.nextId("RetrieveQueue");
   { 
@@ -47,7 +48,7 @@ TEST(ObjectStore, RetrieveQueueBasicAccess) {
   cta::objectstore::RetrieveQueue rq(retrieveQueueAddress, be);
   cta::objectstore::ScopedExclusiveLock lock(rq);
   rq.fetch();
-  rq.removeIfEmpty();
+  rq.removeIfEmpty(lc);
   ASSERT_FALSE(rq.exists());
 }
 }
\ No newline at end of file
diff --git a/objectstore/RetrieveRequest.cpp b/objectstore/RetrieveRequest.cpp
index fcdd7f32110c3d0fe711cb77edefad35d5268133..2848739e28264feba650aa58bff3c0afeb9ffe32 100644
--- a/objectstore/RetrieveRequest.cpp
+++ b/objectstore/RetrieveRequest.cpp
@@ -314,7 +314,7 @@ auto RetrieveRequest::getJobs() -> std::list<JobDump> {
   return ret;
 }
 
-bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId) {
+bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId, log::LogContext & lc) {
   checkPayloadWritable();
   auto * jl = m_payload.mutable_jobs();
   // Find the job and update the number of failures
@@ -332,7 +332,7 @@ bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId) {
     }
     if (j.totalretries() >= j.maxtotalretries()) {
       j.set_status(serializers::RJS_Failed);
-      return finishIfNecessary();
+      return finishIfNecessary(lc);
     } else {
       j.set_status(serializers::RJS_Pending);
       return false;
@@ -341,7 +341,7 @@ bool RetrieveRequest::addJobFailure(uint16_t copyNumber, uint64_t mountId) {
   throw NoSuchJob ("In RetrieveRequest::addJobFailure(): could not find job");
 }
 
-bool RetrieveRequest::finishIfNecessary() {
+bool RetrieveRequest::finishIfNecessary(log::LogContext & lc) {
   checkPayloadWritable();
   // This function is typically called after changing the status of one job
   // in memory. If the request is complete, we will just remove it.
@@ -354,6 +354,9 @@ bool RetrieveRequest::finishIfNecessary() {
     if (!finishedStatuses.count(j.status()))
       return false;
   remove();
+  log::ScopedParamContainer params(lc);
+  params.add("retrieveRequestObject", getAddressIfSet());
+  lc.log(log::INFO, "In RetrieveRequest::finishIfNecessary(): removed finished retrieve request.");
   return true;
 }
 
diff --git a/objectstore/RetrieveRequest.hpp b/objectstore/RetrieveRequest.hpp
index 2e8efbed04fe269f383867414b78a88054d6fb9d..20211b20ffb305e6b02413e8a060d267965ed23f 100644
--- a/objectstore/RetrieveRequest.hpp
+++ b/objectstore/RetrieveRequest.hpp
@@ -68,9 +68,9 @@ public:
   AsyncJobDeleter * asyncDeleteJob();
   JobDump getJob(uint16_t copyNb);
   std::list<JobDump> getJobs();
-  bool addJobFailure(uint16_t copyNumber, uint64_t mountId); /**< Returns true is the request is completely failed 
+  bool addJobFailure(uint16_t copyNumber, uint64_t mountId, log::LogContext & lc); /**< Returns true is the request is completely failed 
                                                                    (telling wheather we should requeue or not). */
-  bool finishIfNecessary();                   /**< Handling of the consequences of a job status change for the entire request.
+  bool finishIfNecessary(log::LogContext & lc);                   /**< Handling of the consequences of a job status change for the entire request.
                                                * This function returns true if the request got finished. */
   serializers::RetrieveJobStatus getJobStatus(uint16_t copyNumber);
   // Mark all jobs as pending mount (following their linking to a tape pool)
diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp
index bbf006e201fe7a60c2f6aeaa2c29818b18afa2a2..ac94e580c5de8a6a4e67ec60f7c2e328f68eb10c 100644
--- a/objectstore/RootEntry.cpp
+++ b/objectstore/RootEntry.cpp
@@ -74,12 +74,15 @@ bool RootEntry::isEmpty() {
   return true;
 }
 
-void RootEntry::removeIfEmpty() {
+void RootEntry::removeIfEmpty(log::LogContext & lc) {
   checkPayloadWritable();
   if (!isEmpty()) {
     throw NotEmpty("In RootEntry::removeIfEmpty(): root entry not empty");
   }
   remove();
+  log::ScopedParamContainer params(lc);
+  params.add("rootObjectName", getAddressIfSet());
+  lc.log(log::INFO, "In RootEntry::removeIfEmpty(): removed root entry.");
 }
 
 void RootEntry::garbageCollect(const std::string& presumedOwner, AgentReference & agentReference, log::LogContext & lc,
@@ -102,7 +105,7 @@ namespace {
   }
 }
 
-std::string RootEntry::addOrGetArchiveQueueAndCommit(const std::string& tapePool, AgentReference& agentRef) {
+std::string RootEntry::addOrGetArchiveQueueAndCommit(const std::string& tapePool, AgentReference& agentRef, log::LogContext & lc) {
   checkPayloadWritable();
   // Check the archive queue does not already exist
   try {
@@ -134,7 +137,7 @@ std::string RootEntry::addOrGetArchiveQueueAndCommit(const std::string& tapePool
   return archiveQueueAddress;
 }
 
-void RootEntry::removeArchiveQueueAndCommit(const std::string& tapePool) {
+void RootEntry::removeArchiveQueueAndCommit(const std::string& tapePool, log::LogContext & lc) {
   checkPayloadWritable();
   // find the address of the archive queue object
   try {
@@ -171,6 +174,11 @@ void RootEntry::removeArchiveQueueAndCommit(const std::string& tapePool) {
     }
     // We can delete the queue
     aq.remove();
+    {
+      log::ScopedParamContainer params(lc);
+      params.add("archiveQueueObject", aq.getAddressIfSet());
+      lc.log(log::INFO, "In RootEntry::removeArchiveQueueAndCommit(): removed archive queue.");
+    }
   deleteFromRootEntry:
     // ... and remove it from our entry
     serializers::removeOccurences(m_payload.mutable_archivequeuepointers(), tapePool);
@@ -258,7 +266,7 @@ void RootEntry::removeMissingRetrieveQueueReference(const std::string& vid) {
   serializers::removeOccurences(m_payload.mutable_retrievequeuepointers(), vid);
 }
 
-void RootEntry::removeRetrieveQueueAndCommit(const std::string& vid) {
+void RootEntry::removeRetrieveQueueAndCommit(const std::string& vid, log::LogContext & lc) {
   checkPayloadWritable();
   // find the address of the retrieve queue object
   try {
@@ -295,6 +303,11 @@ void RootEntry::removeRetrieveQueueAndCommit(const std::string& vid) {
     }
     // We can now delete the queue
     rq.remove();
+    {
+      log::ScopedParamContainer params(lc);
+      params.add("retrieveQueueObject", rq.getAddressIfSet());
+      lc.log(log::INFO, "In RootEntry::removeRetrieveQueueAndCommit(): removed retrieve queue.");
+    }
   deleteFromRootEntry:
     // ... and remove it from our entry
     serializers::removeOccurences(m_payload.mutable_retrievequeuepointers(), vid);
@@ -370,7 +383,7 @@ std::string RootEntry::addOrGetDriveRegisterPointerAndCommit(
   }
 }
 
-void RootEntry::removeDriveRegisterAndCommit() {
+void RootEntry::removeDriveRegisterAndCommit(log::LogContext & lc) {
   checkPayloadWritable();
   // Get the address of the drive register (nothing to do if there is none)
   if (!m_payload.has_driveregisterpointer() || 
@@ -387,6 +400,9 @@ void RootEntry::removeDriveRegisterAndCommit() {
   }
   // we can delete the drive register
   dr.remove();
+  log::ScopedParamContainer params(lc);
+  params.add("driveRegisterObject", dr.getAddressIfSet());
+  lc.log(log::INFO, "In RootEntry::removeDriveRegisterAndCommit(): removed drive register.");
   // And update the root entry
   m_payload.mutable_driveregisterpointer()->set_address("");
   // We commit for safety and symmetry with the add operation
@@ -418,7 +434,7 @@ std::string RootEntry::getAgentRegisterAddress() {
 
 // Get the name of a (possibly freshly created) agent register
 std::string RootEntry::addOrGetAgentRegisterPointerAndCommit(AgentReference& agentRef,
-  const EntryLogSerDeser & log) {
+  const EntryLogSerDeser & log, log::LogContext & lc) {
   // Check if the agent register exists
   try {
     return getAgentRegisterAddress();
@@ -435,7 +451,7 @@ std::string RootEntry::addOrGetAgentRegisterPointerAndCommit(AgentReference& age
     // decide on the object's name
     std::string arAddress (agentRef.nextId("AgentRegister"));
     // Record the agent registry in our own intent
-    addIntendedAgentRegistry(arAddress);
+    addIntendedAgentRegistry(arAddress, lc);
     commit();
     // Create the agent registry
     AgentRegister ar(arAddress, m_objectStore);
@@ -463,7 +479,7 @@ std::string RootEntry::addOrGetAgentRegisterPointerAndCommit(AgentReference& age
   }
 }
 
-void RootEntry::removeAgentRegisterAndCommit() {
+void RootEntry::removeAgentRegisterAndCommit(log::LogContext & lc) {
   checkPayloadWritable();
   // Check that we do have an agent register set. Cleanup a potential intent as
   // well
@@ -479,6 +495,9 @@ void RootEntry::removeAgentRegisterAndCommit() {
         "a non-empty intended agent register. Internal error.");
     }
     iar.remove();
+    log::ScopedParamContainer params(lc);
+    params.add("agentRegisterObject", iar.getAddressIfSet());
+    lc.log(log::INFO, "In RootEntry::removeAgentRegisterAndCommit(): removed agent register");
     m_payload.set_agentregisterintent("");
     commit();
   }
@@ -493,12 +512,15 @@ void RootEntry::removeAgentRegisterAndCommit() {
         "register is not empty. Cannot remove.");
     }
     ar.remove();
+    log::ScopedParamContainer params(lc);
+    params.add("agentRegisterObject", ar.getAddressIfSet());
+    lc.log(log::INFO, "In RootEntry::removeAgentRegisterAndCommit(): removed agent register.");
     m_payload.mutable_agentregisterpointer()->set_address("");
     commit();
   }
 }
 
-void RootEntry::addIntendedAgentRegistry(const std::string& address) {
+void RootEntry::addIntendedAgentRegistry(const std::string& address, log::LogContext & lc) {
   checkPayloadWritable();
   // We are supposed to have only one intended agent registry at a time.
   // If we got the lock and there is one entry, this means the previous
@@ -525,6 +547,9 @@ void RootEntry::addIntendedAgentRegistry(const std::string& address) {
           "found a non-empty intended agent register. Internal Error.");
       }
       iar.remove();
+      log::ScopedParamContainer params (lc);
+      params.add("agentRegisterObject", iar.getAddressIfSet());
+      lc.log(log::INFO, "In RootEntry::addIntendedAgentRegistry(): removed agent register.");
     }
   }
   m_payload.set_agentregisterintent(address);
@@ -577,7 +602,7 @@ std::string RootEntry::addOrGetSchedulerGlobalLockAndCommit(AgentReference& agen
   }
 }
 
-void RootEntry::removeSchedulerGlobalLockAndCommit() {
+void RootEntry::removeSchedulerGlobalLockAndCommit(log::LogContext & lc) {
   checkPayloadWritable();
   // Get the address of the scheduler lock (nothing to do if there is none)
   if (!m_payload.has_schedulerlockpointer() ||
@@ -594,6 +619,9 @@ void RootEntry::removeSchedulerGlobalLockAndCommit() {
   }
   // we can delete the drive register
   sgl.remove();
+  log::ScopedParamContainer params(lc);
+  params.add("schedulerGlobalLockObject", sgl.getAddressIfSet());
+  lc.log(log::INFO, "In RootEntry::removeSchedulerGlobalLockAndCommit(): removed scheduler global lock object.");
   // And update the root entry
   m_payload.mutable_schedulerlockpointer()->set_address("");
   // We commit for safety and symmetry with the add operation
diff --git a/objectstore/RootEntry.hpp b/objectstore/RootEntry.hpp
index 86deabaf82423ad04c844de00a5c3e15d0fbacfb..afbf302917c2b6d34fb69cdec0e6bf4ac9c631d1 100644
--- a/objectstore/RootEntry.hpp
+++ b/objectstore/RootEntry.hpp
@@ -52,7 +52,7 @@ public:
   bool isEmpty();
   
   // Safe remover
-  void removeIfEmpty();
+  void removeIfEmpty(log::LogContext & lc);
   
   // Garbage collection (disallowed for root entry).
   void garbageCollect(const std::string &presumedOwner, AgentReference & agentReference, log::LogContext & lc,
@@ -63,11 +63,11 @@ public:
   CTA_GENERATE_EXCEPTION_CLASS(WrongArchiveQueue);
   /** This function implicitly creates the archive queue structure and updates 
    * the pointer to it. It will implicitly commit the object to the store. */
-  std::string addOrGetArchiveQueueAndCommit(const std::string & tapePool, AgentReference & agentRef);
+  std::string addOrGetArchiveQueueAndCommit(const std::string & tapePool, AgentReference & agentRef, log::LogContext & lc);
   /** This function implicitly deletes the tape pool structure. 
    * Fails if it not empty*/
   CTA_GENERATE_EXCEPTION_CLASS(NoSuchArchiveQueue);
-  void removeArchiveQueueAndCommit(const std::string & tapePool);
+  void removeArchiveQueueAndCommit(const std::string & tapePool, log::LogContext & lc);
   /** This function is used in a cleanup utility. Removes unconditionally the reference to the archive queue */
   void removeMissingArchiveQueueReference(const std::string & tapePool);
   void removeArchiveQueueIfAddressMatchesAndCommit(const std::string & tapePool, const std::string & archiveQueueAddress);
@@ -86,7 +86,7 @@ public:
   /** This function is used in a cleanup utility. Removes unconditionally the reference to the retrieve queue */
   void removeMissingRetrieveQueueReference(const std::string & address);
   CTA_GENERATE_EXCEPTION_CLASS(NoSuchRetrieveQueue);
-  void removeRetrieveQueueAndCommit(const std::string & vid);
+  void removeRetrieveQueueAndCommit(const std::string & vid, log::LogContext & lc);
   std::string getRetrieveQueueAddress(const std::string & vid);
   struct RetrieveQueueDump {
     std::string vid;
@@ -98,7 +98,7 @@ public:
   CTA_GENERATE_EXCEPTION_CLASS(DriveRegisterNotEmpty);
   std::string getDriveRegisterAddress();  
   std::string addOrGetDriveRegisterPointerAndCommit(AgentReference & agentRef, const EntryLogSerDeser & log);
-  void removeDriveRegisterAndCommit();
+  void removeDriveRegisterAndCommit(log::LogContext & lc);
   
   // Agent register manipulations ==============================================
   CTA_GENERATE_EXCEPTION_CLASS(AgentRegisterNotEmpty);
@@ -108,16 +108,16 @@ public:
    * log for tracking objects being created. We already use an agent here for
    * object name generation, but not yet tracking. */
   std::string addOrGetAgentRegisterPointerAndCommit(AgentReference & agentRef,
-    const EntryLogSerDeser & log);
-  void removeAgentRegisterAndCommit();
+    const EntryLogSerDeser & log, log::LogContext & lc);
+  void removeAgentRegisterAndCommit(log::LogContext & lc);
 
   // Agent register manipulations ==============================================
   std::string getSchedulerGlobalLock();
   std::string addOrGetSchedulerGlobalLockAndCommit(AgentReference & agentRef, const EntryLogSerDeser & log);
-  void removeSchedulerGlobalLockAndCommit();
+  void removeSchedulerGlobalLockAndCommit(log::LogContext & lc);
   
 private:
-  void addIntendedAgentRegistry(const std::string & address);
+  void addIntendedAgentRegistry(const std::string & address, log::LogContext & lc);
   
 public:
   // Dump the root entry
@@ -126,4 +126,3 @@ public:
 
 }}
 
-
diff --git a/objectstore/RootEntryTest.cpp b/objectstore/RootEntryTest.cpp
index 289f347784a9d3ffd73c6ae0d44be2b40e7e70c9..989f062c63b8c2c667f5f13dd0c736d624b64c01 100644
--- a/objectstore/RootEntryTest.cpp
+++ b/objectstore/RootEntryTest.cpp
@@ -31,6 +31,8 @@ namespace unitTests {
 
 TEST(ObjectStore, RootEntryBasicAccess) {
   cta::objectstore::BackendVFS be;
+  cta::log::DummyLogger dl("dummyLogger");
+  cta::log::LogContext lc(dl);
   { 
     // Try to create the root entry
     cta::objectstore::RootEntry re(be);
@@ -57,7 +59,7 @@ TEST(ObjectStore, RootEntryBasicAccess) {
     re.fetch();
     cta::objectstore::EntryLogSerDeser el("user0",
       "unittesthost", time(NULL));
-    re.addOrGetAgentRegisterPointerAndCommit(agentRef, el);
+    re.addOrGetAgentRegisterPointerAndCommit(agentRef, el, lc);
     ASSERT_NO_THROW(re.getAgentRegisterAddress());
     re.commit();
     //agent.registerSelf();
@@ -66,8 +68,8 @@ TEST(ObjectStore, RootEntryBasicAccess) {
   cta::objectstore::RootEntry re(be);
   cta::objectstore::ScopedExclusiveLock lock(re);
   re.fetch();
-  re.removeAgentRegisterAndCommit();
-  re.removeIfEmpty();
+  re.removeAgentRegisterAndCommit(lc);
+  re.removeIfEmpty(lc);
   ASSERT_FALSE(re.exists());
 }
 
@@ -86,9 +88,9 @@ TEST (ObjectStore, RootEntryArchiveQueues) {
     re.initialize();
     re.insert();
     cta::objectstore::ScopedExclusiveLock rel(re);
-    re.addOrGetAgentRegisterPointerAndCommit(agr, el);
+    re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc);
   }
-  ag.insertAndRegisterSelf();
+  ag.insertAndRegisterSelf(lc);
   std::string tpAddr1, tpAddr2;
   {
     // Create the tape pools
@@ -97,7 +99,7 @@ TEST (ObjectStore, RootEntryArchiveQueues) {
     re.fetch();
     ASSERT_THROW(re.getArchiveQueueAddress("tapePool1"),
       cta::objectstore::RootEntry::NoSuchArchiveQueue);
-    tpAddr1 = re.addOrGetArchiveQueueAndCommit("tapePool1", agr);
+    tpAddr1 = re.addOrGetArchiveQueueAndCommit("tapePool1", agr, lc);
     // Check that we car read it
     cta::objectstore::ArchiveQueue aq(tpAddr1, be);
     cta::objectstore::ScopedSharedLock aql(aq);
@@ -108,7 +110,7 @@ TEST (ObjectStore, RootEntryArchiveQueues) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock lock(re);
     re.fetch();
-    tpAddr2 = re.addOrGetArchiveQueueAndCommit("tapePool2", agr);
+    tpAddr2 = re.addOrGetArchiveQueueAndCommit("tapePool2", agr, lc);
     ASSERT_TRUE(be.exists(tpAddr2));
   }
   {
@@ -116,7 +118,7 @@ TEST (ObjectStore, RootEntryArchiveQueues) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock lock(re);
     re.fetch();
-    re.removeArchiveQueueAndCommit("tapePool2");
+    re.removeArchiveQueueAndCommit("tapePool2", lc);
     ASSERT_FALSE(be.exists(tpAddr2));
   }
   // Unregister the agent
@@ -126,10 +128,10 @@ TEST (ObjectStore, RootEntryArchiveQueues) {
   cta::objectstore::RootEntry re(be);
   cta::objectstore::ScopedExclusiveLock lock(re);
   re.fetch();
-  re.removeAgentRegisterAndCommit();
-  re.removeArchiveQueueAndCommit("tapePool1");
+  re.removeAgentRegisterAndCommit(lc);
+  re.removeArchiveQueueAndCommit("tapePool1", lc);
   ASSERT_FALSE(be.exists(tpAddr1));
-  re.removeIfEmpty();
+  re.removeIfEmpty(lc);
   ASSERT_FALSE(re.exists());
 }
 
@@ -153,9 +155,9 @@ TEST (ObjectStore, RootEntryDriveRegister) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock rel(re);
     re.fetch();
-    re.addOrGetAgentRegisterPointerAndCommit(agr, el);
+    re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc);
   }
-  ag.insertAndRegisterSelf();
+  ag.insertAndRegisterSelf(lc);
   std::string driveRegisterAddress;
   {
     // create the drive register
@@ -174,7 +176,7 @@ TEST (ObjectStore, RootEntryDriveRegister) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock rel(re);
     re.fetch();
-    re.removeDriveRegisterAndCommit();
+    re.removeDriveRegisterAndCommit(lc);
     ASSERT_FALSE(be.exists(driveRegisterAddress));
   }
   // Unregister the agent
@@ -184,8 +186,8 @@ TEST (ObjectStore, RootEntryDriveRegister) {
   cta::objectstore::RootEntry re(be);
   cta::objectstore::ScopedExclusiveLock lock(re);
   re.fetch();
-  re.removeAgentRegisterAndCommit();
-  re.removeIfEmpty();
+  re.removeAgentRegisterAndCommit(lc);
+  re.removeIfEmpty(lc);
   ASSERT_FALSE(re.exists());
 }
 
@@ -200,6 +202,7 @@ TEST(ObjectStore, RootEntryAgentRegister) {
   cta::objectstore::EntryLogSerDeser el("user0",
     "unittesthost", time(NULL));
   cta::log::DummyLogger dl("dummyLogger");
+  cta::log::LogContext lc(dl);
   cta::objectstore::AgentReference agr("UnitTests", dl); 
   cta::objectstore::Agent ag(agr.getAgentAddress(), be);
   ag.initialize();
@@ -211,7 +214,7 @@ TEST(ObjectStore, RootEntryAgentRegister) {
     re.fetch();
     ASSERT_THROW(re.getAgentRegisterAddress(),
       cta::objectstore::RootEntry::NotAllocated);
-    arAddr = re.addOrGetAgentRegisterPointerAndCommit(agr, el);
+    arAddr = re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc);
     // Check that we car read it
     cta::objectstore::AgentRegister ar(arAddr, be);
     cta::objectstore::ScopedSharedLock arl(ar);
@@ -224,9 +227,9 @@ TEST(ObjectStore, RootEntryAgentRegister) {
     re.fetch();
     // Check that we still get the same agent register
     ASSERT_EQ(arAddr, re.getAgentRegisterAddress());
-    ASSERT_EQ(arAddr, re.addOrGetAgentRegisterPointerAndCommit(agr, el));
+    ASSERT_EQ(arAddr, re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc));
     // Remove it
-    ASSERT_NO_THROW(re.removeAgentRegisterAndCommit());
+    ASSERT_NO_THROW(re.removeAgentRegisterAndCommit(lc));
     // Check that the object is gone
     ASSERT_FALSE(be.exists(arAddr));
   }
@@ -234,7 +237,7 @@ TEST(ObjectStore, RootEntryAgentRegister) {
   cta::objectstore::RootEntry re(be);
   cta::objectstore::ScopedExclusiveLock lock(re);
   re.fetch();
-  re.removeIfEmpty();
+  re.removeIfEmpty(lc);
   ASSERT_FALSE(re.exists());
 }
 
@@ -258,9 +261,9 @@ TEST (ObjectStore, RootEntrySchedulerGlobalLock) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock rel(re);
     re.fetch();
-    re.addOrGetAgentRegisterPointerAndCommit(agr, el);
+    re.addOrGetAgentRegisterPointerAndCommit(agr, el, lc);
   }
-  ag.insertAndRegisterSelf();
+  ag.insertAndRegisterSelf(lc);
   std::string schedulerGlobalLockAddress;
   {
     // create the drive register
@@ -279,7 +282,7 @@ TEST (ObjectStore, RootEntrySchedulerGlobalLock) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock rel(re);
     re.fetch();
-    re.removeSchedulerGlobalLockAndCommit();
+    re.removeSchedulerGlobalLockAndCommit(lc);
     ASSERT_FALSE(be.exists(schedulerGlobalLockAddress));
   }
   // Unregister the agent
@@ -289,8 +292,8 @@ TEST (ObjectStore, RootEntrySchedulerGlobalLock) {
   cta::objectstore::RootEntry re(be);
   cta::objectstore::ScopedExclusiveLock lock(re);
   re.fetch();
-  re.removeAgentRegisterAndCommit();
-  re.removeIfEmpty();
+  re.removeAgentRegisterAndCommit(lc);
+  re.removeIfEmpty(lc);
   ASSERT_FALSE(re.exists());
 }
 
diff --git a/objectstore/SchedulerGlobalLock.cpp b/objectstore/SchedulerGlobalLock.cpp
index 5300cdcb22f32ffdf77df17ee8662fdc1d553a2e..e364a4c35193d06328715cdd189c4b791e926550 100644
--- a/objectstore/SchedulerGlobalLock.cpp
+++ b/objectstore/SchedulerGlobalLock.cpp
@@ -71,6 +71,9 @@ void SchedulerGlobalLock::garbageCollect(const std::string &presumedOwner, Agent
     throw (NotEmpty("Trying to garbage collect a non-empty AgentRegister: internal error"));
   }
   remove();
+  log::ScopedParamContainer params(lc);
+  params.add("schedulerGlobalLock", getAddressIfSet());
+  lc.log(log::INFO, "In SchedulerGlobalLock::garbageCollect(): Garbage collected and removed scheduler global lock.");
 }
 
 uint64_t SchedulerGlobalLock::getIncreaseCommitMountId() {
diff --git a/objectstore/cta-objectstore-collect-orphaned-object.cpp b/objectstore/cta-objectstore-collect-orphaned-object.cpp
index 1509ccc740ff3fde467e8bcb8d6fd05f76a68d62..e3e2c85bd0203f568ce62e7d34d082d66469965e 100644
--- a/objectstore/cta-objectstore-collect-orphaned-object.cpp
+++ b/objectstore/cta-objectstore-collect-orphaned-object.cpp
@@ -76,7 +76,7 @@ int main(int argc, char ** argv) {
     cta::objectstore::AgentReference agr("cta-objectstore-collect-orphaned-object", sl);
     cta::objectstore::Agent ag(agr.getAgentAddress(), *be);
     ag.initialize();
-    ag.insertAndRegisterSelf();
+    ag.insertAndRegisterSelf(lc);
     switch (go.type()) {
     case cta::objectstore::serializers::ObjectType::ArchiveRequest_t:
     {
diff --git a/objectstore/cta-objectstore-initialize.cpp b/objectstore/cta-objectstore-initialize.cpp
index 53e4af31d4c0b5eec217b74c15f731a5cac40996..9d0d2a206198a91ad4bdb329d8d8f4e7dd52c695 100644
--- a/objectstore/cta-objectstore-initialize.cpp
+++ b/objectstore/cta-objectstore-initialize.cpp
@@ -57,9 +57,10 @@ int main(int argc, char ** argv) {
     cta::objectstore::Agent ag(agr.getAgentAddress(), *be);
     ag.initialize();
     cta::objectstore::EntryLogSerDeser el("user0", "systemhost", time(NULL));
-    re.addOrGetAgentRegisterPointerAndCommit(agr,el);
+    cta::log::LogContext lc(logger);
+    re.addOrGetAgentRegisterPointerAndCommit(agr,el, lc);
     rel.release();
-    ag.insertAndRegisterSelf();
+    ag.insertAndRegisterSelf(lc);
     rel.lock(re);
     re.fetch();
     re.addOrGetDriveRegisterPointerAndCommit(agr, el);
diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp
index e1412448c2020751c1a8e5a603007509056dfcee..9146f6e8e6dfc44ff8ef26eba5aac38967694a05 100644
--- a/scheduler/OStoreDB/OStoreDB.cpp
+++ b/scheduler/OStoreDB/OStoreDB.cpp
@@ -306,7 +306,7 @@ void OStoreDB::trimEmptyQueues(log::LogContext& lc) {
       aq.fetch();
       if (!aq.dumpJobs().size()) {
         aql.release();
-        re.removeArchiveQueueAndCommit(a.tapePool);
+        re.removeArchiveQueueAndCommit(a.tapePool, lc);
         log::ScopedParamContainer params(lc);
         params.add("tapePool", a.tapePool)
               .add("queueObject", a.address);
@@ -320,7 +320,7 @@ void OStoreDB::trimEmptyQueues(log::LogContext& lc) {
       rq.fetch();
       if (!rq.dumpJobs().size()) {
         rql.release();
-        re.removeRetrieveQueueAndCommit(r.vid);
+        re.removeRetrieveQueueAndCommit(r.vid, lc);
         log::ScopedParamContainer params(lc);
         params.add("vid", r.vid)
               .add("queueObject", r.address);
@@ -544,7 +544,7 @@ void OStoreDB::queueArchive(const std::string &instanceName, const cta::common::
             .add("queueUnlockTime", qUnlockTime);
       logContext.log(log::INFO, "In OStoreDB::queueArchive(): added job to queue");
     }
-  } catch (NoSuchArchiveQueue &) {
+  } catch (NoSuchArchiveQueue &ex) {
     // Unlink the request from already connected tape pools
     for (auto tpa=linkedTapePools.begin(); tpa!=linkedTapePools.end(); tpa++) {
       objectstore::ArchiveQueue aq(*tpa, m_objectStore);
@@ -552,10 +552,12 @@ void OStoreDB::queueArchive(const std::string &instanceName, const cta::common::
       aq.fetch();
       aq.removeJob(aReq.getAddressIfSet());
       aq.commit();
-      aReq.remove();
     }
+    aReq.remove();
     log::ScopedParamContainer params(logContext);
     params.add("tapepool", currentTapepool)
+          .add("archiveRequestObject", aReq.getAddressIfSet())
+          .add("exceptionMessage", ex.getMessageValue())
           .add("jobObject", aReq.getAddressIfSet());
     logContext.log(log::INFO, "In OStoreDB::queueArchive(): failed to enqueue job");
     throw;
@@ -625,6 +627,10 @@ void OStoreDB::deleteArchiveRequest(const std::string &diskInstanceName,
           ar.setJobOwner(j.copyNb, m_agentReference->getAgentAddress());
         }
         ar.remove();
+        log::LogContext lc(m_logger);
+        log::ScopedParamContainer params(lc);
+        params.add("archiveRequestObject", ar.getAddressIfSet());
+        lc.log(log::INFO, "In OStoreDB::deleteArchiveRequest(): delete archive request.");
         m_agentReference->removeFromOwnership(ar.getAddressIfSet(), m_objectStore);
         // We found and deleted the job: return.
         return;
@@ -637,11 +643,14 @@ void OStoreDB::deleteArchiveRequest(const std::string &diskInstanceName,
 //------------------------------------------------------------------------------
 // OStoreDB::ArchiveToFileRequestCancelation::complete()
 //------------------------------------------------------------------------------
-void OStoreDB::ArchiveToFileRequestCancelation::complete() {
+void OStoreDB::ArchiveToFileRequestCancelation::complete(log::LogContext & lc) {
   if (m_closed)
     throw ArchiveRequestAlreadyDeleted("OStoreDB::ArchiveToFileRequestCancelation::complete(): called twice");
   // We just need to delete the object and forget it
   m_request.remove();
+  log::ScopedParamContainer params(lc);
+  params.add("archiveRequestObject", m_request.getAddressIfSet());
+  lc.log(log::INFO, "In ArchiveToFileRequestCancelation::complete(): removed archive request.");
   m_agentReference.removeFromOwnership(m_request.getAddressIfSet(), m_objectStore);
   m_closed = true;
 }
@@ -1053,6 +1062,8 @@ void OStoreDB::removeDrive(const std::string& drive, log::LogContext &lc) {
         ds.remove();
         dr.removeDrive(drive);
         dr.commit();
+        log::ScopedParamContainer params(lc);
+        params.add("driveStateObject", ds.getAddressIfSet());
         lc.log(log::INFO, "In OStoreDB::removeDrive(): removed and dereferenced drive state object.");
       } else {
         dr.removeDrive(drive);
@@ -1792,7 +1803,7 @@ std::list<std::unique_ptr<SchedulerDatabase::ArchiveJob> > OStoreDB::ArchiveMoun
         ScopedExclusiveLock rexl(re);
         re.fetch();
         try {
-          re.removeArchiveQueueAndCommit(mountInfo.tapePool);
+          re.removeArchiveQueueAndCommit(mountInfo.tapePool, logContext);
           log::ScopedParamContainer params(logContext);
           params.add("tapepool", mountInfo.tapePool)
                 .add("queueObject", aq.getAddressIfSet());
@@ -1991,7 +2002,7 @@ std::list<std::unique_ptr<SchedulerDatabase::ArchiveJob> > OStoreDB::ArchiveMoun
           // The queue should be removed as it is empty.
           ScopedExclusiveLock rexl(re);
           re.fetch();
-          re.removeArchiveQueueAndCommit(mountInfo.tapePool);
+          re.removeArchiveQueueAndCommit(mountInfo.tapePool, logContext);
           log::ScopedParamContainer params(logContext);
           params.add("tapepool", mountInfo.tapePool)
                 .add("queueObject", aq.getAddressIfSet());
@@ -2180,7 +2191,7 @@ std::list<std::unique_ptr<SchedulerDatabase::RetrieveJob> > OStoreDB::RetrieveMo
         ScopedExclusiveLock rexl(re);
         re.fetch();
         try {
-          re.removeRetrieveQueueAndCommit(mountInfo.vid);
+          re.removeRetrieveQueueAndCommit(mountInfo.vid, logContext);
           log::ScopedParamContainer params(logContext);
           params.add("vid", mountInfo.vid)
                 .add("queueObject", rq.getAddressIfSet());
@@ -2353,7 +2364,7 @@ std::list<std::unique_ptr<SchedulerDatabase::RetrieveJob> > OStoreDB::RetrieveMo
           // The queue should be removed as it is empty.
           ScopedExclusiveLock rexl(re);
           re.fetch();
-          re.removeArchiveQueueAndCommit(mountInfo.tapePool);
+          re.removeArchiveQueueAndCommit(mountInfo.tapePool, logContext);
           log::ScopedParamContainer params(logContext);
           params.add("tapepool", mountInfo.tapePool)
                 .add("queueObject", rq.getAddressIfSet());
@@ -2666,7 +2677,7 @@ void OStoreDB::RetrieveJob::fail(log::LogContext &logContext) {
   objectstore::ScopedExclusiveLock rrl(m_retrieveRequest);
   m_retrieveRequest.fetch();
   // Add a job failure. If the job is failed, we will delete it.
-  if (m_retrieveRequest.addJobFailure(selectedCopyNb, m_mountId)) {
+  if (m_retrieveRequest.addJobFailure(selectedCopyNb, m_mountId, logContext)) {
     // The job will not be retried. Either another jobs for the same request is 
     // queued and keeps the request referenced or the request has been deleted.
     // In any case, we can forget it.
diff --git a/scheduler/OStoreDB/OStoreDB.hpp b/scheduler/OStoreDB/OStoreDB.hpp
index d1094f9b250bc7dbba660ed097de86bd44a6465f..925f798e09ec78ab2bd3664f26780e708b651324 100644
--- a/scheduler/OStoreDB/OStoreDB.hpp
+++ b/scheduler/OStoreDB/OStoreDB.hpp
@@ -207,7 +207,7 @@ public:
       objectstore::Backend & be, catalogue::Catalogue & catalogue, log::Logger &logger): m_request(be), m_lock(), m_objectStore(be),
       m_catalogue(catalogue), m_logger(logger), m_agentReference(agentReference), m_closed(false) {} 
     virtual ~ArchiveToFileRequestCancelation();
-    void complete() override;
+    void complete(log::LogContext & lc) override;
   private:
     objectstore::ArchiveRequest m_request;
     objectstore::ScopedExclusiveLock m_lock;
diff --git a/scheduler/OStoreDB/OStoreDBFactory.hpp b/scheduler/OStoreDB/OStoreDBFactory.hpp
index 877f4b7327e76f91324d7178a162a9f52ee2975c..d7fd49501e324eee53c5fbaf02ab505ad7f90497 100644
--- a/scheduler/OStoreDB/OStoreDBFactory.hpp
+++ b/scheduler/OStoreDB/OStoreDBFactory.hpp
@@ -187,9 +187,10 @@ m_OStoreDB(*m_backend, *m_catalogue, *m_logger), m_agentReference("OStoreDBFacto
   objectstore::Agent agent(m_agentReference.getAgentAddress(), *m_backend);
   agent.initialize();
   objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL));
-  re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl);
+  log::LogContext lc(*m_logger);
+  re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl, lc);
   rel.release();
-  agent.insertAndRegisterSelf();
+  agent.insertAndRegisterSelf(lc);
   rel.lock(re);
   re.fetch();
   re.addOrGetDriveRegisterPointerAndCommit(m_agentReference, cl);
@@ -220,9 +221,10 @@ m_OStoreDB(*m_backend, *m_catalogue, *m_logger),  m_agentReference("OStoreDBFact
   objectstore::Agent agent(m_agentReference.getAgentAddress(), *m_backend);
   agent.initialize();
   objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL));
-  re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl);
+  log::LogContext lc(*m_logger);
+  re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl, lc);
   rel.release();
-  agent.insertAndRegisterSelf();
+  agent.insertAndRegisterSelf(lc);
   rel.lock(re);
   re.fetch();
   re.addOrGetDriveRegisterPointerAndCommit(m_agentReference, cl);
diff --git a/scheduler/SchedulerDatabase.hpp b/scheduler/SchedulerDatabase.hpp
index 544965835450402051fa9c7151fb190f36d58613..bac987e63207585da78c650b07cd8e743eff5c36 100644
--- a/scheduler/SchedulerDatabase.hpp
+++ b/scheduler/SchedulerDatabase.hpp
@@ -147,7 +147,7 @@ public:
    */ 
   class ArchiveToFileRequestCancelation {
   public:
-    virtual void complete() = 0;
+    virtual void complete(log::LogContext & lc) = 0;
     virtual ~ArchiveToFileRequestCancelation() {};
   };