diff --git a/modules/menu.workbench_access.inc b/modules/menu.workbench_access.inc
index a7a1b94..e710cad 100644
--- a/modules/menu.workbench_access.inc
+++ b/modules/menu.workbench_access.inc
@@ -169,6 +169,7 @@ function _workbench_access_menu_build_tree(&$tree, $link) {
  * Load data for a menu.
  */
 function menu_workbench_access_load($scheme) {
+  $data = array();
   // This might be a menu or a single menu item.
   if ($menu = menu_load($scheme['access_id'])) {
     $menu = (object) $menu;
@@ -178,8 +179,8 @@ function menu_workbench_access_load($scheme) {
       'description' => $menu->description,
     );
   }
-  else {
-    $item = (object) menu_link_load($scheme['access_id']);
+  elseif ($item = menu_link_load($scheme['access_id'])) {
+    $item = (object) $item;
     $data = array(
       'access_id' => $item->mlid,
       'name' => $item->link_title,
@@ -189,6 +190,7 @@ function menu_workbench_access_load($scheme) {
   return $data;
 }
 
+
 /**
  * Implements hook_menu_delete().
  *
diff --git a/modules/taxonomy.workbench_access.inc b/modules/taxonomy.workbench_access.inc
index 51889b3..67aebdb 100644
--- a/modules/taxonomy.workbench_access.inc
+++ b/modules/taxonomy.workbench_access.inc
@@ -204,6 +204,7 @@ function taxonomy_workbench_access_tree($info, $keys) {
  * Load data for a taxonomy term.
  */
 function taxonomy_workbench_access_load($scheme) {
+  $data = array();
   if ($vocabulary = taxonomy_vocabulary_machine_name_load($scheme['access_id'])) {
     $data = array(
       'name' => $vocabulary->name,
@@ -211,8 +212,7 @@ function taxonomy_workbench_access_load($scheme) {
       'access_id' => $vocabulary->machine_name,
     );
   }
-  else {
-    $term = taxonomy_term_load($scheme['access_id']);
+  elseif ($term = taxonomy_term_load($scheme['access_id'])) {
     $data = array(
       'name' => $term->name,
       'description' => $term->description,
@@ -223,51 +223,6 @@ function taxonomy_workbench_access_load($scheme) {
 }
 
 /**
- * Implements hook_taxonomy_term_insert().
- *
- * If an new term is added, check to see if we need to create a section.
- */
-function workbench_access_taxonomy_term_insert($term) {
-  if (variable_get('workbench_access', 'taxonomy') != 'taxonomy' || !variable_get('workbench_access_auto_assign', 1)) {
-    return;
-  }
-  $active = array_filter(variable_get('workbench_access_taxonomy', array()));
-  if (in_array($term->vocabulary_machine_name, $active)) {
-    $section = array(
-      'access_id' => $term->tid,
-      'access_type' => 'taxonomy',
-      'access_scheme' => 'taxonomy',
-      'access_type_id' => $term->vocabulary_machine_name,
-    );
-    workbench_access_section_save($section);
-  }
-}
-
-/**
- * Implements hook_taxonomy_term_delete().
- *
- * If an active term is deleted, cascade the change through our system.
- */
-function workbench_access_taxonomy_term_delete($term) {
-  $access_scheme = db_query("SELECT * FROM {workbench_access} WHERE access_type = :access_type AND access_id = :access_id", array(':access_type' => 'taxonomy', ':access_id' => $term->tid))->fetchAssoc();
-  if (!empty($access_scheme)) {
-    workbench_access_section_delete($access_scheme);
-  }
-}
-
-/**
- * Implements hook_taxonomy_vocabulary_delete().
- *
- * If an active vocabulary is deleted, cascade the change through our system.
- */
-function workbench_access_taxonomy_vocabulary_delete($vocabulary) {
-  $access_scheme = db_query("SELECT * FROM {workbench_access} WHERE access_type = :access_type AND access_id = :access_id", array(':access_type' => 'taxonomy', ':access_id' => $vocabulary->machine_name))->fetchAssoc();
-  if (!empty($access_scheme)) {
-    workbench_access_section_delete($access_scheme);
-  }
-}
-
-/**
  * Executes a form alter on a specific FieldAPI form element.
  */
 function taxonomy_workbench_access_default_form_alter(&$form, &$form_state, $options) {
@@ -358,3 +313,74 @@ function workbench_access_taxonomy_autocomplete_validate($element, &$form_state)
     form_set_error($element['#field_name'], t('You may not assign this content to: !terms', array('!terms' => implode(', ', $terms))));
   }
 }
+
+/**
+ * Implements hook_query_TAG_alter().
+ *
+ * If this is a restricted taxonomy autocomplete query, add the conditions
+ * required by Workbench Access.
+ *
+ * @see taxonomy_autocomplete()
+ */
+function workbench_access_query_term_access_alter(QueryAlterableInterface $query) {
+  global $user;
+  if (workbench_access_is_active_autocomplete()) {
+    // Alter the query.
+    if (!isset($user->workbench_access)) {
+      workbench_access_user_load_data($user);
+    }
+    $tree = workbench_access_get_user_tree($user);
+    if (!empty($tree)) {
+      $query->condition('t.tid', array_keys($tree), 'IN');
+    }
+    // Force a NULL return if the user has no section assignments.
+    else {
+      $query->condition('t.tid', -10);
+    }
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_insert().
+ *
+ * If a new term is added, check to see if we need to create a section.
+ */
+function workbench_access_taxonomy_term_insert($term) {
+  if (variable_get('workbench_access', 'taxonomy') != 'taxonomy' || !variable_get('workbench_access_auto_assign', 1)) {
+    return;
+  }
+  $active = array_filter(variable_get('workbench_access_taxonomy', array()));
+  if (in_array($term->vocabulary_machine_name, $active)) {
+    $section = array(
+      'access_id' => $term->tid,
+      'access_type' => 'taxonomy',
+      'access_scheme' => 'taxonomy',
+      'access_type_id' => $term->vocabulary_machine_name,
+    );
+    workbench_access_section_save($section);
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_delete().
+ *
+ * If an active term is deleted, cascade the change through our system.
+ */
+function workbench_access_taxonomy_term_delete($term) {
+  $access_scheme = db_query("SELECT * FROM {workbench_access} WHERE access_type = :access_type AND access_id = :access_id", array(':access_type' => 'taxonomy', ':access_id' => $term->tid))->fetchAssoc();
+  if (!empty($access_scheme)) {
+    workbench_access_section_delete($access_scheme);
+  }
+}
+
+/**
+ * Implements hook_taxonomy_vocabulary_delete().
+ *
+ * If an active vocabulary is deleted, cascade the change through our system.
+ */
+function workbench_access_taxonomy_vocabulary_delete($vocabulary) {
+  $access_scheme = db_query("SELECT * FROM {workbench_access} WHERE access_type = :access_type AND access_id = :access_id", array(':access_type' => 'taxonomy', ':access_id' => $vocabulary->machine_name))->fetchAssoc();
+  if (!empty($access_scheme)) {
+    workbench_access_section_delete($access_scheme);
+  }
+}
diff --git a/workbench_access.info b/workbench_access.info
index e35742f..86cbba4 100644
--- a/workbench_access.info
+++ b/workbench_access.info
@@ -8,4 +8,6 @@ files[] = includes/workbench_access_handler_field_edit_node.inc
 files[] = includes/workbench_access_handler_field_section.inc
 files[] = includes/workbench_access_handler_filter_access.inc
 files[] = includes/workbench_access_handler_sort_section.inc
+files[] = modules/taxonomy.workbench_access.inc
+files[] = modules/menu.workbench_access.inc
 files[] = tests/workbench_access.test
diff --git a/workbench_access.module b/workbench_access.module
index 29880dc..1ed7040 100644
--- a/workbench_access.module
+++ b/workbench_access.module
@@ -6,6 +6,16 @@
  */
 
 /**
+ * Implements hook_init().
+ */
+function workbench_access_init() {
+  // Even though we cache, we still need the include, or else our hooks don't
+  // run properly. See http://drupal.org/node/1356272
+  $scheme = variable_get('workbench_access', 'taxonomy');
+  workbench_access_load_include($scheme);
+}
+
+/**
  * Implements hook_menu().
  */
 function workbench_access_menu() {
@@ -538,9 +548,7 @@ function workbench_access_tree($info, $keys = FALSE) {
  * Load the active tree.
  */
 function workbench_access_get_active_tree() {
-  // Even though we cache, we still need the include.
   $scheme = variable_get('workbench_access', 'taxonomy');
-  workbench_access_load_include($scheme);
 
   // Now check the cache.
   $cache = cache_get('workbench_access_tree', 'cache_bootstrap');
@@ -554,9 +562,16 @@ function workbench_access_get_active_tree() {
   $func = $scheme . '_workbench_access_info';
   $info = $func();
   $data = $info[$scheme];
-  $active = workbench_access_get_ids_by_scheme($data);
+  $stored = workbench_access_get_ids_by_scheme($data);
   $tree = workbench_access_tree($data);
   workbench_access_build_tree($tree);
+  // Ensure that we have no orphaned ids.
+  $active = array();
+  foreach ($stored as $access_id => $access_scheme) {
+    if (isset($tree[$access_id])) {
+      $active[$access_id] = $access_scheme;
+    }
+  }
   $access_tree = array(
     'access_scheme' => $data,
     'tree' => $tree,
@@ -1397,7 +1412,12 @@ function workbench_access_node_form_element(&$form, $form_state) {
   // Set default form options.
   $default = array();
   if (!empty($form['#node']->workbench_access)) {
-    $default = array_keys($form['#node']->workbench_access);
+    $current = array_keys($form['#node']->workbench_access);
+    foreach ($current as $access_id) {
+      if (isset($active['active'][$access_id])) {
+        $default[] = $access_id;
+      }
+    }
   }
   $options = array();
   $multiple = variable_get('workbench_access_allow_multiple', 0);
@@ -1998,29 +2018,3 @@ function workbench_access_is_active_autocomplete() {
 
   return $result;
 }
-
-/**
- * Implements hook_query_TAG_alter().
- *
- * If this is a restricted taxonomy autocomplete query, add the conditions
- * required by Workbench Access.
- *
- * @see taxonomy_autocomplete()
- */
-function workbench_access_query_term_access_alter(QueryAlterableInterface $query) {
-  global $user;
-  if (workbench_access_is_active_autocomplete()) {
-    // Alter the query.
-    if (!isset($user->workbench_access)) {
-      workbench_access_user_load_data($user);
-    }
-    $tree = workbench_access_get_user_tree($user);
-    if (!empty($tree)) {
-      $query->condition('t.tid', array_keys($tree), 'IN');
-    }
-    // Force a NULL return if the user has no section assignments.
-    else {
-      $query->condition('t.tid', -10);
-    }
-  }
-}
