diff --git a/core/modules/aggregator/aggregator.routing.yml b/core/modules/aggregator/aggregator.routing.yml
index 2f2d553..508a5de 100644
--- a/core/modules/aggregator/aggregator.routing.yml
+++ b/core/modules/aggregator/aggregator.routing.yml
@@ -84,3 +84,6 @@ aggregator.page_last:
     _title: 'Feed aggregator'
   requirements:
     _permission: 'access news feeds'
+  options:
+    # @todo Add cacheability metadata to this response.
+    no_cache: TRUE
diff --git a/core/modules/block/src/Controller/BlockController.php b/core/modules/block/src/Controller/BlockController.php
index 2779a9b..6200a4e 100644
--- a/core/modules/block/src/Controller/BlockController.php
+++ b/core/modules/block/src/Controller/BlockController.php
@@ -81,6 +81,8 @@ public function demo($theme) {
       );
     }
 
+    $page['#cache'] = [];
+
     return $page;
   }
 
diff --git a/core/modules/config/tests/config_test/src/SchemaListenerController.php b/core/modules/config/tests/config_test/src/SchemaListenerController.php
index 1a6b28c..2545645 100644
--- a/core/modules/config/tests/config_test/src/SchemaListenerController.php
+++ b/core/modules/config/tests/config_test/src/SchemaListenerController.php
@@ -46,6 +46,7 @@ public function test() {
     catch (SchemaIncompleteException $e) {
       return [
         '#markup' => $e->getMessage(),
+        '#cache' => [],
       ];
     }
   }
diff --git a/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php b/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php
index 103b303..ec0b716 100644
--- a/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php
+++ b/core/modules/dynamic_page_cache/src/EventSubscriber/DynamicPageCacheSubscriber.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheableMetadata;
 use Drupal\Core\Cache\CacheableResponseInterface;
+use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\PageCache\RequestPolicyInterface;
 use Drupal\Core\PageCache\ResponsePolicyInterface;
 use Drupal\Core\Render\Element;
@@ -17,6 +18,7 @@
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
 use Symfony\Component\HttpKernel\KernelEvents;
 
 /**
@@ -44,11 +46,19 @@ class DynamicPageCacheSubscriber implements EventSubscriberInterface {
    * Attribute name of the Dynamic Page Cache request policy result.
    *
    * @see onRouteMatch()
-   * @see onRespond()
+   * @see onResponse()
    */
   const ATTRIBUTE_REQUEST_POLICY_RESULT = '_dynamic_page_cache_request_policy_result';
 
   /**
+   * Attribute name of the controller's render array #cache check.
+   *
+   * @see onViewRenderArray()
+   * @see onResponse()
+   */
+  const ATTRIBUTE_CONTROLLER_RESULT_RENDER_ARRAY_HAS_CACHEABILITY = '_dynamic_page_cache_controller_render_array_has_cacheability';
+
+  /**
    * Name of Dynamic Page Cache's response header.
    */
   const HEADER = 'X-Drupal-Dynamic-Cache';
@@ -149,10 +159,32 @@ public function onRouteMatch(GetResponseEvent $event) {
   }
 
   /**
+   * Complain if a controller returns a render array without #cache.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent $event
+   *   The event to process.
+   *
+   * @see ::onResponse()
+   */
+  public function onViewRenderArray(GetResponseForControllerResultEvent $event) {
+    $request = $event->getRequest();
+    $result = $event->getControllerResult();
+
+    // Check if MainContentViewSubscriber would render this render array, i.e.
+    // if this render array will in fact be converted into a response.
+    if (is_array($result) && ($request->query->has(MainContentViewSubscriber::WRAPPER_FORMAT) || $request->getRequestFormat() == 'html')) {
+      // If #cache is not set, complain later.
+      $request->attributes->set(self::ATTRIBUTE_CONTROLLER_RESULT_RENDER_ARRAY_HAS_CACHEABILITY, isset($result['#cache']));
+    }
+  }
+
+  /**
    * Stores a response in case of a Dynamic Page Cache miss, if cacheable.
    *
    * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
    *   The event to process.
+   *
+   * @throws \LogicException
    */
   public function onResponse(FilterResponseEvent $event) {
     $response = $event->getResponse();
@@ -200,6 +232,13 @@ public function onResponse(FilterResponseEvent $event) {
       return;
     }
 
+    // If #cache was not set, complain.
+    // @see ::onViewRenderArray()
+    if ($request->attributes->get(self::ATTRIBUTE_CONTROLLER_RESULT_RENDER_ARRAY_HAS_CACHEABILITY) === FALSE) {
+      trigger_error('The controller for the route \'' . $request->attributes->get('_route') . '\' returned a render array without cacheability metadata. See https://www.drupal.org/developing/api/8/render/arrays/cacheability.', E_USER_ERROR);
+      return;
+    }
+
     // Embed the response object in a render array so that RenderCache is able
     // to cache it, handling cache redirection for us.
     $response_as_render_array = $this->responseToRenderArray($response);
@@ -323,6 +362,10 @@ public static function getSubscribedEvents() {
     // Run before HtmlResponseSubscriber::onRespond(), which has priority 0.
     $events[KernelEvents::RESPONSE][] = ['onResponse', 100];
 
+    // Run before MainContentViewSubscriber::onViewRenderArray(), which has
+    // priority 0.
+    $events[KernelEvents::VIEW][] = ['onViewRenderArray', 100];
+
     return $events;
   }
 
diff --git a/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php b/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php
index ccc9170..0a51d5d 100644
--- a/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php
+++ b/core/modules/dynamic_page_cache/src/Tests/DynamicPageCacheIntegrationTest.php
@@ -126,6 +126,12 @@ public function testDynamicPageCache() {
     // Cache.
     $this->drupalGet('dynamic-page-cache-test/html/uncacheable/tags');
     $this->assertEqual('MISS', $this->drupalGetHeader(DynamicPageCacheSubscriber::HEADER), 'By default, Drupal has no auto-placeholdering cache tags.');
+
+    // Finally, controllers returning render arrays without a top-level #cache
+    // trigger an exception urging the developer to add cacheability metadata.
+    $this->drupalGet(Url::fromRoute('dynamic_page_cache_test.html_without_cacheability'));
+    $this->assertResponse(200);
+    $this->assertRaw("The controller for the route 'dynamic_page_cache_test.html_without_cacheability' returned a render array without cacheability metadata. See https://www.drupal.org/developing/api/8/render/arrays/cacheability.");
   }
 
 }
diff --git a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml
index 77125b6..1b06b47 100644
--- a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml
+++ b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/dynamic_page_cache_test.routing.yml
@@ -73,3 +73,10 @@ dynamic_page_cache_test.html.uncacheable.tags:
     _controller: '\Drupal\dynamic_page_cache_test\DynamicPageCacheTestController::htmlUncacheableTags'
   requirements:
     _access: 'TRUE'
+
+dynamic_page_cache_test.html_without_cacheability:
+  path: '/dynamic-page-cache-test/html-without-cacheability'
+  defaults:
+    _controller: '\Drupal\dynamic_page_cache_test\DynamicPageCacheTestController::htmlWithoutCacheability'
+  requirements:
+    _access: 'TRUE'
diff --git a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php
index 929f3a0..7187a37 100644
--- a/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php
+++ b/core/modules/dynamic_page_cache/tests/dynamic_page_cache_test/src/DynamicPageCacheTestController.php
@@ -44,20 +44,31 @@ public function cacheableResponse() {
   }
 
   /**
-   * A route returning a render array (without cache contexts, so cacheable).
+   * A route returning a render array without #cache.
    *
    * @return array
    *   A render array.
    */
-  public function html() {
+  public function htmlWithoutCacheability() {
     return [
       'content' => [
         '#markup' => 'Hello world.',
+        '#cache' => [],
       ],
     ];
   }
 
   /**
+   * A route returning a render array (without cache contexts, so cacheable).
+   *
+   * @return array
+   *   A render array.
+   */
+  public function html() {
+    return $this->htmlWithoutCacheability() + ['#cache' => []];
+  }
+
+  /**
    * A route returning a render array (with cache contexts, so cacheable).
    *
    * @param \Symfony\Component\HttpFoundation\Request $request
diff --git a/core/modules/filter/filter.routing.yml b/core/modules/filter/filter.routing.yml
index 5b56da7..0724195 100644
--- a/core/modules/filter/filter.routing.yml
+++ b/core/modules/filter/filter.routing.yml
@@ -13,6 +13,9 @@ filter.tips:
     _title: 'Compose tips'
   requirements:
     _entity_access: 'filter_format.use'
+  options:
+    # @todo Add cacheability metadata to this response.
+    no_cache: TRUE
 
 filter.admin_overview:
   path: '/admin/config/content/formats'
diff --git a/core/modules/system/src/Controller/Http4xxController.php b/core/modules/system/src/Controller/Http4xxController.php
index c664324..ea69a00 100644
--- a/core/modules/system/src/Controller/Http4xxController.php
+++ b/core/modules/system/src/Controller/Http4xxController.php
@@ -23,6 +23,7 @@ class Http4xxController extends ControllerBase {
   public function on401() {
     return [
       '#markup' => $this->t('Please log in to access this page.'),
+      '#cache' => [],
     ];
   }
 
@@ -35,6 +36,7 @@ public function on401() {
   public function on403() {
     return [
       '#markup' => $this->t('You are not authorized to access this page.'),
+      '#cache' => [],
     ];
   }
 
@@ -47,6 +49,7 @@ public function on403() {
   public function on404() {
     return [
       '#markup' => $this->t('The requested page could not be found.'),
+      '#cache' => [],
     ];
   }
 
diff --git a/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php b/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php
index ff4859d..7501914 100644
--- a/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php
+++ b/core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php
@@ -28,6 +28,7 @@ class AjaxTestController {
   public static function dialogContents() {
     // This is a regular render array; the keys do not have special meaning.
     $content = array(
+      '#cache' => [],
       '#title' => 'AJAX Dialog contents',
       'content' => array(
         '#markup' => 'Example message',
@@ -56,6 +57,7 @@ public static function dialogContents() {
    */
   public function render() {
     return [
+      '#cache' => [],
       '#attached' => [
         'library' => [
           'core/drupalSettings',
@@ -106,6 +108,7 @@ public function renderError(Request $request) {
    * Returns a render array of form elements and links for dialog.
    */
   public function dialog() {
+    $build['#cache'] = [];
     // Add two wrapper elements for testing non-modal dialogs. Modal dialogs use
     // the global drupal-modal wrapper by default.
     $build['dialog_wrappers'] = array('#markup' => '<div id="ajax-test-dialog-wrapper-1"></div><div id="ajax-test-dialog-wrapper-2"></div>');
diff --git a/core/modules/system/tests/modules/batch_test/src/Controller/BatchTestController.php b/core/modules/system/tests/modules/batch_test/src/Controller/BatchTestController.php
index 35e5bea..d83f8c1 100644
--- a/core/modules/system/tests/modules/batch_test/src/Controller/BatchTestController.php
+++ b/core/modules/system/tests/modules/batch_test/src/Controller/BatchTestController.php
@@ -23,6 +23,7 @@ public function testRedirect() {
     return array(
       'success' => array(
         '#markup' => 'Redirection successful.',
+        '#cache' => [],
       )
     );
   }
@@ -107,6 +108,7 @@ function testProgrammatic($value = 1) {
     return array(
       'success' => array(
         '#markup' => 'Got out of a programmatic batched form.',
+        '#cache' => [],
       )
     );
   }
diff --git a/core/modules/system/tests/modules/common_test/src/Controller/CommonTestController.php b/core/modules/system/tests/modules/common_test/src/Controller/CommonTestController.php
index 383be8f..03b3208 100644
--- a/core/modules/system/tests/modules/common_test/src/Controller/CommonTestController.php
+++ b/core/modules/system/tests/modules/common_test/src/Controller/CommonTestController.php
@@ -56,6 +56,7 @@ public function typeLinkActiveClass() {
           'set_active_class' => TRUE,
         ),
       ),
+      '#cache' => [],
     );
   }
 
diff --git a/core/modules/system/tests/modules/early_rendering_controller_test/src/EarlyRenderingTestController.php b/core/modules/system/tests/modules/early_rendering_controller_test/src/EarlyRenderingTestController.php
index d560f94..3ad2ba5 100644
--- a/core/modules/system/tests/modules/early_rendering_controller_test/src/EarlyRenderingTestController.php
+++ b/core/modules/system/tests/modules/early_rendering_controller_test/src/EarlyRenderingTestController.php
@@ -68,6 +68,7 @@ public function renderArray() {
         $elements = $this->earlyRenderContent();
         return $elements;
       }],
+      '#cache' => [],
     ];
   }
 
@@ -75,6 +76,7 @@ public function renderArrayEarly() {
     $render_array = $this->earlyRenderContent();
     return [
       '#markup' => $this->renderer->render($render_array),
+      '#cache' => [],
     ];
   }
 
diff --git a/core/modules/system/tests/modules/entity_test/src/Controller/EntityTestController.php b/core/modules/system/tests/modules/entity_test/src/Controller/EntityTestController.php
index 1d6e4e8..33eb14b 100644
--- a/core/modules/system/tests/modules/entity_test/src/Controller/EntityTestController.php
+++ b/core/modules/system/tests/modules/entity_test/src/Controller/EntityTestController.php
@@ -105,12 +105,16 @@ public function testAdmin() {
    *   A renderable array.
    */
   public function listReferencingEntities($entity_reference_field_name, $referenced_entity_type, $referenced_entity_id) {
+    $build = [
+      '#cache' => [],
+    ];
+
     // Early return if the referenced entity does not exist (or is deleted).
     $referenced_entity = $this->entityManager()
       ->getStorage($referenced_entity_type)
       ->load($referenced_entity_id);
     if ($referenced_entity === NULL) {
-      return array();
+      return $build;
     }
 
     $query = $this->entityQueryFactory
@@ -119,9 +123,10 @@ public function listReferencingEntities($entity_reference_field_name, $reference
     $entities = $this->entityManager()
       ->getStorage('entity_test')
       ->loadMultiple($query->execute());
-    return $this->entityManager()
+    $build += $this->entityManager()
       ->getViewBuilder('entity_test')
       ->viewMultiple($entities, 'full');
+    return $build;
   }
 
   /**
diff --git a/core/modules/system/tests/modules/menu_test/src/Controller/MenuTestController.php b/core/modules/system/tests/modules/menu_test/src/Controller/MenuTestController.php
index c5088e8..8a38b2a 100644
--- a/core/modules/system/tests/modules/menu_test/src/Controller/MenuTestController.php
+++ b/core/modules/system/tests/modules/menu_test/src/Controller/MenuTestController.php
@@ -73,7 +73,7 @@ public static function create(ContainerInterface $container) {
    *   A string that can be used for comparison.
    */
   public function menuTestCallback() {
-    return ['#markup' => 'This is the menuTestCallback content.'];
+    return ['#markup' => 'This is the menuTestCallback content.', '#cache' => []];
   }
 
 
@@ -114,7 +114,7 @@ public function themePage($inherited) {
     if ($inherited) {
       $output .= ' Theme negotiation inheritance is being tested.';
     }
-    return ['#markup' => $output];
+    return ['#markup' => $output, '#cache' => []];
   }
 
   /**
diff --git a/core/modules/system/tests/modules/menu_test/src/TestControllers.php b/core/modules/system/tests/modules/menu_test/src/TestControllers.php
index a7e39e4..c14f2d4 100644
--- a/core/modules/system/tests/modules/menu_test/src/TestControllers.php
+++ b/core/modules/system/tests/modules/menu_test/src/TestControllers.php
@@ -18,21 +18,21 @@ class TestControllers {
    * Returns page to be used as a login path.
    */
   public function testLogin() {
-    return ['#markup' => 'This is TestControllers::testLogin.'];
+    return ['#markup' => 'This is TestControllers::testLogin.', '#cache' => []];
   }
 
   /**
    * Prints out test data.
    */
   public function test1() {
-    return ['#markup' => 'test1'];
+    return ['#markup' => 'test1', '#cache' => []];
   }
 
   /**
    * Prints out test data.
    */
   public function test2() {
-    return ['#markup' => 'test2'];
+    return ['#markup' => 'test2', '#cache' => []];
   }
 
   /**
@@ -43,14 +43,14 @@ public function testSession() {
       $_SESSION['menu_test'] = 0;
     }
     $_SESSION['menu_test']++;
-    return ['#markup' => SafeMarkup::format('Session menu_test is @count', ['@count' => $_SESSION['menu_test']])];
+    return ['#markup' => SafeMarkup::format('Session menu_test is @count', ['@count' => $_SESSION['menu_test']]), '#cache' => []];
   }
 
   /**
    * Prints out test data.
    */
   public function testDerived() {
-    return ['#markup' => 'testDerived'];
+    return ['#markup' => 'testDerived', '#cache' => []];
   }
 
   /**
@@ -64,10 +64,10 @@ public function testDerived() {
    */
   public function testDefaults($placeholder = NULL) {
     if ($placeholder) {
-      return ['#markup' => SafeMarkup::format("Sometimes there is a placeholder: '@placeholder'.", array('@placeholder' => $placeholder))];
+      return ['#markup' => SafeMarkup::format("Sometimes there is a placeholder: '@placeholder'.", array('@placeholder' => $placeholder)), '#cache' => []];
     }
     else {
-      return ['#markup' => 'Sometimes there is no placeholder.'];
+      return ['#markup' => 'Sometimes there is no placeholder.', '#cache' => []];
     }
   }
 
@@ -77,6 +77,7 @@ public function testDefaults($placeholder = NULL) {
   public function testContextual() {
     return [
       '#markup' => 'testContextual',
+      '#cache' => [],
       'stuff' => [
         '#type' => 'contextual_links',
         '#contextual_links' => [
diff --git a/core/modules/system/tests/modules/paramconverter_test/src/TestControllers.php b/core/modules/system/tests/modules/paramconverter_test/src/TestControllers.php
index 327a8d5..76a20e3 100644
--- a/core/modules/system/tests/modules/paramconverter_test/src/TestControllers.php
+++ b/core/modules/system/tests/modules/paramconverter_test/src/TestControllers.php
@@ -17,15 +17,15 @@ class TestControllers {
 
   public function testUserNodeFoo(EntityInterface $user, NodeInterface $node, $foo) {
     $foo = is_object($foo) ? $foo->label() : $foo;
-    return ['#markup' => "user: {$user->label()}, node: {$node->label()}, foo: $foo"];
+    return ['#markup' => "user: {$user->label()}, node: {$node->label()}, foo: $foo", '#cache' => []];
   }
 
   public function testNodeSetParent(NodeInterface $node, NodeInterface $parent) {
-    return ['#markup' => "Setting '{$parent->label()}' as parent of '{$node->label()}'."];
+    return ['#markup' => "Setting '{$parent->label()}' as parent of '{$node->label()}'.", '#cache' => []];
   }
 
   public function testEntityLanguage(NodeInterface $node) {
-    $build = ['#markup' => $node->label()];
+    $build = ['#markup' => $node->label(), '#cache' => []];
     \Drupal::service('renderer')->addCacheableDependency($build, $node);
     return $build;
   }
diff --git a/core/modules/system/tests/modules/router_test_directory/src/TestContent.php b/core/modules/system/tests/modules/router_test_directory/src/TestContent.php
index dc2caca..a4e4eb9 100644
--- a/core/modules/system/tests/modules/router_test_directory/src/TestContent.php
+++ b/core/modules/system/tests/modules/router_test_directory/src/TestContent.php
@@ -43,7 +43,7 @@ public static function create(ContainerInterface $container) {
    * Provides example content for testing route enhancers.
    */
   public function test1() {
-    return ['#markup' => 'abcde'];
+    return ['#markup' => 'abcde', '#cache' => []];
   }
 
   /**
@@ -54,13 +54,13 @@ public function test1() {
    */
   public function test11() {
     $account = $this->currentUser();
-    return ['#markup' => $account->getUsername()];
+    return ['#markup' => $account->getUsername(), '#cache' => ['context' => 'user']];
   }
 
   public function testAccount(UserInterface $user) {
     $current_user_name = $this->currentUser()->getUsername();
     $this->currentUser()->setAccount($user);
-    return ['#markup' => $current_user_name . ':' . $user->getUsername()];
+    return ['#markup' => $current_user_name . ':' . $user->getUsername(), '#cache' => ['context' => 'user']];
   }
 
   /**
diff --git a/core/modules/system/tests/modules/router_test_directory/src/TestControllers.php b/core/modules/system/tests/modules/router_test_directory/src/TestControllers.php
index 40fad0b..6d06ed4 100644
--- a/core/modules/system/tests/modules/router_test_directory/src/TestControllers.php
+++ b/core/modules/system/tests/modules/router_test_directory/src/TestControllers.php
@@ -29,19 +29,19 @@ public function test1() {
   }
 
   public function test2() {
-    return ['#markup' => "test2"];
+    return ['#markup' => "test2", '#cache' => []];
   }
 
   public function test3($value) {
-    return ['#markup' => $value];
+    return ['#markup' => $value, '#cache' => []];
   }
 
   public function test4($value) {
-    return ['#markup' => $value];
+    return ['#markup' => $value, '#cache' => []];
   }
 
   public function test5() {
-    return ['#markup' => "test5"];
+    return ['#markup' => "test5", '#cache' => []];
   }
 
   public function test6() {
diff --git a/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php b/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php
index 3af2ea5..dc8aa54 100644
--- a/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php
+++ b/core/modules/system/tests/modules/session_test/src/Controller/SessionTestController.php
@@ -26,7 +26,7 @@ class SessionTestController extends ControllerBase {
   public function get() {
     return empty($_SESSION['session_test_value'])
       ? []
-      : ['#markup' => $this->t('The current value of the stored session variable is: %val', array('%val' => $_SESSION['session_test_value']))];
+      : ['#markup' => $this->t('The current value of the stored session variable is: %val', array('%val' => $_SESSION['session_test_value'])), '#cache' => []];
   }
 
   /**
@@ -42,7 +42,7 @@ public function getFromSessionObject(Request $request) {
     $value = $request->getSession()->get("session_test_key");
     return empty($value)
       ? []
-      : ['#markup' => $this->t('The current value of the stored session variable is: %val', array('%val' => $value))];
+      : ['#markup' => $this->t('The current value of the stored session variable is: %val', array('%val' => $value)), '#cache' => []];
   }
 
   /**
@@ -61,7 +61,7 @@ public function getId(Request $request) {
 
     $request->getSession()->save();
 
-    return ['#markup' => 'session_id:' . session_id() . "\n"];
+    return ['#markup' => 'session_id:' . session_id() . "\n", '#cache' => []];
   }
 
   /**
@@ -89,7 +89,7 @@ public function getIdFromCookie(Request $request) {
   public function set($test_value) {
     $_SESSION['session_test_value'] = $test_value;
 
-    return ['#markup' => $this->t('The current value of the stored session variable has been set to %val', array('%val' => $test_value))];
+    return ['#markup' => $this->t('The current value of the stored session variable has been set to %val', array('%val' => $test_value)), '#cache' => []];
   }
 
   /**
@@ -105,7 +105,7 @@ public function set($test_value) {
   public function noSet($test_value) {
     \Drupal::service('session_handler.write_safe')->setSessionWritable(FALSE);
     $this->set($test_value);
-    return ['#markup' => $this->t('session saving was disabled, and then %val was set', array('%val' => $test_value))];
+    return ['#markup' => $this->t('session saving was disabled, and then %val was set', array('%val' => $test_value)), '#cache' => []];
   }
 
   /**
@@ -131,7 +131,7 @@ public function setMessage() {
   public function setMessageButDontSave() {
     \Drupal::service('session_handler.write_safe')->setSessionWritable(FALSE);
     $this->setMessage();
-    return ['#markup' => ''];
+    return ['#markup' => '', '#cache' => []];
   }
 
   /**
@@ -141,7 +141,7 @@ public function setMessageButDontSave() {
    *   A notification message.
    */
   public function isLoggedIn() {
-    return ['#markup' => $this->t('User is logged in.')];
+    return ['#markup' => $this->t('User is logged in.'), '#cache' => []];
   }
 
   /**
diff --git a/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php b/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php
index 5e2835e..072a8ef 100644
--- a/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php
+++ b/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php
@@ -22,6 +22,7 @@ public function renderTitle() {
     $build = array();
     $build['#markup'] = 'Hello Drupal';
     $build['#title'] = 'Foo';
+    $build['#cache'] = [];
 
     return $build;
   }
@@ -35,6 +36,7 @@ public function renderTitle() {
   public function staticTitle() {
     $build = array();
     $build['#markup'] = 'Hello Drupal';
+    $build['#cache'] = [];
 
     return $build;
   }
@@ -72,6 +74,7 @@ public function controllerWithCache() {
   public function renderPage() {
     return array(
       '#markup' => 'Content',
+      '#cache' => [],
     );
   }
 
diff --git a/core/modules/system/tests/modules/test_page_test/src/Controller/TestPageTestController.php b/core/modules/system/tests/modules/test_page_test/src/Controller/TestPageTestController.php
index ca423c8..552dab8 100644
--- a/core/modules/system/tests/modules/test_page_test/src/Controller/TestPageTestController.php
+++ b/core/modules/system/tests/modules/test_page_test/src/Controller/TestPageTestController.php
@@ -24,6 +24,7 @@ public function testPage() {
           'test-setting' => 'azAZ09();.,\\\/-_{}',
         ],
       ],
+      '#cache' => [],
     ];
   }
 
