diff --git a/diff.module b/diff.module
index 355bb01..400e455 100644
--- a/diff.module
+++ b/diff.module
@@ -52,7 +52,7 @@ function diff_menu() {
     'access arguments' => array(1),
     'file' => 'diff.pages.inc',
   );
-  $items['node/%node/revisions/view/%/%'] = array(
+  $items['node/%node/revisions/view/%diff_menu_revision/%diff_menu_revision'] = array(
     'title' => 'Diff',
     'page callback' => 'diff_diffs_show',
     'page arguments' => array(1, 4, 5),
@@ -100,6 +100,19 @@ function diff_menu_alter(&$callbacks) {
 }
 
 /**
+ * Menu argument loader.
+ */
+function diff_menu_revision_load($vid) {
+  if (empty($vid)) {
+    return FALSE;
+  }
+  if (!$nid = arg(1)) {
+    return FALSE;
+  }
+  return node_load($nid, $vid);
+}
+
+/**
  * Access callback for the node revisions page.
  */
 function diff_node_revision_access($node, $op = 'view') {
diff --git a/diff.pages.inc b/diff.pages.inc
index 5363f27..1772d38 100644
--- a/diff.pages.inc
+++ b/diff.pages.inc
@@ -154,15 +154,26 @@ function diff_node_revisions_validate($form, &$form_state) {
  *   Version ID of the new revision.
  */
 function diff_diffs_show($node, $old_vid, $new_vid) {
+  if (is_object($old_vid)) {
+    $old_node = $old_vid;
+    $old_vid = $old_node->vid;
+  }
+  else {
+    $old_node = node_load($node->nid, $old_vid);
+  }
+  if (is_object($new_vid)) {
+    $new_node = $new_vid;
+    $new_vid = $new_node->vid;
+  }
+  else {
+    $new_node = node_load($node->nid, $new_vid);
+  }
 
   // Set same title as on the 'Revisions' tab for consistency
   drupal_set_title(t('Revisions for %title', array('%title' => $node->title)));
 
   $node_revisions = node_revision_list($node);
 
-  $old_node = node_load($node->nid, $old_vid);
-  $new_node = node_load($node->nid, $new_vid);
-
   // Generate table header (date, username, logmessage).
   $old_header = t('!date by !username', array(
     '!date' => l(format_date($old_node->revision_timestamp), "node/$node->nid/revisions/$old_node->vid/view"),
