diff --git a/views/views_bulk_operations.views.inc b/views/views_bulk_operations.views.inc
index 1c7078a..e6c685a 100644
--- a/views/views_bulk_operations.views.inc
+++ b/views/views_bulk_operations.views.inc
@@ -6,7 +6,8 @@
 function views_bulk_operations_views_data_alter(&$data) {
   foreach (entity_get_info() as $entity_type => $info) {
     if (isset($info['base table']) && isset($data[$info['base table']]['table'])) {
-      $data[$info['base table']]['views_bulk_operations'] = array(
+      $data[$info['base table']]['views_bulk_operations']['moved to'] = array('views_entity_' . $entity_type, 'views_bulk_operations');
+      $data['views_entity_' . $entity_type]['views_bulk_operations'] = array(
         'title' => $data[$info['base table']]['table']['group'],
         'group' => t('Bulk operations'),
         'help' => t('Provide a checkbox to select the row for bulk operations.'),
diff --git a/views/views_bulk_operations_handler_field_operations.inc b/views/views_bulk_operations_handler_field_operations.inc
index 61886d4..4e5e7f6 100644
--- a/views/views_bulk_operations_handler_field_operations.inc
+++ b/views/views_bulk_operations_handler_field_operations.inc
@@ -6,7 +6,7 @@
 * Implements the Views Form API.
 */
 
-class views_bulk_operations_handler_field_operations extends views_handler_field {
+class views_bulk_operations_handler_field_operations extends views_handler_field_entity {
   var $revision = FALSE;
 
   function init(&$view, &$options) {
@@ -46,6 +46,12 @@ class views_bulk_operations_handler_field_operations extends views_handler_field
         unset($operation_options['use_queue']);
       }
     }
+
+    // Check whether this is a revision.
+    $table_data = views_fetch_data($this->table);
+    if (!empty($table_data['table']['revision'])) {
+      $this->revision = TRUE;
+    }
   }
 
   function option_definition() {
@@ -263,19 +269,20 @@ class views_bulk_operations_handler_field_operations extends views_handler_field
     // At this point, the query has already been run, so we can access the results
     // in order to get the base key value (for example, nid for nodes).
     foreach ($this->view->result as $row_index => $row) {
-      $entity_id = $this->get_value($row);
+      $this->view->row_index = $row_index;
+      $id = $this->get_value($row, $this->real_field);
 
       if ($this->options['vbo_settings']['force_single']) {
         $form[$this->options['id']][$row_index] = array(
           '#type' => 'radio',
           '#parents' => array($this->options['id']),
-          '#return_value' => $entity_id,
+          '#return_value' => $id,
         );
       }
       else {
         $form[$this->options['id']][$row_index] = array(
           '#type' => 'checkbox',
-          '#return_value' => $entity_id,
+          '#return_value' => $id,
           '#default_value' => FALSE,
           '#attributes' => array('class' => array('vbo-select')),
         );
@@ -318,29 +325,7 @@ class views_bulk_operations_handler_field_operations extends views_handler_field
    * the entity type that VBO is operating on.
    */
   public function get_entity_type() {
-    $base_table = $this->view->base_table;
-
-    // If the current field is under a relationship you can't be sure that the
-    // base table of the view is the base table of the current field.
-    // For example a field from a node author on a node view does have users as base table.
-    if (!empty($this->options['relationship']) && $this->options['relationship'] != 'none') {
-      $relationships = $this->view->display_handler->get_option('relationships');
-      $options = $relationships[$this->options['relationship']];
-      $data = views_fetch_data($options['table']);
-      $base_table = $data[$options['field']]['relationship']['base'];
-    }
-    // The base table is now known, use it to determine the entity type.
-    foreach (entity_get_info() as $entity_type => $info) {
-      if (isset($info['base table']) && $info['base table'] == $base_table) {
-        return $entity_type;
-      }
-      elseif (isset($info['revision table']) && $info['revision table'] == $base_table) {
-        $this->revision = TRUE;
-        return $entity_type;
-      }
-    }
-    // This should never happen.
-    _views_bulk_operations_report_error("Could not determine the entity type for VBO field on views base table %table", array('%table' => $base_table));
-    return FALSE;
+    return $this->entity_type;
   }
+
 }
diff --git a/views_bulk_operations.info b/views_bulk_operations.info
index 957ca64..040366e 100644
--- a/views_bulk_operations.info
+++ b/views_bulk_operations.info
@@ -1,7 +1,7 @@
 name = Views Bulk Operations
 description = Provides a way of selecting multiple rows and applying operations to them.
 dependencies[] = entity
-dependencies[] = views
+dependencies[] = views (>=3.12)
 package = Views
 core = 7.x
 php = 5.2.9
diff --git a/views_bulk_operations.module b/views_bulk_operations.module
index 49ccf55..f425ef5 100644
--- a/views_bulk_operations.module
+++ b/views_bulk_operations.module
@@ -902,10 +902,16 @@ function views_bulk_operations_adjust_selection($queue_name, $operation, $option
   }
 
   $vbo = _views_bulk_operations_get_field($view);
+
+  // Call views_handler_field_entity::pre_render() to get the entities.
+  $vbo->pre_render($view->result);
+
   $rows = array();
   foreach ($view->result as $row_index => $result) {
+    // Set the row index.
+    $view->row_index = $row_index;
     $rows[$row_index] = array(
-      'entity_id' => $vbo->get_value($result),
+      'entity_id' => $vbo->get_value($result, $vbo->real_field),
       'views_row' => array(),
       'position' => array(
         'current' => ++$context['sandbox']['progress'],
@@ -1127,12 +1133,22 @@ function views_bulk_operations_direct_adjust(&$selection, $vbo) {
     if ($field_name != $vbo->options['id']) {
       unset($view->field[$field_name]);
     }
+    else {
+      // Get hold of the new VBO field.
+      $new_vbo = $view->field[$field_name];
+    }
   }
 
   $view->execute($vbo->view->current_display);
+
+  // Call views_handler_field_entity::pre_render() to get the entities.
+  $new_vbo->pre_render($view->result);
+
   $results = array();
   foreach ($view->result as $row_index => $result) {
-    $results[$row_index] = $vbo->get_value($result);
+    // Set the row index.
+    $view->row_index = $row_index;
+    $results[$row_index] = $new_vbo->get_value($result, $new_vbo->real_field);
   }
   $selection = $results;
 }
