diff --git a/workbench_access.module b/workbench_access.module
index 35a4cd7..3a87691 100644
--- a/workbench_access.module
+++ b/workbench_access.module
@@ -1185,6 +1185,19 @@ function workbench_access_options($tree, $active) {
 }
 
 /**
+ * Build an array of form options for the currently active workbench access tree.
+ *
+ * @return
+ *   An array of options, suitable for use in a form.
+ */
+function workbench_access_active_options() {
+  $active = workbench_access_get_active_tree();
+  $tree = $active['tree'];
+  workbench_access_build_tree($tree);
+  return workbench_access_options($tree, $active['active']);
+}
+
+/**
  * Ensure the proper action for our content form.
  */
 function workbench_access_form_views_exposed_form_alter(&$form, &$form_state) {
@@ -1729,3 +1742,156 @@ function workbench_access_access_scheme_load($scheme) {
   $info = module_invoke_all('workbench_access_info');
   return isset($info[$scheme]) ? $info[$scheme] : FALSE;
 }
+
+/**
+ * Implements hook_action_info().
+ */
+function workbench_access_action_info() {
+  $info = array();
+
+  $info['workbench_access_assign_section_presave_action'] = array(
+    'type' => 'node',
+    'label' => t("Assign Section (Presave)"),
+    'configurable' => TRUE,
+    'behavior' => array('changes_property'),
+    'triggers' => array('node_presave'),
+  );
+
+  $info['workbench_access_unassign_section_presave_action'] = array(
+    'type' => 'node',
+    'label' => t("Unassign Section (Presave)"),
+    'configurable' => TRUE,
+    'behavior' => array('changes_property'),
+    'triggers' => array('node_presave'),
+  );
+
+  if (module_exists('workbench_moderation')){
+    // Get all workbench transitions.
+    $transitions = workbench_moderation_transitions();
+
+    // Add a trigger for each transition.
+    foreach ($transitions as $transition_definition) {
+      $transition_string = 'wmt_' . $transition_definition->from_name . '__' . $transition_definition->to_name;
+      // Hash this string if it's longer than the db field size
+      if (strlen($transition_string) > 32) {
+        $transition_string = md5($transition_string);
+      }
+
+      $info['workbench_access_assign_section_presave_action']['triggers'][] = $transition_string;
+      $info['workbench_access_unassign_section_presave_action']['triggers'][] = $transition_string;
+    }
+  }
+
+  return $info;
+}
+
+/**
+ * Form builder; Prepare a form for possible sections.
+ */
+function workbench_access_assign_section_presave_action_form($context) {
+  $form = array();
+
+  $active = workbench_access_get_active_tree();
+  $tree = $active['tree'];
+  workbench_access_build_tree($tree);
+  $options = workbench_access_options($tree, $active['active']);
+
+  // display an error if workbench access module has not been configured
+  if (empty($options) && !variable_get('workbench_access', FALSE)) {
+    $message = workbench_access_configuration_needed_message();
+    drupal_set_message($message, 'error', $repeat = FALSE);
+  }
+
+  $form['section'] = array(
+    '#type' => 'select',
+    '#options' => $options,
+    '#default_value' => isset($context['section']) ? $context['section'] : '',
+  );
+
+  return $form;
+}
+
+/**
+ * Process workbench_moderation_set_state_action_form form submissions.
+ */
+function workbench_access_assign_section_presave_action_submit($form, $form_state) {
+  return array('section' => $form_state['values']['section']);
+}
+
+/**
+ * Changes the moderation state for a given node.
+ */
+function workbench_access_assign_section_presave_action($node, $context) {
+  if (empty($context['section']) || !variable_get('workbench_access_node_type_' . $node->type, 1)){
+    return;
+  }
+
+  if (variable_get('workbench_access_allow_multiple', 0)){
+    if (empty($node->workbench_access_id) || !is_array($node->workbench_access_id)) {
+      $node->workbench_access_id = array();
+    }
+
+    if (!in_array($context['section'], $node->workbench_access_id)){
+      $node->workbench_access_id[] = $context['section'];
+    }
+  }
+  else {
+    $node->workbench_access_id = array($context['section']);
+  }
+}
+
+/**
+ * Form builder; Prepare a form for possible sections.
+ */
+function workbench_access_unassign_section_presave_action_form($context) {
+  $form = array();
+
+  $options = workbench_access_active_options();
+
+  // display an error if workbench access module has not been configured
+  if (empty($options) && !variable_get('workbench_access', FALSE)) {
+    $message = workbench_access_configuration_needed_message();
+    drupal_set_message($message, 'error', $repeat = FALSE);
+  }
+
+  $form['section'] = array(
+    '#type' => 'select',
+    '#options' => $options,
+    '#default_value' => isset($context['section']) ? $context['section'] : '',
+  );
+
+  return $form;
+}
+
+/**
+ * Process workbench_moderation_set_state_action_form form submissions.
+ */
+function workbench_access_unassign_section_presave_action_submit($form, $form_state) {
+  return array('section' => $form_state['values']['section']);
+}
+
+/**
+ * Changes the moderation state for a given node.
+ */
+function workbench_access_unassign_section_presave_action($node, $context) {
+  if (empty($context['section']) || !variable_get('workbench_access_node_type_' . $node->type, 1)){
+    return;
+  }
+
+  if (variable_get('workbench_access_allow_multiple', 0)){
+    if (empty($node->workbench_access_id) || !is_array($node->workbench_access_id)) {
+      return;
+    }
+
+    $key = array_search($context['section'], $node->workbench_access_id);
+
+    if ($key !== FALSE){
+      unset($node->workbench_access_id[$key]);
+    }
+  }
+  else {
+    if ($node->workbench_access_id == $context['section']){
+      $node->workbench_access_id = array();
+    }
+  }
+}
diff --git a/workbench_access.rules.inc b/workbench_access.rules.inc
new file mode 100644
index 0000000..65a385f
--- /dev/null
+++ b/workbench_access.rules.inc
@@ -0,0 +1,213 @@
+<?php
+
+/**
+ * Implements hook_rules_file_info().
+ */
+function workbench_access_rules_file_info() {
+  $items = array();
+  $items[] = 'workbench_access.rules';
+
+  return $items;
+}
+
+/**
+ * Implements hook_rules_condition_info().
+ */
+function workbench_access_rules_condition_info() {
+   $items = array();
+
+   $items['content_is_using_workbench_access'] = array(
+    'group' => t("Node"),
+    'label' => t("Content is using workbench access control"),
+    'base' => 'workbench_access_rules_condition_content_is_using_workbench_access',
+    'parameter' => array(
+      'node' => array('type' => 'node', 'label' => t("Content")),
+    ),
+    'access callback' => 'rules_node_integration_access',
+  );
+
+   $items['contents_current_access_state'] = array(
+     'group' => t("Node"),
+     'label' => t("Contents current access control state"),
+     'base' => 'workbench_access_rules_condition_contents_current_access_state',
+     'parameter' => array(
+       'node' => array('type' => 'node', 'label' => t("Content")),
+       'access_state' => array(
+         'type' => 'text',
+         'label' => t("Workbench access state"),
+         'options list' => 'workbench_access_active_options',
+         'restriction' => 'input',
+         'save' => TRUE,
+       ),
+     ),
+     'access callback' => 'rules_node_integration_access',
+   );
+
+  return $items;
+}
+
+/**
+ * Implements hook_rules_action_info() on behalf of the workbench_access module.
+ */
+function workbench_access_rules_action_info() {
+  $items = array();
+
+  $items['workbench_access_assign_access_state'] = array(
+    'label' => t("Assign access control state (presave)"),
+    'group' => t("Node"),
+    'base' => 'workbench_access_assign_access_state_presave_rules_action',
+
+    'parameter' => array(
+      'node' => array(
+        'type' => 'node',
+        'label' => t("Content"),
+      ),
+      'access_state' => array(
+        'type' => 'text',
+        'label' => t("Workbench access control state"),
+        'options list' => 'workbench_access_active_options',
+        'restriction' => 'input',
+      ),
+    ),
+  );
+
+  $items['workbench_access_unassign_access_state'] = array(
+    'label' => t("Unassign access control state (presave)"),
+    'group' => t("Node"),
+    'base' => 'workbench_access_unassign_access_state_presave_rules_action',
+
+    'parameter' => array(
+      'node' => array(
+        'type' => 'node',
+        'label' => t("Content"),
+      ),
+      'access_state' => array(
+        'type' => 'text',
+        'label' => t("Workbench access control state"),
+        'options list' => 'workbench_access_active_options',
+        'restriction' => 'input',
+      ),
+    ),
+  );
+
+  $items['workbench_access_load_access_states'] = array(
+    'label' => t("Load access control states"),
+    'group' => t("Node"),
+    'base' => 'workbench_access_load_access_states_rules_action',
+
+    'parameter' => array(
+      'node' => array(
+        'type' => 'node',
+        'label' => t("Content"),
+      ),
+    ),
+    'provides' => array(
+      'workbench_access_states' => array(
+        'type' => 'list<taxonomy_term>',
+        'label' => t("Workbench Access States"),
+      ),
+    ),
+  );
+
+  return $items;
+}
+
+/**
+ * Condition: Check if the content is using workbench access control.
+ *
+ * @param $node
+ *   A node object
+ *
+ * @return
+ *   TRUE/FALSE depending on if the content is using workbench access control.
+ */
+function workbench_access_rules_condition_content_is_using_workbench_access($node) {
+  if (!is_object($node)) {
+    return FALSE;
+  }
+
+  return variable_get('workbench_access_node_type_' . $node->type, 1) == 1;
+}
+
+/**
+ * Condition: Check if workbench moderation state matched selected state.
+ *
+ * @param $node
+ *   A node object
+ * @param $access_state
+ *   A node object
+ *
+ * @return
+ *  TRUE/FALSE depending on if the nodes current state matches selected state.
+ */
+function workbench_access_rules_condition_contents_current_access_state($node, $access_state) {
+  if (!is_object($node)) {
+    return FALSE;
+  }
+
+  if (is_array($node->workbench_access_id)){
+   return in_array($access_state, $node->workbench_access_id);
+  }
+
+  return $node->workbench_access_id == $access_state;
+}
+
+/**
+ * Action: Assign an access state to a given node.
+ *
+ * $param $node
+ *   A node object
+ *
+ * $param $access_state
+ *   The desired access state to assign.
+ *
+ * @return
+ *   An array containing the node object stored in the key called 'node'.
+ */
+function workbench_access_assign_access_state_presave_rules_action($node, $access_state) {
+  if (is_object($node) && !empty($access_state)){
+    actions_do('workbench_access_assign_section_presave_action', $node, array('section' => $access_state));
+  }
+
+  return array('node' => $node);
+}
+
+/**
+ * Action: Unassign an access state from a given node.
+ *
+ * $param $node
+ *   A node object
+ *
+ * $param $access_state
+ *   The desired access state to assign.
+ *
+ * @return
+ *   An array containing the node object stored in the key called 'node'.
+ */
+function workbench_access_unassign_access_state_presave_rules_action($node, $access_state) {
+  if (is_object($node) && !empty($access_state)){
+    actions_do('workbench_access_unassign_section_presave_action', $node, array('section' => $access_state));
+  }
+
+  return array('node' => $node);
+}
+
+/**
+ * Action: Loads the workbench access states into a variable.
+ *
+ * $param $node
+ *   A node object
+ *
+ * @return
+ *   An array containing the node object stored in the key called 'node' and an array containing the access control states for the given node.
+ */
+function workbench_access_load_access_states_rules_action($node) {
+  $states = array();
+
+  if (is_object($node) && property_exists($node, 'workbench_access_id')){
+    $states = $node->workbench_access_id;
+  }
+
+  return array('node' => $node, 'workbench_access_states' => $states);
+}
+
