diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index 06c855db493d150fbfee4dfb4f68b66b63ac8d00..e7ab15bc6c673d888ca6014d2e7dfc64c9fe4730 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -733,6 +733,8 @@ void cta::Scheduler::queueRetrieveRequest(
   const std::string &remoteFileOrDir) {
 
   const auto remoteStat = m_remoteNS.statFile(remoteFileOrDir);
+  // If the target does not exist or is a directory, we are retrieving to 
+  // directory
   const bool retrieveToDir = remoteStat.get() && S_ISDIR(remoteStat->mode);
   if(retrieveToDir) {
     const std::string &remoteDir = remoteFileOrDir;
@@ -744,12 +746,33 @@ void cta::Scheduler::queueRetrieveRequest(
   } else {
     const std::string &remoteFile = remoteFileOrDir;
 
+    // The remote file should not exist
     if(remoteStat.get()) {
       std::ostringstream msg;
       msg << "Failed to queue request to retrieve to the single file " <<
         remoteFile << " because the remote file already exists";
       throw exception::Exception(msg.str());
     }
+    // We should only try to retrieve one file
+    if (archiveFiles.size() != 1)
+      throw exception::Exception("Failed to queue request to retrieve to single file: trying to retrieve several files");
+    // Check the validity of the source
+    auto sourceStat = m_ns.statFile(requester, archiveFiles.front());
+    if (!sourceStat.get())
+      throw exception::Exception("Failed to queue request to retrieve to single file: source file does not exist");
+    auto tapeCopies = m_ns.getTapeFiles(requester, archiveFiles.front());
+    if (!tapeCopies.size())
+      throw exception::Exception("Failed to queue request to retrieve to single file: source file has no copy on tape");
+    // Generate the requests and enqueue them in the database
+    CreationLog cl (requester.getUser(), requester.getHost(), time(NULL), 
+        "Retrieve request queueing");
+    std::list<TapeFileLocation> tcl;
+    for (auto nstf = tapeCopies.begin(); nstf != tapeCopies.end(); nstf++) {
+      tcl.push_back(nstf->tapeFileLocation);
+    }
+    RetrieveToFileRequest rtfr (archiveFiles.front(), sourceStat->size,
+        tcl, remoteFile, 0, cl);
+    m_db.queue(rtfr);
   }
 }
 
diff --git a/scheduler/SchedulerTest.cpp b/scheduler/SchedulerTest.cpp
index 5b8547bb3f90a1731c28dce9d8b35b25368666c4..ec556ea6792bbd07f8f89496d8ee7a21def45323 100644
--- a/scheduler/SchedulerTest.cpp
+++ b/scheduler/SchedulerTest.cpp
@@ -155,6 +155,16 @@ public:
   static const std::string s_remoteFileRawPath3;
   static const std::string s_remoteFileRawPath4;
 
+  static const std::string s_remoteTargetFilename1;
+  static const std::string s_remoteTargetFilename2;
+  static const std::string s_remoteTargetFilename3;
+  static const std::string s_remoteTargetFilename4;
+
+  static const std::string s_remoteTargetRawPath1;
+  static const std::string s_remoteTargetRawPath2;
+  static const std::string s_remoteTargetRawPath3;
+  static const std::string s_remoteTargetRawPath4;
+
 private:
 
   // Prevent copying
@@ -197,6 +207,16 @@ const std::string SchedulerTest::s_remoteFileRawPath2(std::string("mock:") + s_r
 const std::string SchedulerTest::s_remoteFileRawPath3(std::string("mock:") + s_remoteFilename3);
 const std::string SchedulerTest::s_remoteFileRawPath4(std::string("mock:") + s_remoteFilename4);
 
+const std::string SchedulerTest::s_remoteTargetFilename1("remoteFileForWrite1");
+const std::string SchedulerTest::s_remoteTargetFilename2("remoteFileForWrite2");
+const std::string SchedulerTest::s_remoteTargetFilename3("remoteFileForWrite3");
+const std::string SchedulerTest::s_remoteTargetFilename4("remoteFileForWrite4");
+
+const std::string SchedulerTest::s_remoteTargetRawPath1(std::string("mock:") + s_remoteTargetFilename1);
+const std::string SchedulerTest::s_remoteTargetRawPath2(std::string("mock:") + s_remoteTargetFilename2);
+const std::string SchedulerTest::s_remoteTargetRawPath3(std::string("mock:") + s_remoteTargetFilename3);
+const std::string SchedulerTest::s_remoteTargetRawPath4(std::string("mock:") + s_remoteTargetFilename4);
+
 TEST_P(SchedulerTest, createStorageClass_new_as_adminOnAdminHost) {
   using namespace cta;
 
@@ -2402,7 +2422,7 @@ TEST_P(SchedulerTest, archive_and_retrieve_new_file) {
     std::list<std::string> archiveFiles;
     archiveFiles.push_back("/grandparent/parent_file");
     ASSERT_THROW(scheduler.queueRetrieveRequest(s_userOnUserHost, archiveFiles,
-      s_remoteFileRawPath1), std::exception);
+      s_remoteTargetRawPath1), std::exception);
   }
 
   {
@@ -2429,14 +2449,16 @@ TEST_P(SchedulerTest, archive_and_retrieve_new_file) {
   }
 
   {
+    
     std::list<std::string> archiveFiles;
     archiveFiles.push_back("/grandparent/parent_file");
     ASSERT_NO_THROW(scheduler.queueRetrieveRequest(s_userOnUserHost,
-      archiveFiles, s_remoteFileRawPath1));
+      archiveFiles, s_remoteTargetRawPath1));
   }
 
   {
-    const auto rqsts = scheduler.getRetrieveRequests(s_userOnUserHost);
+    decltype(scheduler.getRetrieveRequests(s_userOnUserHost)) rqsts;
+    ASSERT_NO_THROW(rqsts = scheduler.getRetrieveRequests(s_userOnUserHost));
     ASSERT_EQ(1, rqsts.size());
     auto tapeItor = rqsts.cbegin();
     ASSERT_FALSE(tapeItor == rqsts.cend());
diff --git a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp
index cbc3a97145b40d2de94cb8cdc9cfee422cf44018..ee602264bcee1598d9f895d6b090bc72061bf89d 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp
@@ -262,10 +262,10 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
       // Schedule the retrieval of the file
       std::list<std::string> archiveFilePaths;
       archiveFilePaths.push_back(archiveFilePath.str());
-      scheduler. queueRetrieveRequest(
+      ASSERT_NO_THROW(scheduler. queueRetrieveRequest(
         requester,
         archiveFilePaths,
-        remoteFilePath.str());
+        remoteFilePath.str()));
     }
   }
 
@@ -408,10 +408,10 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
       // Schedule the retrieval of the file
       std::list<std::string> archiveFilePaths;
       archiveFilePaths.push_back(archiveFilePath.str());
-      scheduler. queueRetrieveRequest(
+      ASSERT_NO_THROW(scheduler. queueRetrieveRequest(
         requester,
         archiveFilePaths,
-        remoteFilePath.str());
+        remoteFilePath.str()));
     }
   }
 
@@ -603,10 +603,10 @@ TEST_F(castor_tape_tapeserver_daemon_DataTransferSessionTest, DataTransferSessio
       // Schedule the retrieval of the file
       std::list<std::string> archiveFilePaths;
       archiveFilePaths.push_back(archiveFilePath.str());
-      scheduler. queueRetrieveRequest(
+      ASSERT_NO_THROW(scheduler. queueRetrieveRequest(
         requester,
         archiveFilePaths,
-        remoteFilePath.str());
+        remoteFilePath.str()));
     }
   }
   DriveConfig driveConfig("T10D6116", "T10KD6", "/dev/tape_T10D6116", "manual");