diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index e702295aad173f33e8590478c560d0a6b7bd1160..6e4f357da7f31efd10d54d2a2fd44ab4b6831f2e 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -11,6 +11,7 @@ set (COMMON_LIB_SRC_FILES
   exception/Exception.cpp
   RemoteFileStatus.cpp
   RemotePath.cpp
+  RemotePathAndStatus.cpp
   SmartFd.cpp
   strerror_r_wrapper.cpp
   Timer.cpp
diff --git a/common/RemoteFileStatus.cpp b/common/RemoteFileStatus.cpp
index 6a07787868ab757de6cf3956619763b97eabdc3f..c683b9ac87e27a7aa0f1a9307566ea28c6ba8eed 100644
--- a/common/RemoteFileStatus.cpp
+++ b/common/RemoteFileStatus.cpp
@@ -22,8 +22,8 @@
 // constructor
 //------------------------------------------------------------------------------
 cta::RemoteFileStatus::RemoteFileStatus():
-  m_mode(0),
-  m_size(0) {
+  mode(0),
+  size(0) {
 }
 
 //------------------------------------------------------------------------------
@@ -33,28 +33,7 @@ cta::RemoteFileStatus::RemoteFileStatus(
   const UserIdentity &owner,
   const mode_t mode,
   const uint64_t size):
-  m_owner(owner),
-  m_mode(mode),
-  m_size(size) {
-}
-
-//------------------------------------------------------------------------------
-// getOwner
-//------------------------------------------------------------------------------
-const cta::UserIdentity &cta::RemoteFileStatus::getOwner() const throw() {
-  return m_owner;
-}
-
-//------------------------------------------------------------------------------
-// getMode
-//------------------------------------------------------------------------------
-mode_t cta::RemoteFileStatus::getMode() const throw() {
-  return m_mode;
-}
-
-//------------------------------------------------------------------------------
-// getSize
-//------------------------------------------------------------------------------
-uint64_t cta::RemoteFileStatus::getSize() const throw() {
-  return m_size;
+  owner(owner),
+  mode(mode),
+  size(size) {
 }
diff --git a/common/RemoteFileStatus.hpp b/common/RemoteFileStatus.hpp
index ca995dda3da2a52c3f871625a5b1607f2910ce04..f21f124e20c4bc9b05cab700571d1721ea6c49d3 100644
--- a/common/RemoteFileStatus.hpp
+++ b/common/RemoteFileStatus.hpp
@@ -28,9 +28,7 @@ namespace cta {
 /**
  * The status of a remote file or a directory.
  */
-class RemoteFileStatus {
-public:
-
+struct RemoteFileStatus {
   /**
    * Constructor.
    *
@@ -50,43 +48,22 @@ public:
     const mode_t mode,
     const uint64_t size);
 
-  /**
-   * Returns the identity of the owner.
-   */
-  const UserIdentity &getOwner() const throw();
-
-  /**
-   * Returns the mode bits of the directory entry.
-   *
-   * @return The mode bits of the directory entry.
-   */
-  mode_t getMode() const throw();
-
-  /**
-   * Returns the size of the file in bytes.
-   *
-   * @return The size of the file in bytes.
-   */
-  uint64_t getSize() const throw();
-
-private:
-
   /**
    * The identity of the owner.
    */
-  UserIdentity m_owner;
+  UserIdentity owner;
 
   /**
    * The mode bits of the directory entry.
    */
-  mode_t m_mode;
+  mode_t mode;
 
   /**
    * Returns the size of the file in bytes.
    *
    * @return The size of the file in bytes.
    */
-  uint64_t m_size;
+  uint64_t size;
 
 }; // class RemoteFileStatus
 
diff --git a/common/RemotePathAndStatus.cpp b/common/RemotePathAndStatus.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bd003a4b3df0fc00783d2f182fdbe1c15a4f5349
--- /dev/null
+++ b/common/RemotePathAndStatus.cpp
@@ -0,0 +1,35 @@
+/*
+ * 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 "common/RemotePathAndStatus.hpp"
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RemotePathAndStatus::RemotePathAndStatus() {
+}
+
+//------------------------------------------------------------------------------
+// constructor
+//------------------------------------------------------------------------------
+cta::RemotePathAndStatus::RemotePathAndStatus(
+  const RemotePath &path,
+  const RemoteFileStatus &status):
+  path(path),
+  status(status) {
+}
diff --git a/common/RemotePathAndStatus.hpp b/common/RemotePathAndStatus.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..5d0a5a34be784253161bf0f2c8a961c243851ba1
--- /dev/null
+++ b/common/RemotePathAndStatus.hpp
@@ -0,0 +1,57 @@
+/*
+ * 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 "common/RemoteFileStatus.hpp"
+#include "common/RemotePath.hpp"
+
+namespace cta {
+
+/**
+ * The path and status of a file in a remote storage system.
+ */
+struct RemotePathAndStatus {
+  /**
+   * Constructor.
+   */
+  RemotePathAndStatus();
+
+  /**
+   * Constructor.
+   *
+   * @param path The path of the file in the remote storage system.
+   * @param status The status of the file in the remote storage system.
+   */
+  RemotePathAndStatus(
+    const RemotePath &path,
+    const RemoteFileStatus &status);
+
+  /**
+   * The path of the file in the remote storage system.
+   */
+  RemotePath path;
+
+  /**
+   * The status of the file in the remote storage system.
+   */
+  RemoteFileStatus status;
+
+}; // class RemotePathAndStatus
+
+} // namespace cta
diff --git a/common/UserIdentity.hpp b/common/UserIdentity.hpp
index 71e051c501b984fd45be3a64e328f553a3d14048..be100e09671ad4403d55629b8ac0569ff4bc2b49 100644
--- a/common/UserIdentity.hpp
+++ b/common/UserIdentity.hpp
@@ -26,8 +26,7 @@ namespace cta {
 /**
  * Class reprsenting the identity of a user.
  */
-class UserIdentity {
-public:
+struct UserIdentity {
 
   /**
    * Constructor.
diff --git a/common/UtilsTest.cpp b/common/UtilsTest.cpp
index ff709cedd1e09af6616e6240ab3b27906baca7aa..ec8dfcba26fc80f09dea46187b5baccbf03c0427 100644
--- a/common/UtilsTest.cpp
+++ b/common/UtilsTest.cpp
@@ -148,6 +148,15 @@ TEST_F(cta_UtilsTest,
   ASSERT_EQ(std::string("/grandparent/parent/"), enclosingPath);
 }
 
+TEST_F(cta_UtilsTest, getEnclosedName_just_enclosed_name) {
+  using namespace cta;
+
+  const std::string enclosedName = "child";
+  std::string result;
+  ASSERT_NO_THROW(result = Utils::getEnclosedName(enclosedName));
+  ASSERT_EQ(enclosedName, result);
+}
+
 TEST_F(cta_UtilsTest, getEnclosedName) {
   using namespace cta;
 
diff --git a/remotens/MockRemoteNS.cpp b/remotens/MockRemoteNS.cpp
index 35e51f9e84cba311ce518fcfd334e0ea901d6119..ba599ff14181d9575a08ae374cf599c4cbcccfce 100644
--- a/remotens/MockRemoteNS.cpp
+++ b/remotens/MockRemoteNS.cpp
@@ -24,6 +24,7 @@
 
 #include "common/exception/Exception.hpp"
 #include "common/RemotePath.hpp"
+#include "common/Utils.hpp"
 #include "remotens/MockRemoteNS.hpp"
 
 //------------------------------------------------------------------------------
@@ -51,7 +52,7 @@ bool cta::MockRemoteNS::regularFileExists(const RemotePath &remoteFile) const {
   if(m_entries.end() == it) {
     return false;
   }
-  if(!S_ISREG(m_entries.at(remoteFile).getMode())) {
+  if(!S_ISREG(m_entries.at(remoteFile).mode)) {
     return false;
   }
   return true;
@@ -65,7 +66,7 @@ bool cta::MockRemoteNS::dirExists(const RemotePath &remoteFile) const {
   if(m_entries.end() == it) {
     return false;
   }
-  if(!S_ISDIR(m_entries.at(remoteFile).getMode())) {
+  if(!S_ISDIR(m_entries.at(remoteFile).mode)) {
     return false;
   }
   return true;
@@ -93,7 +94,8 @@ void cta::MockRemoteNS::rename(const RemotePath &remoteFile,
 //------------------------------------------------------------------------------
 std::string cta::MockRemoteNS::getFilename(const RemotePath &remoteFile) const {
   const std::string afterScheme = remoteFile.getAfterScheme();
-  throw exception::Exception(std::string(__FUNCTION__) + " not implemented");
+  const std::string afterSchemeTrimmed = Utils::trimSlashes(afterScheme);
+  return Utils::getEnclosedName(afterSchemeTrimmed);
 }
 
 //------------------------------------------------------------------------------
diff --git a/remotens/MockRemoteNSTest.cpp b/remotens/MockRemoteNSTest.cpp
index c55dbb036ce3b2510c5ad49f0bfb127a1bc8fc34..b54b9313204fe2e2de90373e11060e73ced972c5 100644
--- a/remotens/MockRemoteNSTest.cpp
+++ b/remotens/MockRemoteNSTest.cpp
@@ -106,9 +106,9 @@ TEST_F(cta_MockRemoteNsTest, statFile) {
   ASSERT_NO_THROW(rns.createEntry(rp, status));
   RemoteFileStatus result;
   ASSERT_NO_THROW(result = rns.statFile(rp));
-  ASSERT_TRUE(result.getMode()==mode);
-  ASSERT_TRUE(result.getOwner()==owner);
-  ASSERT_TRUE(result.getSize()==size);
+  ASSERT_EQ(mode, result.mode);
+  ASSERT_EQ(owner, result.owner);
+  ASSERT_EQ(size, result.size);
 }
 
 TEST_F(cta_MockRemoteNsTest, rename) {
@@ -125,9 +125,9 @@ TEST_F(cta_MockRemoteNsTest, rename) {
   ASSERT_NO_THROW(rns.rename(rp, new_rp));  
   RemoteFileStatus result;
   ASSERT_NO_THROW(result = rns.statFile(new_rp));
-  ASSERT_TRUE(result.getMode()==mode);
-  ASSERT_TRUE(result.getOwner()==owner);
-  ASSERT_TRUE(result.getSize()==size);
+  ASSERT_EQ(mode, result.mode);
+  ASSERT_EQ(owner, result.owner);
+  ASSERT_EQ(size, result.size);
 }
 
 } // namespace unitTests
diff --git a/scheduler/ArchiveToFileRequest.cpp b/scheduler/ArchiveToFileRequest.cpp
index 19b38c123777e49b0666c0f996be9ecaa508e27e..2ea29f78e8b7dfe57007822371ddd3b013da5a3b 100644
--- a/scheduler/ArchiveToFileRequest.cpp
+++ b/scheduler/ArchiveToFileRequest.cpp
@@ -34,26 +34,23 @@ cta::ArchiveToFileRequest::~ArchiveToFileRequest() throw() {
 // constructor
 //------------------------------------------------------------------------------
 cta::ArchiveToFileRequest::ArchiveToFileRequest(
-  const std::string &remoteFile,
-  const uint64_t remoteFileSize,
+  const RemotePathAndStatus &remoteFile,
   const std::string &archiveFile,
-  //const RemoteFileStatus &remoteFileStatus,
   const std::map<uint16_t, std::string> &copyNbToPoolMap,
   const uint64_t priority,
   const CreationLog & creationLog):
   ArchiveRequest(priority, creationLog),
-  m_remoteFilePath(remoteFile),
-  m_remoteFileSize(remoteFileSize),
+  m_remoteFile(remoteFile),
   m_archiveFile(archiveFile),
-  m_copyNbToPoolMap(copyNbToPoolMap)/*,
-  m_remoteFileStatus(remoteFileStatus)*/ {
+  m_copyNbToPoolMap(copyNbToPoolMap) {
 }
 
 //------------------------------------------------------------------------------
 // getRemoteFile
 //------------------------------------------------------------------------------
-const std::string &cta::ArchiveToFileRequest::getRemoteFilePath() const throw() {
-  return m_remoteFilePath;
+const cta::RemotePathAndStatus &cta::ArchiveToFileRequest::getRemoteFile()
+  const throw() {
+  return m_remoteFile;
 }
 
 //------------------------------------------------------------------------------
@@ -70,10 +67,3 @@ const std::map<uint16_t, std::string> &cta::ArchiveToFileRequest::
   getCopyNbToPoolMap() const throw() {
   return m_copyNbToPoolMap;
 }
-
-//------------------------------------------------------------------------------
-// getRemoteFileSize
-//------------------------------------------------------------------------------
-uint64_t cta::ArchiveToFileRequest::getRemoteFileSize() const throw() {
-  return m_remoteFileSize;
-}
\ No newline at end of file
diff --git a/scheduler/ArchiveToFileRequest.hpp b/scheduler/ArchiveToFileRequest.hpp
index cec1a02adb148ef8f5d3fa9e87930d923a267018..f4299db2cdfd4c5abb562f6f4908ae80b85ab57e 100644
--- a/scheduler/ArchiveToFileRequest.hpp
+++ b/scheduler/ArchiveToFileRequest.hpp
@@ -18,7 +18,7 @@
 
 #pragma once
 
-#include "common/RemoteFileStatus.hpp"
+#include "common/RemotePathAndStatus.hpp"
 #include "scheduler/ArchiveRequest.hpp"
 
 #include <map>
@@ -47,7 +47,7 @@ public:
   /**
    * Constructor.
    *
-   * @param remoteFile The URL of the source remote file to be archived.
+   * @param remoteFile The path and status of the remote file to be archived.
    * @param archiveFile The full path of the destination archive file.
    * @param remoteFileStatus The status gotten from stat-ing the remote file.
    * @param copyNbToPoolMap The mapping from archive copy number to destination
@@ -56,28 +56,19 @@ public:
    * @param creationLog The creation information
    */
   ArchiveToFileRequest(
-    const std::string &remoteFilePath,
-    const uint64_t remoteFileSize,
+    const RemotePathAndStatus &remoteFilePath,
     const std::string &archiveFile,
-    //const RemoteFileStatus &remoteFileStatus,
     const std::map<uint16_t, std::string> &copyNbToPoolMap,
     const uint64_t priority,
     const CreationLog & creationLog);
 
   /**
-   * Returns the URL of the source remote file to be archived.
+   * Returns the path and status of the remote file to be archived.
    *
-   * @return The URL of the source remote file to be archived.
+   * @return The path and status of the remote file to be archived.
    */
-  const std::string &getRemoteFilePath() const throw();
+  const RemotePathAndStatus &getRemoteFile() const throw();
 
-  /**
-   * Returns the size of the file.
-   * 
-   * @return the size of the file.
-   */
-  uint64_t getRemoteFileSize() const throw();
-  
   /**
    * Returns the full path of the destination archive file.
    *
@@ -95,15 +86,10 @@ public:
 private:
 
   /**
-   * The URL of the destination remote file to be archived.
+   * The path ans status of the remote file to be archived.
    */
-  std::string m_remoteFilePath;
+  RemotePathAndStatus m_remoteFile;
 
-  /**
-   * The remote file size
-   */
-  uint64_t m_remoteFileSize;
-  
   /**
    * The full path of the source archive file.
    */
@@ -114,12 +100,6 @@ private:
    */
   std::map<uint16_t, std::string> m_copyNbToPoolMap;
 
-  /**
-   * The status gotten from stat-ing the remote file.
-   */
-  // TODO: cleanup if this change is satisfactory.  
-  //RemoteFileStatus m_remoteFileStatus;
-  
 }; // class ArchiveToFileRequest
 
 } // namespace cta
diff --git a/scheduler/ArchiveToTapeCopyRequest.cpp b/scheduler/ArchiveToTapeCopyRequest.cpp
index f1e1c84d7b861d61e6afbeeeebdbc465685bdb83..1b4090b0f97d11cd54216c584adaf91375324cbb 100644
--- a/scheduler/ArchiveToTapeCopyRequest.cpp
+++ b/scheduler/ArchiveToTapeCopyRequest.cpp
@@ -34,7 +34,7 @@ cta::ArchiveToTapeCopyRequest::~ArchiveToTapeCopyRequest() throw() {
 // constructor
 //------------------------------------------------------------------------------
 cta::ArchiveToTapeCopyRequest::ArchiveToTapeCopyRequest(
-  const std::string &remoteFile,
+  const RemotePathAndStatus &remoteFile,
   const std::string &archiveFile,
   const uint16_t copyNb,
   const std::string tapePoolName,
@@ -50,7 +50,8 @@ cta::ArchiveToTapeCopyRequest::ArchiveToTapeCopyRequest(
 //------------------------------------------------------------------------------
 // getRemoteFile
 //------------------------------------------------------------------------------
-const std::string &cta::ArchiveToTapeCopyRequest::getRemoteFile() const throw() {
+const cta::RemotePathAndStatus &cta::ArchiveToTapeCopyRequest::getRemoteFile()
+  const throw() {
   return m_remoteFile;
 }
 
diff --git a/scheduler/ArchiveToTapeCopyRequest.hpp b/scheduler/ArchiveToTapeCopyRequest.hpp
index 6f1b17485e052cafb75dd3aa85978a4cd6095ac8..2e62f6c137c958b5590c8492a8a6c83f1813ce83 100644
--- a/scheduler/ArchiveToTapeCopyRequest.hpp
+++ b/scheduler/ArchiveToTapeCopyRequest.hpp
@@ -18,6 +18,7 @@
 
 #pragma once
 
+#include "common/RemotePathAndStatus.hpp"
 #include "scheduler/ArchiveRequest.hpp"
 
 #include <stdint.h>
@@ -44,7 +45,7 @@ public:
   /**
    * Constructor.
    *
-   * @param remoteFile The URL of the source remote file to be archived.
+   * @param remoteFile The path and status of the remote file to be archived.
    * @param archiveFile The full path of the destination archive file.
    * @param copyNb The tape copy number.
    * @param tapePoolName The name of the destination tape pool.
@@ -54,7 +55,7 @@ public:
    * was created.  If no value is given then the current time is used.
    */
   ArchiveToTapeCopyRequest(
-    const std::string &remoteFile,
+    const RemotePathAndStatus &remoteFile,
     const std::string &archiveFile,
     const uint16_t copyNb,
     const std::string tapePoolName,
@@ -62,11 +63,11 @@ public:
     const CreationLog & creationLog);
 
   /**
-   * Returns the URL of the source remote file to be archived.
+   * Returns the path and status of the remote file to be archived.
    *
-   * @return The URL of the source remote file to be archived.
+   * @return The path and status of the remote file to be archived.
    */
-  const std::string &getRemoteFile() const throw();
+  const RemotePathAndStatus &getRemoteFile() const throw();
 
   /**
    * Returns the full path of the destination archive file.
@@ -92,9 +93,9 @@ public:
 private:
 
   /**
-   * The URL of the destination remote file to be archived.
+   * The path and status of the remote file to be archived.
    */
-  std::string m_remoteFile;
+  RemotePathAndStatus m_remoteFile;
 
   /**
    * The full path of the source archive file.
diff --git a/scheduler/CreationLog.hpp b/scheduler/CreationLog.hpp
index 73ae4224abdf7232cd3638fbe573d9ee77d28eb1..3f4c5e94c397ae6afb1c2d777aa3e88acedb14f9 100644
--- a/scheduler/CreationLog.hpp
+++ b/scheduler/CreationLog.hpp
@@ -39,7 +39,7 @@ struct CreationLog {
    * Constructor.
    */
   CreationLog(const UserIdentity &user, const std::string &host,
-    const time_t time,  const std::string & comment);
+    const time_t time,  const std::string & comment = "");
 
   /**
    * The identity of the creator.
diff --git a/scheduler/MockSchedulerDatabase.cpp b/scheduler/MockSchedulerDatabase.cpp
index 984408c7d7446ca304602c558e23a0729f72393d..faa8614283b7d0b60ed14af895c8b026ee5b4884 100644
--- a/scheduler/MockSchedulerDatabase.cpp
+++ b/scheduler/MockSchedulerDatabase.cpp
@@ -150,7 +150,11 @@ void cta::MockSchedulerDatabase::createSchema() {
       ");"
     "CREATE TABLE ARCHIVETOTAPECOPYREQUEST("
       "STATE          TEXT,"
-      "REMOTEFILE     TEXT,"
+      "REMOTEFILEPATH TEXT,"
+      "REMOTEFILEUID  INTEGER,"
+      "REMOTEFILEGID  INTEGER,"
+      "REMOTEFILESIZE INTEGER,"
+      "REMOTEFILEMODE INTEGER,"
       "ARCHIVEFILE    TEXT,"
       "TAPEPOOL       TEXT,"
       "COPYNB         INTEGER,"
@@ -214,7 +218,7 @@ void cta::MockSchedulerDatabase::queue(const ArchiveToFileRequest &rqst) {
     const uint16_t copyNb = itor->first;
     const std::string &tapePoolName = itor->second;
     queue(ArchiveToTapeCopyRequest(
-      rqst.getRemoteFilePath(),
+      rqst.getRemoteFile(),
       rqst.getArchiveFile(),
       copyNb,
       tapePoolName,
@@ -230,14 +234,24 @@ void cta::MockSchedulerDatabase::queue(const ArchiveToTapeCopyRequest &rqst) {
   char *zErrMsg = 0;
   const CreationLog &log = rqst.getCreationLog();
   std::ostringstream query;
-  query << "INSERT INTO ARCHIVETOTAPECOPYREQUEST(STATE, REMOTEFILE,"
-    " ARCHIVEFILE, TAPEPOOL, COPYNB, PRIORITY, UID, GID, HOST, CREATIONTIME) VALUES("
-    << "'PENDING_NS_CREATION','" << rqst.getRemoteFile() << "','" <<
-    rqst.getArchiveFile() << "','" << rqst.getTapePoolName() << "'," <<
-    rqst.getCopyNb() << "," << rqst.getPriority() << "," <<
-    log.user.uid << "," << log.user.gid << ","
-    << " '" << log.host << "', "
-    << (int)log.time << ");";
+  query << "INSERT INTO ARCHIVETOTAPECOPYREQUEST(STATE, REMOTEFILEPATH,"
+    " REMOTEFILEUID, REMOTEFILEGID, REMOTEFILESIZE, REMOTEFILEMODE, ARCHIVEFILE,"
+    " TAPEPOOL, COPYNB, PRIORITY, UID, GID, HOST, CREATIONTIME)"
+    " VALUES("
+    "'PENDING_NS_CREATION','" <<
+    rqst.getRemoteFile().path.getRaw() << "'," <<
+    rqst.getRemoteFile().status.owner.uid << "," <<
+    rqst.getRemoteFile().status.owner.gid << "," <<
+    rqst.getRemoteFile().status.size << "," <<
+    rqst.getRemoteFile().status.mode << ",'" <<
+    rqst.getArchiveFile() << "','" <<
+    rqst.getTapePoolName() << "'," <<
+    rqst.getCopyNb() << "," <<
+    rqst.getPriority() << "," <<
+    log.user.uid << "," <<
+    log.user.gid << ",'" <<
+    log.host << "', " <<
+    (int)log.time << ");";
   if(SQLITE_OK != sqlite3_exec(m_dbHandle, query.str().c_str(), 0, 0,
     &zErrMsg)) {
     std::ostringstream msg;
@@ -261,7 +275,8 @@ std::map<cta::TapePool, std::list<cta::ArchiveToTapeCopyRequest> >
   cta::MockSchedulerDatabase::getArchiveRequests() const {
   std::ostringstream query;
   std::map<TapePool, std::list<ArchiveToTapeCopyRequest> > rqsts;
-  query << "SELECT STATE, REMOTEFILE, ARCHIVEFILE, TAPEPOOL, COPYNB,"
+  query << "SELECT STATE, REMOTEFILEPATH, REMOTEFILEUID, REMOTEFILEGID,"
+    " REMOTEFILESIZE, REMOTEFILEMODE, ARCHIVEFILE, TAPEPOOL, COPYNB,"
     " PRIORITY, UID, GID, HOST, CREATIONTIME FROM ARCHIVETOTAPECOPYREQUEST"
     " ORDER BY ARCHIVEFILE;";
   sqlite3_stmt *s = NULL;
@@ -277,28 +292,40 @@ std::map<cta::TapePool, std::list<cta::ArchiveToTapeCopyRequest> >
     const std::string tapePoolName =
       (char *)sqlite3_column_text(statement.get(), idx("TAPEPOOL"));
     const TapePool tapePool = getTapePool(tapePoolName);
-    const std::string remoteFile = (char *)sqlite3_column_text(statement.get(),
-      idx("REMOTEFILE"));
-    const std::string archiveFile = (char *)sqlite3_column_text(statement.get(),
-      idx("ARCHIVEFILE"));
-    const uint16_t copyNb = sqlite3_column_int(statement.get(), idx("COPYNB"));
-    const std::string tapePolMName = (char *)sqlite3_column_text(
-      statement.get(), idx("TAPEPOOL"));
-    const uint16_t requesterUid = sqlite3_column_int(statement.get(),
-      idx("UID"));
-    const uint16_t requesterGid = sqlite3_column_int(statement.get(),
-      idx("GID"));
+    const std::string remoteFilePath =
+      (char *)sqlite3_column_text(statement.get(), idx("REMOTEFILEPATH"));
+    const uint32_t remoteFileUid =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILEUID"));
+    const uint32_t remoteFileGid =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILEGID"));
+    const uint64_t remoteFileSize =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILESIZE"));
+    const mode_t remoteFileMode =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILEMODE"));
+    const std::string archiveFile =
+      (char *)sqlite3_column_text(statement.get(), idx("ARCHIVEFILE"));
+    const uint16_t copyNb =
+      sqlite3_column_int(statement.get(), idx("COPYNB"));
+    const std::string tapePolMName =
+      (char *)sqlite3_column_text(statement.get(), idx("TAPEPOOL"));
+    const uint16_t requesterUid =
+      sqlite3_column_int(statement.get(), idx("UID"));
+    const uint16_t requesterGid =
+      sqlite3_column_int(statement.get(), idx("GID"));
     const std::map<uint16_t, std::string> copyNbToPoolMap;
-    const uint64_t priority = sqlite3_column_int(statement.get(),
-      idx("PRIORITY"));
+    const uint64_t priority =
+      sqlite3_column_int(statement.get(), idx("PRIORITY"));
     const UserIdentity requester(requesterUid, requesterGid);
     const std::string requesterHost = 
       (char *)sqlite3_column_text(statement.get(),idx("HOST"));
-    const time_t creationTime = sqlite3_column_int(statement.get(),
-      idx("CREATIONTIME"));
-    const CreationLog log(requester, requesterHost, creationTime, "");
+    const time_t creationTime =
+      sqlite3_column_int(statement.get(), idx("CREATIONTIME"));
+    const UserIdentity remoteFileOwner(remoteFileUid, remoteFileGid);
+    const RemoteFileStatus remoteFileStatus(remoteFileOwner, remoteFileMode,
+      remoteFileSize);
+    const CreationLog log(requester, requesterHost, creationTime);
     rqsts[tapePool].push_back(ArchiveToTapeCopyRequest(
-      remoteFile,
+      RemotePathAndStatus(remoteFilePath, remoteFileStatus),
       archiveFile,
       copyNb,
       tapePoolName,
@@ -367,7 +394,8 @@ std::list<cta::ArchiveToTapeCopyRequest> cta::MockSchedulerDatabase::
   getArchiveRequests(const std::string &tapePoolName) const {
   std::ostringstream query;
   std::list<ArchiveToTapeCopyRequest> rqsts;
-  query << "SELECT STATE, REMOTEFILE, ARCHIVEFILE, TAPEPOOL, COPYNB,"
+  query << "SELECT STATE, REMOTEFILEPATH, REMOTEFILEUID, REMOTEFILEGID,"
+    " REMOTEFILESIZE, REMOTEFILEMODE, ARCHIVEFILE, TAPEPOOL, COPYNB,"
     " PRIORITY, UID, GID, HOST, CREATIONTIME FROM ARCHIVETOTAPECOPYREQUEST"
     " WHERE TAPEPOOL='" << tapePoolName << "' ORDER BY ARCHIVEFILE;";
   sqlite3_stmt *s = NULL;
@@ -383,8 +411,16 @@ std::list<cta::ArchiveToTapeCopyRequest> cta::MockSchedulerDatabase::
     const std::string tapePoolName =
       (char *)sqlite3_column_text(statement.get(), idx("TAPEPOOL"));
     const TapePool tapePool = getTapePool(tapePoolName);
-    const std::string remoteFile = (char *)sqlite3_column_text(statement.get(),
-      idx("REMOTEFILE"));
+    const std::string remoteFilePath =
+      (char *)sqlite3_column_text(statement.get(), idx("REMOTEFILEPATH"));
+    const uint32_t remoteFileUid =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILEUID"));
+    const uint32_t remoteFileGid =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILEGID"));
+    const uint64_t remoteFileSize =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILESIZE"));
+    const mode_t remoteFileMode =
+      sqlite3_column_int(statement.get(), idx("REMOTEFILEMODE"));
     const std::string archiveFile = (char *)sqlite3_column_text(statement.get(),
       idx("ARCHIVEFILE"));
     const uint16_t copyNb = sqlite3_column_int(statement.get(), idx("COPYNB"));
@@ -402,9 +438,12 @@ std::list<cta::ArchiveToTapeCopyRequest> cta::MockSchedulerDatabase::
       (char *)sqlite3_column_text(statement.get(),idx("HOST"));
     const time_t creationTime = sqlite3_column_int(statement.get(),
       idx("CREATIONTIME"));
+    const UserIdentity remoteFileOwner(remoteFileUid, remoteFileGid);
+    const RemoteFileStatus remoteFileStatus(remoteFileOwner, remoteFileMode,
+      remoteFileSize);
     const CreationLog log(requester, requesterHost, creationTime, "");
     rqsts.push_back(ArchiveToTapeCopyRequest(
-      remoteFile,
+      RemotePathAndStatus(remoteFilePath, remoteFileStatus),
       archiveFile,
       copyNb,
       tapePoolName,
diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp
index a60eab317cc70fde5b191395fc07a066de5cc2ff..ca88f09e2d1c810164633850793f3c9c5996706c 100644
--- a/scheduler/OStoreDB/OStoreDB.cpp
+++ b/scheduler/OStoreDB/OStoreDB.cpp
@@ -521,8 +521,8 @@ void OStoreDB::queue(const cta::ArchiveToFileRequest& rqst) {
   objectstore::ArchiveToFileRequest atfr(m_agent->nextId("ArchiveToFileRequest"), m_objectStore);
   atfr.initialize();
   atfr.setArchiveFile(rqst.getArchiveFile());
-  atfr.setRemoteFile(rqst.getRemoteFilePath());
-  atfr.setSize(rqst.getRemoteFileSize());
+  atfr.setRemoteFile(rqst.getRemoteFile().path.getRaw());
+  atfr.setSize(rqst.getRemoteFile().status.size);
   atfr.setPriority(rqst.getPriority());
   atfr.setCreationLog(rqst.getCreationLog());
   // We will need to identity tapepools is order to construct the request
diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index d9de597e3655164035cd6b4cfd91554209c344cc..c77be65b9d35a2c230f03ac8b9d33674ba99d366 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -17,6 +17,7 @@
  */
 
 #include "common/exception/Exception.hpp"
+#include "common/RemotePathAndStatus.hpp"
 #include "common/UserIdentity.hpp"
 #include "common/Utils.hpp"
 #include "nameserver/NameServer.hpp"
@@ -505,11 +506,11 @@ void cta::Scheduler::queueArchiveRequest(
       throw exception::Exception(message.str());
     }
 
-    // Fetch the file sizes for each file
-    std::list<RemoteFileInfo> rfil;
-    for (auto rf=remoteFiles.begin(); rf!=remoteFiles.end(); rf++) {
-      auto rfStat = m_remoteNS.statFile(*rf);
-      rfil.push_back(RemoteFileInfo(*rf, rfStat.getSize()));
+    // Fetch the status of each remote file
+    std::list<RemotePathAndStatus> rfil;
+    for (auto rf = remoteFiles.begin(); rf != remoteFiles.end(); rf++) {
+      const auto rfStat = m_remoteNS.statFile(*rf);
+      rfil.push_back(RemotePathAndStatus(*rf, rfStat));
     }
     queueArchiveToDirRequest(requester, rfil, archiveDir);
 
@@ -523,9 +524,9 @@ void cta::Scheduler::queueArchiveRequest(
         " actual=" << remoteFiles.size() << " archiveFile=" << archiveFile;
       throw exception::Exception(message.str());
     }
-    auto rfStat=m_remoteNS.statFile(remoteFiles.front());
+    const auto rfStat = m_remoteNS.statFile(remoteFiles.front());
     queueArchiveToFileRequest(requester, 
-      RemoteFileInfo(remoteFiles.front(), rfStat.getSize()), archiveFile);
+      RemotePathAndStatus(remoteFiles.front(), rfStat), archiveFile);
   }
 }
 
@@ -534,7 +535,7 @@ void cta::Scheduler::queueArchiveRequest(
 //------------------------------------------------------------------------------
 void cta::Scheduler::queueArchiveToDirRequest(
   const SecurityIdentity &requester,
-  const std::list<RemoteFileInfo> &remoteFiles,
+  const std::list<RemotePathAndStatus> &remoteFiles,
   const std::string &archiveDir) {
 
   const uint64_t priority = 0; // TO BE DONE
@@ -574,7 +575,7 @@ void cta::Scheduler::assertStorageClassHasAtLeastOneCopy(
 std::list<cta::ArchiveToFileRequest> cta::Scheduler::
   createArchiveToFileRequests(
   const SecurityIdentity &requester,
-  const std::list<RemoteFileInfo> &remoteFiles,
+  const std::list<RemotePathAndStatus> &remoteFiles,
   const std::string &archiveDir,
   const uint64_t priority) {
   const bool archiveDirEndsWithASlash = Utils::endsWith(archiveDir, '/');
@@ -582,7 +583,7 @@ std::list<cta::ArchiveToFileRequest> cta::Scheduler::
 
   for(auto itor = remoteFiles.cbegin(); itor != remoteFiles.cend(); itor++) {
     const auto remoteFile = *itor;
-    const auto remoteFileName = Utils::getEnclosedName(remoteFile.path);
+    const auto remoteFileName = m_remoteNS.getFilename(remoteFile.path);
     const std::string archiveFile = archiveDirEndsWithASlash ?
       archiveDir + remoteFileName : archiveDir + '/' + remoteFileName;
     archiveToFileRequests.push_back(createArchiveToFileRequest(requester,
@@ -622,7 +623,7 @@ void cta::Scheduler::createNSEntryAndUpdateSchedulerDatabase(
 //------------------------------------------------------------------------------
 void cta::Scheduler::queueArchiveToFileRequest(
   const SecurityIdentity &requester,
-  const RemoteFileInfo &remoteFile,
+  const RemotePathAndStatus &remoteFile,
   const std::string &archiveFile) {
 
   const uint64_t priority = 0; // TO BE DONE
@@ -638,7 +639,7 @@ void cta::Scheduler::queueArchiveToFileRequest(
 //------------------------------------------------------------------------------
 cta::ArchiveToFileRequest cta::Scheduler::createArchiveToFileRequest(
   const SecurityIdentity &requester,
-  const RemoteFileInfo &remoteFile,
+  const RemotePathAndStatus &remoteFile,
   const std::string &archiveFile,
   const uint64_t priority) const {
 
@@ -650,10 +651,9 @@ cta::ArchiveToFileRequest cta::Scheduler::createArchiveToFileRequest(
   const auto routes = m_db.getArchivalRoutes(storageClassName);
   const auto copyNbToPoolMap = createCopyNbToPoolMap(routes);
 
-  const CreationLog log(requester.getUser(), requester.getHost(), time(NULL), "");
+  const CreationLog log(requester.getUser(), requester.getHost(), time(NULL));
   return ArchiveToFileRequest(
-    remoteFile.path,
-    remoteFile.size,
+    remoteFile,
     archiveFile,
     copyNbToPoolMap,
     priority,
diff --git a/scheduler/Scheduler.hpp b/scheduler/Scheduler.hpp
index 016b925bb9a2a008caae4f014949c9a8d6dd28b7..51f7ab0dbd513f7f5622deadf2b731a653dcdf06 100644
--- a/scheduler/Scheduler.hpp
+++ b/scheduler/Scheduler.hpp
@@ -39,6 +39,7 @@ class LogicalLibrary;
 class MountRequest;
 class NameServer;
 class RemoteNS;
+class RemotePathAndStatus;
 class RetrievalFileTransfer;
 class RetrieveFromTapeCopyRequest;
 class RetrieveToDirRequest;
@@ -740,13 +741,14 @@ private:
    * destination directory.
    *
    * @param requester The identity of the user requesting the archival.
-   * @param remoteFiles The URLs of one or more remote files.
+   * @param remoteFiles The paths and statuses of the files in the  remote
+   * storage systems.
    * @param archiveDir The full path of the destination directory within the
    * archive namespace.
    */
   void queueArchiveToDirRequest(
     const SecurityIdentity &requester,
-    const std::list<RemoteFileInfo> &remoteFiles,
+    const std::list<RemotePathAndStatus> &remoteFiles,
     const std::string &archiveDir);
 
   /**
@@ -763,14 +765,15 @@ private:
    * request to archive multiple files to an archive directory.
    *
    * @param requester The identity of the requester.
-   * @param remoteFiles The URLs of the remote files.
+   * @param remoteFiles The paths and statuses of the files in the remote
+   * storage systems.
    * @param archiveFile The full path of the destination directory within the
    * archive namespace.
    * @param priority The priority of the request.
    */
   std::list<ArchiveToFileRequest> createArchiveToFileRequests(
     const SecurityIdentity &requester,
-    const std::list<RemoteFileInfo> &remoteFiles,
+    const std::list<RemotePathAndStatus> &remoteFiles,
     const std::string &archiveDir,
     const uint64_t priority);
 
@@ -789,27 +792,27 @@ private:
    * destination directory.
    *
    * @param requester The identity of the requester.
-   * @param remoteFile The URL of the remote file.
+   * @param remoteFile The path and status of the remote file.
    * @param archiveFile The full path of the destination file within the
    * archive namespace.
    */
   void queueArchiveToFileRequest(
     const SecurityIdentity &requester,
-    const RemoteFileInfo &remoteFile,
+    const RemotePathAndStatus &remoteFile,
     const std::string &archiveFile);
 
   /**
    * Returns the ArchiveToFileRequest object representing the specified request.
    *
    * @param requester The identity of the requester.
-   * @param remoteFile The URL of the remote file.
+   * @param remoteFile The path and status of the remote file.
    * @param archiveFile The full path of the destination file within the
    * archive namespace.
    * @param priority The priority of the request.
    */
   ArchiveToFileRequest createArchiveToFileRequest(
     const SecurityIdentity &requester,
-    const RemoteFileInfo &remoteFile,
+    const RemotePathAndStatus &remoteFile,
     const std::string &archiveFile,
     const uint64_t priority) const;
 
diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp
index 8cdb0a9bd504c7b2484db1c67a4e7569d6396ad2..bc0a789e394cc2ce2972c6d5c8c5f58349263042 100644
--- a/scheduler/SchedulerTest.cpp
+++ b/scheduler/SchedulerTest.cpp
@@ -1550,7 +1550,7 @@ TEST_P(SchedulerTest, archive_to_new_file) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin();
       rqstItor != poolRqsts.cend(); rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -1568,7 +1568,7 @@ TEST_P(SchedulerTest, archive_to_new_file) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin(); rqstItor != poolRqsts.cend();
       rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -1720,7 +1720,7 @@ TEST_P(SchedulerTest, archive_twice_to_same_file) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin();
       rqstItor != poolRqsts.cend(); rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -1738,7 +1738,7 @@ TEST_P(SchedulerTest, archive_twice_to_same_file) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin(); rqstItor != poolRqsts.cend();
       rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -1792,7 +1792,7 @@ TEST_P(SchedulerTest, archive_twice_to_same_file) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin();
       rqstItor != poolRqsts.cend(); rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -1881,7 +1881,7 @@ TEST_P(SchedulerTest, delete_archive_request) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin();
       rqstItor != poolRqsts.cend(); rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -1899,7 +1899,7 @@ TEST_P(SchedulerTest, delete_archive_request) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin(); rqstItor != poolRqsts.cend();
       rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -2113,7 +2113,7 @@ TEST_P(SchedulerTest, archive_to_directory) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin();
       rqstItor != poolRqsts.cend(); rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(4, remoteFiles.size());
@@ -2136,7 +2136,7 @@ TEST_P(SchedulerTest, archive_to_directory) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin(); rqstItor != poolRqsts.cend();
       rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(4, remoteFiles.size());
@@ -2379,7 +2379,7 @@ TEST_P(SchedulerTest, archive_and_retrieve_new_file) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin();
       rqstItor != poolRqsts.cend(); rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
@@ -2397,7 +2397,7 @@ TEST_P(SchedulerTest, archive_and_retrieve_new_file) {
     std::set<std::string> archiveFiles;
     for(auto rqstItor = poolRqsts.cbegin(); rqstItor != poolRqsts.cend();
       rqstItor++) {
-      remoteFiles.insert(rqstItor->getRemoteFile());
+      remoteFiles.insert(rqstItor->getRemoteFile().path.getRaw());
       archiveFiles.insert(rqstItor->getArchiveFile());
     }
     ASSERT_EQ(1, remoteFiles.size());
diff --git a/xroot_plugins/XrdProFile.cpp b/xroot_plugins/XrdProFile.cpp
index d2c5a249a4dd222a93fd53cb7f0d2e4edfd59ba3..e7b2c099469d1d79a28e2b0313a88e728809fcf6 100644
--- a/xroot_plugins/XrdProFile.cpp
+++ b/xroot_plugins/XrdProFile.cpp
@@ -924,7 +924,7 @@ void XrdProFile::xCom_listongoingarchivals(const std::vector<std::string> &token
     for(auto pool = poolList.begin(); pool != poolList.end(); pool++) {
       for(auto request = pool->second.begin(); request!=pool->second.end(); request++) {
         responseSS << pool->first.getName()
-                   << " " << request->getRemoteFile()
+                   << " " << request->getRemoteFile().path.getRaw()
                    << " " << request->getArchiveFile()
                    << " " << request->getCopyNb()
                    << " " << request->getPriority()
@@ -940,7 +940,7 @@ void XrdProFile::xCom_listongoingarchivals(const std::vector<std::string> &token
     auto requestList = m_scheduler->getArchiveRequests(requester, tapePool);    
     for(auto request = requestList.begin(); request!=requestList.end(); request++) {
       responseSS << tapePool
-                 << " " << request->getRemoteFile()
+                 << " " << request->getRemoteFile().path.getRaw()
                  << " " << request->getArchiveFile()
                  << " " << request->getCopyNb()
                  << " " << request->getPriority()