diff --git a/search_api.module b/search_api.module
index 1014ff4..d1db89d 100644
--- a/search_api.module
+++ b/search_api.module
@@ -2085,6 +2085,23 @@ function search_api_index_delete($id) {
 }
 
 /**
+ * Options list callback for search indexes.
+ *
+ * @return array
+ *   An array of search index machine names mapped to their human-readable
+ *   names.
+ */
+function search_api_index_options_list() {
+  $ret = array(
+    NULL => '- ' . t('All') . ' -',
+  );
+  foreach (search_api_index_load_multiple(FALSE) as $id => $index) {
+    $ret[$id] = $index->name;
+  }
+  return $ret;
+}
+
+/**
  * Cron queue worker callback for indexing some items.
  *
  * @param array $task
diff --git a/search_api.rules.inc b/search_api.rules.inc
new file mode 100644
index 0000000..575d28c
--- /dev/null
+++ b/search_api.rules.inc
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ * Search API Rules integration.
+ */
+
+
+/**
+ * Implements hook_rules_action_info().
+ */
+function search_api_rules_action_info() {
+  $items['search_api_index'] = array (
+   'parameter' => array(
+      'entity' => array(
+        'type' => 'entity',
+        'label' => t('Entity'),
+        'description' => t('The item to index.'),
+      ),
+      'index' => array(
+        'type' => 'search_api_index',
+        'label' => t('Index'),
+        'description' => t('The index on which the item should be indexed. Leave blank to index on all indexes for this item type.'),
+        'optional' => TRUE,
+        'options list' => 'search_api_index_options_list',
+      ),
+      'index_immediately' => array(
+        'type' => 'boolean',
+        'label' => t('Index immediately'),
+        'description' => t('Activate for indexing the item right away, otherwise it will only be marked as dirty and indexed during the next cron run.'),
+        'optional' => TRUE,
+        'default value' => TRUE,
+        'restriction' => 'input',
+      ),
+    ),
+    'group' => t('Search API'),
+    'access callback' => '_search_api_rules_access',
+    'label' => t('Index an entity'),
+    'base' => '_search_api_rules_action_index',
+  );
+  return $items;
+}
+
+/**
+ * Rules access callback for search api actions.
+ */
+function _search_api_rules_access() {
+  return user_access('administer search_api');
+}
+
+/**
+ * Rules action for indexing an item.
+ */
+function _search_api_rules_action_index(EntityDrupalWrapper $wrapper, SearchApiIndex $index = NULL, $index_immediately = TRUE) {
+  $type = $wrapper->type();
+  $item_ids = array($wrapper->getIdentifier());
+
+  if (empty($index) && !$index_immediately) {
+    search_api_track_item_change($type, $item_ids);
+    return;
+  }
+
+
+  if ($index) {
+    $indexes = array($index);
+  }
+  else {
+    $conditions = array(
+      'enabled' => 1,
+      'item_type' => $type,
+      'read_only' => 0,
+    );
+    $indexes = search_api_index_load_multiple(FALSE, $conditions);
+    if (!$indexes) {
+      return;
+    }
+  }
+  if ($index_immediately) {
+    foreach ($indexes as $index) {
+      $indexed = search_api_index_specific_items_delayed($index, $item_ids);
+    }
+  }
+  else {
+    search_api_get_datasource_controller($type)->trackItemChange($item_ids, $indexes);
+  }
+}
+
+function _search_api_rules_action_index_help() {
+  return t('Queues an item for reindexing. If "index immediately" is disabled then the item will be indexed during the next cron run.');
+}
