--- book_access.module
+++ book_access.module
@@ -64,7 +64,7 @@
  *
  */
 function book_access_perm() {
-  return array('administer book access');
+  return array('administer book access', 'edit own books');
 }
 
 /**
@@ -95,6 +95,9 @@
  */
 function book_access_node_grants($user, $op) {
   $grants['book_access'] = array_keys($user->roles);
+  if (user_access('edit own books', $user)) {
+    $grants['book_access_author'] = array($user->uid);
+  }
   return $grants;
 }
 
@@ -124,6 +127,14 @@
       );
     }
 
+    $parent_node = node_load($parent_nid);
+    $grants[] = array(
+      'realm'        => 'book_access_author',
+      'gid'          => $parent_node->uid,
+      'grant_view'   => TRUE,
+      'grant_update' => TRUE,
+      'grant_delete' => TRUE
+    );
     return $grants;
   }
 }
@@ -349,12 +360,28 @@
   $sql = "
     SELECT nid
     FROM {node_access}
-    WHERE realm = 'book_access'
-    AND gid IN (%s)
-    AND grant_update > 0
+    WHERE grant_update > 0 AND
   ";
 
-  $results = db_query($sql, implode(',', array_keys($user->roles)));
+  if (user_access('edit own books')) {
+    $sql .= "
+      (
+      (realm = 'book_access'
+      AND gid IN (%s))
+      OR
+      (realm = 'book_access_author'
+      AND gid = %s)
+      )
+    ";
+  }
+  else {
+    $sql .= "
+      realm = 'book_access'
+      AND gid IN (%s)
+    ";
+  }
+
+  $results = db_query($sql, implode(',', array_keys($user->roles)), $user->uid);
 
   while ($result = db_fetch_object($results)) {
     $permitted_nids[$result->nid] = $result->nid;
