diff --git a/modules/node/node.module b/modules/node/node.module
index 4cc6bdf..ca03bba 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -943,11 +943,10 @@ function node_save(&$node) {
   node_invoke($node, $op);
   node_invoke_nodeapi($node, $op);
 
-  // Update the node access table for this node.
-  node_access_acquire_grants($node);
-
-  // Clear the page and block caches.
-  cache_clear_all();
+  // 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);
 }
 
 /**
@@ -2213,8 +2212,12 @@ function node_db_rewrite_sql($query, $primary_table, $primary_field) {
  *
  * @param $node
  *   The $node to acquire grants for.
+ *
+ * @param $delete
+ *   Whether to delete existing node access records before inserting new ones.
+ *   Defaults to TRUE.
  */
-function node_access_acquire_grants($node) {
+function node_access_acquire_grants($node, $delete = TRUE) {
   $grants = module_invoke_all('node_access_records', $node);
   if (empty($grants)) {
     $grants[] = array('realm' => 'all', 'gid' => 0, 'grant_view' => 1, 'grant_update' => 0, 'grant_delete' => 0);
@@ -2229,7 +2232,7 @@ function node_access_acquire_grants($node) {
     $grants = array_shift($grant_by_priority);
   }
 
-  node_access_write_grants($node, $grants);
+  node_access_write_grants($node, $grants, NULL, $delete);
 }
 
 /**
diff --git a/modules/node/node.pages.inc b/modules/node/node.pages.inc
index f5bbdfc..feb1bb6 100644
--- a/modules/node/node.pages.inc
+++ b/modules/node/node.pages.inc
@@ -475,6 +475,8 @@ function node_form_submit($form, &$form_state) {
     // rebuilt and node form redisplayed the same way as in preview.
     drupal_set_message(t('The post could not be saved.'), 'error');
   }
+  // Clear the page and block caches.
+  cache_clear_all();
 }
 
 /**
