diff -Naur ../module_grants_2.7-original/module_grants.module ./module_grants.module
--- ../module_grants_2.7-original/module_grants.module	2009-09-04 10:34:29.000000000 +1000
+++ ./module_grants.module	2009-09-04 10:40:55.000000000 +1000
@@ -61,8 +61,16 @@
  * Implementation of hook_perm().
  */
 function module_grants_perm() {
-  return array("access 'I created' tab", "access 'I last modified' tab", "access 'I can edit' tab", "access 'I can view' tab",
-    "access 'Published' tab", "access 'Unpublished' tab", "access 'All' tab");
+  $perms = array("access 'I created' tab", "access 'I last modified' tab",
+		 "access 'I can edit' tab", "access 'I can view' tab",
+		 "access 'Published' tab", "access 'Unpublished' tab", "access 'All' tab");
+
+  foreach (node_get_types() as $type) {
+    $name = check_plain($type->type);
+    $perms[] = 'unpublished '. $name .' access';
+  }
+
+  return $perms;
 }
 
 /**
@@ -532,10 +540,14 @@
   //drupal_set_message("'$op' access=$access by $module: '$node->title'", 'warning');
     return $access;
   }
-  // If the node is NOT published and user does not have the "view revisions"
-  // permission, deny access, UNLESS it's the author viewing their only revision
-  if (!$node->status && !user_access('view revisions', $account)
-    && !($op == 'view' && $account->uid == $node->uid && $account->uid > 0 && get_number_of_revisions($node->nid) == 1)) {
+  // If the node is NOT published and user does not have the "unpublished xxx access"
+  // permission, deny access, UNLESS it's the author (viewing their only revision OR
+  // possessing "view revisions" permission)
+  $which_perm = 'unpublished ' . $node->type . ' access';
+  if (!$node->status && !user_access($which_perm, $account)
+     && !($op == 'view' && $account->uid == $node->uid && $account->uid > 0 &&
+	  (user_access('view revisions', $account) ||
+	   get_number_of_revisions($node->nid) == 1))) {
     return FALSE;
   }
 
