diff --git a/plugins/operation_types/action.class.php b/plugins/operation_types/action.class.php
index d6eb9f7..2a7adf6 100644
--- a/plugins/operation_types/action.class.php
+++ b/plugins/operation_types/action.class.php
@@ -15,6 +15,13 @@ class ViewsBulkOperationsAction extends ViewsBulkOperationsBaseOperation {
   public $formOptions = array();
 
   /**
+   * Contains the raw views rows that were selected.
+   *
+   * @var array
+   */
+  public $rows = array();
+
+  /**
    * Returns the access bitmask for the operation, used for entity access checks.
    */
   public function getAccessMask() {
@@ -124,13 +131,15 @@ class ViewsBulkOperationsAction extends ViewsBulkOperationsBaseOperation {
    *
    * @param $entity
    *   The selected entity, or an array of entities, if aggregation is used.
-   * @param $context
-   *   An array of related data provided by the caller.
    */
-  public function execute($entity, array $context) {
-    $context['entity_type'] = $this->entityType;
+  public function execute($entity) {
+    $context = array('entity_type' => $this->entityType);
     $context += $this->formOptions;
     $context += $this->operationInfo['parameters'];
+    // Some operations require full selected rows.
+    if ($this->needsRows()) {
+      $context['rows'] = $this->rows;
+    }
 
     actions_do($this->operationInfo['callback'], $entity, $context);
     // Actions that specify 'changes_property' need to be explicitly saved.
diff --git a/plugins/operation_types/base.class.php b/plugins/operation_types/base.class.php
index 374ac9d..5ffb08f 100644
--- a/plugins/operation_types/base.class.php
+++ b/plugins/operation_types/base.class.php
@@ -152,8 +152,6 @@ abstract class ViewsBulkOperationsBaseOperation {
    *
    * @param $entity
    *   The selected entity, or an array of entities, if aggregation is used.
-   * @param $context
-   *   An array of related data provided by the caller.
    */
-  abstract function execute($entity, array $context);
+  abstract function execute($entity);
 }
diff --git a/plugins/operation_types/rules_component.class.php b/plugins/operation_types/rules_component.class.php
index bc446b2..d7d2783 100644
--- a/plugins/operation_types/rules_component.class.php
+++ b/plugins/operation_types/rules_component.class.php
@@ -81,10 +81,8 @@ class ViewsBulkOperationsRulesComponent extends ViewsBulkOperationsBaseOperation
    *
    * @param $entity
    *   The selected entity.
-   * @param $context
-   *   An array of related data provided by the caller.
    */
-  public function execute($entity, array $context) {
+  public function execute($entity) {
     // If there was a config form, there's a rules_element.
     // If not, fallback to the component key.
     if ($this->configurable()) {
diff --git a/views_bulk_operations.module b/views_bulk_operations.module
index f5f0192..9abb689 100644
--- a/views_bulk_operations.module
+++ b/views_bulk_operations.module
@@ -347,7 +347,7 @@ function views_bulk_operations_form($form, &$form_state, $vbo) {
     if ($operation->configurable()) {
       $dummy_selection = array();
       foreach ($vbo->view->result as $row_index => $result) {
-        $dummy_selection[$result->{$vbo->field_alias}] = $row_index;
+        $dummy_selection[$row_index] = $result->{$vbo->field_alias};
       }
       $context = array('selection' => $dummy_selection);
       $form += $operation->form($form, $form_state, $context);
@@ -489,7 +489,7 @@ function theme_views_bulk_operations_confirmation($variables) {
 /**
  * Goes through the submitted values, and returns
  * an array of selected rows, in the form of
- * $entity_id => $row_index.
+ * $row_index => $entity_id.
  */
 function _views_bulk_operations_get_selection($vbo, $form_state) {
   $selection = array();
@@ -503,9 +503,6 @@ function _views_bulk_operations_get_selection($vbo, $form_state) {
     else {
       $selected_rows = array($form_state['values'][$field_name]);
     }
-    // At this point, $selected_rows is an array of $row_number => $entity_id.
-    // We need the $entity_id to be the key, so the array gets flipped.
-    $selection = array_flip($selected_rows);
   }
 
   return $selection;
@@ -535,7 +532,7 @@ function _views_bulk_operations_adjust_selection(&$selection, $select_all, $vbo)
     $view->execute($vbo->view->current_display);
     $results = array();
     foreach ($view->result as $row_index => $result) {
-      $results[$result->{$vbo->field_alias}] = $row_index;
+      $results[$row_index] = $result->{$vbo->field_alias};
     }
     $selection = $results;
   }
@@ -702,9 +699,11 @@ function _views_bulk_operations_execute($vbo, $rows, $operation, $force_direct =
   );
   // Some operations require full selected rows.
   if ($operation->needsRows()) {
-    foreach ($rows as $entity_id => $row_index) {
-      $rows[$entity_id] = $vbo->view->result[$row_index];
+    $selected_rows = array();
+    foreach ($rows as $row_index => $entity_id) {
+      $selected_rows[$row_index] = $vbo->view->result[$row_index];
     }
+    $operation->rows = $selected_rows;
   }
   // An operation that needs aggregated results can only be executed directly.
   if ($operation->aggregate()) {
@@ -777,12 +776,7 @@ function _views_bulk_operations_queue_process($data) {
     return;
   }
 
-  // Pass the selected row to the operation if needed.
-  $operation_context = array();
-  if ($operation->needsRows()) {
-    $operation_context['rows'] = array($entity_id => $row);
-  }
-  _views_bulk_operations_operation_do($operation, $entity, $operation_context, $account);
+  _views_bulk_operations_operation_do($operation, $entity, $account);
 
   // @todo Provide a way to spam less here.
   if ($options['display_result']) {
@@ -822,12 +816,7 @@ function _views_bulk_operations_batch_process($rows, $operation, $options, &$con
       continue;
     }
 
-    // Pass the selected row to the operation if needed.
-    $operation_context = array();
-    if ($operation->needsRows()) {
-      $operation_context['rows'] = array($entity_id => $rows[$entity_id]);
-    }
-    _views_bulk_operations_operation_do($operation, $entity, $operation_context);
+    _views_bulk_operations_operation_do($operation, $entity);
 
     $context['sandbox']['progress']++;
     unset($row_group[$entity_id]);
@@ -878,12 +867,7 @@ function _views_bulk_operations_direct_process($operation, $rows, $options, &$co
   }
 
   if ($operation->aggregate()) {
-    // Pass the selected rows to the operation if needed.
-    $operation_context = array();
-    if ($operation->needsRows()) {
-      $operation_context['rows'] = $rows;
-    }
-    _views_bulk_operations_operation_do($operation, $entities, $operation_context);
+    _views_bulk_operations_operation_do($operation, $entities);
 
     $context['results']['log'][] = t('Performed aggregate %operation on @items.', array(
       '%operation' => $operation->label(),
@@ -893,12 +877,7 @@ function _views_bulk_operations_direct_process($operation, $rows, $options, &$co
   }
   else {
     foreach ($entities as $entity_id => $entity) {
-      // Pass the selected row to the operation if needed.
-      $operation_context = array();
-      if ($operation->needsRows()) {
-        $operation_context['rows'] = array($entity_id => $rows[$entity_id]);
-      }
-      _views_bulk_operations_operation_do($operation, $entity, $operation_context);
+      _views_bulk_operations_operation_do($operation, $entity);
 
       $context['results']['rows'] += 1;
     }
@@ -913,7 +892,7 @@ function _views_bulk_operations_direct_process($operation, $rows, $options, &$co
 /**
  * Executes the operation. Called from the process functions.
  */
-function _views_bulk_operations_operation_do($operation, $entity, $context, $account = NULL) {
+function _views_bulk_operations_operation_do($operation, $entity, $account = NULL) {
   global $user;
 
   // If no account was provided, fallback to the current user.
@@ -928,7 +907,7 @@ function _views_bulk_operations_operation_do($operation, $entity, $context, $acc
     drupal_exit();
   }
 
-  $operation->execute($entity, $context);
+  $operation->execute($entity);
 }
 
 /**
