diff --git a/includes/callback_add_viewed_entity.inc b/includes/callback_add_viewed_entity.inc
index bb2ae07d..61b541d6 100644
--- a/includes/callback_add_viewed_entity.inc
+++ b/includes/callback_add_viewed_entity.inc
@@ -16,12 +16,36 @@ class SearchApiAlterAddViewedEntity extends SearchApiAbstractAlterCallback {
    * @see SearchApiAlterCallbackInterface::supportsIndex()
    */
   public function supportsIndex(SearchApiIndex $index) {
+    if ($this->isMultiEntityIndex($index)) {
+      foreach ($index->options['datasource']['types'] as $entity_type) {
+        $info = entity_get_info($entity_type);
+        if (!empty($info['view modes'])) {
+          return TRUE;
+        }
+      }
+      return FALSE;
+    }
     return (bool) $index->getEntityType();
   }
 
   public function configurationForm() {
     $view_modes = array();
-    if ($entity_type = $this->index->getEntityType()) {
+    if ($this->isMultiEntityIndex($this->index)) {
+      foreach ($this->index->options['datasource']['types'] as $entity_type) {
+        $info = entity_get_info($entity_type);
+        foreach ($info['view modes'] as $key => $mode) {
+          $view_modes[$key] = $mode['label'];
+        }
+        // Remove any that aren't present in this entity type. So list of
+        // available view modes must be present in all types for this index.
+        foreach($view_modes as $key => $label) {
+          if (!isset($info['view modes'][$key])) {
+            unset($view_modes[$key]);
+          }
+        }
+      }
+    }
+    elseif ($entity_type = $this->index->getEntityType()) {
       $info = entity_get_info($entity_type);
       foreach ($info['view modes'] as $key => $mode) {
         $view_modes[$key] = $mode['label'];
@@ -67,14 +91,23 @@ public function alterItems(array &$items) {
     $original_user = $GLOBALS['user'];
     $GLOBALS['user'] = drupal_anonymous_user();
 
-    $type = $this->index->getEntityType();
+    $multiple_types = $this->isMultiEntityIndex($this->index);
+    $type = NULL;
+    if (!$multiple_types) {
+      $type = $this->index->getEntityType();
+    }
     $mode = empty($this->options['mode']) ? 'full' : $this->options['mode'];
     foreach ($items as &$item) {
       // Since we can't really know what happens in entity_view() and render(),
       // we use try/catch. This will at least prevent some errors, even though
       // it's no protection against fatal errors and the like.
       try {
-        $render = entity_view($type, array(entity_id($type, $item) => $item), $mode, $item->search_api_language);
+        $entity = $item;
+        if ($multiple_types) {
+          $type = $item->item_type;
+          $entity = $item->$type;
+        }
+        $render = entity_view($type, array(entity_id($type, $entity) => $entity), $mode, $item->search_api_language);
         $text = render($render);
         if (!$text) {
           $item->search_api_viewed = NULL;
