diff --git a/README.txt b/README.txt
index 5c6db31..49e544f 100644
--- a/README.txt
+++ b/README.txt
@@ -22,9 +22,10 @@ CONTENTS
 3.  Permissions
 4.  Configuration
 4.1   Access schemes
-4.1.1  Automated section assignment
-4.1.2  Workbench Access message label
-4.1.3  Allow multiple section assignments
+4.1.1 Content types enabled
+4.1.2  Automated section assignment
+4.1.3  Workbench Access message label
+4.1.4  Allow multiple section assignments
 4.2   Access sections
 4.2.1  Manual section configuration
 4.2.2  Automated section configuration
@@ -460,9 +461,25 @@ section is the Museum vocabulary created during installation.
 
 Select your options and Save configuration.
 
+----
+4.1.1 Content types enabled
+
+This fieldset determines is access control rules will be enforced on each
+content type. You may select to disable complex access rules for any content
+type.
+
+  > Content types enabled
+  [*] Article
+  [*] Basic page
+  Only selected content types will have Workbench Access rules enforced.
+
+By default, access control is enforced for all content types.
+
+Note that these settings are also available under the "Workflow" tab of the
+content type settings page.
 
 ----
-4.1.1  Automated section assignment
+4.1.2  Automated section assignment
 
 On the settings page is another checkbox, labeled 'Automated section
 assignment'. This optional setting is enabled by default.
@@ -480,7 +497,7 @@ automatically configured for you.
 
 
 ----
-4.1.2  Workbench Access message label
+4.1.3  Workbench Access message label
 
 In the user interface, Workbench Access sets certain messages, such as the
 assigned editorial sections and the form label.
@@ -489,7 +506,7 @@ This settings lets you change how the item is labelled. The default is
 "Workbench Access". You may prefer "Sections" or "Editorial Team" instead.
 
 ----
-4.1.3  Allow multiple section assignments
+4.1.4  Allow multiple section assignments
 
 The checkbox labeled 'Allow multiple section assignments' controls the behavior
 of the section selection form when editing content. This optional setting is
diff --git a/includes/workbench_access_handler_field_section.inc b/includes/workbench_access_handler_field_section.inc
index 1504ebf..6b1c96c 100644
--- a/includes/workbench_access_handler_field_section.inc
+++ b/includes/workbench_access_handler_field_section.inc
@@ -52,23 +52,20 @@ class workbench_access_handler_field_section extends views_handler_field_prerend
 
   function pre_render(&$values) {
     // We have to find the sections assigned to each node.
-    $this->field_alias = $this->aliases['nid'];
+    // Load node data.
     $nids = array();
-    // Create shell nodes.
     foreach ($values as $result) {
       if (!empty($result->{$this->aliases['nid']})) {
-        $nids[$result->{$this->aliases['nid']}] = new stdClass();
-        $nids[$result->{$this->aliases['nid']}]->nid = $result->{$this->aliases['nid']};
+        $nids[] = $result->{$this->aliases['nid']};
       }
     }
-    // Load workbench data to these nodes.
-    workbench_access_node_load($nids, array());
-    
+    $nodes = node_load_multiple($nids, array());
+
     // Now match the data to the active tree.
     $active = workbench_access_get_active_tree();
     foreach ($values as $value) {
-      if (isset($value->{$this->aliases['nid']}) && isset($nids[$value->{$this->aliases['nid']}]->workbench_access)) {
-        foreach ($nids[$value->{$this->aliases['nid']}]->workbench_access as $access_id) {
+      if (isset($value->{$this->aliases['nid']}) && isset($nodes[$value->{$this->aliases['nid']}]->workbench_access)) {
+        foreach ($nodes[$value->{$this->aliases['nid']}]->workbench_access as $access_id) {
           $value->workbench_access[] = check_plain($active['tree'][$access_id]['name']);
           $this->items[$value->{$this->aliases['nid']}][$access_id]['value'] = check_plain($active['tree'][$access_id]['name']);
         }
diff --git a/includes/workbench_access_handler_filter_access.inc b/includes/workbench_access_handler_filter_access.inc
index 1166ed2..ddb36a5 100644
--- a/includes/workbench_access_handler_filter_access.inc
+++ b/includes/workbench_access_handler_filter_access.inc
@@ -68,6 +68,7 @@ class workbench_access_handler_filter_access extends views_handler_filter_many_t
 
   function query() {
     global $user;
+    static $allowed;
 
     // If not configured, do nothing.
     $active = workbench_access_get_active_tree();
@@ -106,8 +107,26 @@ class workbench_access_handler_filter_access extends views_handler_filter_many_t
     $subquery->condition($table . '.' . $active['access_scheme']['query_field'], $ids, 'IN');
     $subquery->condition($table . '.access_scheme', $active['access_scheme']['access_scheme']);
 
+    // Filter out node types not governed by this module.
+    // See http://drupal.org/node/1082220.
+    if (!isset($allowed)) {
+      $allowed = array();
+      $types = node_type_get_types();
+      foreach ($types as $type => $data) {
+        if (variable_get('workbench_access_node_type_' . $type, 1)) {
+          $allowed[] = $type;
+        }
+      }
+    }
+    // If not all node types are allowed, filter out those not used.
+    // This has to go in the subquery, not the Views query.
+    if (count($allowed) < count($types)) {
+      $alias = $subquery->join('node', 'n', "$table.nid = n.nid");
+      $subquery->condition("$alias.type", $allowed, 'IN');
+    }
+
     // Now alter the query, which must have an nid in the base table.
-    $this->query->add_where(0, $this->query->base_table . '.nid', $subquery, 'IN');
+    $this->query->add_where($this->options['group'], $this->query->base_table . '.nid', $subquery, 'IN');
 
   }
 }
diff --git a/tests/workbench_access.test b/tests/workbench_access.test
index a6cc7fc..392cee1 100644
--- a/tests/workbench_access.test
+++ b/tests/workbench_access.test
@@ -161,7 +161,17 @@ class WorkbenchAccessTestCase extends DrupalWebTestCase {
     $this->drupalGet("node/$node->nid/edit");
     $this->assertRaw('TestWA', t('Workbench Access field was renamed.'));
     $this->assertRaw('<select multiple="multiple" name="workbench_access_id[]" id="edit-workbench-access-id" class="form-select required">', t('Form presents a select list with multiple select.'));
-    // TODO: Test form options.
+
+    // Check that access control by node type settings work.
+    $this->assertTrue(variable_get('workbench_access_node_type_' . $node->type, 1), t('Workbench Access enforced for %type content.', array('%type' => $node->type)));
+    $response = workbench_access_node_access($node, 'update', $account);
+    $this->assertTrue($response != NODE_ACCESS_IGNORE, t('Workbench Access rules enforced on test node.'));
+
+    variable_set('workbench_access_node_type_' . $node->type, 0);
+    $this->assertFalse(variable_get('workbench_access_node_type_' . $node->type, 1), t('Workbench Access not enforced for %type content.', array('%type' => $node->type)));
+    $response = workbench_access_node_access($node, 'update', $account);
+    $this->assertTrue($response == NODE_ACCESS_IGNORE, t('Workbench Access rules ignored on test node.'));
+
   }
 
 }
diff --git a/workbench_access.admin.inc b/workbench_access.admin.inc
index 16f21a6..87bb595 100644
--- a/workbench_access.admin.inc
+++ b/workbench_access.admin.inc
@@ -53,6 +53,25 @@ function workbench_access_settings_form($form, &$form_state) {
       }
     }
   }
+  $types = node_type_get_types();
+  if (!empty($types)) {
+    $form['node_types'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Content types enabled'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+    );
+    foreach ($types as $type => $data) {
+      $form['node_types']['workbench_access_node_type_' . $type] = array(
+        '#title' => check_plain($data->name),
+        '#type' => 'checkbox',
+        '#default_value' => variable_get('workbench_access_node_type_' . $type, 1),
+      );
+    }
+    $form['node_types']['message'] = array(
+      '#markup' => '<em>' . t('Only selected content types will have Workbench Access rules enforced.') . '</em>',
+    );
+  }
   $form['workbench_access_label'] = array(
     '#type' => 'textfield',
     '#title' => t('Workbench Access message label'),
diff --git a/workbench_access.module b/workbench_access.module
index a08050d..68e9a4c 100644
--- a/workbench_access.module
+++ b/workbench_access.module
@@ -295,8 +295,10 @@ function workbench_access_field_extra_fields() {
   // @TODO: be more selective here.
   $extra = array();
   foreach (node_type_get_names() as $name => $value) {
-    $extra['node'][$name]['form'] = $base;
-    $extra['node'][$name]['display'] = $base;
+    if (variable_get('workbench_access_node_type_' . $name, 1)) {
+      $extra['node'][$name]['form'] = $base;
+      $extra['node'][$name]['display'] = $base;
+    }
   }
   return $extra;
 }
@@ -341,25 +343,34 @@ function workbench_access_node_access($node, $op, $account) {
   if (empty($tree['active'])) {
     return NODE_ACCESS_IGNORE;
   }
-  // Now check the user account.
-  if (!isset($account->workbench_access)) {
-    $account = user_load($account->uid);
+
+  // View step. We ignore for published nodes.
+  if ($op == 'view' && $node->status) {
+    return NODE_ACCESS_IGNORE;
   }
+
+  // If disabled for this content type, do nothing.
   if (!is_object($node)) {
     $type = $node;
   }
   else {
     $type = $node->type;
   }
+  if (!variable_get('workbench_access_node_type_' . $type, 1)) {
+    return NODE_ACCESS_IGNORE;
+  }
+
+  // Now check the user account.
+  if (!isset($account->workbench_access)) {
+    $account = user_load($account->uid);
+  }
+
   // Create step. User must be assigned to a section to create content.
   // Note that we do not currently enforce complex rules here.
   if ($op == 'create' && !empty($account->workbench_access)) {
     return NODE_ACCESS_IGNORE;
   }
-  // View step. We ignore for published nodes.
-  if ($op == 'view' && $node->status) {
-    return NODE_ACCESS_IGNORE;
-  }
+
   // Load the current scheme.
   workbench_access_load_include(variable_get('workbench_access', 'taxonomy'));
   // Get the access rules for this node.
@@ -367,9 +378,12 @@ function workbench_access_node_access($node, $op, $account) {
   if (!empty($node->workbench_access) && !empty($account->workbench_access)) {
     $result = workbench_access_check($op, $type, array_filter($node->workbench_access), $account->workbench_access);
   }
+
+  // workbench_access_check() returns either FALSE or a matching access_id.
   if ($result !== FALSE) {
     return NODE_ACCESS_ALLOW;
   }
+
   return NODE_ACCESS_DENY;
 }
 
@@ -546,8 +560,9 @@ function workbench_access_node_load($nodes, $types) {
     $data[$obj->nid][$obj->access_id] = $obj->access_id;
   }
   foreach ($nodes as $node) {
-    // Cannot load if the node has not been created yet.
-    if (empty($node->nid)) {
+    // Cannot load if the node has not been created yet or if it is
+    // not under access control.
+    if (empty($node->nid) || (isset($node->type) && !variable_get('workbench_access_node_type_' . $node->type, 1))) {
       continue;
     }
     $nodes[$node->nid]->workbench_access = array();
@@ -1244,6 +1259,10 @@ function workbench_access_form_alter(&$form, $form_state, $form_id) {
   if (empty($form['#node_edit_form'])) {
     workbench_access_alter_form($form_id, $form, $form_state);
   }
+  // Ensure that we can enforce our rules.
+  elseif (!isset($form['#node']->type) || !variable_get('workbench_access_node_type_' . $form['#node']->type, 1)) {
+    return;
+  }
   // Fire the node form alter.
   else {
     // Make sure we prepared the user.
@@ -1555,6 +1574,20 @@ function workbench_access_menu_link_submit($form, &$form_state) {
 }
 
 /**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Add access rules to node types.
+ */
+function workbench_access_form_node_type_form_alter(&$form, $form_state) {
+  $form['workflow']['workbench_access_node_type'] = array(
+    '#title' => t('Enforce Workbench Access control'),
+    '#type' => 'checkbox',
+    '#default_value' => variable_get('workbench_access_node_type_' . $form['#node_type']->type, 1),
+    '#description' => t('Use Workbench Access to enforce editorial control to all content of this type.'),
+  );
+}
+
+/**
  * Implements hook_block_view_workbench_block_alter().
  *
  * Show the editorial status of this node.
@@ -1563,7 +1596,10 @@ function workbench_access_workbench_block() {
   // Add editing information to this page (if it's a node).
   if ($node = menu_get_object()) {
     if (user_access('view workbench access information')) {
-      if (empty($node->workbench_access)) {
+      if (!variable_get('workbench_access_node_type_' . $node->type, 1)) {
+        return array(t('@message_label: <em>@type pages are not under access control</em>', array('@message_label' => variable_get('workbench_access_label', 'Section'), '@type' => node_type_get_name($node->type))));
+      }
+      elseif (empty($node->workbench_access)) {
         return array(t('@message_label: <em>Unassigned</em>', array('@message_label' => variable_get('workbench_access_label', 'Section'))));
       }
       else {
