diff --git a/objectstore/Agent.cpp b/objectstore/Agent.cpp
index 1fbf5b008f37292647dcdfcf2ce38c7a3055184e..9f9861718dd7c373e9b6022ebc2833fb3271f878 100644
--- a/objectstore/Agent.cpp
+++ b/objectstore/Agent.cpp
@@ -218,7 +218,7 @@ std::string Agent::dump(Agent & agent) {
   updateFromObjectStore(as, agent.getFreeContext());
   std::stringstream ret;
   ret<< "<<<< Agent " << selfName() << " dump start" << std::endl
-    << "name=" << as.name()
+    << "name=" << as.name() << std::endl
     << "Ownership intent size=" << as.ownershipintent_size() << std::endl;
   for (int i=0; i<as.ownershipintent_size(); i++) {
     ret << "ownershipIntent[" << i << "]: name=" << as.ownershipintent(i).name() 
@@ -230,6 +230,6 @@ std::string Agent::dump(Agent & agent) {
         << " type=" << as.creationintent(i).type() 
         << " container=" << as.creationintent(i).container() << std::endl;
   }
-  ret<< ">>>> AgentRegister " << selfName() << " dump end" << std::endl;
+  ret<< ">>>> Agent " << selfName() << " dump end" << std::endl;
   return ret.str();
 }
\ No newline at end of file
diff --git a/objectstore/AgentRegister.cpp b/objectstore/AgentRegister.cpp
index 4bcda54d164953abd93a324bd318402fdc3c2875..ec7519a864b9afaec92e75562e4b241197dc84cb 100644
--- a/objectstore/AgentRegister.cpp
+++ b/objectstore/AgentRegister.cpp
@@ -100,11 +100,11 @@ std::list<std::string> AgentRegister::getElements(Agent & agent) {
   return ret;
 }
 
-std::string AgentRegister::dump(const std::string & title, Agent & agent) {
+std::string AgentRegister::dump(Agent & agent) {
   cta::objectstore::AgentRegister rs;
   updateFromObjectStore(rs, agent.getFreeContext());
   std::stringstream ret;
-  ret<< "<<<< AgentRegister " << title << " dump start" << std::endl
+  ret<< "<<<< AgentRegister " << selfName() << " dump start" << std::endl
     << "Array size=" << rs.elements_size() << std::endl;
   for (int i=0; i<rs.elements_size(); i++) {
     ret << "element[" << i << "]=" << rs.elements(i) << std::endl;
@@ -113,6 +113,6 @@ std::string AgentRegister::dump(const std::string & title, Agent & agent) {
   for (int i=0; i<rs.intendedelements_size(); i++) {
     ret << "intendedElement[" << i << "]=" << rs.intendedelements(i) << std::endl;
   }
-  ret<< ">>>> AgentRegister " << title << " dump end" << std::endl;
+  ret<< ">>>> AgentRegister " << selfName() << " dump end" << std::endl;
   return ret.str();
 }
\ No newline at end of file
diff --git a/objectstore/AgentRegister.hpp b/objectstore/AgentRegister.hpp
index da84b72d124fd024b94f5d7cae72d4edb998a695..c2c2e03a55e8f01de546c106999e96be7a81c06c 100644
--- a/objectstore/AgentRegister.hpp
+++ b/objectstore/AgentRegister.hpp
@@ -13,5 +13,5 @@ public:
   void upgradeIntendedElementToActual(std::string name, Agent & agent);
   void removeIntendedElement (const std::string  & name, Agent & agent);
   std::list<std::string> getElements(Agent & agent);
-  std::string dump(const std::string & title, Agent & agent);
+  std::string dump(Agent & agent);
 };
\ No newline at end of file
diff --git a/objectstore/FIFO.hpp b/objectstore/FIFO.hpp
index 7342741cb0152b675c9e8b916dfba7fef769ac88..72259711dc579d5d40c5d8ca6887736346a9e6ce 100644
--- a/objectstore/FIFO.hpp
+++ b/objectstore/FIFO.hpp
@@ -1,42 +1,56 @@
 #pragma once
 
 #include "ObjectOps.hpp"
+#include "Agent.hpp"
 #include "exception/Exception.hpp"
 
 class FIFO: private ObjectOps<cta::objectstore::FIFO> {
 public:
-  FIFO(ObjectStore & os, const std::string & name, ContextHandle & context):
-  ObjectOps<cta::objectstore::FIFO>(os, name),
-  m_locked(false) {
+  FIFO(const std::string & name, Agent & agent):
+  ObjectOps<cta::objectstore::FIFO>(agent.objectStore(), name) {
     cta::objectstore::FIFO fs;
-    updateFromObjectStore(fs, context);
+    updateFromObjectStore(fs, agent.getFreeContext());
   }
   
-  void lock(ContextHandle & context) {
-    if (m_locked) throw cta::exception::Exception(
-      "In FIFO::lock: already locked");
-    lockExclusiveAndRead(m_currentState, context);
-    m_locked = true;
-  }
-  
-  std::string peek() {
-    std::string ret;
-    if (!m_locked) throw cta::exception::Exception(
-      "In FIFO::pop: FIFO should be locked");
-    return m_currentState.name(m_currentState.readpointer());
-    return ret;
+private:
+  void lock(ContextHandle & ctx) {
+    lockExclusiveAndRead(m_currentState, ctx);
   }
   
-  void popAndUnlock(ContextHandle & context) {
-    if (!m_locked) throw cta::exception::Exception(
-      "In FIFO::pop: FIFO should be locked");
-    m_currentState.set_readpointer(m_currentState.readpointer()+1);
-    if (m_currentState.readpointer() > 100) {
-      compactCurrentState();
+public:
+  friend class Transaction;  
+  class Transaction {
+  public:
+    Transaction(FIFO & fifo, Agent & agent):
+    m_fifo(fifo), m_ctx(agent.getFreeContext()), m_writeDone(false) {
+      m_fifo.lock(m_ctx);
     }
-    write(m_currentState);
-    unlock(context);
-    m_locked = false;
+    
+    std::string peek() {
+      if (m_writeDone)
+        throw cta::exception::Exception("In FIFO::Transaction::peek: write already occurred");
+      return m_fifo.m_currentState.name(m_fifo.m_currentState.readpointer());
+    }
+    
+    void popAndUnlock() {
+      if (m_writeDone)
+        throw cta::exception::Exception("In FIFO::Transaction::popAndUnlock: write already occurred");
+      m_fifo.m_currentState.set_readpointer(m_fifo.m_currentState.readpointer()+1);
+      if (m_fifo.m_currentState.readpointer() > 100) {
+        m_fifo.compactCurrentState();
+      }
+      m_fifo.write(m_fifo.m_currentState);
+      m_fifo.unlock(m_ctx);
+      m_writeDone = true;
+    }
+  private:
+    FIFO & m_fifo;
+    ContextHandle & m_ctx;
+    bool m_writeDone;
+  };
+  
+  Transaction startTransaction(Agent & agent) {
+    return Transaction(*this, agent);
   }
   
   void push(std::string name, ContextHandle & context) {
@@ -47,9 +61,9 @@ public:
     unlock(context);
   }
   
-  std::string dump(ContextHandle & context) {
+  std::string dump(Agent & agent) {
     cta::objectstore::FIFO fs;
-    updateFromObjectStore(fs, context);
+    updateFromObjectStore(fs, agent.getFreeContext());
     std::stringstream ret;
     ret<< "<<<< FIFO dump start" << std::endl
       << "Read pointer=" << fs.readpointer() << std::endl
@@ -63,7 +77,6 @@ public:
   }
   
 private:
-  bool m_locked;
   cta::objectstore::FIFO m_currentState;
   
   void compactCurrentState() {
diff --git a/objectstore/JobPool.hpp b/objectstore/JobPool.hpp
index 359e6b923e84b925224183a771392a563451b360..c1aa7b1844df748ddafae2396b61cfafcc8b2d11 100644
--- a/objectstore/JobPool.hpp
+++ b/objectstore/JobPool.hpp
@@ -4,16 +4,16 @@
 #include "FIFO.hpp"
 #include "Agent.hpp"
 
-class JobPool: private ObjectOps<cta::objectstore::jobPool> {
+class JobPool: private ObjectOps<cta::objectstore::JobPool> {
 public:
   JobPool(const std::string & name, Agent & agent):
-  ObjectOps<cta::objectstore::jobPool>(agent.objectStore(), name) {
-    cta::objectstore::jobPool jps;
+  ObjectOps<cta::objectstore::JobPool>(agent.objectStore(), name) {
+    cta::objectstore::JobPool jps;
     updateFromObjectStore(jps, agent.getFreeContext());
   }
   
   void PostRecallJob (const std::string & string, ContextHandle & context, const std::string & MigrationFIFOId) {
-    cta::objectstore::jobPool jps;
+    cta::objectstore::JobPool jps;
     lockExclusiveAndRead(jps, context);
   }
   
@@ -22,10 +22,20 @@ public:
     NotAllocatedEx(const std::string & context): cta::exception::Exception(context) {}
   };
   
-private:
+  std::string dump(Agent & agent) {
+    cta::objectstore::JobPool jps;
+    updateFromObjectStore(jps, agent.getFreeContext());
+    std::stringstream ret;
+    ret << "<<<< JobPool " << selfName() << " dump start" << std::endl
+        << "Migration=" << jps.migration() << std::endl
+        << "Recall=" << jps.recall() << std::endl;
+    ret << ">>>> JobPool " << selfName() << " dump end" << std::endl;
+    return ret.str();
+  }
+  
   std::string getRecallFIFO (Agent & agent) {
     // Check if the recall FIFO exists
-    cta::objectstore::jobPool res;
+    cta::objectstore::JobPool res;
     updateFromObjectStore(res, agent.getFreeContext());
     // If the registry is defined, return it, job done.
     if (res.recall().size())
@@ -41,7 +51,7 @@ private:
     } catch (NotAllocatedEx &) {
       // If we get here, the job pool is not created yet, so we have to do it:
       // lock the entry again, for writing
-      cta::objectstore::jobPool res;
+      cta::objectstore::JobPool res;
       ContextHandle ctx = agent.getFreeContext();
       lockExclusiveAndRead(res, ctx);
       // If the registry is already defined, somebody was faster. We're done.
@@ -56,7 +66,7 @@ private:
       agent.addToIntend(selfName(), FIFOName, "recallFIFO");
       // The potential object can now be garbage collected if we die from here.
       // Create the object, then lock. The name should be unique, so no race.
-      cta::objectstore::jobPool jps;
+      cta::objectstore::JobPool jps;
       jps.set_migration("");
       jps.set_recall("");
       writeChild(FIFOName, jps);
diff --git a/objectstore/ObjectStructureDumper.hpp b/objectstore/ObjectStructureDumper.hpp
index b4a5b61407b254dc3133cd341c1b3e05e30a0b55..5be563d3799303ed6584f013af1894cb58c32c71 100644
--- a/objectstore/ObjectStructureDumper.hpp
+++ b/objectstore/ObjectStructureDumper.hpp
@@ -3,6 +3,7 @@
 #include "RootEntry.hpp"
 #include "AgentRegister.hpp"
 #include "Agent.hpp"
+#include "JobPool.hpp"
 #include <iostream>
 
 class ObjectStrucutreDumper {
@@ -11,16 +12,24 @@ public:
     std::stringstream ret;
     ret << "<< Structure dump start" << std::endl;
     RootEntry re(agent);
-    ret << re.dump(agent);
+    ret << re.dump(agent) << std::endl;;
     try {
       AgentRegister ar(re.getAgentRegister(agent), agent);
-      ret << ar.dump("root->agentRegister", agent);
+      ret << ar.dump(agent) << std::endl;
       std::list<std::string> agList = ar.getElements(agent);
       for (std::list<std::string>::iterator i=agList.begin(); i!=agList.end(); i++) {
         Agent a(*i, agent);
-        ret << a.dump(agent);
+        ret << a.dump(agent) << std::endl;
       }
     } catch (RootEntry::NotAllocatedEx &) {}
+    try {
+      JobPool jp (re.getJobPool(agent), agent);
+      ret << jp.dump(agent) << std::endl;
+      try {
+        FIFO rf(jp.getRecallFIFO(agent), agent);
+        ret << rf.dump(agent) << std::endl;
+      } catch (...) {}
+    } catch (RootEntry::NotAllocatedEx &) {}
     ret << ">> Structure dump end" << std::endl;
     return ret.str();
   }
diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp
index 10f719c738f3b8b49e33f6bab3d621e7443077bb..329d282f6b08fd34717cbf58def28a85ebec2e01 100644
--- a/objectstore/RootEntry.cpp
+++ b/objectstore/RootEntry.cpp
@@ -104,7 +104,7 @@ std::string RootEntry::allocateOrGetJobPool(Agent & agent) {
     agent.addToIntend(s_rootEntryName, jpName, "jobPool");
     // The potential object can now be garbage collected if we die from here.
     // Create the object, then lock. The name should be unique, so no race.
-    cta::objectstore::jobPool jps;
+    cta::objectstore::JobPool jps;
     jps.set_migration("");
     jps.set_recall("");
     writeChild(jpName, jps);
@@ -127,6 +127,7 @@ std::string RootEntry::dump (Agent & agent) {
   updateFromObjectStore(res, agent.getFreeContext());
   ret << "<<<< Root entry dump start" << std::endl;
   if (res.has_agentregister()) ret << "agentRegister=" << res.agentregister() << std::endl;
+  ret << "agentRegister Intent Log size=" << res.agentregisterintentlog_size() << std::endl;
   for (int i=0; i<res.agentregisterintentlog_size(); i++) {
     ret << "agentRegisterIntentLog=" << res.agentregisterintentlog(i) << std::endl;
   }
diff --git a/objectstore/cta.proto b/objectstore/cta.proto
index 7bf0ff0c68e7485be85a62f35f462f4c7cc69575..ab56046748b847257cd4e1c3f35ce2c9f0c68d73 100644
--- a/objectstore/cta.proto
+++ b/objectstore/cta.proto
@@ -81,7 +81,7 @@ message RecallJob {
 }
 
 // The job pool
-message jobPool {
+message JobPool {
   required string migration = 7001;
   required string recall = 7002;
 }
diff --git a/objectstore/tapeResourceManagerTest.cpp b/objectstore/tapeResourceManagerTest.cpp
index 70dd539ff550324bb2c2a84b33b24fcb7b7f7dce..f0b3ae6510d4d94631f381fef44f5d7d17009a1a 100644
--- a/objectstore/tapeResourceManagerTest.cpp
+++ b/objectstore/tapeResourceManagerTest.cpp
@@ -70,11 +70,11 @@ int main(void){
     std::cout << osd.dump(self) << std::endl;
     
     // Create the job pool
-    std::cout << "About to add job pool" << std::endl;
+    std::cout << "=============== About to add job pool" << std::endl;
     JobPool jobPool(re.allocateOrGetJobPool(self), self);
-    std::cout << osd.dump(self) << std::endl;
     // Dump again
     std::cout << osd.dump(self) << std::endl;
+    
   } catch (std::exception &e) {
     std::cout << "got exception: " << e.what() << std::endl;
   }