diff --git a/core/modules/node/node.install b/core/modules/node/node.install
index b2616ab..1f25cf3 100644
--- a/core/modules/node/node.install
+++ b/core/modules/node/node.install
@@ -236,6 +236,12 @@ function node_schema() {
         'not null' => TRUE,
         'default' => 1,
       ),
+      'live' => array(
+        'description' => 'Boolean indicating whether the node is the current live revision.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 1,
+      ),
       'comment' => array(
         'description' => 'Whether comments are allowed on this node (at the time of this revision): 0 = no, 1 = closed (read only), 2 = open (read/write).',
         'type' => 'int',
@@ -558,6 +564,19 @@ function node_update_8002() {
 }
 
 /**
+ * Adds the live column to node tables.
+ */
+function node_update_8003() {
+  $spec = array(
+    'description' => 'Boolean indicating whether the node is the current live revision.',
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 1,
+  );
+  db_add_field('node_revision', 'live', $spec);
+}
+
+/**
  * @} End of "addtogroup updates-7.x-to-8.x"
  * The next series of updates should start at 9000.
  */
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index be60e48..1948d2c 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1089,6 +1089,15 @@ function node_save($node) {
     $node->timestamp = REQUEST_TIME;
     $update_node = TRUE;
 
+    // If not set, mark the live status of this revision. If not a revision or
+    // a new node, it is always live.
+    if (!isset($node->is_live)) {
+      $node->is_live = 1;
+    }
+    if ($node->is_new || empty($node->revision)) {
+      $node->is_live = 1;
+    }
+
     // Let modules modify the node before it is saved to the database.
     module_invoke_all('node_presave', $node);
     module_invoke_all('entity_presave', $node, 'node');
@@ -1134,8 +1143,14 @@ function node_save($node) {
     }
     else {
       // For existing nodes, update the node record which matches the value of
-      // $node->nid.
-      drupal_write_record('node', $node, 'nid');
+      // $node->nid, but only if marked as the live revision.
+      if ($node->is_live) {
+        drupal_write_record('node', $node, 'nid');
+      }
+      else {
+        $update_node = FALSE;
+        $live_vid = db_query("SELECT vid FROM {node} WHERE nid = :nid", array(':nid' => $node->nid))->fetchField();
+      }
       // Then, if a new node revision was requested, save a new record for
       // that; otherwise, update the node revision record which matches the
       // value of $node->vid.
@@ -1146,6 +1161,13 @@ function node_save($node) {
         _node_save_revision($node, $user->uid, 'vid');
         $update_node = FALSE;
       }
+      if ($node->is_live) {
+        db_update('node_revision')
+          ->fields(array('live' => 0))
+          ->condition('nid', $node->nid)
+          ->condition('vid', $node->vid, '<>')
+          ->execute();
+      }
       $op = 'update';
     }
     if ($update_node) {
@@ -1167,13 +1189,21 @@ function node_save($node) {
     module_invoke_all('node_' . $op, $node);
     module_invoke_all('entity_' . $op, $node, 'node');
 
-    // Update the node access table for this node. There's no need to delete
-    // existing records if the node is new.
-    $delete = $op == 'update';
-    node_access_acquire_grants($node, $delete);
+    // Update the node access table for this node, but only if it is the live
+    // revision. There's no need to delete existing records if the node is new.
+    if ($node->is_live) {
+      $delete = $op == 'update';
+      node_access_acquire_grants($node, $delete);
+    }
+    // If this is not a live revision, then we must re-sync field storage.
+    else {
+      $live_node = node_load($node->nid, $live_vid, TRUE);
+      field_attach_update('node', $live_node);
+    }
 
     // Clear internal properties.
     unset($node->is_new);
+    unset($node->is_live);
     unset($node->original);
     // Clear the static loading cache.
     entity_get_controller('node')->resetCache(array($node->nid));
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index 4e94b26..a66099d 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -227,6 +227,17 @@ function node_form($form, &$form_state, $node) {
     '#default_value' => $node->revision,
     '#access' => user_access('administer nodes'),
   );
+  $form['revision_information']['is_live'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Set as live revision'),
+    '#default_value' => 1,
+    '#access' => user_access('administer nodes'),
+    '#states' => array(
+      'visible' => array(
+        ':input[name="revision"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
   // Check the revision log checkbox when the log textarea is filled in.
   // This must not happen if "Create new revision" is enabled by default, since
   // the state would auto-disable the checkbox otherwise.
