diff --git a/hdlmake b/hdlmake
index 89b05285cf3eed54ccc81344829bf80183ff0cc7..f1bd74f6d3d407f279aa174a906a50fe9183f392 100755
Binary files a/hdlmake and b/hdlmake differ
diff --git a/src/hdlmake_kernel.py b/src/hdlmake_kernel.py
index 29c8caa891dbbb4e800030d560be4203c77bf982..da42c4b51bc71aaf16e2d0f6df02bd0b7a4ed791 100644
--- a/src/hdlmake_kernel.py
+++ b/src/hdlmake_kernel.py
@@ -254,6 +254,11 @@ class HdlmakeKernel(object):
         f.write("process run {Generate Programming File} -force rerun_all\n")
         f.close()
 
+    def clean_modules(self):
+        for m in self.modules_pool:
+            if m.source in ["svn", "git"]:
+                m.remove()
+
     def generate_fetch_makefile(self):
         pool = self.modules_pool
 
diff --git a/src/module.py b/src/module.py
index 140aa8ae6a7174ef7953c9dbf3a86b46740d6fe3..37359d372d70079013ca2e58a35a8a5318180d22 100644
--- a/src/module.py
+++ b/src/module.py
@@ -76,8 +76,8 @@ class Module(object):
             self.path = url
             self.isfetched = True
         else:
-            if os.path.exists(os.path.join(fetchto, self.basename)):
-                self.path = os.path.join(fetchto, self.basename)
+            if os.path.exists(os.path.abspath(os.path.join(fetchto, self.basename))):
+                self.path = os.path.abspath(os.path.join(fetchto, self.basename))
                 self.isfetched = True
             else:
                 self.path = None
@@ -125,6 +125,26 @@ class Module(object):
             sth = []
         return sth
 
+    def remove(self):
+        if not self.isfetched:
+            return
+
+        import shutil
+        import os
+
+        p.vprint("Removing " + self.path)
+        shutil.rmtree(self.path)
+
+        parts = self.path.split('/')
+        while True:
+            try:
+                parts = parts[:-1]
+                tmp = '/'.join(parts)
+                p.vprint("Trying to remove " + tmp)
+                os.rmdir(tmp)
+            except OSError: #a catologue is not empty - we are done
+                break
+
     def parse_manifest(self):
         if self.isparsed == True or self.isfetched == False:
             return