diff --git modules/node/node.api.php modules/node/node.api.php
index 257d8cd..797e5d5 100644
--- modules/node/node.api.php
+++ modules/node/node.api.php
@@ -535,6 +535,37 @@ function hook_node_access($node, $op, $account) {
   return NODE_ACCESS_IGNORE;
 }
 
+/**
+ * Alter the control access to a node.
+ *
+ * Modules may implement this hook if they want to remove an access decision of
+ * another module.
+ *
+ * The administrative account (user ID #1) always passes any access check,
+ * so this hook is not called in that case. Users with the "bypass node access"
+ * permission may always view and edit content through the administrative
+ * interface.
+ *
+ * @link http://api.drupal.org/api/group/node_access/7 More on the node access system @endlink
+ * @ingroup node_access
+ * @param $node
+ *   The access result keyed by module name and the allowed, denied or ignored
+ *   permission as the value.
+ * @param $context
+ *   Array with the following keys:
+ *   - node - The node on which the operation is to be performed, or, if it does
+ *     not yet exist, the type of node to be created.
+ *   - op - The operation to be performed.
+ *   - account - A user object representing the user for whom the operation is
+ *     to be performed.
+ *
+ * @see hook_node_access()
+ */
+function hook_node_access_alter(&$access, $context) {
+  // Remove the access results of module foo.
+  unset($access['foo']);
+}
+
 
 /**
  * Act on a node object about to be shown on the add/edit form.
diff --git modules/node/node.module modules/node/node.module
index af9ec21..bb6ab17 100644
--- modules/node/node.module
+++ modules/node/node.module
@@ -2778,7 +2778,20 @@ function node_access($op, $node, $account = NULL) {
   // - At least one module says to grant access.
   // If no module specified either allow or deny, we fall back to the
   // node_access table.
-  $access = module_invoke_all('node_access', $node, $op, $account);
+  $access = array();
+  foreach (module_implements('node_access') as $module) {
+    $func = $module . '_node_access';
+    $access[$module] = $func($node, $op, $account);
+  }
+
+  // Allow other modules to change the access.
+  $context = array(
+    'node' => $node,
+    'op' => $op,
+    'account' => $account,
+  );
+  drupal_alter('node_access', $access, $context);
+
   if (in_array(NODE_ACCESS_DENY, $access, TRUE)) {
     $rights[$account->uid][$cid][$op] = FALSE;
     return FALSE;
