diff --git a/modules/menu.workbench_access.inc b/modules/menu.workbench_access.inc
index 1da7ca6..9d61435 100644
--- a/modules/menu.workbench_access.inc
+++ b/modules/menu.workbench_access.inc
@@ -80,6 +80,12 @@ function menu_workbench_access_configuration(&$form, &$form_state) {
       ),
     ),
   );
+  $form['menu_workbench_access_info']['workbench_access_menu_limit'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Limit available menu items based on Workbench Access.'),
+    '#description' => t('If checked, when creating nodes users will not be able to choose a parent menu item to which they do not have editorial access.'),
+    '#default_value' => variable_get('workbench_access_menu_limit', 1),
+  );
 }
 
 /**
@@ -250,3 +256,57 @@ function workbench_access_menu_link_delete($link) {
     workbench_access_section_delete($access_scheme);
   }
 }
+
+/**
+ * Executes a form alter on a specific FieldAPI form element.
+ */
+function menu_workbench_access_default_form_alter(&$form, &$form_state, $options) {
+  if (!isset($form['menu'])) {
+    return;
+  }
+
+  // If no options, then no access.
+  if (empty($options)) {
+    $form['menu']['#access'] = FALSE;
+    return;
+  }
+
+  // Nothing to do if we're not limiting menu items.
+  if (!variable_get('workbench_access_menu_limit', 1)) {
+    return;
+  }
+
+  // Assume that all new content will be in the menu.
+  if (empty($form['#node']->nid)) {
+    $form['menu']['enabled']['#default_value'] = 1;
+  }
+
+  // Note that we require menu data for access control.
+  $form['menu']['enabled']['#description'] = t('To enforce access control, this content must be placed in the menu.');
+
+  // Adjust the parent form.
+  $parent = &$form['menu']['link']['parent'];
+  $current = $parent['#options'];
+
+  foreach ($parent['#options'] as $key => $value) {
+    $ids = explode(':', $key);
+    $menu = $ids[0];
+    $plid = $ids[1];
+    // Unset if the user does not not have access to this item and the item
+    // is not the current parent.
+    if (!isset($options[$plid]) && !isset($options[$menu]) && (!$form['menu']['enabled']['#default_value'] || $key != $parent['#default_value'])) {
+      unset($parent['#options'][$key]);
+    }
+  }
+
+  // Add a warning note if the user does not have rights to the current parent,
+  // as the user will not be able to restore the item to its current value if
+  // changed.
+  if (array_key_exists($parent['#default_value'], $parent['#options'])) {
+    $tree = workbench_access_get_user_tree();
+    $default = explode(':', $parent['#default_value']);
+    if ($default[1] != 0 && !isset($tree[$default[1]])) {
+      $parent['#description'] = t('<strong>Note:</strong> since you do not have editorial access to the parent of this menu item, if you change the parent you may not be able to restore it to its original value.');
+    }
+  }
+}
diff --git a/modules/taxonomy.workbench_access.inc b/modules/taxonomy.workbench_access.inc
index d9ce205..41f0766 100644
--- a/modules/taxonomy.workbench_access.inc
+++ b/modules/taxonomy.workbench_access.inc
@@ -252,16 +252,6 @@ function taxonomy_workbench_access_default_form_alter(&$form, &$form_state, $opt
       $element['#element_validate'][] = 'workbench_access_autocomplete_validate';
     }
   }
-  // Inform Workbench Access which data element we store on the node.
-  // (e.g.) $node->{$field}[LANGUAGE][][COLUMN].
-  $form['workbench_access_column'] = array(
-    '#type' => 'value',
-    '#value' => 'tid',
-  );
-  $form['workbench_access_language'] = array(
-    '#type' => 'value',
-    '#value' => TRUE,
-  );
 }
 
 /**
diff --git a/workbench_access.module b/workbench_access.module
index 793067a..1ebd1af 100644
--- a/workbench_access.module
+++ b/workbench_access.module
@@ -621,6 +621,8 @@ function workbench_access_node_load($nodes, $types) {
 function workbench_access_node_insert($node) {
   // Clear the old records for this node.
   workbench_access_node_delete($node);
+  // Make sure we have processed new data.
+  workbench_access_node_presave($node);
   // If nothing to set, we are done.
   if (empty($node->workbench_access)) {
     return;
@@ -652,6 +654,10 @@ function workbench_access_node_insert($node) {
  * Implements hook_node_presave().
  */
 function workbench_access_node_presave($node) {
+  // We must have a node id to continue. @see workbench_access_node_insert().
+  if (empty($node->nid)) {
+    return;
+  }
   // Did we use the default field form?
   workbench_access_prepare_field_save($node);
   if (isset($node->workbench_access_fields)) {
@@ -702,7 +708,7 @@ function workbench_access_node_presave($node) {
 function workbench_access_prepare_field_save($node) {
   // If using a default form element, or the form data is already present, then
   // we do not need this step.
-  if (variable_get('workbench_access_custom_form', 1) || isset($node->workbench_access_fields)) {
+  if (variable_get('workbench_access_custom_form', 1)) {
     return;
   }
   $tree = workbench_access_get_active_tree();
@@ -710,7 +716,7 @@ function workbench_access_prepare_field_save($node) {
   $node->workbench_access_language = $scheme['translatable'];
   $node->workbench_access_column = $scheme['storage_column'];
   // Find the fields to watch for data.
-  if (!empty($scheme['form_field'])) {
+  if (empty($node->workbench_access_fields) && !empty($scheme['form_field'])) {
     $node->workbench_access_fields[] = $scheme['form_field'];
   }
   else {
