--- modules/node/node.module	2008-04-16 16:47:00.000000000 +0200
+++ modules/node/node.module	2008-06-22 22:37:19.187500000 +0200
@@ -787,17 +787,18 @@
 
   return $output;
 }
 
 /**
  * Implementation of hook_perm().
  */
 function node_perm() {
-  $perms = array('administer content types', 'administer nodes', 'access content', 'view revisions', 'revert revisions');
+  //View unpublished nodes for all node types (global)
+  $perms = array('administer content types', 'administer nodes', 'access content', 'view revisions', 'revert revisions', 'view unpublished nodes');
 
   foreach (node_get_types() as $type) {
     if ($type->module == 'node') {
       $name = check_plain($type->type);
       $perms[] = 'create '. $name .' content';
       $perms[] = 'edit own '. $name .' content';
       $perms[] = 'edit '. $name .' content';
     }
@@ -2727,16 +2728,21 @@
   if (user_access('administer nodes')) {
     return TRUE;
   }
 
   if (!user_access('access content')) {
     return FALSE;
   }
 
+  //View unpublished nodes for all node types (global)
+  if ($op == 'view' && $node->status == 0 && user_access('view unpublished nodes')) {
+    return TRUE;
+  }
+
   // Can't use node_invoke(), because the access hook takes the $op parameter
   // before the $node parameter.
   $module = node_get_types('module', $node);
   if ($module == 'node') {
     $module = 'node_content'; // Avoid function name collisions.
   }
   $access = module_invoke($module, 'access', $op, $node);
   if (!is_null($access)) {
