diff --git a/hdlmake b/hdlmake
index dacef8f789f7577725084f709ad2fe70913278be..020b0b49dfd4712392855d2d65aae946c1502282 100755
Binary files a/hdlmake and b/hdlmake differ
diff --git a/src/fetch.py b/src/fetch.py
index ae787482f8ff079dc3aa6b9bcc618e0aacb1b260..8e1e80cf587a9c3bfd9bcdf0a2142fde5af1cade 100644
--- a/src/fetch.py
+++ b/src/fetch.py
@@ -55,13 +55,12 @@ class ModulePool(list):
 
             cur_dir = os.getcwd()
             os.chdir(module.fetchto)
-            url, rev = self.__parse_repo_url(module.url)
 
             cmd = "svn checkout {0} " + module.basename
             if rev:
-                cmd = cmd.format(url + '@' + rev)
+                cmd = cmd.format(module.url + '@' + module.revision)
             else:
-                cmd = cmd.format(url)
+                cmd = cmd.format(module.url)
 
             rval = True
 
@@ -71,7 +70,6 @@ class ModulePool(list):
             os.chdir(cur_dir)
 
             module.isfetched = True
-            module.revision = rev
             module.path = os.path.join(module.fetchto, module.basename)
             return rval
 
@@ -80,9 +78,10 @@ class ModulePool(list):
                 os.mkdir(module.fetchto)
 
             cur_dir = os.getcwd()
-            url, rev = self.__parse_repo_url(module.url)
+            if module.branch == None:
+              module.branch = "master"
 
-            basename = path.url_basename(url)
+            basename = path.url_basename(module.url)
             mod_path = os.path.join(module.fetchto, basename)
 
             if basename.endswith(".git"):
@@ -94,11 +93,11 @@ class ModulePool(list):
                 update_only = False
 
             if update_only:
-                cmd = "(cd {0} && git pull)"
-                cmd = cmd.format(mod_path)
+                cmd = "(cd {0} && git checkout {1})"
+                cmd = cmd.format(mod_path, module.branch)
             else:
-                cmd = "(cd {0} && git clone {1})"
-                cmd = cmd.format(module.fetchto, url)
+                cmd = "(cd {0} && git clone -b {2} {1})"
+                cmd = cmd.format(module.fetchto, module.url, module.branch)
 
             rval = True
 
@@ -106,35 +105,18 @@ class ModulePool(list):
             if os.system(cmd) != 0:
                 rval = False
 
-            if rev and rval:
+            if module.revision and rval:
                 os.chdir(mod_path)
-                cmd = "git checkout " + rev
+                cmd = "git checkout " + module.revision
                 p.vprint(cmd)
                 if os.system(cmd) != 0:
                     rval = False
                 os.chdir(cur_dir)
 
             module.isfetched = True
-            module.revision = rev
             module.path = mod_path
             return rval
 
-        def __parse_repo_url(self, url) :
-            """
-            Check if link to a repo seems to be correct. Filter revision number
-            """
-            import re
-            url_pat = re.compile("[ \t]*([^ \t]+)[ \t]*(@[ \t]*(.+))?[ \t]*")
-            url_match = re.match(url_pat, url)
-
-            if url_match == None:
-                p.echo("Not a correct repo url: {0}. Skipping".format(url))
-            if url_match.group(3) != None: #there is a revision given 
-                ret = (url_match.group(1), url_match.group(3))
-            else:
-                ret = (url_match.group(1), None)
-            return ret
-
     #end class ModuleFetcher
     def __init__(self):
         self.top_module = None 
diff --git a/src/module.py b/src/module.py
index 87b3aae21a540d726cc53e4f8d4ad2d5a355e852..21f3af3675e3b6ee7134853415524e952ff7dc6e 100644
--- a/src/module.py
+++ b/src/module.py
@@ -47,6 +47,7 @@ class Module(object):
             return path.url_basename(self.url)
 
     def __init__(self, parent, url, source, fetchto, pool):
+        import path
         self.fetchto = fetchto
         self.pool = pool
         self.source = source
@@ -65,7 +66,10 @@ class Module(object):
         self.revision = None
         self._files = None
         self.manifest = None
-        self.url = url
+        if source != "local":
+            self.url, self.branch, self.revision = path.url_parse(url)
+        else:
+            self.url, self.branch, self.revision = url, None, None
 
         if source == "local" and not os.path.exists(url):
             p.rawprint("Path to the local module doesn't exist:\n" + url)
diff --git a/src/path.py b/src/path.py
index 0cfcc4c9a9cb6a038d0521ee347d131797630605..11879a11bea2ec2914d6912b243b1e4003574b9a 100644
--- a/src/path.py
+++ b/src/path.py
@@ -20,6 +20,7 @@
 #
 
 import os
+import msg as p
 
 ise_path_64 = {
 "10.0":"/opt/Xilinx/10.0/ISE/bin/lin",
@@ -37,11 +38,37 @@ ise_path_32 = {"10.0":"/opt/Xilinx/10.0/ISE/bin/lin",
 "12.4":"/opt/Xilinx/12.4/ISE_DS/ISE/bin/lin64",
 "13.1":"/opt/Xilinx/13.1/ISE_DS/ISE/bin/lin64"}
  
+def url_parse(url):
+    """
+    Check if link to a repo seems to be correct. Filter revision number and branch
+    """
+    import re
+    print "<<<" + url
+    """url_pat = re.compile("[ \t]*([^ \t]+?)[ \t]*(::)?([^ \t@]+)?(@[ \t]*(.+))?[ \t]*")
+    url_match = re.match(url_pat, url)
+    if url_match == None:
+        p.echo("Not a correct repo url: {0}. Skipping".format(url))
+    url_clean = url_match.group(1)
+    if url_match.group(3) != None: #there is a branch
+      branch = url_match.group(3)
+    if url_match.group(5) != None: #there is a revision given 
+      rev = url_match.group(5)"""
+    url_clean, branch, rev = None, None, None
+    if "@@" in url:
+      url_clean, rev = url.split("@@")
+    elif "::" in url:
+      url_clean, branch = url.split("::")
+    else:
+      url_clean = url
+
+    print url_clean, branch, rev
+    return (url_clean, branch, rev)
 
 def url_basename(url):
     """
     Get basename from an url
     """
+
     if url.endswith(".git"):
         ret = os.path.basename(url[:-4])
     elif url[-1] == '/':