diff --git a/core/lib/Drupal/Core/Template/TwigEnvironment.php b/core/lib/Drupal/Core/Template/TwigEnvironment.php
index e10a1a913a593fc6884b988068f7550e7b5d3153..86f5dc6b7eabd67d92a43cb6aa7452ed8948be07 100644
--- a/core/lib/Drupal/Core/Template/TwigEnvironment.php
+++ b/core/lib/Drupal/Core/Template/TwigEnvironment.php
@@ -21,6 +21,13 @@ class TwigEnvironment extends \Twig_Environment {
   protected $cache_object = NULL;
   protected $storage = NULL;
 
+  /**
+   * Static cache of template classes.
+   *
+   * @var array
+   */
+  protected $templateClasses;
+
   /**
    * Constructs a TwigEnvironment object and stores cache and storage
    * internally.
@@ -29,6 +36,8 @@ public function __construct(\Twig_LoaderInterface $loader = NULL, $options = arr
     // @todo Pass as arguments from the DIC.
     $this->cache_object = cache();
 
+    $this->templateClasses = array();
+
     parent::__construct($loader, $options);
   }
 
@@ -110,4 +119,19 @@ protected function storage() {
     return $this->storage;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getTemplateClass($name, $index = null) {
+    // We override this method to add caching because it gets called multiple
+    // times when the same template is used more than once. For example, a page
+    // rendering 50 nodes without any node template overrides will use the same
+    // node.html.twig for the output of each node and the same compiled class.
+    $cache_index = $name . (NULL === $index ? '' : '_' . $index);
+    if (!isset($this->templateClasses[$cache_index])) {
+      $this->templateClasses[$cache_index] = parent::getTemplateClass($name, $index);
+    }
+    return $this->templateClasses[$cache_index];
+  }
+
 }