diff --git drush_make.download.inc drush_make.download.inc
index a40e10a..65acfef 100644
--- drush_make.download.inc
+++ drush_make.download.inc
@@ -184,54 +184,140 @@ class DrushMakeDownload_Get extends DrushMakeDownload {
 
 class DrushMakeDownload_Git extends DrushMakeDownload {
   function download() {
-    // @TODO implement revisions, tags
+
     $name = $this->project->name;
     $tmp_path = $this->project->tmp_path;
     $download = $this->project->download;
+    $wc = drush_get_option('working-copy');
+
+        // check if branch option is set in info file, otherwise set default to master branch
+    $this->project->download['branch'] = $download['branch'] = isset($download['branch']) ? $download['branch'] : 'master';
+    // check if tag / revsion option is set in info file, otherwise we set it to false
+    $this->project->download['tag'] = $download['tag'] = isset($download['tag']) ? $download['tag'] : FALSE;
+    // @TODO: i think its better to call it "commit" and not "revision"... ??!
+    $this->project->download['revision'] = $download['revision'] = isset($download['revision']) ? $download['revision'] : FALSE;
+
+        // only progress if we have a download url...    
     if (!empty($download['url'])) {
-      // Parse the git repo URL into pieces that we can work with.
-      // Working copy URLs are of the format git@[domain]:[repo] while
-      // Export URLs are of the format git://[domain]/[repo]
-      $url = strtr($download['url'], array('git@' => '', 'git://' => ''));
-      $url_ar = strpos($url, ':') !== FALSE ? explode(':', $url, 2) : explode('/', $url, 2);
-      $wc = drush_get_option('working-copy');
-      $url = $wc ? "git@{$url_ar[0]}:{$url_ar[1]}" : "git://{$url_ar[0]}/{$url_ar[1]}";
 
-      $this->project->download['branch'] = $download['branch'] = isset($download['branch']) ? $download['branch'] : 'master';
+    // split the given download url into pices
+    $url_array = $this->_getUrlParts($download['url']);
+
+    // build url for git clone to support different protocols
+    // currently all protocols seems to use the same url schema
+    switch ($url_array['protocol']) {
+      case 'git':
+        // github uses two different urls, working copy urls using scp format
+        // git@domain:repo export url format are git://domain/repo
+        if ($wc) {
+        // working copy is set
+          $url = 'git@' . $url_array['host'] . ':' . $url_array['resource'];
+        break;
+        }
+      case 'ssh':
+      case 'http':
+      case 'https':
+      case 'ftp':
+      case 'ftps':
+      case 'rsync':
+      case 'file':
+        // @TODO: implement port & user options
+        $url = $url_array['protocol'] . '://' . $url_array['host'] . '/' . $url_array['resource'];
+        break;
+      default:
+        drush_make_error('DOWNLOAD_ERROR', dt('unknown protocol @protocol in %project', array('@protocol' => $url_array['protocol'], '%project' => $name)));
+        return false;
+        break;
+      }
+          
+      // clone the given reposity
       if (drush_shell_exec("git clone %s %s/%s", $url, $tmp_path, $name)) {
         drush_log(dt('%project cloned from %url.', array('%project' => $name, '%url' => $url)), 'ok');
-      }
-      else if ($wc && drush_shell_exec("git clone %s %s/%s", "git://{$url_ar[0]}/{$url_ar[1]}", $tmp_path, $name)) {
-        drush_log(dt("%project private url failed, using public.", array('%project' => $name)), 'ok');
-        $wc = FALSE;
-        drush_log(dt('%project cloned from %url.', array('%project' => $name, '%url' => "git://{$url_ar[0]}/{$url_ar[1]}")), 'ok');
-      }
-      else {
+      } else {
         drush_make_error('DOWNLOAD_ERROR', dt('Unable to clone %project from %url.', array('%project' => $name, '%url' => $url)));
       }
-      // Checkout a branch if one was asked for in the make file
-      if ($download['branch'] !== 'master') {
+
+      // GIT Checkout only work on a ready cloned repo. So we switch to branch or to tag (only if we have no branch) after cloneing.
+      if ($download['branch'] !== 'master' || $download['tag'] || $download['revision']) {
+
+        // get current directory (for move back later)
         $cwd = getcwd();
+        // change path to working copy of cloned repo
         chdir($tmp_path . '/' . $name);
-        if (drush_shell_exec("git checkout -b %s origin/%s", $download['branch'], $download['branch'])) {
-          drush_log(dt("Checked out branch %branch.", array('%branch' => $download['branch'])), 'ok');
-        }
-        else {
-          drush_make_error('DOWNLOAD_ERROR', dt("Unable to check out branch %branch.", array('%branch' => $download['branch'])));
+        
+        // Progress branch / tag / revision download. Ensure that only one option ist set (branch OR tag OR revision)
+        // check if branch a other than master        
+        if($download['branch'] !== 'master' && !$download['tag'] && !$download['revision']) {
+          if (drush_shell_exec("git checkout -b %s origin/%s", $download['branch'], $download['branch'])) {
+            drush_log(dt("Checked out branch %branch.", array('%branch' => $download['branch'])), 'ok');
+          } else {
+            drush_make_error('DOWNLOAD_ERROR', dt("Unable to check out branch %branch.", array('%branch' => $download['branch'])));
+          }
+        // progress if: tag is set but not the others
+        } elseif ($download['branch'] == 'master' && $download['tag'] && !$download['revision']) {
+          if (drush_shell_exec("git checkout refs/tags/%s", $download['tag'])) { // @TODO: change checkout to refs path
+            drush_log(dt("Checked out tag %tag.", array('%tag' => $download['tag'])),'ok');
+          } else {
+            drush_make_error('DOWNLOAD_ERROR', dt("Unable to check out tag %tag.", array('%tag' => $download['tag'])));
+          }
+        // progress if: revision is set but not the others
+        } elseif ($download['branch'] == 'master' && !$download['tag'] && $download['revision']) {
+            if (drush_shell_exec("git checkout %s", $download['revision'])) {
+                drush_log(dt("Checked out revision %revision.", array('%revision' => $download['revision'])),'ok');
+            } else {
+                drush_make_error('DOWNLOAD_ERROR', dt("Unable to checkout revision %revision",array('%revision' => $download['revision'])));
+            }
+        // more than one option is set so we throw a error message       	
+        } else {
+            drush_make_error('DOWNLOAD_ERROR', dt("You can only specific branch or tag or revision but not combined in make file."));
+            return false;
         }
+        // move back to last current directory (first line)
         chdir($cwd);
       }
+      
       // Remove .git/ directory if working-copy flag was not specified.
       if (!$wc && file_exists($tmp_path . '/' . $name . '/.git')) {
         drush_shell_exec("rm -rf %s/%s/.git", $tmp_path, $name);
       }
       return $name;
-    }
-    else {
+    } else {
       $download['url'] = dt("unspecified location");
     }
     return FALSE;
   }
+  
+  
+  /**
+  * private helper function to split the given url into parts
+  * protocol / port / site / resource
+  */
+  function _getUrlParts($url) {
+    $result = array();
+ 
+    // Get the protocol, site and resource parts of the URL
+    // original url = http://example.com/blog/index?name=foo
+    // protocol = http://
+    // site = example.com/
+    // resource = blog/index?name=foo
+    $regex = '#^(.*?//)*([\w\.\d]*)(:(\d+))*(/*)(.*)$#';
+    $matches = array();
+    preg_match($regex, $url, $matches);
+ 
+    // Assign the matched parts of url to the result array
+    $result['protocol'] = $matches[1];
+    $result['port'] = $matches[4];
+    $result['host'] = $matches[2];
+    $result['resource'] = $matches[6];
+ 
+    // clean up the site portion by removing the trailing /
+    $result['host'] = preg_replace('#/$#', '', $result['host']);
+ 
+    // clean up the protocol portion by removing the trailing ://
+    $result['protocol'] = preg_replace('#://$#', '', $result['protocol']);
+ 
+  return $result;
+  }
 }
 
 class DrushMakeDownload_Bzr extends DrushMakeDownload {
@@ -310,5 +396,4 @@ class DrushMakeDownload_Hg extends DrushMakeDownload {
     drush_make_error('DOWNLOAD_ERROR', dt('Unable to clone %project from %url.', array('%project' => $name, '%url' => $download['url'])));
     return FALSE;
   }
-}
-
+}
\ No newline at end of file
