diff --git a/taxonomy_access.module b/taxonomy_access.module
index b44a06f..15b2dc2 100644
--- a/taxonomy_access.module
+++ b/taxonomy_access.module
@@ -18,18 +18,22 @@ define('TAXONOMY_ACCESS_CONFIG', 'admin/config/people/taxonomy_access');
 /**
  * Cache a list of all roles.
  *
+ * @param
+ *   A string containing a permission. If set, only roles containing that 
+ *   permission are returned.
+ *
  * @return
  *   An array of roles from user_roles().
  *
  * @todo
  *   Replace this function once http://drupal.org/node/6463 is backported.
  */
-function _taxonomy_access_user_roles() {
-  static $roles;
-  if (!is_array($roles)) {
-    $roles = user_roles();
+function _taxonomy_access_user_roles($permission = NULL) {
+  static $roles = array();
+  if (!isset($roles[$permission])) {
+    $roles[$permission] = user_roles(FALSE, $permission);
   }
-  return $roles;
+  return $roles[$permission];
 }
 
 
@@ -177,6 +181,19 @@ function taxonomy_access_taxonomy_term_delete($term) {
 }
 
 /**
+ * Implements hook_permission().
+ */
+function taxonomy_access_permission() {
+  return array(
+    'taxonomy access unpublished' => array(
+      'title' => t('Use Taxonomy Access Control grants for unpublished nodes'),
+      'description' => t('Allow the user access to unpublished nodes according to Taxonomy Access Control grants.  Without this permission, access to unpublished nodes is always denied.'),
+      'restrict access' => TRUE,
+    )
+  );
+}
+
+/**
  * Implements hook_node_grants().
  * Gives access to taxonomies based on the taxonomy_access table.
  */
@@ -189,7 +206,29 @@ function taxonomy_access_node_grants($user, $op) {
  * Implements hook_node_access_records().
  */
 function taxonomy_access_node_access_records($node) {
-  return _taxonomy_access_node_access_records($node->nid);
+  $grant_records = _taxonomy_access_node_access_records($node->nid); 
+
+  // If the node is unpublished, use TAC grants only for authorized roles.
+  if (!$node->status) {
+    $unpublished_roles = 
+      _taxonomy_access_user_roles('taxonomy access unpublished');
+
+    // Set a zero-row for roles without the permission.
+    $no_grant_record = new stdClass();
+    $no_grant_record->grant_view = 0;
+    $no_grant_record->grant_update = 0;
+    $no_grant_record->grant_delete = 0;
+
+    foreach ($grant_records as $key => $record) {
+      if (!in_array($record['gid'], array_keys($unpublished_roles))) {
+        $no_grant_record->rid = $record['gid'];
+        $grant_records[$key] = 
+          _taxonomy_access_format_grant_record($no_grant_record);
+      }
+    }
+  }
+  
+  return $grant_records;
 }
 
 /**
