diff --git a/handlers/uc_node_access_acl.module b/handlers/uc_node_access_acl.module
index 815d04f..4eed3c9 100644
--- a/handlers/uc_node_access_acl.module
+++ b/handlers/uc_node_access_acl.module
@@ -64,10 +64,33 @@ function uc_node_access_acl_form_alter(&$form, &$form_state, $form_id) {
     // Load up all the expirations for this node and add them to the names.
     $result = db_query("SELECT uid, expiration FROM {uc_node_access_expirations} WHERE access_nid = %d", $form['#parameters'][2]->nid);
     while ($row = db_fetch_array($result)) {
-      $users[$row['uid']] .= ' - '. t('Expires @date', array('@date' => format_date($row['expiration'], 'small')));
+      // Need to first check that the user with an expiration hasn't been removed manually from the node
+      if (array_key_exists($row['uid'], $users)) {
+        $users[$row['uid']] .= ' - '. t('Expires @date', array('@date' => format_date($row['expiration'], 'small')));
+      }
     }
 
     // Stuff the data back in the form.
     $form['acl']['view']['user_list']['#default_value'] = serialize($users);
+
+    // Also add in our own submit handler so we can clean up expirations
+    $form['#submit'][] = 'uc_node_access_acl_form_submit';
   }
 }
+
+function uc_node_access_acl_form_submit($form, &$form_state) {
+  $node = $form_state['node'];
+
+  // look at all users that are currently able to view in the ACL list
+  $users = unserialize($form_state['values']['acl']['view']['user_list']);
+
+  // Load up all the expirations for this node so they can be checked if they have been manually removed 
+  $result = db_query("SELECT uid, expiration FROM {uc_node_access_expirations} WHERE access_nid = %d", $node->nid);
+  while ($row = db_fetch_array($result)) {
+    // If any of the users in uc_node_access_expirations are not in this ACL list, remove them
+    if (!array_key_exists($row['uid'], $users)) {
+      uc_node_access_delete_expiration($row['uid'], $node->nid);
+    }
+  }
+
+}
diff --git a/uc_node_access.module b/uc_node_access.module
index d94a2a9..cd5b261 100644
--- a/uc_node_access.module
+++ b/uc_node_access.module
@@ -34,15 +34,11 @@ function uc_node_access_cron() {
     // Revoke access for the user through the current node access handler.
     uc_node_access_op('revoke', $access['access_nid'], $access['uid']);
 
-    // Delete the expiration from the database.
-    db_query("DELETE FROM {uc_node_access_expirations} WHERE uid = %d AND access_nid = %d", $access['uid'], $access['access_nid']);
+    // Delete the expiration
+    uc_node_access_delete_expiration($access['uid'], $access['access_nid']);
 
     $items[] = t('User @uid lost access to <a href="!url">node @nid</a>.', array('@uid' => $access['uid'], '@nid' => $access['access_nid'], '!url' => url('node/'. $access['access_nid'])));
 
-    $node = node_load($access['access_nid']);
-    $account = user_load($access['uid']);
-
-    ca_pull_trigger('uc_node_access_revoke', $node, $account);
   }
 
   if (!empty($items)) {
@@ -61,6 +57,16 @@ function uc_node_access_cron() {
   }
 }
 
+function uc_node_access_delete_expiration($uid, $access_nid) {
+    // Delete the expiration from the database.
+    db_query("DELETE FROM {uc_node_access_expirations} WHERE uid = %d AND access_nid = %d", $uid, $access_nid);
+
+    $node = node_load($access_nid);
+    $account = user_load($uid);
+
+    ca_pull_trigger('uc_node_access_revoke', $node, $account);
+}
+
 /**
  * Implementation of hook_product_feature().
  */
