diff --git a/token.module b/token.module
index fb2c855..3cec5e2 100644
--- a/token.module
+++ b/token.module
@@ -195,6 +195,28 @@ function token_field_info_alter(&$info) {
 }
 
 /**
+ * Implements hook_field_display_alter().
+ */
+function token_field_display_alter(&$display, $context) {
+  if ($context['view_mode'] == 'token') {
+    $view_mode_settings = field_view_mode_settings($context['instance']['entity_type'], $context['instance']['bundle']);
+    // If the token view mode fell back to the 'default' view mode, then
+    // use the default token formatter.
+    if (empty($view_mode_settings[$context['view_mode']]['custom_settings'])) {
+      $field_type_info = field_info_field_types($context['field']['type']);
+      if (!empty($field_type_info['default_token_formatter'])) {
+        $display['type'] = $field_type_info['default_token_formatter'];
+
+        $formatter_info = field_info_formatter_types($display['type']);
+        $display['settings'] = isset($formatter_info['settings']) ? $formatter_info['settings'] : array();
+        $display['settings']['label'] = 'hidden';
+        $display['module'] = $formatter_info['module'];
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_field_create_instance().
  */
 function token_field_create_instance($instance) {
@@ -271,6 +293,14 @@ function token_get_entity_mapping($value_type = 'token', $value = NULL) {
  */
 function token_entity_info_alter(&$info) {
   foreach (array_keys($info) as $entity_type) {
+    // Add a token view mode if it does not already exist.
+    if (!empty($info[$entity_type]['view modes']) && !isset($info[$entity_type]['view modes']['token'])) {
+      $info[$entity_type]['view modes']['token'] = array(
+        'label' => t('Tokens'),
+        'custom settings' => FALSE,
+      );
+    }
+
     if (!empty($info[$entity_type]['token type'])) {
       // If the entity's token type is already defined, great!
       continue;
diff --git a/token.tokens.inc b/token.tokens.inc
index 18135ec..707c34a 100644
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -1201,7 +1201,6 @@ function _token_field_info($field_name = NULL) {
             }
 
             $info[$key]['token types'][] = $token_type;
-            $info[$key]['formatter'] = isset($type_info[$field['type']]['default_token_formatter']) ? $type_info[$field['type']]['default_token_formatter'] : $type_info[$field['type']]['default_formatter'];
 
             // Find which label is most commonly used.
             foreach ($field['bundles'][$entity] as $bundle) {
@@ -1258,11 +1257,6 @@ function field_token_info_alter(&$info) {
         'name' => $field['label'],
         'description' => $field['description'],
         'module' => 'token',
-        'field settings' => array(
-          'display' => array(
-            'type' => $field['formatter'],
-          ),
-        ),
       );
     }
   }
@@ -1301,10 +1295,8 @@ function field_tokens($type, $tokens, array $data = array(), array $options = ar
           continue;
         }
 
-        $display = isset($token_info['field settings']['display']) ? $token_info['field settings']['display'] : array();
-        $display += array('label' => FALSE);
-        $field_output = field_view_field($entity_type, $entity, $field_name, $display, $langcode);
-        $field_output['#display_settings'] = $display;
+        $field_output = field_view_field($entity_type, $entity, $field_name, 'token', $langcode);
+        $field_output['#token_options'] = $options;
         $field_output['#pre_render'][] = 'token_pre_render_field_token';
         $replacements[$original] = drupal_render($field_output);
       }
@@ -1331,7 +1323,7 @@ function token_pre_render_field_token(&$elements) {
   $deltas = element_get_visible_children($elements);
   $count = count($deltas);
   if ($count > 1) {
-    $join = isset($elements['#display_settings']['join']) ? $elements['#display_settings']['join'] : ", ";
+    $join = isset($elements['#token_options']['join']) ? $elements['#token_options']['join'] : ", ";
     foreach ($deltas as $index => $delta) {
       // Do not add a suffix to the last item.
       if ($index < ($count - 1)) {
