diff --git a/file_entity/file_entity.field.inc b/file_entity/file_entity.field.inc
new file mode 100644
index 0000000..43016ff
--- /dev/null
+++ b/file_entity/file_entity.field.inc
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @file
+ * Field API integration for the file_entity module.
+ */
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function file_entity_field_formatter_info() {
+  $info['file_rendered'] = array(
+    'label' => t('Rendered file'),
+    'description' => t('Display the file in a specific view mode'),
+    'field types' => array('file', 'image'),
+    'settings' => array('file_view_mode' => 'default'),
+  );
+  return $info;
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function file_entity_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+  $element = array();
+
+  if ($display['type'] == 'file_rendered') {
+    $element['file_view_mode'] = array(
+      '#title'   => t('View mode'),
+      '#type'    => 'select',
+      '#options' => file_entity_view_mode_labels(),
+      '#default_value' => $settings['file_view_mode'],
+      // Never empty, so no #empty_option
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function file_entity_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+  $summary = NULL;
+
+  if ($display['type'] === 'file_rendered') {
+    $view_mode_label = file_entity_view_mode_label($settings['file_view_mode'], t('Unknown'));
+    $summary = t('View mode: %mode', array('%mode' => $view_mode_label));
+  }
+
+  return $summary;
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function file_entity_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $settings = $display['settings'];
+  $element = array();
+
+  if ($display['type'] == 'file_rendered') {
+    $view_mode = $settings['file_view_mode'];
+
+    // To prevent infinite recursion caused by reference cycles, we store
+    // diplayed nodes in a recursion queue.
+    $recursion_queue = &drupal_static(__FUNCTION__, array());
+
+    // If no 'referencing entity' is set, we are starting a new 'reference
+    // thread' and need to reset the queue.
+    // @todo Bug: $entity->referencing_entity on files referenced in a different
+    // thread on the page. E.g: 1 references 1+2 / 2 references 1+2 / visit homepage.
+    // We'd need a more accurate way...
+    if (!isset($entity->referencing_entity)) {
+      $recursion_queue = array();
+    }
+
+    // The recursion queue only needs to track files.
+    if ($entity_type == 'file') {
+      list($id) = entity_extract_ids($entity_type, $entity);
+      $recursion_queue[$id] = $id;
+    }
+
+    // Prevent 'empty' fields from causing a WSOD.
+    $items = array_filter($items);
+
+    // Check the recursion queue to determine which nodes should be fully
+    // displayed, and which nodes will only be displayed as a title.
+    $files_display = array();
+    foreach ($items as $delta => $item) {
+      if (!isset($recursion_queue[$item['fid']])) {
+        $files_display[$item['fid']] = file_load($item['fid']);
+      }
+    }
+
+    // Load and build the fully displayed nodes.
+    if ($files_display) {
+      foreach ($files_display as $fid => $file) {
+        $files_display[$fid]->referencing_entity = $entity;
+        $files_display[$fid]->referencing_field = $field['field_name'];
+      }
+      $files_built = file_view_multiple($files_display, $view_mode);
+    }
+
+    // Assemble the render array.
+    foreach ($items as $delta => $item) {
+      if (isset($files_built[$item['fid']])) {
+        $element[$delta] = $files_built[$item['fid']];
+      }
+    }
+  }
+
+  return $element;
+}
diff --git a/file_entity/file_entity.info b/file_entity/file_entity.info
index 155f844..7d311ae 100644
--- a/file_entity/file_entity.info
+++ b/file_entity/file_entity.info
@@ -4,3 +4,4 @@ package = Media
 core = 7.x
 dependencies[] = field
 dependencies[] = ctools
+files[] = file_entity.field.inc
\ No newline at end of file
diff --git a/file_entity/file_entity.module b/file_entity/file_entity.module
index 889fc1a..8c8b3fe 100644
--- a/file_entity/file_entity.module
+++ b/file_entity/file_entity.module
@@ -12,6 +12,10 @@
  */
 require_once dirname(__FILE__) . '/file_entity.file_api.inc';
 
+// @todo Remove when http://drupal.org/node/977052 is fixed.
+require_once dirname(__FILE__) . '/file_entity.field.inc';
+
+
 /**
  * Implements hook_help().
  */
@@ -241,6 +245,30 @@ function file_entity_file_formatter_info() {
 
   return $formatters;
 }
+/**
+ * Return the label for a specific file entity view mode.
+ */
+function file_entity_view_mode_label($view_mode, $default = FALSE) {
+  $labels = file_entity_view_mode_labels();
+  return isset($labels[$view_mode]) ? $labels[$view_mode] : $default;
+}
+
+/**
+ * Return an array of available view modes for file entities.
+ */
+function file_entity_view_mode_labels() {
+  $labels = &drupal_static(__FUNCTION__);
+
+  if (!isset($options)) {
+    $entity_info = entity_get_info('file');
+    $labels = array('default' => t('Default'));
+    foreach ($entity_info['view modes'] as $machine_name => $mode) {
+      $labels[$machine_name] = $mode['label'];
+    }
+  }
+
+  return $labels;
+}
 
 /**
  * Implements hook_file_formatter_FORMATTER_view().
