diff --git a/reviewboard/static/rb/css/diffviewer.less b/reviewboard/static/rb/css/diffviewer.less
index 69c9c121de804fed61df8f1895c0a4969cbdee01..5f670b7cc92967b85fed13bc06bb195bd0c42256 100644
--- a/reviewboard/static/rb/css/diffviewer.less
+++ b/reviewboard/static/rb/css/diffviewer.less
@@ -421,6 +421,9 @@ ol.index li {
     vertical-align: bottom;
     margin: 4px;
   }
+  label {
+    display: inline!important;
+  }
 
   .revisions {
     padding: 0;
@@ -431,17 +434,19 @@ ol.index li {
       padding: 2px 6px;
       text-decoration: none;
 
-      &:hover {
+      &:hover, &.hovered {
         background: @revisions-hover-color;
         border-color: @revisions-hover-border-color;
         color: @revisions-text-color;
       }
+      &.inter_diff {
+        cursor: pointer;
+      }
 
       &:visited {
         color: @revisions-text-color;
       }
     }
-
     .current {
       font-weight: bold;
       padding: 2px 6px;
@@ -449,6 +454,20 @@ ol.index li {
   }
 }
 
+#diffhopper_diff, #diffhopper_interdiff {
+  padding: 5px;
+  background: #fefadf;
+  margin: 2px;
+  border: 1px @revisions-hover-border-color solid;
+  position: absolute;
+  text-align: center;
+  display: none; /* hidden untill shown */
+  .pick_interdiff {
+    position: relative;
+    top: 13px;
+  }
+}
+
 
 /****************************************************************************
  * Pagination
diff --git a/reviewboard/static/rb/js/diffviewer.js b/reviewboard/static/rb/js/diffviewer.js
index 3482988c894bc332530e7239c521ae743ea4f9e6..7e42423660d01781a2eb38d38218e7c981f469c8 100644
--- a/reviewboard/static/rb/js/diffviewer.js
+++ b/reviewboard/static/rb/js/diffviewer.js
@@ -1562,4 +1562,72 @@ $(document).ready(function() {
     });
 });
 
+/**
+ * The magic behind the "View revision:" buttons
+ */
+var diffHopper = new function() {
+    var diffs = $('#jump_to_revision a.diff'),
+        currentDiff,
+        hideTimer = null,
+        /**
+         * Shows all the entries except the current selected
+         */
+        fixInterDiffForDisplay = function(revision) {
+            $('#diffhopper_interdiff a').show();
+            $('#diffhopper_interdiff_' + revision).hide();
+        },
+        /**
+         * Hides the top and the bottom pickers
+         */
+        hide = function() {
+            $('#diffhopper_diff').hide();
+            $('#diffhopper_interdiff').hide();
+            diffs.removeClass('hovered');
+        }
+    ;
+
+    // These make up the public API
+    return {
+        hoverOver: function(revision) {
+            currentDiff = revision;
+            fixInterDiffForDisplay(revision);
+            var revision_elem = diffs.eq(revision - 1),
+              revision_offset = revision_elem.offset();
+              centre = revision_offset.left + (revision_elem.outerWidth() / 2) - 1,
+              diff_elem = $('#diffhopper_diff'),
+              diff_width = diff_elem.outerWidth(),
+              interdiff_width = $('#diffhopper_interdiff').outerWidth();
+
+            diffs.removeClass('hovered');
+            revision_elem.addClass('hovered');
+
+            diff_elem.css({
+                top: (revision_offset.top - diff_elem.outerHeight(true)) + 'px',
+                left: (centre - diff_width / 2) + 'px',
+                display: 'block'
+            });
+
+            $('#diffhopper_interdiff').css({
+              top: (revision_offset.top + revision_elem.outerHeight()) + 'px',
+              left: (centre - interdiff_width / 2) + 'px',
+              display: 'block'
+            });
+        },
+        startHideTimer: function() {
+            hideTimer = window.setTimeout(hide, 500);
+        },
+        clearHideTimer: function() {
+            window.clearTimeout(hideTimer);
+        },
+        hopToDiff: function(prefix, postfix) {
+            location.href = prefix + currentDiff + postfix;
+        },
+        hopToInterDiff: function(otherDiff, prefix, postfix) {
+            var leftDiff = Math.min(currentDiff, otherDiff),
+              rightDiff = Math.max(currentDiff, otherDiff);
+            location.href = prefix + leftDiff + '-' + rightDiff + postfix;
+        }
+    }
+}();
+
 // vim: set et:
diff --git a/reviewboard/templates/diffviewer/view_diff.html b/reviewboard/templates/diffviewer/view_diff.html
index 6a804e51a19aa9ec8cc46d7e4a743d0b626c41cc..438d2d529aba09491a73618f97cfc505115290e7 100644
--- a/reviewboard/templates/diffviewer/view_diff.html
+++ b/reviewboard/templates/diffviewer/view_diff.html
@@ -138,15 +138,23 @@
 {#   Show a revision selector for jumping between revisions. #}
  <table class="revision-selector">
   <tr>
-   <th><label for="jump_to_revision">{% trans "Jump to revision:" %}<label></th>
-   <td>
+   <th><label for="jump_to_revision">{% trans "View revision:" %}<label></th>
+   <td id="jump_to_revision_wrapper" onmouseover="diffHopper.clearHideTimer()" onmouseout="diffHopper.startHideTimer()">
     <div id="jump_to_revision" class="revisions">
-{%  for item in review_request.diffset_history|revision_link_list:diffset_pair %}
-{%   if item.is_current %}
-     <span class="current">{{item.revision}}</span>
-{%   else %}
-     <a href="{{review_request.get_absolute_url}}diff/{{item.revision}}/#index_header">{{item.revision}}</a>
-{%   endif %}
+	   <div id="diffhopper_diff">
+		   <input type="button" value="Jump to it" onclick="diffHopper.hopToDiff('{{review_request.get_absolute_url}}diff/', '/#index_header');"/>
+	   </div>
+	   <div id="diffhopper_interdiff">
+		   <label>Compare with:</label>
+		   <br /><br />
+{%   for item in review_request.diffset_history.diffsets.all %}
+           <a id="diffhopper_interdiff_{{ item.revision }}" class="inter_diff"
+             onclick="diffHopper.hopToInterDiff({{ item.revision }}, '{{review_request.get_absolute_url}}diff/', '/#index_header');">
+             {{ item.revision }}</a>
+{%   endfor %}
+	   </div>
+{%  for item in review_request.diffset_history|interdiff_link_list:diffset_pair %}
+<a class="diff {% if item.is_current %} current{% endif %}" onmouseover="diffHopper.hoverOver({{item.revision}})">{{item.revision}}</a>
 {%  endfor %}
 {%  if draft and draft.diffset %}
 {#   There's a draft diff, so display it in the list. #}
@@ -159,31 +167,9 @@
     </div>
    </td>
   </tr>
-  <tr>
-   <th><label for="show_interdiff">{% blocktrans %}Changes between r{{revision}} and:{% endblocktrans %}</label></th>
-   <td>
-    <div id="show_interdiff" class="revisions">
-{%  for item in review_request.diffset_history|interdiff_link_list:diffset_pair %}
-{%   if item.is_current %}
-     <span class="current">{{item.revision}}</span>
-{%   else %}
-     <a href="{{review_request.get_absolute_url}}diff/{{item.path}}/#index_header">{{item.revision}}</a>
-{%   endif %}
-{%  endfor %}
-{%  if draft and draft.diffset %}
-{#   There's a draft diff, so display it in the list. #}
-{%   if is_draft_diff or is_draft_interdiff %}
-     <span class="current">{{draft.diffset.revision}}</span>
-{%   else %}
-     <a href="{{review_request.get_absolute_url}}diff/{{diffset_pair.0}}-{{diffset_pair.1}}/#index_header">{{draft.diffset.revision}}</a>
-{%   endif %}
-{%  endif %}
-    </div>
-   </td>
-  </tr>
  </table>
 {% endif %}
-
+<br />
  <p><label>{% trans "Files Changed:" %}</label></p>
 {% include "diffviewer/changeindex.html" %}
   </div>
