diff --git a/_states/debmirror.py b/_states/debmirror.py
index ee86580..6001df1 100644
--- a/_states/debmirror.py
+++ b/_states/debmirror.py
@@ -82,12 +82,19 @@
 def _get_target_path(name, tgt):
     if not tgt.get('target_dir', False):
         raise SaltInvocationError('Argument "target_dir" is mandatory! ')
-    return {'target_dir': tgt.get('target_dir'),
+
+    out = {'target_dir': tgt.get('target_dir'),
             'lock_file': tgt.get('lock_file',
                                  os.path.join(tgt.get('target_dir'),
                                               '.lockmirror')),
             'log_file': tgt.get('log_file', '/var/log/debmirror_'.join(name))}
 
+    if tgt.get('cache_dir', False):
+        out['cache_dir'] = tgt.get('cache_dir')
+        out['cache_ready_file'] = os.path.join(out['cache_dir'], '.ready')
+
+    return out
+
 
 def _get_env(tgt):
     env = {}
@@ -101,9 +108,23 @@
     return env
 
 
-def _check_mirror_cache(cache_dir):
-    cacheReadinessKeyFile = os.path.join(cache_dir, '.ready')
-    return os.path.isfile(cacheReadinessKeyFile)
+def _check_mirror_cache(file_name):
+    return os.path.isfile(file_name)
+
+
+def _cache_copied(file_name, target_dir, action='check'):
+    pattern = '%s - copied\n' % target_dir
+    if action == 'add':
+        with open(file_name, 'a+') as f:
+            f.write(pattern)
+        return True
+    else:
+        with open(file_name, 'r') as f:
+            cache_copied = f.readlines()
+        if pattern in cache_copied:
+            return True
+        else:
+            return False
 
 
 def _get_cmdline(name, tgt):
@@ -134,10 +155,11 @@
         for key, value in enumerate(sorted(tgt['filter'])):
             cmdline += " " + tgt['filter'][value]
     if tgt.get('target_dir', False):
-        target_dir = _get_target_path(name, tgt)['target_dir']
+        targets = _get_target_path(name, tgt)
+        target_dir = targets['target_dir']
         if tgt.get('cache_dir'):
-            cache_dir = tgt.get('cache_dir')
-            if _check_mirror_cache(cache_dir):
+            cache_dir = targets['cache_dir']
+            if _check_mirror_cache(targets['cache_ready_file']):
                 cmdline += ' ' + target_dir
             else:
                 cmdline += ' ' + cache_dir
@@ -147,10 +169,12 @@
 
 
 def _update_mirror(name, tgt):
+    targetPaths = _get_target_path(name, tgt)
     # Remove old lock file, is was.
-    lock_file = _get_target_path(name, tgt)['lock_file']
+    lock_file = targetPaths['lock_file']
     if os.path.isfile(lock_file):
-        log.debug("Removing lockfile:{} for mirror{}".format(lock_file, name))
+        log.debug("Removing lockfile: {} for mirror {}".format(
+            lock_file, name))
         __states__['file.absent'](lock_file)
     cmdline = _get_cmdline(name, tgt)
     # fetch ENV params for proxy
@@ -160,7 +184,7 @@
     if not os.path.isdir(l_dir):
         __salt__['file.makedirs'](l_dir + '/')
     fh = logging.FileHandler(
-        "{0}".format(_get_target_path(name, tgt)['log_file']))
+        "{0}".format(targetPaths['log_file']))
     fh.setLevel(logging.DEBUG)
     fh_format = logging.Formatter(
         '%(asctime)s - %(lineno)d - %(levelname)-8s - %(message)s')
@@ -169,36 +193,52 @@
     log2file.addHandler(fh)
     # check cache usage
     if tgt.get('cache_dir'):
-        cache_dir = tgt.get('cache_dir')
-        target_dir = _get_target_path(name, tgt)['target_dir']
+        cache_dir = targetPaths['cache_dir']
+        cache_ready = targetPaths['cache_ready_file']
+        target_dir = targetPaths['target_dir']
         cpline = "find . -name *.deb -exec cp -rlf --parent {} %s \\;" % (
             target_dir)
-        # if cache exists - copy and run sync over cache
-        # if cache does not exist - create cache, copy and run sync again over it
-        if _check_mirror_cache(cache_dir):
-            result = __salt__['cmd.run_all'](cpline, redirect_stderr=True,
-                                             cwd=cache_dir, env=env_vars)
-            if result['retcode'] == 0:
+
+        # if cache exists and not copied - copy and run sync over cache
+        # if cache exists and copied - do nothing
+        if _check_mirror_cache(cache_ready):
+            if not _cache_copied(cache_ready, target_dir):
+                result = __salt__['cmd.run_all'](cpline, redirect_stderr=True,
+                                                 cwd=cache_dir, env=env_vars)
                 log2file.debug(result['stdout'])
-                result = __salt__['cmd.run_all'](cmdline, redirect_stderr=True,
-                                                 env=env_vars)
+
+                if result['retcode'] != 0:
+                    return _failed(name,
+                        "debmirror failed to copy cache. Reason {0}".format(
+                            result['stderr']))
+
+                _cache_copied(cache_ready, target_dir, 'add')
+        # if cache does not exist - create cache and copy
         else:
             result = __salt__['cmd.run_all'](cmdline, redirect_stderr=True,
                                              env=env_vars)
-            if result['retcode'] == 0:
-                __states__['file.managed']('%s/.ready' % cache_dir, replace=False)
-                log2file.debug(result['stdout'])
-                result = __salt__['cmd.run_all'](cpline, redirect_stderr=True,
-                                                 cwd=cache_dir, env=env_vars)
-                if result['retcode'] == 0:
-                    log2file.debug(result['stdout'])
-                    cmdline = _get_cmdline(name, tgt)
-                    result = __salt__['cmd.run_all'](cmdline, redirect_stderr=True,
-                                             env=env_vars)
+            log2file.debug(result['stdout'])
 
-    else:
-        result = __salt__['cmd.run_all'](cmdline, redirect_stderr=True,
-                                         env=env_vars)
+            if result['retcode'] != 0:
+                return _failed(name,
+                               "debmirror failed. Reason {0}".format(
+                                result['stderr']))
+
+            __states__['file.touch'](cache_ready)
+            result = __salt__['cmd.run_all'](cpline, redirect_stderr=True,
+                                             cwd=cache_dir, env=env_vars)
+            log2file.debug(result['stdout'])
+
+            if result['retcode'] != 0:
+                    return _failed(name,
+                        "debmirror failed to copy cache. Reason {0}".format(
+                            result['stderr']))
+
+            _cache_copied(cache_ready, target_dir, 'add')
+            cmdline = _get_cmdline(name, tgt)
+
+    result = __salt__['cmd.run_all'](cmdline, redirect_stderr=True,
+                                     env=env_vars)
     log2file.debug(result['stdout'])
     # destroy file logger
     for i in list(log2file.handlers):
