diff --git a/views/handler_argument_fulltext.inc b/views/handler_argument_fulltext.inc
index db106a1..57fa9c6 100644
--- a/views/handler_argument_fulltext.inc
+++ b/views/handler_argument_fulltext.inc
@@ -15,10 +15,10 @@ class SearchApiMultiHandlerArgumentFulltext extends SearchApiViewsHandlerArgumen
     $server_id = substr($this->table, 18);
     $indexes = search_api_index_load_multiple(FALSE, array('enabled' => TRUE, 'server' => $server_id));
     foreach ($indexes as $index) {
-      if (!empty($index->options['fields'])) {
+      if (!empty($index->getFields())) {
         $prefix = $index->machine_name . ':';
         $prefix_name = $index->name . ' » ';
-        $f = $index->options['fields'];
+        $f = $index->getFields();
         foreach ($index->getFulltextFields() as $name) {
           $fields[$prefix . $name] = $prefix_name . $f[$name]['name'];
         }
diff --git a/views/handler_filter_fulltext.inc b/views/handler_filter_fulltext.inc
index 2dd1fe6..ca99287 100644
--- a/views/handler_filter_fulltext.inc
+++ b/views/handler_filter_fulltext.inc
@@ -13,10 +13,10 @@ class SearchApiMultiHandlerFilterFulltext extends SearchApiViewsHandlerFilterFul
     $server_id = substr($this->table, 18);
     $indexes = search_api_index_load_multiple(FALSE, array('enabled' => TRUE, 'server' => $server_id));
     foreach ($indexes as $index) {
-      if (!empty($index->options['fields'])) {
+      if ($index->getFields()) {
         $prefix = $index->machine_name . ':';
         $prefix_name = $index->name . ' » ';
-        $f = $index->options['fields'];
+        $f = $index->getFields();
         foreach ($index->getFulltextFields() as $name) {
           $fields[$prefix . $name] = $prefix_name . $f[$name]['name'];
         }
diff --git a/views/query.inc b/views/query.inc
index 9fe9a68..bc168e4 100644
--- a/views/query.inc
+++ b/views/query.inc
@@ -13,6 +13,13 @@ class SearchApiMultiViewsQuery extends SearchApiViewsQuery {
   protected $server;
 
   /**
+   * The indexes used by this view.
+   *
+   * @var array
+   */
+  protected $indexes;
+
+  /**
    * Create the basic query object and fill with default values.
    */
   public function init($base_table, $base_field, $options) {
@@ -45,7 +52,8 @@ class SearchApiMultiViewsQuery extends SearchApiViewsQuery {
       $id = $result['id'];
       $index_id = $result['index_id'];
       if (!isset($index_types[$index_id])) {
-        $index_types[$index_id] = search_api_index_load($index_id)->item_type;
+        $this->indexes[$index_id] = search_api_index_load($index_id);
+        $index_types[$index_id] = $this->indexes[$index_id]->item_type;
       }
       // Maybe the service class or a postprocessor already set the entities.
       if (!empty($result['entity'])) {
@@ -101,7 +109,9 @@ class SearchApiMultiViewsQuery extends SearchApiViewsQuery {
           $wrapper = $datasource->getMetadataWrapper($item);
           $view_result[$key] = (object) $this->extractFields($wrapper, $type_fields[$type]);
           $view_result[$key]->entity = $item;
-                  }
+          if (!isset($view_result[$key]->entity->type))
+          $view_result[$key]->entity->type = $type;
+        }
         catch (Exception $e) {
           continue;
         }
@@ -122,7 +132,7 @@ class SearchApiMultiViewsQuery extends SearchApiViewsQuery {
         }
         $view->result[$key]->search_api_relevance = $result['score'];
         $view->result[$key]->search_api_multi_index = $result['index_id'];
-        foreach ($this->fields as $field => $true) {
+        foreach ($this->query->getFields() as $field => $true) {
           if (!isset($view->result[$key]->$field)) {
             $view->result[$key]->$field = '';
           }
@@ -131,6 +141,67 @@ class SearchApiMultiViewsQuery extends SearchApiViewsQuery {
     }
   }
 
+  /**
+   * Returns the according metadata wrappers for the given query results.
+   *
+   * This is necessary to support generic entity handlers and plugins with this
+   * query backend.
+   */
+  public function get_result_wrappers($results, $relationship = NULL, $field = NULL) {
+    $wrappers = array();
+    $load_entities_index = array();
+    $load_entities_types = array();
+    $fields = array();
+    foreach ($results as $row_index => $row) {
+      $fields = $this->indexes[$row->search_api_multi_index]->getFields();
+      if(in_array($field, array_keys($fields))){
+        $currrent_field_index = $this->indexes[$row->search_api_multi_index]->item_type;
+      }
+      $is_entity = (boolean) entity_get_info($this->indexes[$row->search_api_multi_index]->item_type);
+      if ($is_entity && isset($row->entity)) {
+        // If this entity isn't load, register it for pre-loading.
+        if (!is_object($row->entity)) {
+          $load_entities_index[$row->entity] = $row_index;
+          $load_entities_types[$row->entity] = $this->indexes[$row->search_api_multi_index]->item_type;
+        }
+
+        $wrappers[$row_index] = $this->indexes[$row->search_api_multi_index]->entityWrapper($row->entity);
+      }
+    }
+
+    // If the results are entities, we pre-load them to make use of a multiple
+    // load. (Otherwise, each result would be loaded individually.)
+    if (!empty($load_entities_index)) {
+      foreach ($load_entities_types as $type) {
+        $entities = entity_load($type, array_keys($load_entities_index));
+        foreach ($entities as $entity_id => $entity) {
+          $wrappers[$load_entities_index[$entity_id]] = $this->indexes[$row->search_api_multi_index]->entityWrapper($entity);
+        }
+      }
+    }
+
+    // Apply the relationship, if necessary.
+    $type = isset($currrent_field_index) ? $currrent_field_index : $this->indexes[$row->search_api_multi_index]->item_type;
+    $selector_suffix = '';
+    if ($field && ($pos = strrpos($field, ':'))) {
+      $selector_suffix = substr($field, 0, $pos);
+    }
+    if ($selector_suffix || ($relationship && !empty($this->view->relationship[$relationship]))) {
+      // Use EntityFieldHandlerHelper to compute the correct data selector for
+      // the relationship.
+      $handler = (object) array(
+        'view' => $this->view,
+        'relationship' => $relationship,
+        'real_field' => '',
+      );
+      $selector = EntityFieldHandlerHelper::construct_property_selector($handler);
+      $selector .= ($selector ? ':' : '') . $selector_suffix;
+      list($type, $wrappers) = EntityFieldHandlerHelper::extract_property_multiple($wrappers, $selector);
+    }
+
+    return array($type, $wrappers);
+  }
+
   //
   // Query interface methods (proxy to $this->query)
   //
diff --git a/views/search_api_multi.views.inc b/views/search_api_multi.views.inc
index 6a370bf..7e0b381 100644
--- a/views/search_api_multi.views.inc
+++ b/views/search_api_multi.views.inc
@@ -8,6 +8,7 @@
 function search_api_multi_views_data() {
   $data = array();
   $servers = array();
+  $field_handlers = entity_views_get_field_handlers();
   foreach (search_api_index_load_multiple(FALSE) as $index) {
     if (!($server = $index->server()) || !$server->supportsFeature('search_api_multi')) {
       continue;
@@ -79,7 +80,7 @@ function search_api_multi_views_data() {
             $table[$key]['title'] = $info['label'];
             $table[$key]['help'] = empty($info['description']) ? t('(No information available)') : $info['description'];
             $table[$key]['type'] = $type;
-            $table[$key]['field']['handler'] = _search_api_views_field_handler($type, $inner_type);
+            entity_views_field_definition($key, $info, $table);
             if ($inner_type == 'options') {
               $table[$key]['field']['options'] = $value->optionsList();
             }
@@ -89,7 +90,7 @@ function search_api_multi_views_data() {
               // Discern between original and indexed type
               $table[$key]['field']['type'] = $table[$key]['type'];
               $table[$key]['type'] = $fields[$prefix . $property]['type'];
-              $table[$key] += _search_api_views_add_handlers($fields[$prefix . $property], $value);
+              _search_api_views_add_handlers($key, $fields[$prefix . $property], $value, $table);
               if (!empty($table[$key]['sort'])) {
                 $table[$key]['field']['click sortable'] = TRUE;
               }
@@ -137,7 +138,7 @@ function search_api_multi_views_data() {
       $table[$key]['title'] = $name;
       $table[$key]['help'] = empty($info['description']) ? t('(No information available)') : $info['description'];
       $table[$key]['type'] = $field['type'];
-      $table[$key] += _search_api_views_add_handlers($field, $tmp);
+      _search_api_views_add_handlers($key, $field, $tmp, $table);
     }
 
     // Special handlers
@@ -145,7 +146,7 @@ function search_api_multi_views_data() {
     $table['search_api_relevance']['title'] = t('Relevance');
     $table['search_api_relevance']['help'] = t('The relevance of this search result with respect to the query.');
     $table['search_api_relevance']['type'] = 'decimal';
-    $table['search_api_relevance']['field']['handler'] = _search_api_views_field_handler('decimal', 'decimal');
+    $table['search_api_relevance']['field']['handler'] = $field_handlers['decimal'];
     $table['search_api_relevance']['field']['click sortable'] = TRUE;
     $table['search_api_relevance']['sort']['handler'] = 'SearchApiViewsHandlerSort';
 
@@ -164,7 +165,7 @@ function search_api_multi_views_data() {
     $table['search_api_multi_index']['title'] = t('Index');
     $table['search_api_multi_index']['help'] = t('The search indexes that will be searched.');
     $table['search_api_multi_index']['type'] = 'options';
-    $table['search_api_multi_index']['field']['handler'] = _search_api_views_field_handler('options', 'options');
+    $table['search_api_multi_index']['field']['handler'] = $field_handlers['options'];
     $table['search_api_multi_index']['field']['options'] = $indexes;
     $table['search_api_multi_index']['argument']['handler'] = 'SearchApiViewsHandlerArgument';
     $table['search_api_multi_index']['filter']['handler'] = 'SearchApiViewsHandlerFilterOptions';
