diff --git a/pypungi/gather.py b/pypungi/gather.py
index 52a5f03..67048ae 100755
--- a/pypungi/gather.py
+++ b/pypungi/gather.py
@@ -305,6 +305,7 @@ class Gather(yum.YumBase):
                 target = os.path.join(pkgdir, os.path.basename(remote))
                 if os.path.exists(target):
                     os.remove(target) # avoid traceback after interrupted download
+                if os.path.isfile(target):os.remove(target)#make sure to refresh
                 os.link(local, target)
                 continue
 
@@ -319,7 +320,9 @@ class Gather(yum.YumBase):
             if not os.path.exists(local) or not os.path.samefile(path, local):
                 shutil.copy2(path, local)
  
-            os.link(local, os.path.join(pkgdir, os.path.basename(remote)))
+            target = os.path.join(pkgdir, os.path.basename(remote))
+            if os.path.isfile(target): os.remove(target)#make sure to refresh
+            os.link(local, target)
 
 
     def downloadSRPMs(self):
@@ -368,11 +371,14 @@ class Gather(yum.YumBase):
 
                 if not self.config.has_option('default', 'quiet'):
                     self.logger.info("%s already exists and appears to be complete" % local)
-                if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and self.verifyCachePkg(pkg, os.path.join(pkgdir, os.path.basename(remote))) == pkg.packagesize:
+                if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and \
+                        self.verifyCachePkg(pkg, os.path.join(pkgdir, os.path.basename(remote))) == pkg.packagesize:
                     if not self.config.has_option('default', 'quiet'):
                         self.logger.info("%s already exists in tree and appears to be complete" % local)
                 else:
-                    os.link(local, os.path.join(pkgdir, os.path.basename(remote)))
+                    target = os.path.join(pkgdir, os.path.basename(remote))
+                    if os.path.isfile(target): os.remove(target)
+                    os.link(local, target)
                 continue
 
             # Disable cache otherwise things won't download
@@ -386,4 +392,6 @@ class Gather(yum.YumBase):
             if not os.path.exists(local) or not os.path.samefile(path, local):
                 shutil.copy2(path, local)
 
-            os.link(local, os.path.join(pkgdir, os.path.basename(remote)))
+            target = os.path.join(pkgdir, os.path.basename(remote))
+            if os.path.isfile(target): os.remove(target)
+            os.link(local, target)
diff --git a/pypungi/pungi.py b/pypungi/pungi.py
index 3f74669..2389131 100755
--- a/pypungi/pungi.py
+++ b/pypungi/pungi.py
@@ -162,7 +162,8 @@ class Pungi:
         for pattern in self.config.get('default', 'relnotedirre').split():
             dirres.append(re.compile(pattern))
 
-        os.makedirs(docsdir)
+        if not os.path.exists(docsdir): 
+            os.makedirs(docsdir)
 
         # Expload the packages we list as relnote packages
         pkgs = os.listdir(os.path.join(self.topdir, self.config.get('default', 'product_path')))
@@ -201,7 +202,9 @@ class Pungi:
                 for regex in dirres:
                     if regex.match(directory) and not os.path.exists(os.path.join(self.topdir, directory)):
                         log.info("Copying release note dir %s" % directory)
-                        shutil.copytree(os.path.join(dirpath, directory), os.path.join(self.topdir, directory))
+                        target = os.path.join(self.topdir, directory)
+                        shutil.rmtree(target, ignore_errors=True)
+                        shutil.copytree(os.path.join(dirpath, directory), target)
         
 
     def doSplittree(self):
@@ -260,10 +263,11 @@ class Pungi:
 
         # this is stolen from splittree.py in anaconda-runtime.  Blame them if its ugly (:
         for i in range(timber.src_list[0], timber.src_list[-1] + 1):
+            if not os.path.exists("%s-disc%d/SRPMS" % (timber.dist_dir, i)):
                 os.makedirs("%s-disc%d/SRPMS" % (timber.dist_dir, i))
-                timber.linkFiles(timber.dist_dir,
-                               "%s-disc%d" %(timber.dist_dir, i),
-                               timber.common_files)
+            timber.linkFiles(timber.dist_dir,
+                             "%s-disc%d" %(timber.dist_dir, i),
+                             timber.common_files)
 
         timber.splitSRPMS()
         log.info("splitSRPMS complete")
@@ -289,7 +293,8 @@ class Pungi:
         createrepo.append('media://%s' % mediaid)
 
         createrepo.append('--outputdir')
-        if self.config.getint('default', 'discs') == 1:
+        if self.config.getint('default', 'discs') == 1 and \
+                not os.path.exists('%s-disc1' % self.topdir):
             os.makedirs('%s-disc1' % self.topdir)
         createrepo.append('%s-disc1' % self.topdir)
 
@@ -317,7 +322,8 @@ class Pungi:
         anaruntime = '/usr/lib/anaconda-runtime/boot'
         discinfofile = os.path.join(self.topdir, '.discinfo') # we use this a fair amount
 
-        os.makedirs(self.isodir)
+        if not os.path.exists(self.isodir):
+            os.makedirs(self.isodir)
 
         # setup the base command
         mkisofs = ['/usr/bin/mkisofs']
@@ -401,9 +407,10 @@ class Pungi:
                 content[content.index('ALL\n')] = ','.join([str(x) for x in range(1, self.config.getint('default', 'discs') + 1)]) + '\n'
                 open(discinfofile, 'w').writelines(content)
 
-                # move the main repodata out of the way to use the split repodata
-                shutil.move(os.path.join(self.topdir, 'repodata'), os.path.join(self.config.get('default', 'destdir'), 
-                    'repodata-%s' % self.config.get('default', 'arch')))
+                # move the main repodata directory out of the way to use the split repodata
+                target = os.path.join(self.config.get('default', 'destdir'), 'repodata-%s' % self.config.get('default', 'arch'))
+                shutil.rmtree(target, ignore_errors=True)
+                shutil.move(os.path.join(self.topdir, 'repodata'), target)
                 shutil.copytree('%s-disc1/repodata' % self.topdir, os.path.join(self.topdir, 'repodata'))
 
             # setup the extra mkisofs args
@@ -448,9 +455,10 @@ class Pungi:
 
             # return the .discinfo file
             if not self.config.get('default', 'arch') == 'source':
-                shutil.move(os.path.join(self.config.get('default', 'destdir'), '.discinfo-%s' % self.config.get('default', 'arch')), discinfofile)
+                shutil.move(os.path.join(self.config.get('default', 'destdir'), 
+                    '.discinfo-%s' % self.config.get('default', 'arch')), discinfofile)
 
-                shutil.rmtree(os.path.join(self.topdir, 'repodata')) # remove our copied repodata
+                shutil.rmtree(os.path.join(self.topdir, 'repodata'), ignore_errors=True) # remove our copied repodata
                 shutil.move(os.path.join(self.config.get('default', 'destdir'), 
                     'repodata-%s' % self.config.get('default', 'arch')), os.path.join(self.topdir, 'repodata'))
 
@@ -512,6 +520,7 @@ class Pungi:
 
         for directory in dirs:
             if directory.startswith('os-disc') or directory.startswith('SRPM-disc'):
+                shutil.rmtree(os.path.join(self.workdir,directory), ignore_errors=True)
                 shutil.move(os.path.join(self.archdir, directory), os.path.join(self.workdir, directory))
 
         log.info("CreateIsos is done.")
