diff --git commitlog/includes/commitlog.views_default.inc commitlog/includes/commitlog.views_default.inc
index a1e10f3..ead26af 100644
--- commitlog/includes/commitlog.views_default.inc
+++ commitlog/includes/commitlog.views_default.inc
@@ -47,6 +47,7 @@ function commitlog_views_default_views() {
       'empty' => '',
       'hide_empty' => 0,
       'empty_zero' => 0,
+      'link_type' => 'log',
       'exclude' => 0,
       'id' => 'path',
       'table' => 'versioncontrol_item_revisions',
diff --git includes/plugins/webviewer_url_handlers/VersioncontrolRepositoryUrlHandlerGitweb.inc includes/plugins/webviewer_url_handlers/VersioncontrolRepositoryUrlHandlerGitweb.inc
new file mode 100644
index 0000000..6fab0df
--- /dev/null
+++ includes/plugins/webviewer_url_handlers/VersioncontrolRepositoryUrlHandlerGitweb.inc
@@ -0,0 +1,108 @@
+<?php
+// $Id$
+/**
+ * @file
+ * Repository Url handler class for gitweb.
+ */
+
+/**
+ * Base class for URL handlers.
+ */
+class VersioncontrolRepositoryUrlHandlerGitweb extends VersioncontrolRepositoryUrlHandler {
+
+  /**
+   * Gitweb do not need to have a hash base parameter to show an item
+   * log history.
+   */
+  public function getItemLogViewUrl(&$item) {
+    $placeholders = array(
+      '%repo_name' => $this->repository->name,
+      '%path'     => substr($item->path, 1),
+      '%revision' => $item->revision,
+    );
+
+    $label = $item->getSelectedLabel();
+    if (isset($label->type) && $label->type == VERSIONCONTROL_LABEL_BRANCH) {
+      $current_branch = $label->name;
+    }
+    if (isset($current_branch)) {
+      $placeholders['%branch'] = ';hb=' . $current_branch;
+    }
+    else {
+      $placeholders['%branch'] = '';
+    }
+
+    if ($item->isFile()) {
+      return strtr($this->getTemplateUrl('file_log_view'), $placeholders);
+    }
+    else { // directory
+      return strtr($this->getTemplateUrl('directory_log_view'), $placeholders);
+    }
+  }
+
+  /**
+   * Gitweb do not need to have a hash base parameter to show an item
+   * content.
+   */
+  public function getItemViewUrl(&$item) {
+    $placeholders = array(
+      '%repo_name' => $this->repository->name,
+      '%path'     => substr($item->path, 1),
+      '%revision' => $item->blob_hash,
+    );
+
+    $label = $item->getSelectedLabel();
+    if (isset($label->type) && $label->type == VERSIONCONTROL_LABEL_BRANCH) {
+      $current_branch = $label->name;
+    }
+    if (isset($current_branch)) {
+      $placeholders['%branch'] = ';hb=' . $current_branch;
+    }
+    else {
+      $placeholders['%branch'] = '';
+    }
+
+    $view_url = $item->isFile()
+      ? $this->getTemplateUrl('file_view')
+      : $this->getTemplateUrl('directory_view');
+
+    return strtr($view_url, $placeholders);
+  }
+
+  /**
+   * Gitweb use blobs for diff.
+   */
+  public function getDiffUrl(&$file_item_new, $file_item_old) {
+    $placeholders = array(
+      '%repo_name' => $this->repository->name,
+      '%path'         => $file_item_new->path,
+      '%new_blob_hash' => $file_item_new->blob_hash,
+      '%old_path'     => $file_item_old->path,
+      '%old_blob_hash' => $file_item_old->blob_hash,
+    );
+
+    $label = $file_item_new->getSelectedLabel();
+    if (isset($label->type) && $label->type == VERSIONCONTROL_LABEL_BRANCH) {
+      $current_branch = $label->name;
+    }
+    if (isset($current_branch)) {
+      $placeholders['%new_revision'] = ';hb=' . $current_branch;
+    }
+    else {
+      $placeholders['%new_revision'] = '';
+    }
+
+    $label = $file_item_old->getSelectedLabel();
+    if (isset($label->type) && $label->type == VERSIONCONTROL_LABEL_BRANCH) {
+      $current_branch = $label->name;
+    }
+    if (isset($current_branch)) {
+      $placeholders['%old_revision'] = ';hbp=' . $current_branch;
+    }
+    else {
+      $placeholders['%old_revision'] = '';
+    }
+
+    return strtr($this->getTemplateUrl('diff'), $placeholders);
+  }
+}
diff --git includes/plugins/webviewer_url_handlers/gitweb.inc includes/plugins/webviewer_url_handlers/gitweb.inc
index 6b57378..4430301 100644
--- includes/plugins/webviewer_url_handlers/gitweb.inc
+++ includes/plugins/webviewer_url_handlers/gitweb.inc
@@ -11,22 +11,16 @@ $plugin = array(
   'title' => t('Gitweb URL autogenerator'),
   'url_templates' => array(
     'commit_view' => '%base_url/?p=%repo_name;a=commit;h=%revision',
-    'file_log_view' => '%base_url/?p=%repo_name;a=history;f=%path;h=%revision;hb=%branch',
-    'directory_log_view' => '%base_url/?p=%repo_name;a=history;f=%path;h=%revision;hb=%branch',
-    'file_view' => '%base_url/?p=%repo_name;a=blob;f=%path;h=%revision;hb=%branch',
-    'directory_view' => '%base_url/?p=%repo_name;a=tree;f=%path;h=%revision;hb=%branch',
-    /**
-     * FIXME gitweb need blob hashes in order to do this, but
-     * versioncontrol_git is not storing blobs, so stop supporting this
-     * until we can do this.
-     * Template should be like this:
-     * '%base_url/?p=%repo_name;a=blobdiff;f=%path;h=%new_blob_hash;hp=%old_blob_hash;hb=%new_revision;hpb=%old_revision',
-     */
-    'diff' => '',
+    'file_log_view' => '%base_url/?p=%repo_name;a=history;f=%path;h=%revision%branch',
+    'directory_log_view' => '%base_url/?p=%repo_name;a=history;f=%path;h=%revision%branch',
+    'file_view' => '%base_url/?p=%repo_name;a=blob;f=%path;h=%revision%branch',
+    'directory_view' => '%base_url/?p=%repo_name;a=tree;f=%path;h=%revision%branch',
+    'diff' => '%base_url/?p=%repo_name;a=blobdiff;f=%path;h=%new_blob_hash;hp=%old_blob_hash%new_revision%old_revision',
   ),
   'handler' => array(
-    'class' => 'VersioncontrolRepositoryUrlHandler',
-    'file' => 'VersioncontrolRepositoryUrlHandler.inc',
+    'class' => 'VersioncontrolRepositoryUrlHandlerGitweb',
+    'file' => 'VersioncontrolRepositoryUrlHandlerGitweb.inc',
     'path' => drupal_get_path('module', 'versioncontrol') . '/includes/plugins/webviewer_url_handlers',
+    'parent' => 'none',
   ),
 );
diff --git includes/views/handlers/versioncontrol_handler_field_item_revision_path.inc includes/views/handlers/versioncontrol_handler_field_item_revision_path.inc
new file mode 100644
index 0000000..234f54b
--- /dev/null
+++ includes/views/handlers/versioncontrol_handler_field_item_revision_path.inc
@@ -0,0 +1,69 @@
+<?php
+// $Id$
+class versioncontrol_handler_field_item_revision_path extends views_handler_field {
+  public $backends = NULL;
+  public $repos = array();
+  public $itemRevisions = array();
+
+  function construct() {
+    parent::construct();
+    $this->backends = versioncontrol_get_backends();
+  }
+
+  /**
+   * Get a repository of the @param $vcs type.
+   */
+  function getRepository($vcs, $repo_id) {
+    if (!isset($this->repos[$repo_id])) {
+      $this->repos[$repo_id] = $this->backends[$vcs]->loadEntity('repo', array($repo_id));
+    }
+    return $this->repos[$repo_id];
+  }
+
+  /**
+   * Get an item revision.
+   */
+  function getItemRevision($vcs, $item_revision_id) {
+    if (!isset($this->itemRevisions[$item_revision_id])) {
+      $this->itemRevisions[$item_revision_id] = $this->backends[$vcs]->loadEntity('item', array($item_revision_id));
+    }
+    return $this->itemRevisions[$item_revision_id];
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['link_type'] = array('default' => 'view', 'translatable' => TRUE);
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['link_type'] = array(
+      '#type' => 'radios',
+      '#title' => t('Where to link at the repository browser'),
+      '#default_value' => $this->options['link_type'],
+      '#options' => array(
+        'view' => t('Item content'),
+        'log' => t('Item log history'),
+      ),
+    );
+  }
+
+  function render($values) {
+    $path = $values->{$this->field_alias};
+    $vcs = $values->{$this->aliases['vcs']};
+    $repo_id = $values->{$this->aliases['repo_id']};
+    $item_revision_id = $values->{$this->aliases['item_revision_id']};
+    $repo = $this->getRepository($vcs, $repo_id);
+    $url_handler = $repo->getUrlHandler();
+    $item_revision = $this->getItemRevision($vcs, $item_revision_id);
+    $link_type = !empty($this->options['link_type']) ? $this->options['link_type'] : 'view';
+    switch ($link_type) {
+      case 'log':
+        return l(check_plain($path), $url_handler->getItemLogViewUrl($item_revision));
+      case 'view':
+      default:
+        return l(check_plain($path), $url_handler->getItemViewUrl($item_revision));
+    }
+  }
+}
diff --git includes/views/handlers/versioncontrol_handler_field_operation_revision.inc includes/views/handlers/versioncontrol_handler_field_operation_revision.inc
index 45ba0e5..0228816 100644
--- includes/views/handlers/versioncontrol_handler_field_operation_revision.inc
+++ includes/views/handlers/versioncontrol_handler_field_operation_revision.inc
@@ -7,16 +7,30 @@
  */
 class versioncontrol_handler_field_operation_revision extends views_handler_field {
   public $backends = NULL;
+  public $repos = array();
 
   function construct() {
     parent::construct();
     $this->backends = versioncontrol_get_backends();
   }
 
+  /**
+   * Get a repository of the @param $vcs type.
+   */
+  function getRepository($vcs, $repo_id) {
+    if (!isset($this->repos[$repo_id])) {
+      $this->repos[$repo_id] = $this->backends[$vcs]->loadEntity('repo', array($repo_id));
+    }
+    return $this->repos[$repo_id];
+  }
+
   function render($values) {
     $revision = $values->{$this->field_alias};
     $vcs = $values->{$this->aliases['vcs']};
+    $repo_id = $values->{$this->aliases['repo_id']};
     $revision = $this->backends[$vcs]->formatRevisionIdentifier($revision, 'short');
-    return check_plain($revision);
+    $repo = $this->getRepository($vcs, $repo_id);
+    $url_handler = $repo->getUrlHandler();
+    return l(check_plain($revision), $url_handler->getCommitViewUrl($revision));
   }
 }
diff --git includes/views/versioncontrol.views.inc includes/views/versioncontrol.views.inc
index 4de3c8f..0e3d061 100755
--- includes/views/versioncontrol.views.inc
+++ includes/views/versioncontrol.views.inc
@@ -291,6 +291,7 @@ function versioncontrol_views_data() {
       'click sortable' => TRUE,
       'additional fields' => array(
         'vcs' => array('table' => 'versioncontrol_repositories', 'field' => 'vcs'),
+        'repo_id' => array('table' => 'versioncontrol_repositories', 'field' => 'repo_id'),
       ),
     ),
     'sort' => array(
@@ -440,8 +441,14 @@ function versioncontrol_views_data() {
   $data['versioncontrol_item_revisions']['path'] = array(
     'title' => t("File path"),
     'help' => t("The file path within the repository"),
-    'field' => array(
-      'handler' => 'views_handler_field',
+    'field'    => array(
+      'handler' => 'versioncontrol_handler_field_item_revision_path',
+      'click sortable' => TRUE,
+      'additional fields' => array(
+        'vcs' => array('table' => 'versioncontrol_repositories', 'field' => 'vcs'),
+        'repo_id' => array('table' => 'versioncontrol_repositories', 'field' => 'repo_id'),
+        'item_revision_id',
+      ),
     ),
     'sort' => array(
       'handler' => 'views_handler_sort',
@@ -461,6 +468,7 @@ function versioncontrol_views_data() {
       'click sortable' => TRUE,
       'additional fields' => array(
         'vcs' => array('table' => 'versioncontrol_repositories', 'field' => 'vcs'),
+        'repo_id' => array('table' => 'versioncontrol_repositories', 'field' => 'repo_id'),
       ),
     ),
     'sort' => array(
@@ -557,6 +565,9 @@ function versioncontrol_views_handlers() {
       'versioncontrol_handler_field_item_revision_action' => array(
         'parent' => 'views_handler_field',
       ),
+      'versioncontrol_handler_field_item_revision_path' => array(
+        'parent' => 'views_handler_field',
+      ),
       'versioncontrol_handler_field_item_revision_visual_diffstat' => array(
         'parent' => 'views_handler_field',
       ),
