diff --git a/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
index 251b920..71aaed4 100644
--- a/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
@@ -118,6 +118,7 @@ public function onRespond(FilterResponseEvent $event) {
     // Expose the cache contexts and cache tags associated with this page in a
     // X-Drupal-Cache-Contexts and X-Drupal-Cache-Tags header respectively.
     if ($response instanceof CacheableResponseInterface) {
+      // @todo Merge in the cache contexts from the upcasted parameters.
       $response_cacheability = $response->getCacheableMetadata();
       $response->headers->set('X-Drupal-Cache-Tags', implode(' ', $response_cacheability->getCacheTags()));
       $response->headers->set('X-Drupal-Cache-Contexts', implode(' ', $this->cacheContextsManager->optimizeTokens($response_cacheability->getCacheContexts())));
diff --git a/core/lib/Drupal/Core/ParamConverter/CacheContextAwareParamConverterInterface.php b/core/lib/Drupal/Core/ParamConverter/CacheContextAwareParamConverterInterface.php
new file mode 100644
index 0000000..a6cd07b
--- /dev/null
+++ b/core/lib/Drupal/Core/ParamConverter/CacheContextAwareParamConverterInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\ParamConverter\CacheContextAwareParamConverterInterface.
+ */
+
+namespace Drupal\Core\ParamConverter;
+
+/**
+ * Interface for ParamConverters that can affect cache contexts.
+ */
+interface CacheContextAwareParamConverterInterface {
+
+  /**
+   * Returns cache contexts that are affected by the ParamConverter.
+   *
+   * @param mixed $value
+   *   The raw value.
+   * @param mixed $definition
+   *   The parameter definition provided in the route options.
+   * @param string $name
+   *   The name of the parameter.
+   * @param array $defaults
+   *   The route defaults array.
+   *
+   * @return array
+   *   The cache contexts.
+   */
+  public function contexts($value, $definition, $name, array $defaults);
+
+}
diff --git a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
index 172b27b..b0c4dc1 100644
--- a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
+++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
@@ -41,7 +41,7 @@
  *         type: entity:{entity_type}
  * @endcode
  */
-class EntityConverter implements ParamConverterInterface {
+class EntityConverter implements ParamConverterInterface, CacheContextAwareParamConverterInterface {
 
   /**
    * Entity manager which performs the upcasting in the end.
@@ -121,4 +121,11 @@ protected function getEntityTypeFromDefaults($definition, $name, array $defaults
     return $entity_type_id;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function contexts($value, $definition, $name, array $defaults) {
+    // TODO: Implement contexts() method.
+  }
+
 }
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
index 997749f..552f29d 100644
--- a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
@@ -81,6 +81,10 @@ public function setRouteParameterConverters(RouteCollection $routes) {
    * {@inheritdoc}
    */
   public function convert(array $defaults) {
+    // Initialize the cache contexts.
+    // @todo This should be set as a default on the Route.
+    $defaults['_cache_contexts'] = isset($defaults['_cache_contexts']) ? $defaults['_cache_contexts'] : [];
+
     /** @var $route \Symfony\Component\Routing\Route */
     $route = $defaults[RouteObjectInterface::ROUTE_OBJECT];
 
@@ -103,10 +107,18 @@ public function convert(array $defaults) {
 
       // If a converter returns NULL it means that the parameter could not be
       // converted.
-      $defaults[$name] = $this->getConverter($definition['converter'])->convert($defaults[$name], $definition, $name, $defaults);
+      $converter = $this->getConverter($definition['converter']);
+      $defaults[$name] = $converter->convert($defaults[$name], $definition, $name, $defaults);
       if (!isset($defaults[$name])) {
         throw new ParamNotConvertedException(sprintf('The "%s" parameter was not converted for the path "%s" (route name: "%s")', $name, $route->getPath(), $defaults[RouteObjectInterface::ROUTE_NAME]));
       }
+
+      // Keep track of any affected cache contexts.
+      if ($converter instanceof CacheContextAwareParamConverterInterface) {
+        if ($contexts = $converter->contexts($defaults[$name], $definition, $name, $defaults)) {
+          $defaults['_cache_contexts'] = array_merge($defaults['_cache_contexts'], $contexts);
+        }
+      }
     }
 
     return $defaults;
diff --git a/core/modules/language/src/LanguageConverter.php b/core/modules/language/src/LanguageConverter.php
index fdfb58a2..440dfad 100644
--- a/core/modules/language/src/LanguageConverter.php
+++ b/core/modules/language/src/LanguageConverter.php
@@ -7,14 +7,16 @@
 
 namespace Drupal\language;
 
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\ParamConverter\CacheContextAwareParamConverterInterface;
 use Drupal\Core\ParamConverter\ParamConverterInterface;
 use Symfony\Component\Routing\Route;
 
 /**
  * Converts parameters for upcasting entity IDs to full objects.
  */
-class LanguageConverter implements ParamConverterInterface {
+class LanguageConverter implements ParamConverterInterface, CacheContextAwareParamConverterInterface {
 
   /**
    * The language manager.
@@ -50,4 +52,16 @@ public function applies($definition, $name, Route $route) {
     return (!empty($definition['type']) && $definition['type'] == 'language');
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function contexts($value, $definition, $name, array $defaults) {
+    if (!empty($value)) {
+      // If the value is set it is already upcasted to a LanguageInterface
+      // object by $this->convert().
+      /* @var LanguageInterface $value */
+      return [$value->getId()];
+    }
+  }
+
 }
