diff --git a/core/modules/field/modules/options/lib/Drupal/options/Plugin/field/formatter/OptionsDefaultFormatter.php b/core/modules/field/modules/options/lib/Drupal/options/Plugin/field/formatter/OptionsDefaultFormatter.php
new file mode 100644
index 0000000..ae29f6f
--- /dev/null
+++ b/core/modules/field/modules/options/lib/Drupal/options/Plugin/field/formatter/OptionsDefaultFormatter.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\options\Plugin\field\formatter\OptionsDefaultFormatter.
+ */
+
+namespace Drupal\options\Plugin\field\formatter;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\field\Plugin\Type\Formatter\FormatterBase;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Plugin implementation of the 'list_default' formatter.
+ *
+ * @Plugin(
+ *   id = "list_default",
+ *   module = "options",
+ *   label = @Translation("Default"),
+ *   field_types = {
+ *     "list_integer",
+ *     "list_float",
+ *     "list_text",
+ *     "list_boolean",
+ *   }
+ * )
+ */
+class OptionsDefaultFormatter extends FormatterBase {
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::viewElements().
+   */
+  public function viewElements(EntityInterface $entity, $langcode, array $items) {
+    $elements = array();
+
+    $allowed_values = options_allowed_values($this->field, $this->instance, $entity->entityType(), $entity);
+
+    foreach ($items as $delta => $item) {
+
+      // Old options
+      if (isset($allowed_values[$item['value']])) {
+        $output = field_filter_xss($allowed_values[$item['value']]);
+      }
+      else {
+        // If no match was found in allowed values, fall back to the key.
+        $output = field_filter_xss($item['value']);
+      }
+      $elements[$delta] = array('#markup' => $output);
+    }
+
+    return $elements;
+  }
+
+}
diff --git a/core/modules/field/modules/options/lib/Drupal/options/Plugin/field/formatter/OptionsKeyFormatter.php b/core/modules/field/modules/options/lib/Drupal/options/Plugin/field/formatter/OptionsKeyFormatter.php
new file mode 100644
index 0000000..ce0255b
--- /dev/null
+++ b/core/modules/field/modules/options/lib/Drupal/options/Plugin/field/formatter/OptionsKeyFormatter.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\options\Plugin\field\formatter\OptionsKeyFormatter.
+ */
+
+namespace Drupal\options\Plugin\field\formatter;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\field\Plugin\Type\Formatter\FormatterBase;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Plugin implementation of the 'list_key' formatter.
+ *
+ * @Plugin(
+ *   id = "list_key",
+ *   module = "options",
+ *   label = @Translation("Key"),
+ *   field_types = {
+ *     "list_integer",
+ *     "list_float",
+ *     "list_text",
+ *     "list_boolean",
+ *   }
+ * )
+ */
+class OptionsKeyFormatter extends FormatterBase {
+
+  /**
+   * Implements Drupal\field\Plugin\Type\Formatter\FormatterInterface::viewElements().
+   */
+  public function viewElements(EntityInterface $entity, $langcode, array $items) {
+    $elements = array();
+
+    foreach ($items as $delta => $item) {
+      $elements[$delta] = array('#markup' => field_filter_xss($item['value']));
+    }
+
+    return $elements;
+  }
+
+}
diff --git a/core/modules/field/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php b/core/modules/field/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php
index 5215be6..98c4a7f 100644
--- a/core/modules/field/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php
+++ b/core/modules/field/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php
@@ -33,11 +33,12 @@ function setUp() {
     parent::setUp();
 
     // Create test user.
-    $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer taxonomy'));
+    $admin_user = $this->drupalCreateUser(array('access content', 'administer taxonomy', 'access administration pages', 'administer site configuration', 'administer users', 'administer permissions', 'administer content types', 'administer nodes', 'bypass node access'));
     $this->drupalLogin($admin_user);
 
     // Create content type, with underscores.
     $type_name = 'test_' . strtolower($this->randomName());
+    $this->type_name = $type_name;
     $type = $this->drupalCreateContentType(array('name' => $type_name, 'type' => $type_name));
     $this->type = $type->type;
   }
@@ -273,4 +274,55 @@ function assertAllowedValuesInput($input_string, $result, $message) {
       $this->assertIdentical($field['settings']['allowed_values'], $result, $message);
     }
   }
+
+  /**
+   * Tests normal formatter display on node display.
+   */
+  function testNodeDisplay() {
+    $this->field_name = strtolower($this->randomName());
+    $this->createOptionsField('list_boolean');
+    $node = $this->drupalCreateNode(array('type' => $this->type));
+
+    // Create a new node with the uploaded file.
+    $this->drupalGet('node/' . $node->nid);
+
+    $on = $this->randomName();
+    $off = $this->randomName();
+    $allowed_values = array(1 => $on, 0 => $off);
+    $edit = array(
+      'on' => $on,
+      'off' => $off,
+    );
+
+    $this->drupalPost($this->admin_path, $edit, t('Save settings'));
+    $this->assertText('Saved ' . $this->field_name . ' configuration.', t("The 'On' and 'Off' form fields work for boolean fields."));
+
+    debug('Saved ' . $this->field_name . ' configuration.');
+
+    // Select a default value.
+    $edit = array(
+      $this->field_name . '[und]' => '1',
+    );
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    // Check the node page and see if the values are correct
+    $file_formatters = array('list_default', 'list_key');
+    foreach ($file_formatters as $formatter) {
+      $edit = array(
+        "fields[$this->field_name][type]" => $formatter,
+      );
+      $this->drupalPost('admin/structure/types/manage/' . $this->type_name . '/display', $edit, t('Save'));
+      $this->drupalGet('node/' . $node->nid);
+
+      if ($formatter == 'list_default') {
+        $output = $on;
+      }
+      else {
+        $output = '1';
+      }
+
+      $elements = $this->xpath('//div[text()="' . $output . '"]');
+      $this->assertEqual(count($elements), 1, 'Correct options found.');
+    }
+  }
 }
diff --git a/core/modules/field/modules/options/options.module b/core/modules/field/modules/options/options.module
index e958510..54b55eb 100644
--- a/core/modules/field/modules/options/options.module
+++ b/core/modules/field/modules/options/options.module
@@ -859,50 +859,3 @@ function theme_options_none($variables) {
 
   return $output;
 }
-
-/**
- * Implements hook_field_formatter_info().
- */
-function options_field_formatter_info() {
-  return array(
-    'list_default' => array(
-      'label' => t('Default'),
-      'field types' => array('list_integer', 'list_float', 'list_text', 'list_boolean'),
-    ),
-    'list_key' => array(
-      'label' => t('Key'),
-      'field types' => array('list_integer', 'list_float', 'list_text', 'list_boolean'),
-    ),
-  );
-}
-
-/**
- * Implements hook_field_formatter_view().
- */
-function options_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
-  $element = array();
-
-  switch ($display['type']) {
-    case 'list_default':
-      $allowed_values = options_allowed_values($field, $instance, $entity_type, $entity);
-      foreach ($items as $delta => $item) {
-        if (isset($allowed_values[$item['value']])) {
-          $output = field_filter_xss($allowed_values[$item['value']]);
-        }
-        else {
-          // If no match was found in allowed values, fall back to the key.
-          $output = field_filter_xss($item['value']);
-        }
-        $element[$delta] = array('#markup' => $output);
-      }
-      break;
-
-    case 'list_key':
-      foreach ($items as $delta => $item) {
-        $element[$delta] = array('#markup' => field_filter_xss($item['value']));
-      }
-      break;
-  }
-
-  return $element;
-}
