diff --git a/middletier/CMakeLists.txt b/middletier/CMakeLists.txt
index e2f4ade8012c6d5ac524665c608a653405e4a4d3..89966f32517b420be406e9838af2bef260a48d15 100644
--- a/middletier/CMakeLists.txt
+++ b/middletier/CMakeLists.txt
@@ -80,8 +80,9 @@ add_library (ctamiddletiersqliteunittests SHARED
 
 include_directories(${CMAKE_BINARY_DIR})
 
-add_library(ctamiddletiersqliteobjectstore
-  objectstore/ObjectStoreMiddleTierAdmin.cpp)
+add_library(ctamiddletierobjectstore
+  objectstore/ObjectStoreMiddleTierAdmin.cpp
+  objectstore/ObjectStoreMiddleTierUser.cpp)
 
-add_library (ctamiddletiersqliteobjectstoreunittests SHARED
+add_library (ctamiddletierobjectstoreunittests SHARED
   objectstore/ObjectStoreMiddleTierTest.cpp)
diff --git a/middletier/objectstore/ObjectStoreMiddleTierAdmin.cpp b/middletier/objectstore/ObjectStoreMiddleTierAdmin.cpp
index ccb7934664b033cc7e08795ac51557535c512f52..65dbc50e6baf58c29023e381a60fed717b703ca4 100644
--- a/middletier/objectstore/ObjectStoreMiddleTierAdmin.cpp
+++ b/middletier/objectstore/ObjectStoreMiddleTierAdmin.cpp
@@ -88,15 +88,18 @@ void OStoreMiddleTierAdmin::createAdminHost(
   const SecurityIdentity& requester,
   const std::string& hostName,
   const std::string& comment) {
+  throw cta::exception::Exception("TODO");
 }
 
 void OStoreMiddleTierAdmin::deleteAdminHost(
   const SecurityIdentity& requester,
   const std::string& hostName) {
+  throw cta::exception::Exception("TODO");
 }
 
 std::list<AdminHost> OStoreMiddleTierAdmin::getAdminHosts(
   const SecurityIdentity& requester) const {
+  throw cta::exception::Exception("TODO");
   std::list<AdminHost> ret;
   return ret;
 }
@@ -106,16 +109,18 @@ void OStoreMiddleTierAdmin::createStorageClass(
   const std::string &name,
   const uint16_t nbCopies,
   const std::string &comment) {
+  throw cta::exception::Exception("TODO");
 }
 
 void OStoreMiddleTierAdmin::deleteStorageClass(
   const SecurityIdentity& requester,
   const std::string& name) { 
-
+  throw cta::exception::Exception("TODO");
 }
 
 std::list<StorageClass> OStoreMiddleTierAdmin::getStorageClasses(
   const SecurityIdentity& requester) const {
+  throw cta::exception::Exception("TODO");
   std::list<StorageClass> ret;
   return ret;
 }
@@ -123,18 +128,20 @@ std::list<StorageClass> OStoreMiddleTierAdmin::getStorageClasses(
 void OStoreMiddleTierAdmin::createTapePool(
   const SecurityIdentity& requester,
   const std::string& name,
-  const uint16_t nbDrives,
   const uint32_t nbPartialTapes,
   const std::string& comment) {
 }
 
+
 void OStoreMiddleTierAdmin::deleteTapePool(
   const SecurityIdentity& requester,
   const std::string& name) {
+  throw cta::exception::Exception("TODO");
 }
 
 std::list<TapePool> OStoreMiddleTierAdmin::getTapePools(
   const SecurityIdentity& requester) const {
+  throw cta::exception::Exception("TODO");
   std::list<TapePool> ret;
   return ret;
 }
@@ -145,16 +152,19 @@ void OStoreMiddleTierAdmin::createArchivalRoute(
   const uint16_t copyNb,
   const std::string &tapePoolName,
   const std::string &comment) {
+  throw cta::exception::Exception("TODO");
 }
 
 void OStoreMiddleTierAdmin::deleteArchivalRoute(
   const SecurityIdentity &requester,
   const std::string &storageClassName,
   const uint16_t copyNb) {
+  throw cta::exception::Exception("TODO");
 }
 
 std::list<ArchivalRoute> OStoreMiddleTierAdmin::getArchivalRoutes(
   const SecurityIdentity& requester) const {
+  throw cta::exception::Exception("TODO");
   std::list<ArchivalRoute> ret;
   return ret;
 }
@@ -163,15 +173,18 @@ void OStoreMiddleTierAdmin::createLogicalLibrary(
   const SecurityIdentity& requester,
   const std::string& name,
   const std::string& comment) {
+  throw cta::exception::Exception("TODO");
 }
 
 void OStoreMiddleTierAdmin::deleteLogicalLibrary(
   const SecurityIdentity& requester,
   const std::string& name) {
+  throw cta::exception::Exception("TODO");
 }
 
 std::list<LogicalLibrary> OStoreMiddleTierAdmin::getLogicalLibraries(
   const SecurityIdentity& requester) const {
+  throw cta::exception::Exception("TODO");
   std::list<LogicalLibrary> ret;
   return ret;
 }
@@ -180,10 +193,12 @@ void OStoreMiddleTierAdmin::createTape(
   const SecurityIdentity& requester,
   const std::string& vid,
   const std::string& logicalLibraryName,
-  const std::string& tapePoolName, const uint64_t capacityInBytes, const std::string& comment) {
+  const std::string& tapePoolName, 
+  const uint64_t capacityInBytes, 
+  const std::string& comment) {
+  throw cta::exception::Exception("TODO");
 }
 
-
 void OStoreMiddleTierAdmin::deleteTape(
   const SecurityIdentity& requester,
   const std::string& vid) {
diff --git a/middletier/objectstore/ObjectStoreMiddleTierAdmin.hpp b/middletier/objectstore/ObjectStoreMiddleTierAdmin.hpp
index e662f118171c5877921ede8a5bd3018aaeff5a7b..bc2d99433e9c03d56db2986f0aa59f175ed435ff 100644
--- a/middletier/objectstore/ObjectStoreMiddleTierAdmin.hpp
+++ b/middletier/objectstore/ObjectStoreMiddleTierAdmin.hpp
@@ -33,7 +33,7 @@ namespace objectstore {
 class OStoreMiddleTierAdmin: public MiddleTierAdmin {
 public:
   /**
-   * Contructor
+   * Constructor
    */
   OStoreMiddleTierAdmin(objectstore::Backend & backend);
   
@@ -161,26 +161,6 @@ public:
     const uint32_t nbPartialTapes,
     const std::string &comment);
 
-  /**
-   * Creates a tape pool with the specifed name.
-   *
-   * @param requester The identity of the user requesting the creation of the
-   * tape pool.
-   * @param name The name of the tape pool.
-   * @param nbDrives The maximum number of drives that can be concurrently
-   * assigned to this pool independent of whether they are archiving or
-   * retrieving files.
-   * @param nbPartialTapes The maximum number of tapes that can be partially
-   * full at any moment in time.
-   * @param comment The comment describing the tape pool.
-   */
-  virtual void createTapePool(
-    const SecurityIdentity &requester,
-    const std::string &name,
-    const uint16_t nbDrives,
-    const uint32_t nbPartialTapes,
-    const std::string &comment);
-
   /**
    * Delete the tape pool with the specifed name.
    *
diff --git a/middletier/objectstore/ObjectStoreMiddleTierTest.cpp b/middletier/objectstore/ObjectStoreMiddleTierTest.cpp
index 82d2c88f151306088ec3cf5ba63dbe283c115c63..3b14399334cbe2e9eaecd04de776c61460356934 100644
--- a/middletier/objectstore/ObjectStoreMiddleTierTest.cpp
+++ b/middletier/objectstore/ObjectStoreMiddleTierTest.cpp
@@ -20,19 +20,20 @@
 #include "middletier/interface/MiddleTierAdmin.hpp"
 #include "middletier/interface/MiddleTierUser.hpp"
 #include "middletier/objectstore/ObjectStoreMiddleTierAdmin.hpp"
+#include "middletier/objectstore/ObjectStoreMiddleTierUser.hpp"
 #include "objectstore/BackendVFS.hpp"
 
 namespace unitTests {
 
 class OStoreVfsMiddleTier: public localMiddleTier {
 public:
-  OStoreVfsMiddleTier(): m_vfs(), m_admin(m_vfs) {}
+  OStoreVfsMiddleTier(): m_vfs(), m_admin(m_vfs), m_user(m_vfs) {}
   virtual cta::MiddleTierAdmin & admin () { return m_admin; }
-  //virtual cta::MiddleTierUser & user () { return m_user; }
+  virtual cta::MiddleTierUser & user () { return m_user; }
 private:
   cta::objectstore::BackendVFS m_vfs;
   cta::OStoreMiddleTierAdmin m_admin;
-  //cta::OStoreMiddleTierUser m_user;
+  cta::OStoreMiddleTierUser m_user;
 };
 
 class SQLiteMiddleTierFactory: public MiddleTierFactory {
diff --git a/middletier/objectstore/ObjectStoreMiddleTierUser.cpp b/middletier/objectstore/ObjectStoreMiddleTierUser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..519f1e51f236f44b221ccbedfdb1b0ee49c26ec7
--- /dev/null
+++ b/middletier/objectstore/ObjectStoreMiddleTierUser.cpp
@@ -0,0 +1,123 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "utils/exception/Exception.hpp"
+#include "middletier/objectstore/ObjectStoreMiddleTierUser.hpp"
+#include "objectstore/Backend.hpp"
+#include "objectstore/RootEntry.hpp"
+
+namespace cta {
+
+OStoreMiddleTierUser::OStoreMiddleTierUser(objectstore::Backend& backend):
+  m_backend(backend) {}
+
+OStoreMiddleTierUser::~OStoreMiddleTierUser() throw() { }
+
+void OStoreMiddleTierUser::createDir(
+  const SecurityIdentity& requester,
+  const std::string& dirPath) {
+  throw cta::exception::Exception("TODO");
+
+}
+void OStoreMiddleTierUser::deleteDir(
+  const SecurityIdentity& requester,
+  const std::string& dirPath) {
+  throw cta::exception::Exception("TODO");
+}
+
+DirIterator OStoreMiddleTierUser::getDirContents(
+  const SecurityIdentity& requester,
+  const std::string& dirPath) const {
+  throw cta::exception::Exception("TODO");
+}
+
+DirEntry OStoreMiddleTierUser::stat(
+  const SecurityIdentity& requester,
+  const std::string path) const {
+  throw cta::exception::Exception("TODO");
+}
+
+void OStoreMiddleTierUser::setDirStorageClass(
+  const SecurityIdentity& requester,
+  const std::string& dirPath,
+  const std::string& storageClassName) {
+  throw cta::exception::Exception("TODO");
+}
+
+void OStoreMiddleTierUser::clearDirStorageClass(
+  const SecurityIdentity& requester,
+  const std::string& dirPath) {
+  throw cta::exception::Exception("TODO");
+}
+
+std::string OStoreMiddleTierUser::getDirStorageClass(
+  const SecurityIdentity& requester,
+  const std::string& dirPath) const {
+  throw cta::exception::Exception("TODO");
+}
+
+void OStoreMiddleTierUser::archive(
+  const SecurityIdentity& requester,
+  const std::list<std::string>& srcUrls,
+  const std::string& dstPath) {
+  throw cta::exception::Exception("TODO");
+}
+
+std::map<TapePool, std::list<ArchivalJob> > OStoreMiddleTierUser::getArchivalJobs(
+  const SecurityIdentity& requester) const {
+  throw cta::exception::Exception("TODO");
+}
+
+std::list<ArchivalJob> OStoreMiddleTierUser::getArchivalJobs(
+  const SecurityIdentity& requester,
+  const std::string& tapePoolName) const {
+  throw cta::exception::Exception("TODO");
+}
+
+void OStoreMiddleTierUser::deleteArchivalJob(
+  const SecurityIdentity& requester,
+  const std::string& dstPath) {
+  throw cta::exception::Exception("TODO");
+}
+
+void OStoreMiddleTierUser::retrieve(
+  const SecurityIdentity& requester,
+  const std::list<std::string>& srcPaths,
+  const std::string& dstUrl) {
+  throw cta::exception::Exception("TODO");
+}
+
+std::map<Tape, std::list<RetrievalJob> > OStoreMiddleTierUser::getRetrievalJobs(
+  const SecurityIdentity& requester) const {
+  throw cta::exception::Exception("TODO");
+}
+
+std::list<RetrievalJob> OStoreMiddleTierUser::getRetrievalJobs(
+  const SecurityIdentity& requester,
+  const std::string& vid) const {
+  throw cta::exception::Exception("TODO");
+}
+
+void OStoreMiddleTierUser::deleteRetrievalJob(
+  const SecurityIdentity& requester, 
+  const std::string& dstUrl) {
+  throw cta::exception::Exception("TODO");
+}
+
+  
+}
diff --git a/middletier/objectstore/ObjectStoreMiddleTierUser.hpp b/middletier/objectstore/ObjectStoreMiddleTierUser.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..044649191e801101474aca7e2f7243f9804ad0fd
--- /dev/null
+++ b/middletier/objectstore/ObjectStoreMiddleTierUser.hpp
@@ -0,0 +1,252 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "middletier/interface/MiddleTierUser.hpp"
+
+namespace cta {
+
+namespace objectstore {
+  class Backend;
+}
+
+/**
+ * The user API of the the middle-tier.
+ */
+class OStoreMiddleTierUser: public MiddleTierUser {
+public:
+  /**
+   * Constructor
+   */
+  OStoreMiddleTierUser(objectstore::Backend & backend);
+  
+  /**
+   * Destructor
+   */
+  virtual ~OStoreMiddleTierUser() throw();
+
+  /**
+   * Creates the specified directory.
+   *
+   * @param requester The identity of the user requesting the creation of the
+   * directory.
+   * @param dirPath The absolute path of the directory.
+   */
+  virtual void createDir(
+    const SecurityIdentity &requester,
+    const std::string &dirPath);
+
+  /**
+   * Deletes the specified directory.
+   *
+   * @param requester The identity of the user requesting the deletion of the
+   * directory.
+   * @param dirPath The absolute path of the directory.
+   */
+  virtual void deleteDir(
+    const SecurityIdentity &requester,
+    const std::string &dirPath);
+
+  /**
+   * Gets the contents of the specified directory.
+   *
+   * @param requester The identity of the user requesting the contents of the
+   * directory.
+   * @param dirPath The absolute path of the directory.
+   * @return An iterator over the contents of the directory.
+   */
+  virtual DirIterator getDirContents(
+    const SecurityIdentity &requester,
+    const std::string &dirPath) const;
+
+  /**
+   * Returns the directory entry information for the specified directory or file
+   * within the archive namespace.
+   *
+   * @param requester The identity of the user requesting the directory entry.
+   * @param path The absolute path of the directory or file within the archive
+   * namespace.
+   * @return The directory entry information for the specified directory or file
+   * within the archive namespace.
+   */
+  virtual DirEntry stat(
+    const SecurityIdentity &requester,
+    const std::string path) const;
+
+  /**
+   * Sets the storage class of the specified directory to the specified value.
+   *
+   * @param requester The identity of the user requesting the setting of the
+   * directory's storage class.
+   * @param dirPath The absolute path of the directory.
+   * @param storageClassName The name of the storage class.
+   */
+  virtual void setDirStorageClass(
+    const SecurityIdentity &requester,
+    const std::string &dirPath,
+    const std::string &storageClassName);
+
+  /**
+   * Clears the storage class of the specified directory.
+   *
+   * @param requester The identity of the user requesting the storage class of
+   * the directory to be cleared.
+   * @param dirPath The absolute path of the directory.
+   */
+  virtual void clearDirStorageClass(
+    const SecurityIdentity &requester,
+    const std::string &dirPath);
+
+  /**
+   * Gets the storage class if of the specified directory if the directory has
+   * one.
+   *
+   * @param requester The identity of the user requesting the storage class of
+   * the directory.
+   * @param dirPath The absolute path of the directory.
+   * @return The name of the storage class if the directory has one, else an
+   * empty string.
+   */
+  virtual std::string getDirStorageClass(
+    const SecurityIdentity &requester,
+    const std::string &dirPath) const;
+
+  /**
+   * Creates an archival job to asynchronously archive the specified source
+   * files to the specified destination within the archive.
+   *
+   * If there is more than one source file then the destination must be a
+   * directory.
+   *
+   * If there is only one source file then the destination can be either a file
+   * or a directory.
+   *
+   * The storage class of the archived file will be inherited from its
+   * destination directory.
+   *
+   * @param requester The identity of the user requesting the archival.
+   * @param srcUrls List of one or more source files.
+   * @param dstPath The absolute path of the destination file or directory
+   * within the archive namespace.
+   */
+  virtual void archive(
+    const SecurityIdentity &requester,
+    const std::list<std::string> &srcUrls,
+    const std::string &dstPath);
+
+  /**
+   * Returns all of the existing archival jobs grouped by tape pool and then
+   * sorted by creation time in ascending order (oldest first).
+   *
+   * @param requester The identity of the user requesting the list.
+   * @return All of the existing archival jobs grouped by tape pool and then
+   * sorted by creation time in ascending order (oldest first).
+   */
+  virtual std::map<TapePool, std::list<ArchivalJob> > getArchivalJobs(
+    const SecurityIdentity &requester) const;
+
+  /**
+   * Returns the list of archival jobs associated with the specified tape pool
+   * sorted by creation time in ascending order (oldest first).
+   *
+   * @param requester The identity of the user requesting the list.
+   * @param tapePoolName The name of the tape pool.
+   * @return The list of archival jobs associated with the specified tape pool
+   * sorted by creation time in ascending order (oldest first).
+   */
+  virtual std::list<ArchivalJob> getArchivalJobs(
+    const SecurityIdentity &requester,
+    const std::string &tapePoolName) const;
+
+  /**
+   * Deletes the specified archival job.
+   *
+   * @param requester The identity of the user requesting the deletion of the
+   * tape.
+   * @param dstPath The absolute path of the destination file within the
+   * archive namespace.
+   */
+  virtual void deleteArchivalJob(
+    const SecurityIdentity &requester,
+    const std::string &dstPath);
+
+  /**
+   * Creates a retrieval job to asynchronously retrieve the specified archived
+   * files and copy them to the specified destination URL.
+   *
+   * If there is more than one archived file then the destination must be a
+   * directory.
+   *
+   * If there is only one archived file then the destination can be either a
+   * file or a directory.
+   *
+   * @param requester The identity of the user requesting the retrieval.
+   * @param srcPaths The list of one of more archived files.
+   * @param dstUrl The URL of the destination file or directory.
+   */
+  virtual void retrieve(
+    const SecurityIdentity &requester,
+    const std::list<std::string> &srcPaths,
+    const std::string &dstUrl);
+
+  /**
+   * Returns all of the existing retrieval jobs grouped by tape and then
+   * sorted by creation time in ascending order (oldest first).
+   *
+   * @param requester The identity of the user requesting the list.
+   * @return All of the existing retrieval jobs grouped by tape and then
+   * sorted by creation time in ascending order (oldest first).
+   */
+  virtual std::map<Tape, std::list<RetrievalJob> > getRetrievalJobs(
+    const SecurityIdentity &requester) const;
+
+  /**
+   * Returns the list of retrieval jobs associated with the specified tape
+   * sorted by creation time in ascending order (oldest first).
+   *
+   * @param requester The identity of the user requesting the list.
+   * @param vid The volume identifier of the tape.
+   * @return The list of retrieval jobs associated with the specified tape
+   * sorted by creation time in ascending order (oldest first).
+   */
+  virtual std::list<RetrievalJob> getRetrievalJobs(
+    const SecurityIdentity &requester,
+    const std::string &vid) const;
+
+  /**
+   * Deletes the specified retrieval job.
+   *
+   * @param requester The identity of the user requesting the deletion of the
+   * tape.
+   * @param dstUrl The URL of the destination file or directory.
+   */
+  virtual void deleteRetrievalJob(
+    const SecurityIdentity &requester,
+    const std::string &dstUrl);
+  
+private:
+  /**
+   * Reference to the backend used for storing objects
+   */
+  objectstore::Backend & m_backend;
+
+}; // class OStoreMiddleTierUser
+
+}
+
diff --git a/objectstore/ObjectOps.cpp b/objectstore/ObjectOps.cpp
index 5a121cc80c4620d5643743573104e06d581ceeee..c7b7b423577255278c0fa813c3161e4840571f27 100644
--- a/objectstore/ObjectOps.cpp
+++ b/objectstore/ObjectOps.cpp
@@ -33,6 +33,7 @@ namespace cta { namespace objectstore {
   MAKE_CTA_OBJECTSTORE_OBJECTOPS_TYPEID(RecallJob);
   MAKE_CTA_OBJECTSTORE_OBJECTOPS_TYPEID(Counter);
   MAKE_CTA_OBJECTSTORE_OBJECTOPS_TYPEID(FIFO);
+  MAKE_CTA_OBJECTSTORE_OBJECTOPS_TYPEID(AdminUsersList);
   
 #undef MAKE_CTA_OBJECTSTORE_OBJECTOPS_TYPEID
 }} 
\ No newline at end of file
diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp
index 46a1dea61ed75422fdbc4db498682c71a1e9fa75..e681ee67ff14a35b65e5870e4f9804f4329483ca 100644
--- a/objectstore/RootEntry.cpp
+++ b/objectstore/RootEntry.cpp
@@ -96,6 +96,22 @@ std::string cta::objectstore::RootEntry::allocateOrGetAgentRegister(Agent & agen
   }
 }
 
+void cta::objectstore::RootEntry::addIntendedAgentRegistry(const std::string& name) {
+  checkPayloadWritable();
+  std::string * reg = m_payload.mutable_agentregisterintentlog()->Add();
+  *reg = name;
+}
+
+void cta::objectstore::RootEntry::deleteFromIntendedAgentRegistry(const std::string& name) {
+  checkPayloadWritable();
+  serializers::removeString(m_payload.mutable_agentregisterintentlog(), name);
+}
+
+void cta::objectstore::RootEntry::setAgentRegister(const std::string& name) {
+  throw cta::exception::Exception("TODO");
+}
+
+
 // Get the name of the JobPool (or exception if not available)
 std::string cta::objectstore::RootEntry::getJobPool() {
   checkPayloadReadable();
@@ -145,17 +161,6 @@ std::string cta::objectstore::RootEntry::allocateOrGetJobPool(Agent & agent) {
   }
 }
 
-void cta::objectstore::RootEntry::addIntendedAgentRegistry(const std::string& name) {
-  checkPayloadWritable();
-  std::string * reg = m_payload.mutable_agentregisterintentlog()->Add();
-  *reg = name;
-}
-
-void cta::objectstore::RootEntry::deleteFromIntendedAgentRegistry(const std::string& name) {
-  checkPayloadWritable();
-  serializers::removeString(m_payload.mutable_agentregisterintentlog(), name);
-}
-
 void cta::objectstore::RootEntry::addIntendedJobPool(const std::string& name) {
   checkPayloadWritable();
   std::string * jp = m_payload.mutable_jobpoolintentlog()->Add();
@@ -167,16 +172,39 @@ void cta::objectstore::RootEntry::deleteFromIntendedJobPool(const std::string& n
   serializers::removeString(m_payload.mutable_jobpoolintentlog(), name);
 }
 
-void cta::objectstore::RootEntry::setAgentRegister(const std::string& name) {
-  checkPayloadWritable();
-  m_payload.set_agentregister(name);
-}
-
 void cta::objectstore::RootEntry::setJobPool(const std::string& name) {
   checkPayloadWritable();
   m_payload.set_jobpool(name);
 }
 
+// Get the name of the admin user list (or exception if not available)
+std::string cta::objectstore::RootEntry::getAdminUsersList() {
+  // Check that the fetch was done
+  if (!m_payloadInterpreted)
+    throw ObjectOpsBase::NotFetched("In RootEntry::getAdminUsersList: object not yet fetched");
+  // If the registry is defined, return it, job done.
+  if (m_payload.adminuserslist().size())
+    return m_payload.adminuserslist();
+  throw NotAllocatedEx("In RootEntry::getAdminUsersList: adminUserList not yet allocated");
+}
+
+std::string cta::objectstore::RootEntry::allocateOrGetAdminUsersList(Agent& agent) {
+  throw cta::exception::Exception("TODO");
+}
+
+void cta::objectstore::RootEntry::addIntendedAdminUsersList(const std::string& name) {
+  throw cta::exception::Exception("TODO");
+}
+
+void cta::objectstore::RootEntry::deleteFromIntendedAdminUsersList(const std::string& name) {
+  throw cta::exception::Exception("TODO");
+}
+
+void cta::objectstore::RootEntry::setAdminUsersList(const std::string& name) {
+  throw cta::exception::Exception("TODO");
+}
+
+
 // Dump the root entry
 std::string cta::objectstore::RootEntry::dump () {
   checkPayloadReadable();
diff --git a/objectstore/RootEntry.hpp b/objectstore/RootEntry.hpp
index 7420094584f23b4ac1bb436b9749ab4e921fd096..b84b9a1fac574100118e74ca68bae1dc5b8b0bb4 100644
--- a/objectstore/RootEntry.hpp
+++ b/objectstore/RootEntry.hpp
@@ -45,13 +45,29 @@ public:
   
   // Get the name of a (possibly freshly created) agent register
   std::string allocateOrGetAgentRegister(Agent & agent);
+
+private:
+  void addIntendedAgentRegistry(const std::string & name);
   
+  void deleteFromIntendedAgentRegistry(const std::string & name);
+  
+  void setAgentRegister(const std::string & name);
+
+public:  
   // Get the name of the JobPool (or exception if not available)
   std::string getJobPool();
   
   // Get the name of a (possibly freshly created) job pool
   std::string allocateOrGetJobPool(Agent & agent);
   
+private:
+  void addIntendedJobPool(const std::string & name);
+  
+  void deleteFromIntendedJobPool(const std::string & name);
+  
+  void setJobPool(const std::string & name);
+
+public:  
   // Get the name of the AdminUsersList (or exception if not available)
   std::string getAdminUsersList();
   
@@ -59,17 +75,11 @@ public:
   std::string allocateOrGetAdminUsersList(Agent & agent);
   
 private:
-  void addIntendedAgentRegistry(const std::string & name);
+  void addIntendedAdminUsersList(const std::string & name);
   
-  void deleteFromIntendedAgentRegistry(const std::string & name);
-  
-  void setAgentRegister(const std::string & name);
+  void deleteFromIntendedAdminUsersList(const std::string & name);
   
-  void addIntendedJobPool(const std::string & name);
-  
-  void deleteFromIntendedJobPool(const std::string & name);
-  
-  void setJobPool(const std::string & name);
+  void setAdminUsersList(const std::string & name);
   
 public:
   // Dump the root entry
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 1b8a0a433de1086f7aae74a97dea59155f4e7ff6..b513680a7b20f83b9763cf778e73602763b42fae 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -16,6 +16,9 @@ target_link_libraries(unittests
   ctamiddletierunittests
   ctamiddletiersqlite
   ctamiddletiersqliteunittests
+  
+  ctamiddletierobjectstoreunittests
+  ctamiddletierobjectstore
   ctanamespacevfs
   ctanamespacevfsunittests
   gmock