diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index c920344..a287a48 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -14,6 +14,20 @@
  */
 
 /**
+ * Gets all view modes for taxonomy_terms.
+ *
+ * @return array
+ *   View mode labels, indexed by view mode machine name.
+ */
+function _taxonomy_get_view_modes() {
+  $info = entity_get_info('taxonomy_term');
+  foreach ($info['view modes'] as $mode => $mode_info) {
+    $modes[$mode] = $mode_info['label'];
+  }
+  return $modes;
+}
+
+/**
  * Implements hook_help().
  */
 function taxonomy_help($path, $arg) {
@@ -106,11 +120,14 @@ function taxonomy_entity_info() {
       ),
       'bundles' => array(),
       'view modes' => array(
-        // @todo View mode for display as a field (when attached to nodes etc).
         'full' => array(
           'label' => t('Taxonomy term page'),
           'custom settings' => FALSE,
         ),
+        'term_reference_field' => array(
+          'label' => t('Term reference field'),
+          'custom settings' => TRUE,
+        ),
       ),
     ),
   );
@@ -1459,10 +1476,53 @@ function taxonomy_field_formatter_info() {
       'label' => t('RSS category'),
       'field types' => array('taxonomy_term_reference'),
     ),
+    'taxonomy_term_reference_term' => array(
+      'label' => t('Rendered term'),
+      'field types' => array('taxonomy_term_reference'),
+      'settings' => array(
+        'term view mode' => 'term_reference_field',
+      ),
+    ),
   );
 }
 
 /**
+ * Implements hook_field_formatter_settings_form().
+ *
+ * Expose the choice of view mode on the referenced terms.
+ */
+function taxonomy_field_formatter_settings_form($field, $instance, $view_mode, $form, $form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+  $element = array();
+
+  if ($display['type'] == 'taxonomy_term_reference_term') {
+    $element['term view mode'] = array(
+      '#description' => t('View mode for rendered term'),
+      '#type' => 'select',
+      '#options' => _taxonomy_get_view_modes('taxonomy_term'),
+      '#default_value' => $settings['term view mode'],
+      '#required' => TRUE,
+    );
+  }
+
+  return $element;
+}
+
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function taxonomy_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+  $modes = _taxonomy_get_view_modes('taxonomy_term');
+  $mode = $settings['term view mode'];
+  $summary = t('View mode: %mode', array('%mode' => $modes[$mode]));
+  return $summary;
+}
+
+/**
  * Implements hook_field_formatter_view().
  */
 function taxonomy_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
@@ -1513,6 +1573,16 @@ function taxonomy_field_formatter_view($entity_type, $entity, $field, $instance,
         );
       }
       break;
+
+    case 'taxonomy_term_reference_term':
+      $view_mode = $display['settings']['term view mode'];
+      foreach ($items as $delta => $item) {
+        // Handle previews of new tags
+        $element[$delta] = ($item['tid'] == 'autocreate')
+          ? array('#markup' => check_plain($item['name']))
+          : taxonomy_term_view($item['taxonomy_term'], $view_mode, $langcode);
+      }
+      break;
   }
 
   return $element;
