Index: diff.module
===================================================================
--- diff.module	(revision 5497)
+++ diff.module	(working copy)
@@ -60,24 +60,47 @@
     'access arguments' => array(1),
     'tab_parent' => 'node/%/revisions/list',
   );
+  $items['node/%node/revisions/view/%'] = array(
+    'title' => 'Diff with predecessor',
+    'page callback' => 'diff_predecessor',
+    'page arguments' => array(1, 4),
+    'type' => MENU_LOCAL_TASK,
+    'access arguments' => array('access content'),
+    'tab_parent' => 'node/%/revisions/list',
+  );
   $items['node/%node/revisions/view/latest'] = array(
     'title' => 'Show latest diff',
     'page callback' => 'diff_latest',
     'page arguments' => array(1),
     'type' => MENU_LOCAL_TASK,
-    'access callback' => '_node_revision_access',
-    'access arguments' => array(1),
+    'access arguments' => array('access content'),
     'tab_parent' => 'node/%/revisions/view',
   );
   return $items;
 }
 
+// Menu callback - show diff between specified version and predecessor for a given node.
+function diff_predecessor($node, $vid) {
+  $revisions = node_revision_list($node);
+  if (isset($revisions[$vid])) {
+    $predecessorvid = _diff_get_previous_vid($revisions,$vid);
+    if ($predecessorvid) {
+      drupal_goto("node/$node->nid/revisions/view/$predecessorvid/$vid");
+    }
+  }
+
+  drupal_goto("node/$node->nid");
+}
 // Menu callback - show latest diff for a given node.
 function diff_latest($node) {
   $revisions = node_revision_list($node);
-  $new = array_shift($revisions);
-  $old = array_shift($revisions);
-  drupal_goto("node/$node->nid/revisions/view/$old->vid/$new->vid");
+  if (count($revisions) > 1) {
+    $new = array_shift($revisions);
+    $old = array_shift($revisions);
+    drupal_goto("node/$node->nid/revisions/view/$old->vid/$new->vid");
+  }
+
+  drupal_goto("node/$node->nid");
 }
 
 /**
