diff --git a/Script/castorstorage.py b/Script/castorstorage.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2cd49ccc0af2b665bb65d0fc1ab857a90234709
--- /dev/null
+++ b/Script/castorstorage.py
@@ -0,0 +1,164 @@
+
+__version__='$Revision:$'
+
+from subprocess import *
+
+def _castorenv(stager, pool):
+    return {'RFIO_USE_CASTOR_V2':'YES',
+            'STAGE_HOST':stager,
+            'STAGE_SVCCLASS':pool}
+    
+
+def checksum(filename, stager, pool, logger=None):
+    
+    logInfo = {'file':logger.findCaller()[0],
+               'line':logger.findCaller()[1]}        
+    logger.debug('Fetching checksum from castor for: '
+                 + filename, extra = logInfo)
+    nsls = Popen(['nsls', '-l', '--checksum', filename],
+                 stdout=PIPE, stderr=STDOUT, env=_castorenv(stager,pool))
+    ret = nsls.wait()
+    nslsOut = nsls.stdout.read()
+    if logger:
+        logInfo = {'file':logger.findCaller()[0],
+                   'line':logger.findCaller()[1]}
+        logger.debug(nslsOut, extra=logInfo)
+    
+    try:
+        id = nslsOut.split().index('AD')
+        return nslsOut.split()[id+1]
+    except ValueError:
+        if logger:
+            logInfo = {'file':logger.findCaller()[0],
+                       'line':logger.findCaller()[1]}
+            
+            logger.warning('Adler32 checksum not found for '
+                           + filename + '. nsls output: '
+                           + nslsOut ,extra=logInfo)
+        return None
+
+
+def sizechecksum(filename, stager, pool, logger=None):
+    
+    logInfo = {'file':logger.findCaller()[0],
+               'line':logger.findCaller()[1]}        
+    logger.debug('Fetching checksum from castor for: '
+                 + filename, extra = logInfo)
+    nsls = Popen(['nsls', '-l', '--checksum', filename],
+                 stdout=PIPE, stderr=STDOUT, env=_castorenv(stager,pool))
+    ret = nsls.wait()
+    nslsOut = nsls.stdout.read()
+
+    if logger:
+        logInfo = {'file':logger.findCaller()[0],
+                   'line':logger.findCaller()[1]}
+        logger.debug(nslsOut, extra=logInfo)
+
+    size = checksum = None
+    if ret == 0:
+       
+        try:
+            splitted = nslsOut.split()
+
+            size = int(splitted[4])
+
+            id = splitted.index('AD')
+            checksum = (nslsOut.split()[id+1]).zfill(8)
+            
+        except ValueError:
+            size = checksum = None
+
+            if logger:
+                logInfo = {'file':logger.findCaller()[0],
+                           'line':logger.findCaller()[1]}
+                logger.warning('Adler32 checksum not found for '
+                               + filename + '. nsls output: '
+                               + nslsOut, extra=logInfo)
+            
+        except IndexError:
+            size = checksum = None
+
+            if logger:
+                logInfo = {'file':logger.findCaller()[0],
+                           'line':logger.findCaller()[1]}
+                logger.warning('Error parsing nsls output '
+                               + nslsOut, extra=logInfo)
+
+    return size,checksum
+
+
+def listdir(directory, stager, pool, logger=None):
+
+    nsls = Popen(['nsls', directory],
+                 stdout=PIPE, stderr=STDOUT, env=_castorenv(stager,pool))
+    ret = nsls.wait()
+    nslsOut = nsls.stdout.read()
+    
+    if logger:
+        logInfo = {'file':logger.findCaller()[0],
+                   'line':logger.findCaller()[1]}
+        logger.debug(nslsOut, extra = logInfo)
+    
+    return ((ret == 0), nslsOut)
+
+
+def migrated(filename, stager, pool, logger=None):
+  
+    nsls = Popen(['nsls', '-l', filename],
+                 stdout=PIPE, stderr=STDOUT, env=_castorenv(stager,pool))
+    ret = nsls.wait()
+    nslsOut = nsls.stdout.read()
+
+    if logger:
+        logInfo = {'file':logger.findCaller()[0],
+                   'line':logger.findCaller()[1]}
+        logger.debug(nslsOut, extra = logInfo)
+    
+    return (ret == 0 and 'm' in nslsOut.split(' ')[0])
+        
+
+def mkdir(directory, stager, pool, logger=None):
+
+    nsmkdir = Popen(['nsmkdir', '-p', directory], stdout=PIPE,
+                    stderr=STDOUT, env=_castorenv(stager,pool))
+    ret = nsmkdir.wait()
+
+    if logger:
+        logInfo = {'file':logger.findCaller()[0],
+                   'line':logger.findCaller()[1]}        
+        logger.debug(nsmkdir.stdout.read(),extra = logInfo)
+
+    return ret
+
+
+def remove(dstfile, stager, pool, logger=None):
+    
+    rfrm = Popen(['rfrm', dstfile], stdout = PIPE,
+                 stderr = STDOUT, env=_castorenv(stager,pool))
+    ret = rfrm.wait()
+
+    if logger:
+        logInfo = {'file':logger.findCaller()[0],'line':logger.findCaller()[1]}
+        logger.debug(rfrm.stdout.read(),extra = logInfo)
+
+    return ret
+
+
+def backgroundcopy(srcfile, dstfile, stager, pool, logger=None):
+    
+    rfcp = Popen(['rfcp', srcfile, dstfile], stdout = PIPE,
+                 stderr = STDOUT, env = _castorenv(stager,pool))
+
+    return rfcp, rfcp.pid
+
+
+def copystate(proc):
+
+    return proc.poll()
+
+
+def copystdout(proc):
+
+    return proc.stdout.read()
+
+    
diff --git a/Script/utils.py b/Script/utils.py
index b3203376c316cd1f2b18917c258402f8f8c4cd4d..61665ae7a5ac6bc9045661fed7402ccf4b69bbb6 100644
--- a/Script/utils.py
+++ b/Script/utils.py
@@ -2,7 +2,6 @@
 __version__='$Revision$'
 
 import logging
-from subprocess import *
 
 #### Set Log severity level #####
 def set_log_level(level, logger):
@@ -20,76 +19,6 @@ def set_log_level(level, logger):
 
 
 
-def castorChecksum(castorfile, castorenv, logger):
-    
-    logInfo = {'file':logger.findCaller()[0],
-               'line':logger.findCaller()[1]}        
-    logger.debug('Fetching checksum from castor for: '
-                 + castorfile, extra = logInfo)
-    nsls = Popen(['nsls', '-l', '--checksum', castorfile],
-                 stdout=PIPE, stderr=STDOUT, env=castorenv)
-    ret = nsls.wait()
-    nslsOut = nsls.stdout.read()
-    logInfo = {'file':logger.findCaller()[0],
-               'line':logger.findCaller()[1]}
-    logger.debug(nslsOut, extra=logInfo)
-    
-    try:
-        id = nslsOut.split().index('AD')
-        return nslsOut.split()[id+1]
-    except ValueError:
-        logInfo = {'file':logger.findCaller()[0],
-                   'line':logger.findCaller()[1]}
-        
-        logger.warning('Adler32 checksum not found for '
-                       + castorfile + '. nsls output: '
-                       + nslsOut ,extra=logInfo)
-        return None
-
-
-def castorinfo(castorfile, castorenv, logger):
-    
-    logInfo = {'file':logger.findCaller()[0],
-               'line':logger.findCaller()[1]}        
-    logger.debug('Fetching checksum from castor for: '
-                 + castorfile, extra = logInfo)
-    nsls = Popen(['nsls', '-l', '--checksum', castorfile],
-                 stdout=PIPE, stderr=STDOUT, env=castorenv)
-    ret = nsls.wait()
-    nslsOut = nsls.stdout.read()
-    logInfo = {'file':logger.findCaller()[0],
-               'line':logger.findCaller()[1]}
-    logger.debug(nslsOut, extra=logInfo)
-
-    size = checksum = None
-    if ret == 0:
-        logInfo = {'file':logger.findCaller()[0],
-                   'line':logger.findCaller()[1]}
-       
-        try:
-            splitted = nslsOut.split()
-
-            size = int(splitted[4])
-
-            id = splitted.index('AD')
-            checksum = (nslsOut.split()[id+1]).zfill(8)
-            
-        except ValueError:
-            size = checksum = None
-            
-            logger.warning('Adler32 checksum not found for '
-                           + castorfile + '. nsls output: '
-                           + nslsOut, extra=logInfo)
-            
-        except IndexError:
-            size = checksum = None
-
-            logger.warning('Error parsing nsls output '
-                           + nslsOut, extra=logInfo)
-
-    return size,checksum
-
-