diff --git a/objectstore/CreationLog.hpp b/objectstore/CreationLog.hpp
index 55e80c4c5ae403ed3851d7f6c2fb2dd1744804ff..592c4cb3e626d95ac1fac67067a1dc958abf84de 100644
--- a/objectstore/CreationLog.hpp
+++ b/objectstore/CreationLog.hpp
@@ -30,6 +30,7 @@ namespace cta { namespace objectstore {
 class CreationLog: public cta::CreationLog {
 public:
   CreationLog (): cta::CreationLog() {}
+  CreationLog (const cta::CreationLog & cl): cta::CreationLog(cl) {}
   CreationLog (const cta::UserIdentity& user, const std::string & hn, uint64_t t,
     const std::string & c): cta::CreationLog(
       cta::UserIdentity(user),hn ,t, c) {}
diff --git a/scheduler/FileSystemStorageClasses.cpp b/scheduler/FileSystemStorageClasses.cpp
index 7c140c6aa297aad16c552665d4b93416b40af926..c52911becc6c1883110b9781b21298569e3d5c81 100644
--- a/scheduler/FileSystemStorageClasses.cpp
+++ b/scheduler/FileSystemStorageClasses.cpp
@@ -27,11 +27,10 @@
 void cta::FileSystemStorageClasses::createStorageClass(
   const std::string &name,
   const uint16_t nbCopies,
-  const UserIdentity &creator,
-  const std::string &comment) {
+  const CreationLog & creationLog) {
   try {
     checkStorageClassDoesNotAlreadyExist(name);
-    StorageClass storageClass(name, nbCopies, creator, comment);
+    StorageClass storageClass(name, nbCopies, creationLog);
     m_storageClasses[name] = storageClass;
   } catch(std::exception &ex) {
     throw Exception(std::string("Failed to create storage class: ") +
diff --git a/scheduler/FileSystemStorageClasses.hpp b/scheduler/FileSystemStorageClasses.hpp
index 914e19eb9d9f68b29f865c87b8a880ad5c43fa9e..686fbc8bc654b00bfe7184dfa2a372c101cd9606 100644
--- a/scheduler/FileSystemStorageClasses.hpp
+++ b/scheduler/FileSystemStorageClasses.hpp
@@ -27,6 +27,8 @@
 
 namespace cta {
 
+class CreationLog;
+  
 /**
  * The storage classes used in the file system.
  */
@@ -45,8 +47,7 @@ public:
   void createStorageClass(
     const std::string &name,
     const uint16_t nbCopies,
-    const UserIdentity &creator,
-    const std::string &comment);
+    const CreationLog &creationLog);
 
   /**
    * Deletes the specified storage class.
diff --git a/scheduler/MockSchedulerDatabase.cpp b/scheduler/MockSchedulerDatabase.cpp
index 6b6e1b2db81b87f333dd8671a75f178c35266bce..55a4c63b90b3fd983b1cdef2831e998b1546cfd3 100644
--- a/scheduler/MockSchedulerDatabase.cpp
+++ b/scheduler/MockSchedulerDatabase.cpp
@@ -79,6 +79,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "TAPEPOOL     TEXT,"
       "UID               INTEGER,"
       "GID               INTEGER,"
+      "HOST              TEXT,"
       "CREATIONTIME      INTEGER,"
       "COMMENT           TEXT,"
       "PRIMARY KEY (STORAGECLASS_NAME, COPYNB),"
@@ -90,6 +91,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "NBCOPIES       INTEGER,"
       "UID            INTEGER,"
       "GID            INTEGER,"
+      "HOST              TEXT,"
       "CREATIONTIME   INTEGER,"
       "COMMENT        TEXT"
       ");"
@@ -98,6 +100,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "NBPARTIALTAPES INTEGER,"
       "UID            INTEGER,"
       "GID            INTEGER,"
+      "HOST              TEXT,"
       "CREATIONTIME   INTEGER,"
       "COMMENT        TEXT"
       ");"
@@ -109,6 +112,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "DATAONTAPE_BYTES    INTEGER,"
       "UID                 INTEGER,"
       "GID                 INTEGER,"
+      "HOST              TEXT,"
       "CREATIONTIME        INTEGER,"
       "COMMENT             TEXT,"
       "PRIMARY KEY (VID),"
@@ -119,6 +123,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "NAME           TEXT,"
       "UID            INTEGER,"
       "GID            INTEGER,"
+      "HOST              TEXT,"
       "CREATIONTIME   INTEGER,"
       "COMMENT        TEXT,"
       "PRIMARY KEY (NAME)"
@@ -128,6 +133,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "ADMIN_GID      INTEGER,"
       "UID            INTEGER,"
       "GID            INTEGER,"
+      "HOST              TEXT,"
       "CREATIONTIME   INTEGER,"
       "COMMENT        TEXT,"
       "PRIMARY KEY (ADMIN_UID,ADMIN_GID)"
@@ -136,6 +142,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "NAME           TEXT,"
       "UID            INTEGER,"
       "GID            INTEGER,"
+      "HOST              TEXT,"
       "CREATIONTIME   INTEGER,"
       "COMMENT        TEXT,"
       "PRIMARY KEY (NAME)"
@@ -149,7 +156,7 @@ void cta::MockSchedulerDatabase::createSchema() {
       "PRIORITY       INTEGER,"
       "UID            INTEGER,"
       "GID            INTEGER,"
-      "HOST           TEXT,"
+      "HOST              TEXT,"
       "CREATIONTIME   INTEGER,"
       "PRIMARY KEY (ARCHIVEFILE, COPYNB),"
       "FOREIGN KEY (TAPEPOOL) REFERENCES TAPEPOOL(NAME)"
@@ -855,14 +862,15 @@ std::list<cta::AdminHost> cta::MockSchedulerDatabase::getAdminHosts() const {
 // createStorageClass
 //------------------------------------------------------------------------------
 void cta::MockSchedulerDatabase::createStorageClass(
-  const SecurityIdentity &requester, const std::string &name,
-  const uint16_t nbCopies, const std::string &comment) {
+  const std::string &name,
+  const uint16_t nbCopies, const CreationLog &creationLog) {
   char *zErrMsg = 0;
   std::ostringstream query;
-  query << "INSERT INTO STORAGECLASS(NAME, NBCOPIES, UID, GID, CREATIONTIME,"
+  query << "INSERT INTO STORAGECLASS(NAME, NBCOPIES, UID, GID, HOST, CREATIONTIME,"
     " COMMENT) VALUES('" << name << "'," << (int)nbCopies << "," <<
-    requester.getUser().uid << "," << requester.getUser().gid << "," <<
-    (int)time(NULL) << ",'" << comment << "');";
+    creationLog.user.uid << "," << creationLog.user.gid << ", '" <<
+    creationLog.host << "', " <<
+    creationLog.time << ",'" << creationLog.comment << "');";
   if(SQLITE_OK != sqlite3_exec(m_dbHandle, query.str().c_str(), 0, 0,
     &zErrMsg)) {
     std::ostringstream msg;
@@ -904,7 +912,7 @@ std::list<cta::StorageClass> cta::MockSchedulerDatabase::getStorageClasses()
   const {
   std::ostringstream query;
   std::list<cta::StorageClass> classes;
-  query << "SELECT NAME, NBCOPIES, UID, GID, CREATIONTIME, COMMENT FROM"
+  query << "SELECT NAME, NBCOPIES, UID, GID, HOST, CREATIONTIME, COMMENT FROM"
     " STORAGECLASS ORDER BY NAME;";
   sqlite3_stmt *s = NULL;
   const int rc = sqlite3_prepare(m_dbHandle, query.str().c_str(), -1, &s, 0 );
@@ -919,10 +927,13 @@ std::list<cta::StorageClass> cta::MockSchedulerDatabase::getStorageClasses()
     classes.push_back(StorageClass(
       (char *)sqlite3_column_text(statement.get(),idx("NAME")),
       sqlite3_column_int(statement.get(),idx("NBCOPIES")),
-      UserIdentity(sqlite3_column_int(statement.get(),idx("UID")),
-      sqlite3_column_int(statement.get(),idx("GID"))),
-      (char *)sqlite3_column_text(statement.get(),idx("COMMENT")),
-      time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME")))
+      CreationLog(
+        UserIdentity(sqlite3_column_int(statement.get(),idx("UID")),
+          sqlite3_column_int(statement.get(),idx("GID"))),
+        (char *)sqlite3_column_text(statement.get(),idx("HOST")),
+        time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME"))),
+        (char *)sqlite3_column_text(statement.get(),idx("COMMENT"))
+      )
     ));
   }
   return classes;
@@ -934,7 +945,7 @@ std::list<cta::StorageClass> cta::MockSchedulerDatabase::getStorageClasses()
 cta::StorageClass cta::MockSchedulerDatabase::getStorageClass(
   const std::string &name) const {
   std::ostringstream query;
-  query << "SELECT NAME, NBCOPIES, UID, GID, CREATIONTIME, COMMENT"
+  query << "SELECT NAME, NBCOPIES, UID, GID, HOST, CREATIONTIME, COMMENT"
     " FROM STORAGECLASS WHERE NAME='" << name << "';";
   sqlite3_stmt *s = NULL;
   const int rc = sqlite3_prepare(m_dbHandle, query.str().c_str(), -1, &s, 0 );
@@ -952,11 +963,13 @@ cta::StorageClass cta::MockSchedulerDatabase::getStorageClass(
       storageClass = cta::StorageClass(
         (char *)sqlite3_column_text(statement.get(),idx("NAME")),
         sqlite3_column_int(statement.get(),idx("NBCOPIES")),
-        UserIdentity(
-          sqlite3_column_int(statement.get(),idx("UID")),
-          sqlite3_column_int(statement.get(),idx("GID"))),
-        (char *)sqlite3_column_text(statement.get(),idx("COMMENT")),
-        time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME")))
+        CreationLog(
+          UserIdentity(sqlite3_column_int(statement.get(),idx("UID")),
+            sqlite3_column_int(statement.get(),idx("GID"))),
+          (char *)sqlite3_column_text(statement.get(),idx("HOST")),
+          time_t(sqlite3_column_int(statement.get(),idx("CREATIONTIME"))),
+          (char *)sqlite3_column_text(statement.get(),idx("COMMENT"))
+        )
       );
     }
     break;
@@ -1059,11 +1072,10 @@ std::list<cta::TapePool> cta::MockSchedulerDatabase::getTapePools() const {
 // createArchivalRoute
 //------------------------------------------------------------------------------
 void cta::MockSchedulerDatabase::createArchivalRoute(
-  const SecurityIdentity &requester,
   const std::string &storageClassName,
   const uint16_t copyNb,
   const std::string &tapePoolName,
-  const std::string &comment) {
+  const CreationLog &creationLog) {
   const std::list<ArchivalRoute> routes = getArchivalRoutesWithoutChecks(
     storageClassName);
   const StorageClass storageClass = getStorageClass(storageClassName);
@@ -1079,10 +1091,10 @@ void cta::MockSchedulerDatabase::createArchivalRoute(
   char *zErrMsg = 0;
   std::ostringstream query;
   query << "INSERT INTO ARCHIVALROUTE(STORAGECLASS_NAME, COPYNB, TAPEPOOL,"
-    " UID, GID, CREATIONTIME, COMMENT) VALUES('" << storageClassName << "'," <<
-    (int)copyNb << ",'" << tapePoolName << "'," << requester.getUser().uid <<
-    "," << requester.getUser().gid << "," << (int)time(NULL) << ",'" << comment
-    << "');";
+    " UID, GID, HOST, CREATIONTIME, COMMENT) VALUES('" << storageClassName << "'," <<
+    (int)copyNb << ",'" << tapePoolName << "'," << creationLog.user.uid <<
+    "," << creationLog.user.gid << ",'" << creationLog.host << 
+    "'," << (int)time(NULL) << ",'" << creationLog.comment << "');";
   if(SQLITE_OK != sqlite3_exec(m_dbHandle, query.str().c_str(), 0, 0,
     &zErrMsg)) {
     std::ostringstream msg;
diff --git a/scheduler/MockSchedulerDatabase.hpp b/scheduler/MockSchedulerDatabase.hpp
index cb9d3878f102950902d1421c6c6e5aa59d1f5c67..3b2e3f0101e7fb6d366503a77ed792bf5533b79d 100644
--- a/scheduler/MockSchedulerDatabase.hpp
+++ b/scheduler/MockSchedulerDatabase.hpp
@@ -23,7 +23,7 @@
 #include <sqlite3.h>
 
 namespace cta {
-
+  
 /**
  * A mock implementation of the database of a tape resource scheduler.
  */
@@ -214,10 +214,9 @@ public:
    * @param comment The comment describing the storage class.
    */
   void createStorageClass(
-    const SecurityIdentity &requester,
     const std::string &name,
     const uint16_t nbCopies,
-    const std::string &comment);
+    const CreationLog &creationLog);
 
   /**
    * Deletes the specified storage class.
@@ -287,11 +286,10 @@ public:
    * @param comment The comment describing the archival route.
    */
   void createArchivalRoute(
-    const SecurityIdentity &requester,
     const std::string &storageClassName,
     const uint16_t copyNb,
     const std::string &tapePoolName,
-    const std::string &comment);
+    const CreationLog &creationLog);
 
   /**
    * Deletes the specified archival route.
diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp
index 4b3d79c715331d344efcd6ba7f5e6546da06c105..7d0e27c930fbfe8c3641c65df3335d5affd2eecc 100644
--- a/scheduler/OStoreDB/OStoreDB.cpp
+++ b/scheduler/OStoreDB/OStoreDB.cpp
@@ -128,14 +128,12 @@ void OStoreDB::assertIsAdminOnAdminHost(const SecurityIdentity& id) const {
   }
 }
 
-void OStoreDB::createStorageClass(const SecurityIdentity& requester, 
-  const std::string& name, const uint16_t nbCopies, const std::string& comment) {
+void OStoreDB::createStorageClass(const std::string& name,
+  const uint16_t nbCopies, const cta::CreationLog& creationLog) {
   RootEntry re(m_objectStore);
   ScopedExclusiveLock rel(re);
   re.fetch();
-  objectstore::CreationLog cl(requester.getUser(), requester.getHost(),
-    time(NULL), comment);
-  re.addStorageClass(name, nbCopies, cl);
+  re.addStorageClass(name, nbCopies, creationLog);
   re.commit();
 }
 
@@ -146,9 +144,7 @@ StorageClass OStoreDB::getStorageClass(const std::string& name) const {
   auto sc = re.dumpStorageClass(name);
   return cta::StorageClass(name,
     sc.copyCount,
-    cta::UserIdentity(sc.log.user.uid, sc.log.user.gid),
-    sc.log.comment,
-    sc.log.time);
+    sc.log);
 }
 
 std::list<StorageClass> OStoreDB::getStorageClasses() const {
@@ -159,8 +155,7 @@ std::list<StorageClass> OStoreDB::getStorageClasses() const {
   decltype (getStorageClasses()) ret;
   for (auto sc = scl.begin(); sc != scl.end(); sc++) {
     ret.push_back(StorageClass(sc->storageClass, 
-        sc->copyCount, sc->log.user,
-        sc->log.comment, sc->log.time));
+        sc->copyCount, sc->log));
   }
   ret.sort();
   return ret;
@@ -175,15 +170,14 @@ void OStoreDB::deleteStorageClass(const SecurityIdentity& requester,
   re.commit();
 }
 
-void OStoreDB::createArchivalRoute(const SecurityIdentity& requester, 
-  const std::string& storageClassName, const uint16_t copyNb, 
-  const std::string& tapePoolName, const std::string& comment) {
+void OStoreDB::createArchivalRoute(const std::string& storageClassName,
+  const uint16_t copyNb, const std::string& tapePoolName,
+  const cta::CreationLog& creationLog) {
   RootEntry re(m_objectStore);
   ScopedExclusiveLock rel(re);
   re.fetch();
-  objectstore::CreationLog cl(requester.getUser(), requester.getHost(),
-      time(NULL), comment);
-  re.setArchivalRoute(storageClassName, copyNb, tapePoolName, cl);
+  re.setArchivalRoute(storageClassName, copyNb, tapePoolName, 
+    objectstore::CreationLog(creationLog));
   re.commit();
 }
 
diff --git a/scheduler/OStoreDB/OStoreDB.hpp b/scheduler/OStoreDB/OStoreDB.hpp
index cd47ac7a82383b894bf358a7f443d097a613d95d..4cc08ac1dac0ba0ab72741adf0e5bb7edf6bb258 100644
--- a/scheduler/OStoreDB/OStoreDB.hpp
+++ b/scheduler/OStoreDB/OStoreDB.hpp
@@ -58,8 +58,8 @@ public:
   virtual void assertIsAdminOnAdminHost(const SecurityIdentity& id) const;
 
   /* === Storage class handling  ============================================ */
-  virtual void createStorageClass(const SecurityIdentity& requester, 
-    const std::string& name, const uint16_t nbCopies, const std::string& comment);
+  virtual void createStorageClass(const std::string& name,
+    const uint16_t nbCopies, const CreationLog& creationLog);
     
 
   virtual StorageClass getStorageClass(const std::string& name) const;
@@ -72,9 +72,9 @@ public:
     const std::string& name);
 
   /* === Archival routes handling  ========================================== */
-  virtual void createArchivalRoute(const SecurityIdentity& requester, 
-    const std::string& storageClassName, const uint16_t copyNb, 
-    const std::string& tapePoolName, const std::string& comment);
+  virtual void createArchivalRoute(const std::string& storageClassName,
+    const uint16_t copyNb, const std::string& tapePoolName,
+    const CreationLog& creationLog);
 
   virtual std::list<ArchivalRoute> getArchivalRoutes(const std::string& storageClassName) const;
 
diff --git a/scheduler/OStoreDB/OStoreDBFactory.hpp b/scheduler/OStoreDB/OStoreDBFactory.hpp
index 48fb654aac610cd7dee18365effdccdbfa98ddf8..7aebdfd763f208a36af09ffe1694c605233adaf6 100644
--- a/scheduler/OStoreDB/OStoreDBFactory.hpp
+++ b/scheduler/OStoreDB/OStoreDBFactory.hpp
@@ -82,16 +82,16 @@ public:
     m_OStoreDB.createAdminUser(requester, user, comment);
   }
 
-  virtual void createArchivalRoute(const SecurityIdentity& requester, const std::string& storageClassName, const uint16_t copyNb, const std::string& tapePoolName, const std::string& comment) {
-    m_OStoreDB.createArchivalRoute(requester, storageClassName, copyNb, tapePoolName, comment);
+  virtual void createArchivalRoute(const std::string& storageClassName, const uint16_t copyNb, const std::string& tapePoolName, const CreationLog& creationLog) {
+    m_OStoreDB.createArchivalRoute(storageClassName, copyNb, tapePoolName, creationLog);
   }
 
   virtual void createLogicalLibrary(const SecurityIdentity& requester, const std::string& name, const std::string& comment) {
     m_OStoreDB.createLogicalLibrary(requester, name, comment);
   }
 
-  virtual void createStorageClass(const SecurityIdentity& requester, const std::string& name, const uint16_t nbCopies, const std::string& comment) {
-    m_OStoreDB.createStorageClass(requester, name, nbCopies, comment);
+  virtual void createStorageClass(const std::string& name, const uint16_t nbCopies, const CreationLog& creationLog) {
+    m_OStoreDB.createStorageClass(name, nbCopies, creationLog);
   }
 
   virtual void createTape(const SecurityIdentity& requester, const std::string& vid, const std::string& logicalLibraryName, const std::string& tapePoolName, const uint64_t capacityInBytes, const std::string& comment) {
diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index e896e204e31d15c5640496af65c695ede6b12d0f..f2fc489cb35317b8504dfc39f474ae74ac837b18 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -199,7 +199,8 @@ void cta::Scheduler::createStorageClass(
   const uint16_t nbCopies,
   const std::string &comment) {
   m_db.assertIsAdminOnAdminHost(requester);
-  m_db.createStorageClass(requester, name, nbCopies, comment);
+  m_db.createStorageClass(name, nbCopies, CreationLog(requester.getUser(), 
+       requester.getHost(), time(NULL), comment));
 }
 
 //------------------------------------------------------------------------------
@@ -261,8 +262,9 @@ void cta::Scheduler::createArchivalRoute(
   const std::string &tapePoolName,
   const std::string &comment) {
   m_db.assertIsAdminOnAdminHost(requester);
-  m_db.createArchivalRoute(requester, storageClassName, copyNb, tapePoolName,
-    comment);
+  m_db.createArchivalRoute(storageClassName, copyNb, tapePoolName,
+    CreationLog(UserIdentity(requester.getUser()), requester.getHost(),
+    time(NULL), comment));
 }
 
 //------------------------------------------------------------------------------
diff --git a/scheduler/SchedulerDatabase.hpp b/scheduler/SchedulerDatabase.hpp
index 54f1ee61cc4ccdeb25828be205e95ba7e5f4e246..6233af997137b9d289f46fd3bd3332fc9ad06e75 100644
--- a/scheduler/SchedulerDatabase.hpp
+++ b/scheduler/SchedulerDatabase.hpp
@@ -32,6 +32,7 @@ class ArchivalRoute;
 class ArchiveToDirRequest;
 class ArchiveToFileRequest;
 class ArchiveToTapeCopyRequest;
+class CreationLog;
 class DirIterator;
 class LogicalLibrary;
 class RetrieveFromTapeCopyRequest;
@@ -222,17 +223,15 @@ public:
   /**
    * Creates the specified storage class.
    *
-   * @param requester The identity of the requester.
    * @param name The name of the storage class.
    * @param nbCopies The number of copies a file associated with this storage
    * class should have on tape.
-   * @param comment The comment describing the storage class.
+   * @param creationLog The who, where, when an why of this modification.
    */
   virtual void createStorageClass(
-    const SecurityIdentity &requester,
     const std::string &name,
     const uint16_t nbCopies,
-    const std::string &comment) = 0;
+    const CreationLog &creationLog) = 0;
 
   /**
    * Deletes the specified storage class.
@@ -294,19 +293,17 @@ public:
   /**
    * Creates the specified archival route.
    *
-   * @param requester The identity of the requester.
    * @param storageClassName The name of the storage class that identifies the
    * source disk files.
    * @param copyNb The tape copy number.
    * @param tapePoolName The name of the destination tape pool.
-   * @param comment The comment describing the archival route.
+   * @param creationLog The who, where, when an why of this modification.
    */
   virtual void createArchivalRoute(
-    const SecurityIdentity &requester,
     const std::string &storageClassName,
     const uint16_t copyNb,
     const std::string &tapePoolName,
-    const std::string &comment) = 0;
+    const CreationLog &creationLog) = 0;
 
   /**
    * Deletes the specified archival route.
diff --git a/scheduler/SchedulerDatabaseTest.cpp b/scheduler/SchedulerDatabaseTest.cpp
index 19834ace11381541caa2288e7319fac3d894e240..5254c2ddc460f4493f3c1ab126580a0903042756 100644
--- a/scheduler/SchedulerDatabaseTest.cpp
+++ b/scheduler/SchedulerDatabaseTest.cpp
@@ -240,8 +240,9 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_incomplete) {
   const std::string comment = "Comment";
   {
     const uint16_t nbCopies = 2;
-    ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName,
-      nbCopies, comment));
+    ASSERT_NO_THROW(db.createStorageClass(storageClassName,
+      nbCopies, CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(),
+        time(NULL), comment)));
   }
 
   const std::string tapePoolName = "TestTapePool";
@@ -250,8 +251,10 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_incomplete) {
     nbPartialTapes, comment));
 
   const uint16_t copyNb = 1;
-  ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName,
-    copyNb, tapePoolName, comment));
+  ASSERT_NO_THROW(db.createArchivalRoute(storageClassName,
+    copyNb, tapePoolName,
+    CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(),
+    time(NULL), comment)));
 
   ASSERT_THROW(db.getArchivalRoutes(storageClassName), std::exception);
 }
@@ -265,8 +268,11 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_complete) {
   const std::string comment = "Comment";
   {
     const uint16_t nbCopies = 2;
-    ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName,
-      nbCopies, comment));
+    ASSERT_NO_THROW(db.createStorageClass(storageClassName,
+      nbCopies,
+        CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(),
+        time(NULL), comment)
+      ));
   }
 
   const std::string tapePoolNameA = "TestTapePoolA";
@@ -285,14 +291,16 @@ TEST_P(SchedulerDatabaseTest, getArchivalRoutes_complete) {
 
   {
     const uint16_t copyNb = 1;
-    ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName,
-      copyNb, tapePoolNameA, comment));
+    ASSERT_NO_THROW(db.createArchivalRoute(storageClassName,
+      copyNb, tapePoolNameA, CreationLog(s_adminOnAdminHost.getUser(),
+      s_adminOnAdminHost.getHost(), time(NULL), comment)));
   }
 
   {
     const uint16_t copyNb = 2;
-    ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName,
-      copyNb, tapePoolNameB, comment));
+    ASSERT_NO_THROW(db.createArchivalRoute(storageClassName,
+      copyNb, tapePoolNameB, CreationLog(s_adminOnAdminHost.getUser(),
+      s_adminOnAdminHost.getHost(), time(NULL), comment)));
   }
 
   {
@@ -311,8 +319,10 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_same_tape_pool_name) {
   const std::string comment = "Comment";
   {
     const uint16_t nbCopies = 2;
-    ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName,
-      nbCopies, comment));
+    ASSERT_NO_THROW(db.createStorageClass(storageClassName,
+      nbCopies,
+      CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(),
+        time(NULL), comment)));
   }
 
   const std::string tapePoolName = "TestTapePool";
@@ -324,14 +334,16 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_same_tape_pool_name) {
 
   {
     const uint16_t copyNb = 1;
-    ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName,
-      copyNb, tapePoolName, comment));
+    ASSERT_NO_THROW(db.createArchivalRoute(storageClassName,
+      copyNb, tapePoolName, CreationLog(s_adminOnAdminHost.getUser(),
+      s_adminOnAdminHost.getHost(), time(NULL), comment)));
   }
 
   {
     const uint16_t copyNb = 2;
-    ASSERT_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName,
-      copyNb, tapePoolName, comment), std::exception);
+    ASSERT_THROW(db.createArchivalRoute(storageClassName,
+      copyNb, tapePoolName, CreationLog(s_adminOnAdminHost.getUser(),
+      s_adminOnAdminHost.getHost(), time(NULL), comment)), std::exception);
   }
 }
 
@@ -344,8 +356,9 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_two_many_routes) {
   const std::string comment = "Comment";
   {
     const uint16_t nbCopies = 1;
-    ASSERT_NO_THROW(db.createStorageClass(s_adminOnAdminHost, storageClassName,
-      nbCopies, comment));
+    ASSERT_NO_THROW(db.createStorageClass(storageClassName,
+      nbCopies, CreationLog(s_adminOnAdminHost.getUser(), s_adminOnAdminHost.getHost(),
+        time(NULL), comment)));
   }
 
   const std::string tapePoolNameA = "TestTapePoolA";
@@ -364,14 +377,16 @@ TEST_P(SchedulerDatabaseTest, createArchivalRoute_two_many_routes) {
 
   {
     const uint16_t copyNb = 1;
-    ASSERT_NO_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName,
-      copyNb, tapePoolNameA, comment));
+    ASSERT_NO_THROW(db.createArchivalRoute(storageClassName,
+      copyNb, tapePoolNameA, CreationLog(s_adminOnAdminHost.getUser(),
+      s_adminOnAdminHost.getHost(), time(NULL), comment)));
   }
 
   {
     const uint16_t copyNb = 2;
-    ASSERT_THROW(db.createArchivalRoute(s_adminOnAdminHost, storageClassName,
-      copyNb, tapePoolNameB, comment), std::exception);
+    ASSERT_THROW(db.createArchivalRoute(storageClassName,
+      copyNb, tapePoolNameB, CreationLog(s_adminOnAdminHost.getUser(),
+      s_adminOnAdminHost.getHost(), time(NULL), comment)), std::exception);
   }
 }
 
diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp
index 63bfad7da6bc7f4bc50b8a030061642c7a12c28c..0269432d7b703bd5905af4cec2dfabc968eeda11 100644
--- a/scheduler/SchedulerTest.cpp
+++ b/scheduler/SchedulerTest.cpp
@@ -177,6 +177,8 @@ TEST_P(SchedulerTest, createStorageClass_new_as_adminOnAdminHost) {
 
   {
     std::list<StorageClass> storageClasses;
+    scheduler.getStorageClasses(
+      s_adminOnAdminHost);
     ASSERT_NO_THROW(storageClasses = scheduler.getStorageClasses(
       s_adminOnAdminHost));
     ASSERT_EQ(1, storageClasses.size());
diff --git a/scheduler/StorageClass.cpp b/scheduler/StorageClass.cpp
index 739f8e1b6eb5ef0ea2320346e0b3872c392f9cca..5045ba4b88f01cc2f4571ffad539a4d1179be12f 100644
--- a/scheduler/StorageClass.cpp
+++ b/scheduler/StorageClass.cpp
@@ -17,6 +17,7 @@
  */
 
 #include "scheduler/StorageClass.hpp"
+#include "scheduler/CreationLog.hpp"
 
 //------------------------------------------------------------------------------
 // constructor
@@ -37,12 +38,10 @@ cta::StorageClass::~StorageClass() throw() {
 cta::StorageClass::StorageClass(
   const std::string &name,
   const uint16_t nbCopies,
-  const UserIdentity &creator,
-  const std::string &comment,
-  const time_t creationTime):
-  ConfigurationItem(creator, comment, creationTime),
+  const CreationLog &creationLog):
   m_name(name),
-  m_nbCopies(nbCopies) {
+  m_nbCopies(nbCopies),
+  m_creationLog(creationLog) {
 }
 
 //------------------------------------------------------------------------------
diff --git a/scheduler/StorageClass.hpp b/scheduler/StorageClass.hpp
index 14a2cc83f089c1a11e358d0412fb07ee316b35fa..b4f8c82ef40a3d4aae84448794c953df50eb789a 100644
--- a/scheduler/StorageClass.hpp
+++ b/scheduler/StorageClass.hpp
@@ -18,17 +18,19 @@
 
 #pragma once
 
-#include "scheduler/ConfigurationItem.hpp"
+#include "scheduler/CreationLog.hpp"
 
 #include <stdint.h>
 #include <string>
 
 namespace cta {
+  
+class CreationLog;
 
 /**
  * Class representing an archive storage-class.
  */
-class StorageClass: public ConfigurationItem {
+class StorageClass {
 public:
 
   /**
@@ -57,9 +59,7 @@ public:
   StorageClass(
     const std::string &name,
     const uint16_t nbCopies,
-    const UserIdentity &creator,
-    const std::string &comment,
-    const time_t creationTime = time(NULL));
+    const CreationLog &creationLog);
 
   /**
    * Returns the name of the storage class.
@@ -77,6 +77,12 @@ public:
    */
   uint16_t getNbCopies() const throw();
   
+  /**
+   * Get the creation log
+   * @return Reference to the creation log
+   */
+  const CreationLog & getCreationLog() const throw();
+  
   /**
    * Returns true if the specified right-hand side is greater than this object.
    *
@@ -97,7 +103,11 @@ private:
    * class should have on tape.
    */
   uint16_t m_nbCopies;
-
+  
+  /**
+   * The record of the entry's creation
+   */
+  CreationLog m_creationLog;
 }; // class StorageClass
 
 } // namespace cta
diff --git a/xroot_plugins/XrdProFilesystem.cpp b/xroot_plugins/XrdProFilesystem.cpp
index 863d296f07c6c379fabb284edd553f410c01150a..2cebcb23ac5ace91ca51d5306399baab701be780 100644
--- a/xroot_plugins/XrdProFilesystem.cpp
+++ b/xroot_plugins/XrdProFilesystem.cpp
@@ -518,8 +518,9 @@ int XrdProFilesystem::executeLsclassCommand(const ParsedRequest &req, XrdOucErrI
     responseSS << "[OK] Listing of the storage class names and no of copies:";
     for(std::list<cta::StorageClass>::iterator it = stgList.begin(); it != stgList.end(); it++) {
       responseSS << "\n" << it->getName() << " " << it->getNbCopies() << " " 
-              << it->getCreator().uid << " " << it->getCreator().gid << " " 
-              << it->getCreationTime() << " \"" << it->getComment() << "\"";
+              << it->getCreationLog().user.uid << " " << it->getCreationLog().user.gid << " " 
+              << it->getCreationLog().host << " "
+              << it->getCreationLog().time << " \"" << it->getCreationLog().comment << "\"";
     }
     eInfo.setErrInfo(responseSS.str().length()+1, responseSS.str().c_str());
     return SFS_DATA;