diff --git a/modules/menu.workbench_access.inc b/modules/menu.workbench_access.inc
index 92e97eb..4ffedfc 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),
+  );
 }
 
 /**
@@ -247,3 +253,52 @@ 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;
+  }
+
+  // Nothing to do if we're not limiting menu items.
+  if (!variable_get('workbench_access_menu_limit', 1)) {
+    return;
+  }
+
+  $tree = workbench_access_get_user_tree();
+  $active = workbench_access_get_active_tree();
+  $menu_options = workbench_access_options($tree, $active['tree']);
+
+  // If no options, then no access.
+  if (empty($menu_options)) {
+    $form['menu']['#access'] = FALSE;
+    return;
+  }
+
+  // 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($menu_options[$plid]) && !isset($menu_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 it's current value if
+  // changed.
+  if (array_key_exists($parent['#default_value'], $parent['#options'])) {
+    $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 it\'s 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 e2f44ec..ffa147d 100644
--- a/workbench_access.module
+++ b/workbench_access.module
@@ -702,7 +702,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 +710,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 {
@@ -1387,6 +1387,9 @@ function workbench_access_form_alter(&$form, $form_state, $form_id) {
   else {
     workbench_access_default_form_element($form, $form_state);
   }
+
+  // Allow modules to alter the form regardless of form element
+  workbench_access_alter_node_form($form, $form_state);
 }
 
 /**
@@ -1534,6 +1537,22 @@ function workbench_access_default_form_element(&$form, &$form_state) {
 }
 
 /**
+ * Allow modules to alter the node form.
+ */
+function workbench_access_alter_node_form(&$form, $form_state) {
+  // Prepare the form element.
+  $active = workbench_access_get_active_tree();
+  $tree = workbench_access_get_user_tree();
+  // Generate options so we can check for access.
+  $options = workbench_access_options($tree, $active['active']);
+  // Call the function.
+  $func = $active['access_scheme']['access_scheme'] . '_workbench_access_default_form_alter';
+  if (function_exists($func)) {
+    $func($form, $form_state, $options);
+  }
+}
+
+/**
  * Find form elements that control access.
  *
  * @see workbench_access_get_assigned_fields()
