diff --git a/scheduler/RetrieveMount.hpp b/scheduler/RetrieveMount.hpp
index e5cb7b9028187436ff6ab4f596b0b6a5b2b1d06c..3e29c5dd42773198175170879c0ee03a070e284c 100644
--- a/scheduler/RetrieveMount.hpp
+++ b/scheduler/RetrieveMount.hpp
@@ -237,7 +237,7 @@ namespace cta {
     /**
      * A pointer to the file catalogue.
      */
-    cta::catalogue::Catalogue &m_catalogue; 
+    cta::catalogue::Catalogue &m_catalogue;
     
   }; // class RetrieveMount
 
diff --git a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp
index c59172cfbf8f37d998717b23161dc5916b7faa0c..2207dcd0cdc335843375a83f14da9d41afd944f4 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp
@@ -168,7 +168,8 @@ bool RecallReportPacker::ReportEndofSession::goingToEnd() {
 void RecallReportPacker::ReportDriveStatus::execute(RecallReportPacker& parent){
   parent.m_retrieveMount->setDriveStatus(m_status);
   if(m_status==cta::common::dataStructures::DriveStatus::Unmounting) {
-    parent.m_retrieveMount->tapeComplete();
+    parent.setTapeDone();
+    parent.setTapeComplete();
   }
 }
 
@@ -322,11 +323,11 @@ void RecallReportPacker::WorkerThread::run(){
   // Make sure the last batch of reports got cleaned up. 
   try {
     m_parent.fullCheckAndFinishAsyncExecute();
-    if(m_parent.m_diskThreadComplete){
+    if(m_parent.isDiskDone()){
       //The m_parent.m_diskThreadComplete is set to true when a ReportEndOfSession or a ReportAndOfSessionWithError
       //has been put. It is only after the fullCheckandFinishAsyncExecute is finished that we can say to the mount that the disk thread is complete.
       m_parent.m_lc.log(cta::log::DEBUG, "In RecallReportPacker::WorkerThread::run(): all disk threads are finished, telling the mount that Disk threads are complete");
-      m_parent.m_retrieveMount->diskComplete();
+      m_parent.setDiskComplete();
     }
   } catch(const cta::exception::Exception& e){
       cta::log::ScopedParamContainer params(m_parent.m_lc);
@@ -395,14 +396,30 @@ void RecallReportPacker::fullCheckAndFinishAsyncExecute() {
 //reportTapeDone()
 //------------------------------------------------------------------------------
 void RecallReportPacker::setTapeDone() {
+  cta::threading::MutexLocker mutexLocker(m_mutexTapeDone);
   m_tapeThreadComplete = true;
+}
+
+void RecallReportPacker::setTapeComplete(){
+  cta::threading::MutexLocker mutexLocker(m_mutexSetTapeComplete);
   m_retrieveMount->tapeComplete();
 }
 
+void RecallReportPacker::setDiskComplete(){
+  cta::threading::MutexLocker mutexLocker(m_mutexSetDiskComplete);
+  m_retrieveMount->diskComplete();
+}
+
+bool RecallReportPacker::isDiskDone(){
+  cta::threading::MutexLocker mutexLocker(m_mutexDiskDone);
+  return m_diskThreadComplete;
+}
+
 //------------------------------------------------------------------------------
 //reportDiskDone()
 //------------------------------------------------------------------------------
 void RecallReportPacker::setDiskDone() {
+  cta::threading::MutexLocker mutexLocker(m_mutexDiskDone);
   m_diskThreadComplete = true;
 }
 
diff --git a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.hpp b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.hpp
index 057d310377a98ec45f180b985205deee392ad081..25b4e7686939a62dba184476ac39edebe103c422 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.hpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.hpp
@@ -98,6 +98,12 @@ public:
    */
   virtual void setTapeDone();
   
+  void setTapeComplete();
+  
+  void setDiskComplete();
+  
+  bool isDiskDone();
+  
   /**
    * Query the status of disk and tape threads (are they both done?).
    * @return true if both tape and disk threads are done.
@@ -227,6 +233,14 @@ private:
    */
   bool m_diskThreadComplete;  
   
+  cta::threading::Mutex m_mutexSetTapeComplete;
+  
+  cta::threading::Mutex m_mutexSetDiskComplete;
+  
+  cta::threading::Mutex m_mutexDiskDone;
+  
+  cta::threading::Mutex m_mutexTapeDone;
+
   /*
    * Proceed finish procedure for async execute for all reports.
    *  
diff --git a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp
index 2fd34e97508f4b89a756d19c07d451544a1404a5..a57e6565a78dd4562dfcfb65ec5b1ee014bedb19 100644
--- a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp
+++ b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp
@@ -356,6 +356,7 @@ void castor::tape::tapeserver::daemon::TapeReadSingleThread::run() {
     params.add("status", "success");
     m_stats.totalTime = totalTimer.secs();
     m_rrp.setTapeDone();
+    m_rrp.setTapeComplete();
     logWithStat(cta::log::INFO, "Tape thread complete",
             params);
     // Report one last time the stats, after unloading/unmounting.