diff --git a/rb_batch/rb_batch.batch.inc b/rb_batch/rb_batch.batch.inc
new file mode 100644
index 0000000..32c672b
--- /dev/null
+++ b/rb_batch/rb_batch.batch.inc
@@ -0,0 +1,42 @@
+<?php
+
+
+/**
+ * @file
+ *  batch callbacls for rb_batch.
+ */
+
+
+/**
+ * Batch operation for calling a rule.
+ *
+ * @param RulesBatchLoop $plugin
+ * @param RulesState $state
+ * @param $context
+ *   array of batch context
+ */
+function rb_batch_loop_op($plugin, $state, &$context) {
+
+  $plugin->evaluate_single($state);
+
+  // @TODO: get a message text via action:
+  // $context['message'] = check_plain($title);
+  // @TODO: get result text via action:
+  // $context['results'][] = t('Updated contentqueue cache for component @title (nid:@nid)', array('@nid' => $nid, '@title' => $title));
+}
+
+
+/**
+ * Finish callback.
+ */
+function rb_batch_loop_finished($success, $results, $operations) {
+  if ($success) {
+    $_SESSION['rb_batch'] = array();
+    foreach ($results as $result) {
+       $_SESSION['rb_batch'][] = $result;
+    }
+  }
+  else {
+    $_SESSION['rb_batch'][] = t('There was an error.');
+  }
+}
\ No newline at end of file
diff --git a/rb_batch/rb_batch.inc b/rb_batch/rb_batch.inc
new file mode 100644
index 0000000..70227f3
--- /dev/null
+++ b/rb_batch/rb_batch.inc
@@ -0,0 +1,209 @@
+<?php
+
+/**
+ * @file
+ *   The class definition for the the Batch Loop component.
+ */
+
+/**
+ * A loop element.
+ */
+class RulesBatchLoop extends RulesLoop {
+
+  protected $itemName = 'batch_loop';
+  protected $listItemInfo;
+  //
+  //public function __construct($settings = array(), $variables = NULL) {
+  //  $this->setUp();
+  //  $this->settings = (array) $settings + array(
+  //    'item:var' => 'list_item',
+  //    'item:label' => t('Current list item'),
+  //  );
+  //  if (!empty($variables)) {
+  //    $this->info['variables'] = $variables;
+  //  }
+  //}
+  //
+  //public function pluginParameterInfo() {
+  //  $info['list'] = array(
+  //    'type' => 'list',
+  //    'restriction' => 'selector',
+  //    'label' => t('List'),
+  //    'description' => t('The list to loop over. The loop will step through each item in the list, allowing further actions on them. See <a href="@url"> the online handbook</a> for more information on how to use loops.',
+  //      array('@url' => rules_external_help('loops'))),
+  //  );
+  //  return $info;
+  //}
+  //
+  //public function integrityCheck() {
+  //  parent::integrityCheck();
+  //  $this->checkVarName($this->settings['item:var']);
+  //}
+  //
+  //public function listItemInfo() {
+  //  if (!isset($this->listItemInfo)) {
+  //    if ($info = $this->getArgumentInfo('list')) {
+  //      // Pass through the variable info keys like property info.
+  //      $this->listItemInfo = array_intersect_key($info, array_flip(array('type', 'property info', 'bundle')));
+  //      $this->listItemInfo['type'] = isset($info['type']) ? entity_property_list_extract_type($info['type']) : 'unknown';
+  //    }
+  //    else {
+  //      $this->listItemInfo = array('type' => 'unknown');
+  //    }
+  //    $this->listItemInfo['label'] = $this->settings['item:label'];
+  //  }
+  //  return $this->listItemInfo;
+  //}
+
+  public function evaluate(RulesState $state) {
+    try {
+      $param_info = $this->pluginParameterInfo();
+      $list = $this->getArgument('list', $param_info['list'], $state);
+      $item_var_info = $this->listItemInfo();
+      $item_var_name = $this->settings['item:var'];
+
+      if (isset($this->settings['list:select'])) {
+        rules_log('Looping over the list items of %selector', array('%selector' => $this->settings['list:select']), RulesLog::INFO, $this);
+      }
+
+      $batch = array(
+        'operations' => array(),
+        'finished' => 'rb_batch_loop_finished',
+        'file' => drupal_get_path('module', 'rb_batch') . '/rb_batch.batch.inc',
+      );
+
+      // Loop over the list and evaluate the children for each list item.
+      foreach ($list as $key => $item) {
+        // Use a separate state so variables are available in the loop only.
+        $state2 = clone $state;
+        $state2->addVariable($item_var_name, $list[$key], $item_var_info);
+        //parent::evaluate($state2);
+
+        $batch['operations'][] = array(
+          'rb_batch_loop_op',
+          array($this, $state2),
+        );
+
+        //// Update variables from parent scope.
+        //foreach ($state->variables as $var_key => &$var_value) {
+        //  if (array_key_exists($var_key, $state2->variables)) {
+        //    $var_value = $state2->variables[$var_key];
+        //  }
+        //}
+      }
+      batch_set($batch);
+    }
+    catch (RulesEvaluationException $e) {
+      rules_log($e->msg, $e->args, $e->severity);
+      rules_log('Unable to evaluate %name.', array('%name' => $this->getPluginName()), RulesLog::WARN, $this);
+    }
+  }
+
+  /**
+   * Evaluate a single batch item.
+   *
+   * @param RulesState
+   *   the state populated with the list item from the batch loop.
+   */
+  public function evaluate_single(RulesState $state) {
+    foreach ($this->children as $action) {
+      $action->evaluate($state);
+    }
+  }
+
+  //protected function stateVariables($element = NULL) {
+  //  return array($this->settings['item:var'] => $this->listItemInfo()) + parent::stateVariables($element);
+  //}
+  //
+  public function label() {
+    return !empty($this->label) ? $this->label : t('Batch Loop');
+  }
+  //
+  //protected function exportChildren($key = 'DO') {
+  //  return parent::exportChildren($key);
+  //}
+  //
+  //protected function importChildren($export, $key = 'DO') {
+  //  parent::importChildren($export, $key);
+  //}
+  //
+  //protected function exportSettings() {
+  //  $export = parent::exportSettings();
+  //  $export['ITEM'][$this->settings['item:var']] = $this->settings['item:label'];
+  //  return $export;
+  //}
+  //
+  //protected function importSettings($export) {
+  //  parent::importSettings($export);
+  //  if (isset($export['ITEM'])) {
+  //    $this->settings['item:var'] = rules_array_key($export['ITEM']);
+  //    $this->settings['item:label'] = reset($export['ITEM']);
+  //  }
+  //}
+}
+
+
+/**
+ * UI for Rules loops.
+ */
+class RulesBatchLoopUI extends RulesLoopUI {
+
+  //public function form(&$form, &$form_state, $options = array()) {
+  //  parent::form($form, $form_state, $options);
+  //  $settings = $this->element->settings;
+  //
+  //  $form['item'] = array(
+  //    '#type' => 'fieldset',
+  //    '#title' => t('Current list item'),
+  //    '#description' => t('The variable used for holding each list item in the loop. This variable will be available inside the loop only.'),
+  //    '#tree' => TRUE,
+  //  );
+  //  $form['item']['label'] = array(
+  //    '#type' => 'textfield',
+  //    '#title' => t('Variable label'),
+  //    '#default_value' => $settings['item:label'],
+  //    '#required' => TRUE,
+  //  );
+  //  $form['item']['var'] = array(
+  //    '#type' => 'textfield',
+  //    '#title' => t('Variable name'),
+  //    '#default_value' => $settings['item:var'],
+  //    '#description' => t('The variable name must contain only lowercase letters, numbers, and underscores and must be unique in the current scope.'),
+  //    '#element_validate' => array('rules_ui_element_machine_name_validate'),
+  //    '#required' => TRUE,
+  //  );
+  //}
+  //
+  //function form_extract_values($form, &$form_state) {
+  //  parent::form_extract_values($form, $form_state);
+  //  $form_values = RulesPluginUI::getFormStateValues($form, $form_state);
+  //
+  //  $this->element->settings['item:var'] = $form_values['item']['var'];
+  //  $this->element->settings['item:label'] = $form_values['item']['label'];
+  //}
+  //
+  //public function form_validate($form, &$form_state) {
+  //  parent::form_validate($form, $form_state);
+  //
+  //  $vars = $this->element->availableVariables();
+  //  $name = $this->element->settings['item:var'];
+  //  if (isset($vars[$name])) {
+  //    form_error($form['item']['var'], t('The variable name %name is already taken.', array('%name' => $name)));
+  //  }
+  //}
+  //
+  //public function buildContent() {
+  //  $content = parent::buildContent();
+  //
+  //  $content['description']['item'] = array(
+  //    '#caption' => t('List item'),
+  //    '#theme' => 'rules_content_group',
+  //  );
+  //  $content['description']['item']['var'] = array(
+  //    '#theme' => 'rules_variable_view',
+  //    '#info' => $this->element->listItemInfo(),
+  //    '#name' => $this->element->settings['item:var'],
+  //  );
+  //  return $content;
+  //}
+}
\ No newline at end of file
diff --git a/rb_batch/rb_batch.info b/rb_batch/rb_batch.info
new file mode 100644
index 0000000..3c07390
--- /dev/null
+++ b/rb_batch/rb_batch.info
@@ -0,0 +1,6 @@
+name = Rules Bonus: BatchLoop
+description = "Provides some batch integration"
+package = Rules
+core = 7.x
+dependencies[] = rules
+files[] = rb_batch.inc
\ No newline at end of file
diff --git a/rb_batch/rb_batch.module b/rb_batch/rb_batch.module
new file mode 100644
index 0000000..e4feff5
--- /dev/null
+++ b/rb_batch/rb_batch.module
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Implements hook_rules_plugin_info().
+ */
+function rb_batch_rules_plugin_info() {
+  $info = array(
+    'batch_loop' => array(
+      'class' => 'RulesBatchLoop',
+      'embeddable' => 'RulesActionContainer',
+      'extenders' => array(
+        'RulesPluginUIInterface' => array(
+          'class' => 'RulesLoopUI',
+        ),
+      ),
+    ),
+  );
+  return $info;
+}
\ No newline at end of file
