diff --git a/delegator/plugins/tasks/node_edit.inc b/delegator/plugins/tasks/node_edit.inc
index 320bfb8b252f1a723c29912ed2ca514e6ca26f0b..e03c8223ff431135b702117bcb35adbfa2e265b3 100644
--- a/delegator/plugins/tasks/node_edit.inc
+++ b/delegator/plugins/tasks/node_edit.inc
@@ -11,8 +11,8 @@ function delegator_node_edit_delegator_tasks() {
       // This is a 'page' task and will fall under the page admin UI
       'task type' => 'page',
 
-      'title' => t('Node view'),
-      'description' => t('The node edit task allows you to control what handler will handle the job of editing a node at the path <em>node/%node/edit</em>. If no handler is set or matches the criteria, the default Drupal node renderer will be used.'),
+      'title' => t('Node edit'),
+      'description' => t('The node edit task allows you to control what handler will handle the job of editing a node at the path <em>node/%node/edit</em>. It also handles the node add page at node/add/%type. If no handler is set or matches the criteria, the default Drupal node renderer will be used. Please note that some modules sufficiently customize their node add and edit procedure that this may not successfully override adding or editing of all types.'),
 
       'admin title' => 'Node edit', // translated by menu system
       'admin description' => 'Overrides for the built in node edit handler at <em>node/%node/edit</em>.',
@@ -34,22 +34,36 @@ function delegator_node_edit_delegator_tasks() {
 /**
  * Callback defined by delegator_node_edit_delegator_tasks().
  *
- * Alter the node view input so that node view comes to us rather than the
- * normal node view process.
+ * Alter the node edit input so that node edit comes to us rather than the
+ * normal node edit process.
  */
 function delegator_node_edit_menu_alter(&$items, $task) {
-  // Override the node view handler for our purpose.
+  // Override the node edit handler for our purpose.
   $items['node/%node/edit']['page callback'] = 'delegator_node_edit';
   $items['node/%node/edit']['file path'] = $task['path'];
   $items['node/%node/edit']['file'] = $task['file'];
+
+  // Also catch node/add handling:
+  foreach (node_get_types('types', NULL, TRUE) as $type) {
+    $path = 'node/add/' . str_replace('_', '-', $type->type);
+    if ($items[$path]['page callback'] != 'node_add') {
+      continue;
+    }
+
+    $items[$path]['page callback'] = 'delegator_node_add';
+    $items[$path]['file path'] = $task['path'];
+    $items[$path]['file'] = $task['file'];
+    // Why str_replace things back?
+    $items[$path]['page arguments'] = array($type->type);
+  }
 }
 
 /**
- * Entry point for our overridden node view.
+ * Entry point for our overridden node edit.
  *
  * This function asks its assigned handlers who, if anyone, would like
  * to run with it. If no one does, it passes through to Drupal core's
- * node view, which is node_page_view().
+ * node edit, which is node_page_edit().
  */
 function delegator_node_edit($node) {
   // Load my task plugin
@@ -68,10 +82,6 @@ function delegator_node_edit($node) {
     if ($function = delegator_get_renderer($handler)) {
       $output = $function($handler, $contexts);
       if ($output) {
-        // Since we're not using node_show() we need to emulate what it used to do.
-        // Update the history table, stating that this user viewed this node.
-        node_tag_new($node->nid);
-
         // TRUE is a special return used to let us know that it handled the
         // task but does not wish us to render anything, as it already did.
         // This is needed for the 'no blocks' functionality.
@@ -85,13 +95,39 @@ function delegator_node_edit($node) {
 
   // Fall back!
   module_load_include('inc', 'node', 'node.pages');
-  return node_page_edit($node);
+  return drupal_get_form($node->type .'_node_form', $node);
+}
+
+/**
+ * Callback to handle the process of adding a node.
+ *
+ * This creates a basic $node and passes that off to delegator_node_edit().
+ * It is modeled after Drupal's node_add() function.
+ *
+ * Unlike node_add() we do not need to check node_access because that was
+ * already checked by the menu system.
+ */
+function delegator_node_add($type) {
+  global $user;
+
+  $types = node_get_types();
+
+  // Initialize settings:
+  $node = (object) array(
+    'uid' => $user->uid,
+    'name' => (isset($user->name) ? $user->name : ''),
+    'type' => $type,
+    'language' => ''
+  );
+
+  drupal_set_title(t('Create @name', array('@name' => $types[$type]->name)));
+  return delegator_node_edit($node);
 }
 
 /**
  * Callback to get arguments provided by this task handler.
  *
- * Since this is the node view and there is no UI on the arguments, we
+ * Since this is the node edit and there is no UI on the arguments, we
  * create dummy arguments that contain the needed data.
  */
 function delegator_node_edit_get_arguments($task, $subtask_id) {
diff --git a/includes/context-access-admin.inc b/includes/context-access-admin.inc
index 5376e303d2bced0cc7f7df7d630c0faa583d804c..257c4c92584fee5613bf2d1d2b777e97bd28d5a5 100644
--- a/includes/context-access-admin.inc
+++ b/includes/context-access-admin.inc
@@ -290,10 +290,21 @@ function ctools_access_ajax_add($fragment = NULL, $name = NULL) {
 
   $test = array(
     'name' => $name,
-    'context' => '',
     'settings' => array() // TODO defaults
   );
 
+  if (isset($plugin['required context'])) {
+    if (is_object($plugin['required context'])) {
+      $test['context'] = '';
+    }
+    else {
+      $test['context'] = array();
+      foreach ($plugin['required context'] as $required) {
+        $test['context'][] = '';
+      }
+    }
+  }
+
   if (isset($plugin['default'])) {
     if (is_array($plugin['default'])) {
       $test['settings'] = $plugin['default'];
diff --git a/includes/context.inc b/includes/context.inc
index c69b6a410ccd8ca386b93f53633bfd9a64fcab5a..c6678b7b3adc8fb53709ca4945e34f5228e8dd14 100644
--- a/includes/context.inc
+++ b/includes/context.inc
@@ -241,7 +241,7 @@ function _ctools_context_filter($contexts, $required) {
  */
 function ctools_context_selector($contexts, $required, $default) {
   if (is_array($required)) {
-    $result = array();
+    $result = array('#tree' => TRUE);
     $count = 1;
     foreach ($required as $id => $r) {
       $result[] = _ctools_context_selector($contexts, $r, $default[$id], $count++);
diff --git a/plugins/access/node_access.inc b/plugins/access/node_access.inc
new file mode 100644
index 0000000000000000000000000000000000000000..55a9cc62b4315f3bebe43e21d0ea4393a24878a7
--- /dev/null
+++ b/plugins/access/node_access.inc
@@ -0,0 +1,88 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Plugin to provide access control based upon node type.
+ */
+
+/**
+ * Implementation of specially named hook_ctools_arguments().
+ */
+function ctools_node_access_ctools_access() {
+  $args['node_access'] = array(
+    'title' => t("Node access"),
+    'description' => t('Control access with built in Drupal node access test.'),
+    'callback' => 'ctools_node_access_ctools_access_check',
+    'default' => array('type' => 'view'),
+    'settings form' => 'ctools_node_access_ctools_access_settings',
+    'settings form submit' => 'ctools_node_access_ctools_access_settings_submit',
+    'summary' => 'ctools_node_access_ctools_acesss_summary',
+    'required context' => array(
+      new ctools_context_required(t('User'), 'user'),
+      new ctools_context_required(t('Node'), 'node'),
+    ),
+  );
+
+  return $args;
+}
+
+/**
+ * Settings form for the 'by node_access' access plugin
+ */
+function ctools_node_access_ctools_access_settings(&$form, &$form_state, $conf) {
+  $form['settings']['type'] = array(
+    '#title' => t('Access type'),
+    '#type' => 'radios',
+    '#options' => array(
+      'view' => t('View'),
+      'update' => t('Update'),
+      'delete' => t('Delete'),
+      'create' => t('Create nodes of the same type'),
+    ),
+    '#description' => t('Using built in Drupal node access rules, determine if the user can perform the selected operation on the node.'),
+    '#default_value' => $conf['type'],
+  );
+}
+
+/**
+ * Check for access.
+ */
+function ctools_node_access_ctools_access_check($conf, $context) {
+  // As far as I know there should always be a context at this point, but this
+  // is safe.
+  list($user_context, $node_context) = $context;
+  if (empty($node_context) || empty($node_context->data) || empty($node_context->data->type)) {
+    return FALSE;
+  }
+
+  if (empty($user_context) || empty($user_context->data)) {
+    return FALSE;
+  }
+
+  if ($conf['type'] == 'create') {
+    return node_access('create', $node_context->data->type, $user_context->data);
+  }
+  else {
+    return node_access($conf['type'], $node_context->data, $user_context->data);
+  }
+}
+
+/**
+ * Provide a summary description based upon the checked node_accesss.
+ */
+function ctools_node_access_ctools_acesss_summary($conf, $context) {
+  list($user_context, $node_context) = $context;
+  $replacement = array('@user' => $user_context->identifier, '@node' => $node_context->identifier);
+
+  switch ($conf['type']) {
+    case 'view':
+      return t('@user can view @node.', $replacement);
+    case 'update':
+      return t('@user can edit @node.', $replacement);
+    case 'delete':
+      return t('@user can delete @node.', $replacement);
+    case 'create':
+      return t('@user can create nodes of the same type as @node.', $replacement);
+  }
+}
\ No newline at end of file
diff --git a/plugins/contexts/node_edit_form.inc b/plugins/contexts/node_edit_form.inc
index 995d2f330b8334cf5a6c374582b0da5c4bb9a27f..ac4b1920941536c48ebb19dc997023382d4ec552 100644
--- a/plugins/contexts/node_edit_form.inc
+++ b/plugins/contexts/node_edit_form.inc
@@ -40,7 +40,7 @@ function ctools_context_create_node_edit_form($empty, $node = NULL, $conf = FALS
     $node = node_load($node['nid']);
   }
 
-  if (!empty($node) && node_access('update', $node)) {
+  if (!empty($node)) {
     module_load_include('inc', 'node', 'node.pages');
     ctools_include('form');
     $form_id = $node->type . '_node_form';
@@ -51,7 +51,7 @@ function ctools_context_create_node_edit_form($empty, $node = NULL, $conf = FALS
     // Fill in the 'node' portion of the context
     $context->data     = $node;
     $context->title    = $node->title;
-    $context->argument = $node->nid;
+    $context->argument = isset($node->nid) ? $node->nid : $node->type;
 
     $context->form       = $form;
     $context->form_state = &$form_state;