diff -urp ./outline_designer.install patch/outline_designer.install
--- ./outline_designer.install	2011-01-31 17:18:28.000000000 +0000
+++ patch/outline_designer.install	2011-02-03 12:15:04.000000000 +0000
@@ -11,7 +11,7 @@ function outline_designer_install() {
 function outline_designer_uninstall() {
   // Delete variables
   $variables = array(
-    'outline_designer_theme', 'outline_designer_collapse_toggle',
+    'outline_designer_theme', 'outline_designer_collapse_toggle', 'outline_designer_context_menu_exclusion_matrix',
   );
 
   foreach (node_get_types() as $type_name => $type) {
diff -urp ./outline_designer.module patch/outline_designer.module
--- ./outline_designer.module	2011-01-31 17:18:28.000000000 +0000
+++ patch/outline_designer.module	2011-02-14 16:53:35.000000000 +0000
@@ -49,6 +49,7 @@ function outline_designer_init() {
 }
 
 function _outline_designer_setup($nid, $ajax_path) {
+  global $user;
   drupal_add_css(drupal_get_path('module', 'outline_designer') .'/css/outline_designer.css');
   drupal_add_js(drupal_get_path('module', 'outline_designer') .'/script/jquery.contextmenu.js');
   drupal_add_js(drupal_get_path('module', 'outline_designer') .'/script/overrides.js', 'header');
@@ -68,11 +69,30 @@ function _outline_designer_setup($nid, $
       }
     }
   }
+
+  //create the array of menu items unavailable to the user by combining
+  //the unavailable menu items in common in all of the user's roles
+  $unchecked_menu_items = array();
+  if ($user->uid != 1) { //user1 should always see all menu items
+    $saved_unchecked_items = variable_get('outline_designer_context_menu_exclusion_matrix', array());
+    //collect only the items unchecked in all of the user's roles
+    foreach (array_keys($user->roles) as $rid) {
+      if($saved_unchecked_items[$rid] != null) {
+	$unchecked_menu_items = array_keys($saved_unchecked_items[$rid]);
+	if (isset($tmp)) {
+	  $unchecked_menu_items = array_intersect($tmp, $unchecked_menu_items);
+	}
+	$tmp = $unchecked_menu_items;
+      }
+    }
+  }
+
   //pass variables to js
   $js_variables = array(
     'path' => base_path() . drupal_get_path('module', 'outline_designer') .'/',
     'types' => array(),
     'theme' => variable_get('outline_designer_theme', 'vista'),
+    'unavailableContextMenuItems' => array_values($unchecked_menu_items),
     'collapseToggle' => variable_get('outline_designer_collapse_toggle', 1),
     'collapseList' => array(),
     'token' => drupal_get_token(),
@@ -279,6 +299,38 @@ function _outline_designer_settings($for
     '#description' => 'This is helpful when working with large book structures.',
     '#required' => FALSE,
   );
+
+  //context menu settings
+  $form["context_menu"] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Context Menu'),
+    '#collapsed' => FALSE,
+    '#collapsible' => TRUE,
+    '#description' => 'The selected items will appear in the Outline Designer context menu, depending on the user\'s roles. Users with several roles will cumulate the roles settings.<br />WARNING: only roles with permission \'administer book outlines\' will be able to utilize these settings.',
+    '#theme' => 'outline_designer_context_menu_items_matrix',
+  );
+  $roles = user_roles(true);
+  $menu_items = array('nid' => t('Node id'), 'add_content' => t('Add Content'), 'rename' => t('Rename'), 'edit' => t('Edit'), 'view' => t('View'), 'delete' => t('Delete'), 'duplicate' => t('Duplicate'), 'change_type' => t('Change Type'));
+  $saved_unchecked_items = variable_get('outline_designer_context_menu_exclusion_matrix', array());
+  //create a checkbox for each menu item for each role
+  foreach ($menu_items as $item_name => $item_desc) {
+    foreach ($roles as $rid => $role) {
+      //if the checkbox is present in the 'outline_designer_context_menu_exclusion_matrix' variable,
+      //then we need to uncheck it (e.g. assign FALSE to #default_value)
+      $default_value = (isset($saved_unchecked_items[$rid][$item_name]['unchecked']))? FALSE : TRUE;
+      $form["context_menu"]["checkboxes"][$item_name]["outline_designer_context_menu_".$item_name."_".$rid] = array(
+	'#name' => 'outline_designer_context_menu_'.$item_name.'_'.$rid,
+        '#type' => 'checkbox',
+        '#title' => $item_desc,
+        '#default_value' => $default_value,
+        '#return_value' => array(
+          'item_name' => $item_name,
+          'rid' => $rid,
+        ),
+      ); 
+    }
+  }
+
   //icons
   $form["packaged_icons"] = array(
     '#type' => 'fieldset',
@@ -337,6 +389,30 @@ function _outline_designer_settings($for
  * Implementation of hook_settings_submit().
  */
 function _outline_designer_settings_submit($form, &$form_state) {
+
+  //store the context menu settings
+  $form_values = array_filter($form_state['values']);
+  $menu_items = (array_keys($form["context_menu"]["checkboxes"]));
+  //collect all the ticked checkboxes
+  foreach ($form_values as $key => $val) {
+    if (strpos($key,"outline_designer_context_menu_") !== false) {
+      $checkboxes[] = $key;
+    }
+  }
+  //extrapolate which items have unchecked by comparing the list of
+  //ticked checkboxes with the list of all the context menu checkboxes
+  foreach ($menu_items as  $item) {
+    if(substr($item, 0, 1) != "#") {
+      $item_checkboxes = $form["context_menu"]["checkboxes"][$item];
+      foreach ($item_checkboxes as $cb_name => $cb_properties) {
+	if ($cb_properties['#type'] == 'checkbox' && !in_array($cb_name, $checkboxes)) {
+	  $items_unchecked[$cb_properties['#return_value']['rid']][$cb_properties['#return_value']['item_name']]['unchecked'] = true;
+	}
+      }
+    }
+  }
+  variable_set('outline_designer_context_menu_exclusion_matrix', array_filter($items_unchecked));
+
   //store the checkbox value
   variable_set('outline_designer_collapse_toggle', $form_state['values']["outline_designer_collapse_toggle"]);
 	//store theme selected
@@ -702,3 +778,32 @@ function outline_designer_suffix() {
       </div>
     </div>';
 }
+
+/**
+ * Implements hook_theme().
+ */
+function outline_designer_theme() {
+  $theme = array(
+    'outline_designer_context_menu_items_matrix' => array(
+      'arguments' => array('form' => NULL),
+    ),
+  );
+  return $theme;
+}
+
+/**
+ * Display the Context menu items as a matrix (columns=user roles, rows=menu items)
+ */
+function theme_outline_designer_context_menu_items_matrix(&$form) {
+  $roles = user_roles(true);
+  foreach (element_children($form["checkboxes"]) as $item_name) {
+    $trow = array();
+    foreach ($roles as $rid => $role) {
+      $trow[] = drupal_render($form["checkboxes"][$item_name]["outline_designer_context_menu_".$item_name."_".$rid]);
+    }
+    $rows[] = $trow;
+  }
+
+  $output = theme('table', array_values($roles), $rows);
+  return $output;
+}
diff -urp ./script/scripts.js patch/script/scripts.js
--- ./script/scripts.js	2011-01-31 17:18:28.000000000 +0000
+++ patch/script/scripts.js	2011-02-03 12:15:04.000000000 +0000
@@ -179,20 +179,37 @@ Drupal.behaviors.outline_designer = func
       }
     });
     //bind the context menu and set it's properties
-  Drupal.settings.outline_designer.context_menu = [   
-    {"Node":{icon: Drupal.settings.outline_designer.path +"images/node.png",disabled:true}}, 
-    $.contextMenu.separator, 
-    {"Add Content":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('add_content'); }, icon: Drupal.settings.outline_designer.path +"images/add_content.png", disabled:false } },
-    {"Rename":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('rename'); }, icon: Drupal.settings.outline_designer.path +"images/rename.png", disabled:false  } },
-    {"Edit":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('edit'); }, icon: Drupal.settings.outline_designer.path +"images/edit.png", disabled:false  } },
-    {"View":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('view'); }, icon: Drupal.settings.outline_designer.path +"images/view.png", disabled:false } },
-    {"Delete":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('delete'); }, icon: Drupal.settings.outline_designer.path +"images/delete.png", disabled:false } }, 
-    {"Duplicate":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('duplicate'); }, icon: Drupal.settings.outline_designer.path +"images/duplicate.png", disabled:false  } },
-    {"Change Type":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('change_type'); }, icon: Drupal.settings.outline_designer.path +"images/change_type.png", disabled:false } }
-  ];
+  var unavailableContextMenuItems = Drupal.settings.outline_designer.unavailableContextMenuItems;
+  Drupal.settings.outline_designer.context_menu = [];
+  if ($.inArray("nid", unavailableContextMenuItems) == -1) {  
+      Drupal.settings.outline_designer.context_menu.push({"Node":{icon: Drupal.settings.outline_designer.path +"images/node.png",disabled:true}},$.contextMenu.separator);
+  }
+
+  if ($.inArray("add_content", unavailableContextMenuItems) == -1) {
+      Drupal.settings.outline_designer.context_menu.push({"Add Content":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('add_content'); }, icon: Drupal.settings.outline_designer.path +"images/add_content.png", disabled:false } });
+  }
+  if ($.inArray("rename", unavailableContextMenuItems) == -1) {
+      Drupal.settings.outline_designer.context_menu.push({"Rename":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('rename'); }, icon: Drupal.settings.outline_designer.path +"images/rename.png", disabled:false  } });
+  }
+  if ($.inArray("edit", unavailableContextMenuItems) == -1) {
+      Drupal.settings.outline_designer.context_menu.push({"Edit":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('edit'); }, icon: Drupal.settings.outline_designer.path +"images/edit.png", disabled:false  } });
+  }
+  if ($.inArray("view", unavailableContextMenuItems) == -1) {
+      Drupal.settings.outline_designer.context_menu.push({"View":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('view'); }, icon: Drupal.settings.outline_designer.path +"images/view.png", disabled:false } });
+  }
+  if ($.inArray("delete", unavailableContextMenuItems) == -1) {
+      Drupal.settings.outline_designer.context_menu.push({"Delete":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('delete'); }, icon: Drupal.settings.outline_designer.path +"images/delete.png", disabled:false } });
+  }
+  if ($.inArray("duplicate", unavailableContextMenuItems) == -1) {
+      Drupal.settings.outline_designer.context_menu.push({"Duplicate":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('duplicate'); }, icon: Drupal.settings.outline_designer.path +"images/duplicate.png", disabled:false  } });
+  }
+  if ($.inArray("change_type", unavailableContextMenuItems) == -1) {
+      Drupal.settings.outline_designer.context_menu.push({"Change Type":{ onclick:function(menuItem,menu) { Drupal.outline_designer.form_render('change_type'); }, icon: Drupal.settings.outline_designer.path +"images/change_type.png", disabled:false } });
+  }
+
   //binding isn't working in Opera / IE correctly or at all
     $('.outline_designer_edit_button').contextMenu(Drupal.settings.outline_designer.context_menu, {theme: Drupal.settings.outline_designer.theme,
-      beforeShow: function () { $(this.menu).find('.context-menu-item-inner:first').css('backgroundImage','url(' + $("#node-" + Drupal.settings.outline_designer.activeNid +"-icon").attr('src') +')').empty().append("nid " + Drupal.settings.outline_designer.activeNid);
+												   beforeShow: function () { if ($.inArray("nid", unavailableContextMenuItems) == -1) { $(this.menu).find('.context-menu-item-inner:first').css('backgroundImage','url(' + $("#node-" + Drupal.settings.outline_designer.activeNid +"-icon").attr('src') +')').empty().append("nid " + Drupal.settings.outline_designer.activeNid);}
       },
       useIframe: false,
       shadow: false
