diff --git a/README.txt b/README.txt
index e3f2fd2..90ddacd 100644
--- a/README.txt
+++ b/README.txt
@@ -273,6 +273,14 @@ Included components
     containing the data from one or more other fields. Use this, e.g., to have a
     single field containing all data that should be searchable, or to make the
     text from a string field, like a taxonomy term, also fulltext-searchable.
+  * Bundle filter
+    Enables the admin to prevent entities from being indexed based on their
+    bundle (content type for nodes, vocabulary for taxonomy terms, etc.).
+  * Complete entity view 
+    Adds a field containing the whole HTML content of the entity as it is viewed
+    on the site. The view mode used can be selected.
+    Note, however, that this might not work for entities of all types. All core
+    entities except files are supported, though.
 
 - Processors
 
diff --git a/includes/callback_add_viewed_entity.inc b/includes/callback_add_viewed_entity.inc
new file mode 100644
index 0000000..2a959e8
--- /dev/null
+++ b/includes/callback_add_viewed_entity.inc
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Search API data alteration callback that adds an URL field for all items.
+ */
+class SearchApiAlterAddViewedEntity extends SearchApiAbstractAlterCallback {
+
+  public function configurationForm() {
+    $info = entity_get_info($this->index->entity_type);
+    $view_modes = array();
+    foreach ($info['view modes'] as $key => $mode) {
+      $view_modes[$key] = $mode['label'];
+    }
+    $this->options += array('mode' => reset($view_modes));
+    if (count($view_modes) > 1) {
+      $form['mode'] = array(
+        '#type' => 'select',
+        '#title' => t('View mode'),
+        '#options' => $view_modes,
+        '#default_value' => $this->options['mode'],
+      );
+    }
+    else {
+      $form['mode'] = array(
+        '#type' => 'value',
+        '#value' => $this->options['mode'],
+      );
+      if ($view_modes) {
+        $form['note'] = array(
+          '#markup' => '<p>' . t('Entities of type %type have only a single view mode. ' .
+              'Therefore, no selection needs to be made.', array('%type' => $info['label'])) . '</p>',
+        );
+      }
+      else {
+        $form['note'] = array(
+          '#markup' => '<p>' . t('Entities of type %type have no defined view modes. ' .
+              'This might either mean that they are always displayed the same way, or that they cannot be processed by this alteration at all. ' .
+              'Please consider this when using this alteration.', array('%type' => $info['label'])) . '</p>',
+        );
+      }
+    }
+    return $form;
+  }
+
+  public function alterItems(array &$items) {
+    $type = $this->index->entity_type;
+    $mode = empty($this->options['mode']) ? 'full' : $this->options['mode'];
+    foreach ($items as $id => &$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 {
+        $text = render(entity_view($type, array(entity_id($type, $item) => $item), $mode));
+        if (!$text) {
+          $item->search_api_viewed = NULL;
+          continue;
+        }
+        $item->search_api_viewed = $text;
+      }
+      catch (Exception $e) {
+        $item->search_api_viewed = NULL;
+      }
+    }
+  }
+
+  public function propertyInfo() {
+    return array(
+      'search_api_viewed' => array(
+        'label' => t('Entity HTML output'),
+        'description' => t('The whole HTML content of the entity when viewed.'),
+        'type' => 'text',
+      ),
+    );
+  }
+
+}
diff --git a/search_api.info b/search_api.info
index b95dd48..d067918 100644
--- a/search_api.info
+++ b/search_api.info
@@ -9,6 +9,7 @@ files[] = search_api.test
 files[] = includes/callback.inc
 files[] = includes/callback_add_fulltext.inc
 files[] = includes/callback_add_url.inc
+files[] = includes/callback_add_viewed_entity.inc
 files[] = includes/callback_bundle_filter.inc
 files[] = includes/exception.inc
 files[] = includes/index_entity.inc
diff --git a/search_api.module b/search_api.module
index f351183..32a1528 100644
--- a/search_api.module
+++ b/search_api.module
@@ -619,6 +619,11 @@ function search_api_search_api_alter_callback_info() {
     'description' => t('Gives you the ability to define additional fulltext fields, containing the text data from one or more other fields.'),
     'class' => 'SearchApiAlterAddFulltext',
   );
+  $callbacks['search_api_alter_add_viewed_entity'] = array(
+    'name' => t('Complete entity view'),
+    'description' => t('Adds an additional field containing the whole HTML content of the entity when viewed.'),
+    'class' => 'SearchApiAlterAddViewedEntity',
+  );
   $callbacks['search_api_alter_bundle_filter'] = array(
     'name' => t('Bundle filter'),
     'description' => t('Exclude items from indexing based on their bundle (content type, vocabulary, …).'),
