diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php
new file mode 100644
index 0000000..763c9ea
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\Field\FieldFormatter\DateTimePlainFormatter.
+ */
+
+namespace Drupal\datetime\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\Core\Field\FormatterBase;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Plugin implementation of the 'datetime_custom' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "datetime_custom",
+ *   label = @Translation("Custom"),
+ *   field_types = {
+ *     "datetime"
+ *   }
+ *)
+ */
+class DateTimeCustomFormatter extends FormatterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return array(
+      'date_format' => DATETIME_DATETIME_STORAGE_FORMAT,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items) {
+    $elements = array();
+
+    foreach ($items as $delta => $item) {
+      $output = '';
+      if (!empty($item->date)) {
+        $date = $item->date;
+        $date->setTimeZone(timezone_open(drupal_get_user_timezone()));
+
+        $output = $date->format($this->getSetting('date_format'));
+      }
+      $elements[$delta] = array('#markup' => $output);
+    }
+
+    return $elements;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $elements['date_format'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Format string'),
+      '#description' => $this->t('A user-defined date format. See the <a href="@url">PHP manual</a> for available options.', array('@url' => 'http://php.net/manual/function.date.php')),
+      '#default_value' => $this->getSetting('date_format'),
+    );
+
+    return $elements;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = array();
+    $date = new DrupalDateTime();
+    $summary[] = $date->format($this->getSetting('date_format'));
+    return $summary;
+  }
+}
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
index f983c8d..0d99b81 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php
@@ -103,11 +103,9 @@ public static function create(ContainerInterface $container, array $configuratio
    * {@inheritdoc}
    */
   public function viewElements(FieldItemListInterface $items) {
-
     $elements = array();
 
     foreach ($items as $delta => $item) {
-
       $formatted_date = '';
       $iso_date = '';
 
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php
index 24fc69c..95716de 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php
@@ -27,15 +27,11 @@ class DateTimePlainFormatter extends FormatterBase {
    * {@inheritdoc}
    */
   public function viewElements(FieldItemListInterface $items) {
-
     $elements = array();
 
     foreach ($items as $delta => $item) {
-
       $output = '';
       if (!empty($item->date)) {
-        // The date was created and verified during field_load(), so it is safe
-        // to use without further inspection.
         $date = $item->date;
         $date->setTimeZone(timezone_open(drupal_get_user_timezone()));
         $format = DATETIME_DATETIME_STORAGE_FORMAT;
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
new file mode 100644
index 0000000..df85775
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
@@ -0,0 +1,180 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\Field\FieldFormatter\DateTimePlainFormatter.
+ */
+
+namespace Drupal\datetime\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Datetime\DateFormatter;
+use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Field\FormatterBase;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Plugin implementation of the 'datetime_time_ago' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "datetime_time_ago",
+ *   label = @Translation("Time ago"),
+ *   field_types = {
+ *     "datetime"
+ *   }
+ *)
+ */
+class DateTimeTimeAgoFormatter extends FormatterBase implements ContainerFactoryPluginInterface{
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultSettings() {
+    return array(
+      'format_type' => 'time span',
+      'granularity' => 2,
+    ) + parent::defaultSettings();
+  }
+
+  /**
+   * The date formatter service.
+   *
+   * @var \Drupal\Core\Datetime\DateFormatter
+   */
+  protected $dateFormatter;
+
+  /**
+   * Constructs a DateTimeTimeAgoFormatter object.
+   *
+   * @param string $plugin_id
+   *   The plugin_id for the formatter.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
+   *   The definition of the field to which the formatter is associated.
+   * @param array $settings
+   *   The formatter settings.
+   * @param string $label
+   *   The formatter label display setting.
+   * @param string $view_mode
+   *   The view mode.
+   * @param array $third_party_settings
+   *   Third party settings.
+   * @param \Drupal\Core\Datetime\DateFormatter $date_formatter
+   *   The date formatter service.
+   */
+  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, DateFormatter $date_formatter) {
+    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
+
+    $this->dateFormatter = $date_formatter;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $plugin_id,
+      $plugin_definition,
+      $configuration['field_definition'],
+      $configuration['settings'],
+      $configuration['label'],
+      $configuration['view_mode'],
+      $configuration['third_party_settings'],
+      $container->get('date.formatter')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items) {
+    $elements = array();
+
+    foreach ($items as $delta => $item) {
+      $output = '';
+      if (!empty($item->date)) {
+        $date = $item->date;
+        $date->setTimeZone(timezone_open(drupal_get_user_timezone()));
+        $output = $this->dateFormat($date);
+      }
+      $elements[$delta] = array('#markup' => $output);
+    }
+
+    return $elements;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, FormStateInterface $form_state) {
+    $elements['format_type'] = array(
+      '#type' => 'select',
+      '#title' => $this->t('Date format'),
+      '#options' => array(
+        'raw time ago' => $this->t('Time ago'),
+        'time ago' => $this->t('Time ago (with "ago" appended)'),
+        'raw time hence' => $this->t('Time hence'),
+        'time hence' => $this->t('Time hence (with "hence" appended)'),
+        'raw time span' => $this->t('Time span (future dates have "-" prepended)'),
+        'inverse time span' => $this->t('Time span (past dates have "-" prepended)'),
+        'time span' => $this->t('Time span (with "ago/hence" appended)'),
+      ),
+      '#default_value' => $this->getSetting('format_type'),
+    );
+
+    $elements['granularity'] = array(
+      '#type' => 'number',
+      '#title' => 'Granularity',
+      '#default_value' => $this->getSetting('granularity'),
+      '#description' => $this->t('The number of different time units to display.'),
+    );
+
+    return $elements;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsSummary() {
+    $summary = array();
+    $future_date = new DrupalDateTime('1 year 1 month 1 week 1 day 1 hour 1 minute');
+    $past_date = new DrupalDateTime('-1 year');
+    $summary[] = t('Future date: !display', array('!display' => $this->dateFormat($future_date, FALSE)));
+    $summary[] = t('Past date: !display', array('!display' => $this->dateFormat($past_date, FALSE)));
+    return $summary;
+  }
+
+  /**
+   * Creates a formatted date value as a string.
+   *
+   * @param \Drupal\Core\Datetime\DrupalDateTime|object $date
+   *   A date object.
+   * @return string
+   *   A formatted date string using the chosen format.
+   */
+  function dateFormat(DrupalDateTime $date) {
+    $format = $this->getSetting('format_type');
+    $granularity = $this->getSetting('granularity');
+    $interval = REQUEST_TIME - $date->getTimestamp();
+    switch ($format) {
+      case 'time ago':
+        return $this->t('%time ago', array('%time' => $this->dateFormatter->formatInterval($interval, $granularity)));
+      case 'raw time hence':
+        return $this->dateFormatter->formatInterval(-$interval, $granularity);
+      case 'time hence':
+        return $this->t('%time hence', array('%time' => $this->dateFormatter->formatInterval(-$interval, $granularity)));
+      case 'raw time span':
+        return ($interval < 0 ? '-' : '') . $this->dateFormatter->formatInterval(abs($interval), $granularity);
+      case 'inverse time span':
+        return ($interval > 0 ? '-' : '') . $this->dateFormatter->formatInterval(abs($interval), $granularity);
+      case 'time span':
+        return $this->t(($interval < 0 ? '%time hence' : '%time ago'), array('%time' => $this->dateFormatter->formatInterval(abs($interval), $granularity)));
+      default: // Fallback to raw time ago.
+        return $this->dateFormatter->formatInterval($interval, $granularity);
+    }
+  }
+}
