diff --git a/modules/node/node.module b/modules/node/node.module
index 51ec8c3..525f1a0 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -3378,15 +3378,34 @@ function node_access_write_grants($node, $grants, $realm = NULL, $delete = TRUE)
 
   // Only perform work when node_access modules are active.
   if (!empty($grants) && count(module_implements('node_grants'))) {
-    $query = db_insert('node_access')->fields(array('nid', 'realm', 'gid', 'grant_view', 'grant_update', 'grant_delete'));
+    $count = db_select('node_access')
+                ->condition('nid', $node->nid)
+                ->countQuery()->execute()->fetchField();
+
     foreach ($grants as $grant) {
       if ($realm && $realm != $grant['realm']) {
         continue;
       }
       // Only write grants; denies are implicit.
       if ($grant['grant_view'] || $grant['grant_update'] || $grant['grant_delete']) {
-        $grant['nid'] = $node->nid;
-        $query->values($grant);
+        // If node grants for this node exists, do an update.
+        if ($count > 0) {
+          $query = db_update('node_access')->condition('nid', $node->nid);
+        }
+        else {
+          // else create new access rules for this node.
+          $query = db_insert('node_access');
+          $query->fields(array('nid' => $node->nid));
+          #$grant['nid'] = $node->nid;
+        }
+
+        $query->fields(array(
+          'realm' => $grant['realm'],
+          'gid' => $grant['gid'],
+          'grant_view' => $grant['grant_view'],
+          'grant_update' => $grant['grant_update'],
+          'grant_delete' => $grant['grant_delete']
+        ));
       }
     }
     $query->execute();
