diff --git a/node.admin.inc b/node.admin.inc
--- node.admin.inc	Thu Jan 15 03:14:12 1970
+++ node.admin.inc	Thu Jan 15 03:14:12 1970
@@ -498,6 +498,7 @@
         ),
       );
     }
+    unset($node);
   }
 
   // Only use a tableselect when the current user is able to perform any
diff --git a/node.install b/node.install
--- node.install	Thu Jan 15 03:14:12 1970
+++ node.install	Thu Jan 15 03:14:12 1970
@@ -114,7 +114,7 @@
       'translate'           => array('translate'),
     ),
     'unique keys' => array(
-      'vid' => array('vid'),
+      'vid' => array('nid'),
     ),
     'foreign keys' => array(
       'node_revision' => array(
@@ -257,7 +257,7 @@
       'nid' => array('nid'),
       'uid' => array('uid'),
     ),
-    'primary key' => array('vid'),
+    'primary key' => array('nid','vid'),
     'foreign keys' => array(
       'versioned_node' => array(
         'table' => 'node',
diff --git a/node.module b/node.module
--- node.module	Thu Jan 15 03:14:12 1970
+++ node.module	Thu Jan 15 03:14:12 1970
@@ -489,7 +489,6 @@
  *   Status flag indicating outcome of the operation.
  */
 function node_type_save($info) {
-  $is_existing = FALSE;
   $existing_type = !empty($info->old_type) ? $info->old_type : $info->type;
   $is_existing = (bool) db_query_range('SELECT 1 FROM {node_type} WHERE type = :type', 0, 1, array(':type' => $existing_type))->fetchField();
   $type = node_type_set_defaults($info);
@@ -569,7 +568,7 @@
       'entity_type' => 'node',
       'bundle' => $type->type,
       'label' => $label,
-      'widget_type' => 'text_textarea_with_summary',
+      'widget' => array('type' => 'text_textarea_with_summary'),
       'settings' => array('display_summary' => TRUE),
       'display' => array(
         'default' => array(
@@ -925,7 +924,7 @@
  */
 function node_load($nid = NULL, $vid = NULL, $reset = FALSE) {
   $nids = (isset($nid) ? array($nid) : array());
-  $conditions = (isset($vid) ? array('vid' => $vid) : array());
+  $conditions = (isset($vid) ? array('nid' => $nid, 'vid' => $vid) : array());
   $node = node_load_multiple($nids, $conditions, $reset);
   return $node ? reset($node) : FALSE;
 }
@@ -1109,15 +1108,18 @@
       // that; otherwise, update the node revision record which matches the
       // value of $node->vid.
       if (!empty($node->revision)) {
+        // @todo:REMOVE don't push any keys onto node revisions here or you'll overwrite the revision every time.
         _node_save_revision($node, $user->uid);
       }
       else {
-        _node_save_revision($node, $user->uid, 'vid');
+        // @todo:REMOVE we want to save over the revision chosen. to properly identify it, we need both the NID and revision VID
+        _node_save_revision($node, $user->uid, array('nid','vid'));
         $update_node = FALSE;
       }
       $op = 'update';
     }
     if ($update_node) {
+      // @todo:REMOVE don't modify or the base node table won't recognize updates to node_revision.
       db_update('node')
         ->fields(array('vid' => $node->vid))
         ->condition('nid', $node->nid)
@@ -1244,9 +1246,11 @@
  *
  * @param $revision_id
  *   The revision ID to delete.
+ * @param $node_id
+ *   The node ID
  */
-function node_revision_delete($revision_id) {
-  if ($revision = node_load(NULL, $revision_id)) {
+function node_revision_delete($revision_id, $node_id=NULL) {
+  if ($revision = node_load($node_id, $revision_id)) {
     // Prevent deleting the current revision.
     $node = node_load($revision->nid);
     if ($revision_id == $node->vid) {
@@ -1779,9 +1783,9 @@
     ->fetchCol();
   node_delete_multiple($nodes);
   // Delete old revisions.
-  $revisions = db_query('SELECT vid FROM {node_revision} WHERE uid = :uid', array(':uid' => $account->uid))->fetchCol();
+  $revisions = db_query('SELECT nid, vid FROM {node_revision} WHERE uid = :uid', array(':uid' => $account->uid))->fetchAssoc();
   foreach ($revisions as $revision) {
-    node_revision_delete($revision);
+    node_revision_delete($revision['vid'], $revision['nid']);
   }
   // Clean history.
   db_delete('history')
diff --git a/node.pages.inc b/node.pages.inc
--- node.pages.inc	Thu Jan 15 03:14:12 1970
+++ node.pages.inc	Thu Jan 15 03:14:12 1970
@@ -517,7 +517,8 @@
     $row = array();
     $operations = array();
 
-    if ($revision->current_vid > 0) {
+    // Ensure the current VID belongs to this node or we'll get weird results.
+    if ($revision->current_vid > 0 && $node->vid == $revision->current_vid) {
       $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision))))
                                . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : ''),
                      'class' => array('revision-current'));
@@ -572,7 +573,7 @@
 
 function node_revision_delete_confirm_submit($form, &$form_state) {
   $node_revision = $form['#node_revision'];
-  node_revision_delete($node_revision->vid);
+  node_revision_delete($node_revision->vid, $node_revision->nid);
 
   watchdog('content', '@type: deleted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
   drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($node_revision->revision_timestamp), '@type' => node_type_get_name($node_revision), '%title' => $node_revision->title)));
