diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp
index 629e98bbce46b476e639f1b3dfa3a3d2c890d27c..c0fed7d220ca17eb52552e013b1275a0072c2a0b 100644
--- a/objectstore/RootEntry.cpp
+++ b/objectstore/RootEntry.cpp
@@ -239,7 +239,7 @@ namespace {
   }
 }
 
-void cta::objectstore::RootEntry::setArchiveRoute(const std::string& storageClass,
+void cta::objectstore::RootEntry::setArchivalRoute(const std::string& storageClass,
   uint16_t copyNb, const std::string& tapePool, const CreationLog& cl) {
   checkPayloadWritable();
   // Find the storageClass entry
@@ -276,7 +276,7 @@ void cta::objectstore::RootEntry::setArchiveRoute(const std::string& storageClas
   }
 }
 
-std::vector<std::string> cta::objectstore::RootEntry::getArchiveRoutes(const std::string storageClass) {
+std::vector<std::string> cta::objectstore::RootEntry::getArchivalRoutes(const std::string storageClass) {
   checkPayloadReadable();
   auto & sc = serializers::findElement(m_payload.storageclasses(), storageClass);
   std::vector<std::string> ret;
@@ -306,7 +306,7 @@ auto cta::objectstore::RootEntry::dumpStorageClasses() -> std::list<StorageClass
     ret.back().log.deserialize(i->log());
     auto & arl = i->routes();
     for (auto j=arl.begin(); j!= arl.end(); j++) {
-      ret.back().routes.push_back(StorageClassDump::ArchiveRouteDump());
+      ret.back().routes.push_back(StorageClassDump::ArchivalRouteDump());
       auto &r = ret.back().routes.back();
       r.copyNumber = j->copynb();
       r.tapePool = j->tapepool();
@@ -327,7 +327,7 @@ auto cta::objectstore::RootEntry::dumpStorageClass(const std::string& name)
       ret.storageClass = i->name();
       auto & arl = i->routes();
       for (auto j=arl.begin(); j!= arl.end(); j++) {
-        ret.routes.push_back(StorageClassDump::ArchiveRouteDump());
+        ret.routes.push_back(StorageClassDump::ArchivalRouteDump());
         auto &r = ret.routes.back();
         r.copyNumber = j->copynb();
         r.tapePool = j->tapepool();
diff --git a/objectstore/RootEntry.hpp b/objectstore/RootEntry.hpp
index 81e81064abdbebc281e32420053a761106fe05b4..18a19246fc7f97887a6101daf84adef39cdecb71 100644
--- a/objectstore/RootEntry.hpp
+++ b/objectstore/RootEntry.hpp
@@ -88,14 +88,15 @@ public:
   void setStorageClassCopyCount(const std::string & storageClass,
     uint16_t copyCount, const CreationLog & cl);
   uint16_t getStorageClassCopyCount(const std::string & storageClass);
-  void setArchiveRoute(const std::string & storageClass, uint16_t copyNb, 
+  void setArchivalRoute(const std::string & storageClass, uint16_t copyNb, 
     const std::string & tapePool, const CreationLog & cl);
+  void removeArchivalRoute(const std::string & storageClass, uint16_t copyNb);
 
   /** Ordered vector of archive routes */
-  std::vector<std::string> getArchiveRoutes (const std::string storageClass);
+  std::vector<std::string> getArchivalRoutes (const std::string storageClass);
   class StorageClassDump {
   public:
-    class ArchiveRouteDump {
+    class ArchivalRouteDump {
     public:
       uint16_t copyNumber;
       std::string tapePool;
@@ -103,7 +104,7 @@ public:
     };
     std::string storageClass;
     uint16_t copyCount;
-    std::list<ArchiveRouteDump> routes;
+    std::list<ArchivalRouteDump> routes;
     CreationLog log;
   };
   std::list<StorageClassDump> dumpStorageClasses();
diff --git a/objectstore/RootEntryTest.cpp b/objectstore/RootEntryTest.cpp
index dc9c0de009c3a5511e9a6f6d4b5a95dc632ea04d..d311611da00acb42997bdd97df64686f668549a9 100644
--- a/objectstore/RootEntryTest.cpp
+++ b/objectstore/RootEntryTest.cpp
@@ -285,8 +285,8 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock lock(re);
     re.fetch();
-    re.setArchiveRoute("class1", 0, "pool1_0", cl);
-    re.setArchiveRoute("class3", 2, "pool3_2", cl);
+    re.setArchivalRoute("class1", 0, "pool1_0", cl);
+    re.setArchivalRoute("class3", 2, "pool3_2", cl);
     re.commit();
   }
   {
@@ -297,8 +297,8 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedSharedLock lock(re);
     re.fetch();
-    ASSERT_NO_THROW(re.getArchiveRoutes("class1"));
-    ASSERT_THROW(re.getArchiveRoutes("class3"),
+    ASSERT_NO_THROW(re.getArchivalRoutes("class1"));
+    ASSERT_THROW(re.getArchivalRoutes("class3"),
       cta::objectstore::RootEntry::IncompleteEntry);
   }
   {
@@ -306,12 +306,12 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) {
     cta::objectstore::RootEntry re(be);
     cta::objectstore::ScopedExclusiveLock lock(re);
     re.fetch();
-    re.setArchiveRoute("class3", 0, "pool3_0", cl);
-    re.setArchiveRoute("class3", 1, "pool3_1", cl);
-    re.setArchiveRoute("class3", 2, "pool3_2b", cl);
+    re.setArchivalRoute("class3", 0, "pool3_0", cl);
+    re.setArchivalRoute("class3", 1, "pool3_1", cl);
+    re.setArchivalRoute("class3", 2, "pool3_2b", cl);
     re.commit();
     re.fetch();
-    ASSERT_NO_THROW(re.getArchiveRoutes("class3"));
+    ASSERT_NO_THROW(re.getArchivalRoutes("class3"));
   }
   {
     // Check that resizing storage classes down and up work as expected
@@ -323,10 +323,10 @@ TEST(RootEntry, StorageClassesAndArchivalRoutes) {
     ASSERT_NO_THROW(re.setStorageClassCopyCount("class3", 2, cl));
     re.commit();
     re.fetch();
-    ASSERT_THROW(re.getArchiveRoutes("class1"),
+    ASSERT_THROW(re.getArchivalRoutes("class1"),
       cta::objectstore::RootEntry::IncompleteEntry);
-    ASSERT_NO_THROW(re.getArchiveRoutes("class3"));
-    ASSERT_EQ(2,re.getArchiveRoutes("class3").size());
+    ASSERT_NO_THROW(re.getArchivalRoutes("class3"));
+    ASSERT_EQ(2,re.getArchivalRoutes("class3").size());
   }
   {
     // Check that dump works in all circumstances
diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp
index 85eb0bc02dfb6a2930addf49728e9035a8bf0aa9..79fa490fbe7ebedeba3bf744c76f45ff8a2497d4 100644
--- a/scheduler/OStoreDB/OStoreDB.cpp
+++ b/scheduler/OStoreDB/OStoreDB.cpp
@@ -157,18 +157,39 @@ StorageClass OStoreDB::getStorageClass(const std::string& name) const {
 }
 
 std::list<StorageClass> OStoreDB::getStorageClasses() const {
-  throw exception::Exception("Not Implemented");
+  RootEntry re(m_objectStore);
+  ScopedSharedLock rel(re);
+  re.fetch();
+  auto scl = re.dumpStorageClasses();
+  decltype (getStorageClasses()) ret;
+  for (auto sc = scl.begin(); sc != scl.end(); sc++) {
+    ret.push_back(StorageClass(sc->storageClass, 
+        sc->copyCount, cta::UserIdentity(sc->log.uid, sc->log.gid),
+        sc->log.comment, sc->log.time));
+  }
+  return ret;
 }
 
 void OStoreDB::deleteStorageClass(const SecurityIdentity& requester, 
   const std::string& name) {
-  throw exception::Exception("Not Implemented");
+  RootEntry re(m_objectStore);
+  ScopedExclusiveLock rel(re);
+  re.fetch();
+  re.removeStorageClass(name);
+  re.commit();
 }
 
 void OStoreDB::createArchivalRoute(const SecurityIdentity& requester, 
   const std::string& storageClassName, const uint16_t copyNb, 
   const std::string& tapePoolName, const std::string& comment) {
-  throw exception::Exception("Not Implemented");
+  RootEntry re(m_objectStore);
+  ScopedExclusiveLock rel(re);
+  re.fetch();
+  objectstore::CreationLog cl(requester.getUser().getUid(),
+      requester.getUser().getUid(), requester.getHost(),
+      time(NULL), comment);
+  re.setArchivalRoute(storageClassName, copyNb, tapePoolName, cl);
+  re.commit();
 }
 
 std::list<ArchivalRoute> 
diff --git a/scheduler/OStoreDB/OStoreDBFactory.hpp b/scheduler/OStoreDB/OStoreDBFactory.hpp
index 84d99e147d3b050f0c0b4dc96be109eb786d9ddb..4e52267c069fad7c81f7efe582ff027a8354d201 100644
--- a/scheduler/OStoreDB/OStoreDBFactory.hpp
+++ b/scheduler/OStoreDB/OStoreDBFactory.hpp
@@ -28,6 +28,7 @@
 #include "scheduler/RetrieveFromTapeCopyRequest.hpp"
 #include "objectstore/RootEntry.hpp"
 #include "objectstore/Agent.hpp"
+#include "objectstore/BackendVFS.hpp"
 
 namespace cta {
   
diff --git a/scheduler/SchedulerDatabaseTest.cpp b/scheduler/SchedulerDatabaseTest.cpp
index 6c4042957adda9f2f9600e68258636bf60af3f81..19834ace11381541caa2288e7319fac3d894e240 100644
--- a/scheduler/SchedulerDatabaseTest.cpp
+++ b/scheduler/SchedulerDatabaseTest.cpp
@@ -25,8 +25,6 @@
 #include "scheduler/SchedulerDatabaseFactory.hpp"
 #include "scheduler/SecurityIdentity.hpp"
 #include "scheduler/UserIdentity.hpp"
-
-#include "objectstore/BackendVFS.hpp"
 #include "OStoreDB/OStoreDBFactory.hpp"
 
 #include <exception>
diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp
index 06dfa5424c67b1432715cf9972e6a4a30c015fa0..63bfad7da6bc7f4bc50b8a030061642c7a12c28c 100644
--- a/scheduler/SchedulerTest.cpp
+++ b/scheduler/SchedulerTest.cpp
@@ -21,6 +21,8 @@
 #include "remotestorage/MockRemoteStorageFactory.hpp"
 #include "remotestorage/RemoteStorage.hpp"
 #include "remotestorage/RemoteStorageFactory.hpp"
+#include "scheduler/AdminUser.hpp"
+#include "scheduler/AdminHost.hpp"
 #include "scheduler/ArchivalRoute.hpp"
 #include "scheduler/ArchiveToFileRequest.hpp"
 #include "scheduler/ArchiveToTapeCopyRequest.hpp"
@@ -32,6 +34,7 @@
 #include "scheduler/StorageClass.hpp"
 #include "scheduler/Tape.hpp"
 #include "scheduler/TapePool.hpp"
+#include "OStoreDB/OStoreDBFactory.hpp"
 
 #include <exception>
 #include <gtest/gtest.h>
@@ -2125,4 +2128,9 @@ static cta::MockRemoteStorageFactory mockRemoteStorageFactory;
 
 INSTANTIATE_TEST_CASE_P(MockSchedulerTest, SchedulerTest,
   ::testing::Values(SchedulerTestParam(mockNsFactory, mockDbFactory, mockRemoteStorageFactory)));
+
+static cta::OStoreDBFactory<cta::objectstore::BackendVFS> OStoreDBFactory;
+
+INSTANTIATE_TEST_CASE_P(OStoreDBPlusMockSchedulerTest, SchedulerTest,
+  ::testing::Values(SchedulerTestParam(mockNsFactory, OStoreDBFactory, mockRemoteStorageFactory)));
 } // namespace unitTests