diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampAgoFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampAgoFormatter.php
index a0f61b5..185907d 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampAgoFormatter.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/TimestampAgoFormatter.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core\Field\Plugin\Field\FieldFormatter;
 
 use Drupal\Component\Utility\SafeMarkup;
+use Drupal\Core\Cache\Cache;
 use Drupal\Core\Datetime\DateFormatterInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
@@ -158,13 +159,21 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
 
     foreach ($items as $delta => $item) {
       if ($item->value) {
-        $updated = $this->formatTimestamp($item->value);
+        $elements[$delta] = [
+          '#markup' => $this->formatTimestamp($item->value),
+          '#cache' => [
+            'max-age' => abs($this->request->server->get('REQUEST_TIME') - $item->value),
+          ],
+        ];
       }
       else {
-        $updated = $this->t('never');
+        $elements[$delta] = [
+          '#markup' =>  $this->t('never'),
+          '#cache' => [
+            'max-age' => Cache::PERMANENT,
+          ],
+        ];
       }
-
-      $elements[$delta] = array('#markup' => $updated);
     }
 
     return $elements;
diff --git a/core/modules/aggregator/src/Controller/AggregatorController.php b/core/modules/aggregator/src/Controller/AggregatorController.php
index c656838..7e386b3 100644
--- a/core/modules/aggregator/src/Controller/AggregatorController.php
+++ b/core/modules/aggregator/src/Controller/AggregatorController.php
@@ -115,6 +115,7 @@ public function adminOverview() {
     $entity_manager = $this->entityManager();
     $feeds = $entity_manager->getStorage('aggregator_feed')
       ->loadMultiple();
+    $max_age = PHP_INT_MAX;
 
     $header = array($this->t('Title'), $this->t('Items'), $this->t('Last update'), $this->t('Next update'), $this->t('Operations'));
     $rows = array();
@@ -126,12 +127,16 @@ public function adminOverview() {
       $last_checked = $feed->getLastCheckedTime();
       $refresh_rate = $feed->getRefreshRate();
 
-      $row[] = ($last_checked ? $this->t('@time ago', array('@time' => $this->dateFormatter->formatInterval(REQUEST_TIME - $last_checked))) : $this->t('never'));
+      $interval = REQUEST_TIME - $last_checked;
+      $max_age = min(abs($interval), $max_age);
+      $row[] = ($last_checked ? $this->t('@time ago', array('@time' => $this->dateFormatter->formatInterval($interval))) : $this->t('never'));
       if (!$last_checked && $refresh_rate) {
         $next_update = $this->t('imminently');
       }
       elseif ($last_checked && $refresh_rate) {
-        $next_update = $next = $this->t('%time left', array('%time' => $this->dateFormatter->formatInterval($last_checked + $refresh_rate - REQUEST_TIME)));
+        $interval = $last_checked + $refresh_rate - REQUEST_TIME;
+        $max_age = min(abs($interval), $max_age);
+        $next_update = $next = $this->t('%time left', array('%time' => $this->dateFormatter->formatInterval($max_age)));
       }
       else {
         $next_update = $this->t('never');
@@ -167,6 +172,9 @@ public function adminOverview() {
       '#header' => $header,
       '#rows' => $rows,
       '#empty' => $this->t('No feeds available. <a href=":link">Add feed</a>.', array(':link' => $this->url('aggregator.feed_add'))),
+      '#cache' => [
+        'max-age' => $max_age,
+      ]
     );
 
     return $build;
diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
index b902c31..42c0a37 100644
--- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
+++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeTimeAgoFormatter.php
@@ -111,6 +111,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
     $elements = array();
 
     foreach ($items as $delta => $item) {
+      /** @var \Drupal\Core\Datetime\DrupalDateTime $date */
       $date = $item->date;
       $output = '';
       if (!empty($item->date)) {
@@ -120,7 +121,12 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
         }
         $output = $this->formatDate($date);
       }
-      $elements[$delta] = array('#markup' => $output);
+      $elements[$delta] = [
+        '#markup' => $output,
+        '#cache' => [
+          'max-age' => abs($this->request->server->get('REQUEST_TIME') - $date->format('U')),
+        ],
+      ];
     }
 
     return $elements;
diff --git a/core/modules/system/src/Form/CronForm.php b/core/modules/system/src/Form/CronForm.php
index 5fec62f..5f72962 100644
--- a/core/modules/system/src/Form/CronForm.php
+++ b/core/modules/system/src/Form/CronForm.php
@@ -102,9 +102,13 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#type' => 'submit',
       '#value' => t('Run cron'),
     );
-    $status = '<p>' . $this->t('Last run: %time ago.', array('%time' => $this->dateFormatter->formatTimeDiffSince($this->state->get('system.cron_last')))) . '</p>';
+    $time = $this->dateFormatter->formatTimeDiffSince($this->state->get('system.cron_last'));
+    $status = '<p>' . $this->t('Last run: %time ago.', array('%time' => $time)) . '</p>';
     $form['status'] = array(
       '#markup' => $status,
+      '#cache' => array(
+        'max-age' => abs($this->getRequest()->server->get('REQUEST_TIME') - $this->state->get('system.cron_last')),
+      ),
     );
 
     $cron_url = $this->url('system.cron', array('key' => $this->state->get('system.cron_key')), array('absolute' => TRUE));
diff --git a/core/modules/user/src/UserListBuilder.php b/core/modules/user/src/UserListBuilder.php
index a61ce89..b55492a 100644
--- a/core/modules/user/src/UserListBuilder.php
+++ b/core/modules/user/src/UserListBuilder.php
@@ -15,6 +15,7 @@
 use Drupal\Core\Entity\Query\QueryFactory;
 use Drupal\Core\Routing\RedirectDestinationInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
 
 /**
  * Defines a class to build a listing of user entities.
@@ -45,6 +46,13 @@ class UserListBuilder extends EntityListBuilder {
   protected $redirectDestination;
 
   /**
+   * The current Request object.
+   *
+   * @var \Symfony\Component\HttpFoundation\Request
+   */
+  protected $request;
+
+  /**
    * Constructs a new UserListBuilder object.
    *
    * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
@@ -57,12 +65,15 @@ class UserListBuilder extends EntityListBuilder {
    *   The date formatter service.
    * @param \Drupal\Core\Routing\RedirectDestinationInterface $redirect_destination
    *   The redirect destination service.
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request.
    */
-  public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, QueryFactory $query_factory, DateFormatterInterface $date_formatter,  RedirectDestinationInterface $redirect_destination) {
+  public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, QueryFactory $query_factory, DateFormatterInterface $date_formatter,  RedirectDestinationInterface $redirect_destination, Request $request) {
     parent::__construct($entity_type, $storage);
     $this->queryFactory = $query_factory;
     $this->dateFormatter = $date_formatter;
     $this->redirectDestination = $redirect_destination;
+    $this->request = $request;
   }
 
   /**
@@ -74,7 +85,8 @@ public static function createInstance(ContainerInterface $container, EntityTypeI
       $container->get('entity.manager')->getStorage($entity_type->id()),
       $container->get('entity.query'),
       $container->get('date.formatter'),
-      $container->get('redirect.destination')
+      $container->get('redirect.destination'),
+      $container->get('request_stack')->getCurrentRequest()
     );
   }
 
@@ -151,7 +163,12 @@ public function buildRow(EntityInterface $entity) {
       '#theme' => 'item_list',
       '#items' => $users_roles,
     );
-    $row['member_for'] = $this->dateFormatter->formatTimeDiffSince($entity->getCreatedTime());
+    $row['member_for']['data'] = [
+      '#markup' => $this->dateFormatter->formatTimeDiffSince($entity->getCreatedTime()),
+      '#cache' => [
+        'max-age' => abs($this->request->server->get('REQUEST_TIME') - $entity->getCreatedTime()),
+      ],
+    ];
     $row['access'] = $entity->access ? $this->t('@time ago', array('@time' => $this->dateFormatter->formatTimeDiffSince($entity->getLastAccessedTime()))) : t('never');
     return $row + parent::buildRow($entity);
   }
diff --git a/core/modules/views/src/Plugin/views/field/TimeInterval.php b/core/modules/views/src/Plugin/views/field/TimeInterval.php
index 4c91421..a6f5f4e 100644
--- a/core/modules/views/src/Plugin/views/field/TimeInterval.php
+++ b/core/modules/views/src/Plugin/views/field/TimeInterval.php
@@ -87,6 +87,12 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    */
   public function render(ResultRow $values) {
     $value = $values->{$this->field_alias};
+    if (empty($this->view->element['#cache']['max-age'])){
+      $this->view->element['#cache']['max-age'] = abs($value);
+    }
+    else {
+      $this->view->element['#cache']['max-age'] = min($this->view->element['#cache']['max-age'], abs($value));
+    }
     return $this->dateFormatter->formatInterval($value, isset($this->options['granularity']) ? $this->options['granularity'] : 2);
   }
 
diff --git a/core/modules/views_ui/src/ViewEditForm.php b/core/modules/views_ui/src/ViewEditForm.php
index 61a7e8b..32d06cd 100644
--- a/core/modules/views_ui/src/ViewEditForm.php
+++ b/core/modules/views_ui/src/ViewEditForm.php
@@ -145,6 +145,9 @@ public function form(array $form, FormStateInterface $form_state) {
         '#attributes' => array('class' => array('view-locked', 'messages', 'messages--warning')),
         '#children' => $this->t('This view is being edited by user @user, and is therefore locked from editing by others. This lock is @age old. Click here to <a href=":url">break this lock</a>.', $lock_message_substitutions),
         '#weight' => -10,
+        '#cache' => array(
+          'max-age' => abs($this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME') - $view->lock->updated),
+        ),
       );
     }
     else {
