diff --git a/Script/eosstorage.py b/Script/eosstorage.py
index 17e27d4456587734ebbe378a859ab16dde6aeb1c..58eae7403daa0f00f09cf3d5c3e95ab019b1c90c 100644
--- a/Script/eosstorage.py
+++ b/Script/eosstorage.py
@@ -4,38 +4,124 @@ __version__='$Revision$'
 from subprocess import *
 import castorstorage
 import sys
+import os.path
+import datetime
 
-def sizechecksum(filename, stager, pool, logger=None):
 
-    if logger:
-        logInfo = {'file':logger.findCaller()[0],
-                   'line':logger.findCaller()[1]}        
-        logger.debug('Fetching checksum from eos for: '
-                     + filename, extra = logInfo)
+def init(conf):
+    keytabfile = conf['keytab']
+    eos = eosstorage(keytabfile)
+    globals()['_eos'] = eos
+    globals()['sizechecksum'] = eos._sizechecksum
+    globals()['remove'] = eos._remove
+    globals()['backgroundcopy'] = eos._backgroundcopy
+
     
+def _authcheck(method):
+    def wrapped(self, *args, **kwargs):
+        diff = self.expiration - datetime.datetime.now()
+        if diff.seconds < 3600:
+            self._updateauth()
+                
+        return method(self,*args, **kwargs)
+
+    return wrapped
+
+
+class eosstorage(object):
+
+    def __init__(self, keytab):
+        self.keytabfile = keytab
+        #keytabfile --> <username>.keytab
+        self.user = os.path.splitext(os.path.basename(self.keytabfile))[0]
+        self.expiration = None
+        self._updateauth()
+
     
-    cmd=['xrdcp', 'root://%s//proc/user/' % stager,
-         '-',
-         '-OSmgm.cmd=fileinfo&mgm.path=%s&mgm.file.info.option=--checksum-m' %  filename,
-         '-np']
-
-    xrd = Popen(cmd, stdout = PIPE, stderr = STDOUT)
-    ret = xrd.wait()
-    out = xrd.stdout.read()
+    def _updateauth(self):
+        #kinit -kt /where/ever/<user>.keytab <user>
+        kinit = Popen(['kinit','-kt',self.keytabfile, self.user],#'-l','100s',
+                      stdout = PIPE, stderr = STDOUT)
+        ret = kinit.wait()
+    
+        if ret:
+            print 'kinit failed. Ret code: %d Output: %s' % \
+                  (ret, kinit.stdout.read())
+            sys.exit(1)
+
+        self._fetchexpiration()
+
+    
+    def _fetchexpiration(self):
+        klist = Popen(['klist',],
+                      stdout = PIPE, stderr = STDOUT)
+        ret = klist.wait()
+
+        out = klist.stdout.read()
+        out = out.split('\n')
+        for idx,l in enumerate(out):
+            if 'Valid' in l:
+                ticket = out[idx+1]
+                
+        ticket = ticket.split()
+        self.expiration = datetime.datetime.strptime(' '.join(ticket[2:4]), \
+                                                     '%m/%d/%y %H:%M:%S')
+        
+    @_authcheck
+    def _sizechecksum(self, filename, stager, pool, logger=None):
+
+        if logger:
+            logInfo = {'file':logger.findCaller()[0],
+                       'line':logger.findCaller()[1]}        
+            logger.debug('Fetching checksum from eos for: '
+                         + filename, extra = logInfo)
+    
+    
+        cmd=['xrdcp', 'root://%s//proc/user/' % stager,
+             '-',
+             '-OSmgm.cmd=fileinfo&mgm.path=%s&mgm.file.info.option=--checksum-m' %  filename,
+             '-np']
+
+        xrd = Popen(cmd, stdout = PIPE, stderr = STDOUT)
+        ret = xrd.wait()
+        out = xrd.stdout.read()
         
-    if not ret:
-        splitted = out.split(' ')
+        if not ret:
+            splitted = out.split(' ')
         
-        size = int(splitted[1].split('=')[1])
-        checksum = splitted[10].split('=')[1][:8]
-    else:
-        checksum=size=None
+            size = int(splitted[1].split('=')[1])
+            checksum = splitted[10].split('=')[1][:8]
+        else:
+            checksum=size=None
+            if logger:
+                logger.warning('Adler32 checksum or size not found for '
+                               + filename + ': '
+                               + out, extra=logInfo)
+
+        return size,checksum
+
+    @_authcheck
+    def _remove(self, dstfile, stager, pool, logger=None):
+    
+        xrd = Popen(['xrd',stager,'rm',dstfile], stdout = PIPE,
+                    stderr = STDOUT)#, env=castorstorage._castorenv(stager,pool))
+        ret = xrd.wait()
+
         if logger:
-            logger.warning('Adler32 checksum or size not found for '
-                           + filename + ': '
-                           + out, extra=logInfo)
+            logInfo = {'file':logger.findCaller()[0],'line':logger.findCaller()[1]}
+            logger.debug(xrd.stdout.read(),extra = logInfo)
+
+        return ret
+
+
+    @_authcheck
+    def _backgroundcopy(self, srcfile, dstfile, stager, pool, logger=None):
 
-    return size,checksum
+        dstfile = 'root://%s/%s' % (stager, dstfile)
+        cmd = ['xrdcp', '-f', srcfile, dstfile,'-ODsvcClass=%s' % pool]
+        xrdcp = Popen(cmd, stdout = PIPE, stderr = STDOUT)
+
+        return xrdcp, xrdcp.pid
 
 
 def mkdir(directory, stager, pool, logger=None):
@@ -50,28 +136,6 @@ def migrated(filename, stager, pool, logger=None):
     sys.exit(1)
     
 
-def remove(dstfile, stager, pool, logger=None):
-    
-    xrd = Popen(['xrd',stager,'rm',dstfile], stdout = PIPE,
-                stderr = STDOUT)#, env=castorstorage._castorenv(stager,pool))
-    ret = xrd.wait()
-
-    if logger:
-        logInfo = {'file':logger.findCaller()[0],'line':logger.findCaller()[1]}
-        logger.debug(xrd.stdout.read(),extra = logInfo)
-
-    return ret
-
-
-def backgroundcopy(srcfile, dstfile, stager, pool, logger=None):
-
-    dstfile = 'root://%s/%s' % (stager, dstfile)
-    cmd = ['xrdcp', '-f', srcfile, dstfile,'-ODsvcClass=%s' % pool]
-    xrdcp = Popen(cmd, stdout = PIPE, stderr = STDOUT)
-
-    return xrdcp, xrdcp.pid
-
-
 copystate = castorstorage.copystate
 copystdout = castorstorage.copystdout