diff --git a/rb_batch/README.txt b/rb_batch/README.txt
index 5babd11..8f3713e 100644
--- a/rb_batch/README.txt
+++ b/rb_batch/README.txt
@@ -6,6 +6,16 @@ Provides a batched rule set component to rules. Using a batched rule set you
 can execute very performance heavy rule sets without fearing of running out
 of execution time.
 
+Rules Batch Loop
+
+Provides a loop element so each item of the list will not be processed directly,
+but executed through in batch process. So you can apply actions on a large list
+of elements (like nodes), without running out of memory or execution time.
+
+As the batch loop will be initiated by form submissions only (right now), the
+executing rule must be called within a form submission context, e.g. node is
+saved.
+
 -- ATTENTION --
 
 DO NOT USE THIS MODULE IF YOU ARE USING RULES > 7.x-beta3
@@ -15,6 +25,8 @@ site. If you're site is already broken because you didn't read this (who would)
 you have to delete the batched rulesets you have created manually.
 To do so remove all batched rulesets in the rules_config table in your database.
 
+The Batch Loop plugin should work anyway.
+
 -- REQUIREMENTS --
 
 Rules (http://drupal.org/project/rules)
diff --git a/rb_batch/rb_batch.rules.inc b/rb_batch/rb_batch.rules.inc
index 4099e2a..e8c5a78 100644
--- a/rb_batch/rb_batch.rules.inc
+++ b/rb_batch/rb_batch.rules.inc
@@ -27,6 +27,15 @@ function rb_batch_rules_plugin_info() {
         ),
       ),
     ),
+    'batch_loop' => array(
+      'class' => 'RulesBatchLoop',
+      'embeddable' => 'RulesActionContainer',
+      'extenders' => array(
+        'RulesPluginUIInterface' => array(
+          'class' => 'RulesLoopUI',
+        ),
+      ),
+    ),
   );
 }
 
@@ -104,3 +113,91 @@ function rb_batch_action_batch_context($message, $finished) {
    * @see rb_batch.module
    */
 }
+
+
+/**
+ * A batched loop element.
+ */
+class RulesBatchLoop extends RulesLoop {
+
+  protected $itemName = 'batch_loop';
+  protected $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.inc',
+      );
+
+      // Loop over the list and set a batch operation 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);
+
+        $batch['operations'][] = array(
+          'rb_batch_loop_op',
+          array($this, $state2),
+        );
+      }
+      batch_set($batch);
+      // @TODO: optionally call batch_process() on non-form-submissions.
+    }
+    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);
+    }
+  }
+
+  public function label() {
+    return !empty($this->label) ? $this->label : t('Batch Loop');
+  }
+}
+
+/**
+ * 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) {
+}
