diff --git a/castor/scheduler/diskmanager/moverhandler.py b/castor/scheduler/diskmanager/moverhandler.py
index adc2c17144aa41c933a6c1ac257520b39324c33c..be51d38fa5c0e7fd5682e2a6cb79ecd3dd1b58d7 100644
--- a/castor/scheduler/diskmanager/moverhandler.py
+++ b/castor/scheduler/diskmanager/moverhandler.py
@@ -147,10 +147,14 @@ class MoverReqHandlerThread(threading.Thread):
       cksumType = 'AD'
     # find transfer in runningTransfers, raise KeyError if not found
     t = self.runningTransfers.get(transferid)
-    if type(t.process) != subprocess.Popen:
-      # movers for which a process exists need to be kept, so that
-      # runningTransfers.poll() can clean them up. All others can be
-      # dropped from the list of running transfers at this time.
+    if type(t) == TapeTransfer:
+      # acknowledge that the transfer completed and return
+      self.runningTransfers.remove(t)
+      return 0
+    if t.process == None or t.process == 0:
+      # this transfer has no subprocess attached to it (case of xroot and d2d src transfers),
+      # so it can be dropped from the list of running transfers at this time.
+      # Others are kept so that runningTransfers.poll() 'bcan clean them up.
       self.runningTransfers.remove(t)
     # get the admin timeout
     timeout = self.config.getValue('TransferManager', 'AdminTimeout', 5, float)
@@ -184,8 +188,8 @@ class MoverReqHandlerThread(threading.Thread):
                                               timeout=timeout)
           t.ended = True
           return 0
-        elif t.transfer.transferType == TransferType.D2DSRC or type(t) == TapeTransfer:
-          # nothing else to be done for sources and tape transfers
+        elif t.transfer.transferType == TransferType.D2DSRC:
+          # nothing else to be done for d2d sources
           return 0
         else:
           raise ValueError('Invalid transfer type %d for transfer %s' % (t.transfer.transferType, transferid))