diff --git a/core/lib/Drupal/Core/PathProcessor/PathProcessorManager.php b/core/lib/Drupal/Core/PathProcessor/PathProcessorManager.php
index 2a3181ee2e..a720c4896a 100644
--- a/core/lib/Drupal/Core/PathProcessor/PathProcessorManager.php
+++ b/core/lib/Drupal/Core/PathProcessor/PathProcessorManager.php
@@ -65,10 +65,14 @@ public function addInbound(InboundPathProcessorInterface $processor, $priority =
    * {@inheritdoc}
    */
   public function processInbound($path, Request $request) {
+    \Drupal::requestStack()->push(Request::create($path));
+
     $processors = $this->getInbound();
     foreach ($processors as $processor) {
       $path = $processor->processInbound($path, $request);
     }
+
+    \Drupal::requestStack()->pop();
     return $path;
   }
 
@@ -104,10 +108,14 @@ public function addOutbound(OutboundPathProcessorInterface $processor, $priority
    * {@inheritdoc}
    */
   public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
+    \Drupal::requestStack()->push(Request::create($path));
+
     $processors = $this->getOutbound();
     foreach ($processors as $processor) {
       $path = $processor->processOutbound($path, $options, $request, $bubbleable_metadata);
     }
+
+    \Drupal::requestStack()->pop();
     return $path;
   }
 
diff --git a/core/modules/language/src/ConfigurableLanguageManager.php b/core/modules/language/src/ConfigurableLanguageManager.php
index 13079f8554..673dd9feb9 100644
--- a/core/modules/language/src/ConfigurableLanguageManager.php
+++ b/core/modules/language/src/ConfigurableLanguageManager.php
@@ -208,15 +208,21 @@ public function saveLanguageTypesConfiguration(array $values) {
    * {@inheritdoc}
    */
   public function getCurrentLanguage($type = LanguageInterface::TYPE_INTERFACE) {
-    if (!isset($this->negotiatedLanguages[$type])) {
+    $currentRequest = $this->requestStack->getCurrentRequest();
+    $requestKey = $currentRequest->getPathInfo() . $currentRequest->getQueryString();
+
+    if (
+      !isset($this->negotiatedLanguages[$requestKey]) ||
+      !isset($this->negotiatedLanguages[$requestKey][$type])
+    ) {
       // Ensure we have a valid value for this language type.
-      $this->negotiatedLanguages[$type] = $this->getDefaultLanguage();
+      $this->negotiatedLanguages[$requestKey][$type] = $this->getDefaultLanguage();
 
       if ($this->negotiator && $this->isMultilingual()) {
         if (!$this->initializing) {
           $this->initializing = TRUE;
           $negotiation = $this->negotiator->initializeType($type);
-          $this->negotiatedLanguages[$type] = reset($negotiation);
+          $this->negotiatedLanguages[$requestKey][$type] = reset($negotiation);
           $this->negotiatedMethods[$type] = key($negotiation);
           $this->initializing = FALSE;
         }
@@ -232,13 +238,16 @@ public function getCurrentLanguage($type = LanguageInterface::TYPE_INTERFACE) {
       }
     }
 
-    return $this->negotiatedLanguages[$type];
+    return $this->negotiatedLanguages[$requestKey][$type];
   }
 
   /**
    * {@inheritdoc}
    */
   public function reset($type = NULL) {
+    $currentRequest = $this->requestStack->getCurrentRequest();
+    $requestKey = $currentRequest->getPathInfo() . $currentRequest->getQueryString();
+
     if (!isset($type)) {
       $this->initialized = FALSE;
       $this->negotiatedLanguages = [];
@@ -250,9 +259,9 @@ public function reset($type = NULL) {
         $this->negotiator->reset();
       }
     }
-    elseif (isset($this->negotiatedLanguages[$type])) {
-      unset($this->negotiatedLanguages[$type]);
-      unset($this->negotiatedMethods[$type]);
+    elseif (isset($this->negotiatedLanguages[$requestKey][$type])) {
+      unset($this->negotiatedLanguages[$requestKey][$type]);
+      unset($this->negotiatedMethods[$requestKey][$type]);
     }
     return $this;
   }
@@ -480,7 +489,12 @@ public function getStandardLanguageListWithoutConfigured() {
    * {@inheritdoc}
    */
   public function getNegotiatedLanguageMethod($type = LanguageInterface::TYPE_INTERFACE) {
-    if (isset($this->negotiatedLanguages[$type]) && isset($this->negotiatedMethods[$type])) {
+    $currentRequest = $this->requestStack->getCurrentRequest();
+    $requestKey = $currentRequest->getPathInfo() . $currentRequest->getQueryString();
+
+    if (isset($this->negotiatedLanguages[$requestKey]) &&
+      isset($this->negotiatedLanguages[$requestKey][$type]) &&
+      isset($this->negotiatedMethods[$type])) {
       return $this->negotiatedMethods[$type];
     }
   }
diff --git a/core/tests/Drupal/KernelTests/Core/PathProcessor/PathProcessorTest.php b/core/tests/Drupal/KernelTests/Core/PathProcessor/PathProcessorTest.php
new file mode 100644
index 0000000000..61a292640a
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/PathProcessor/PathProcessorTest.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Drupal\KernelTests\Core\PathProcessor;
+
+use Drupal\Core\PathProcessor\PathProcessorManager;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\Tests\language\Kernel\LanguageTestBase;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Tests the path processors as a whole.
+ *
+ * @group Path
+ */
+class PathProcessorTest extends LanguageTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['path', 'language', 'user'];
+
+  /**
+   * Setup for the test.
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Add a language.
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+
+    // Enable language negotiation.
+    \Drupal::configFactory()
+      ->getEditable('language.negotiation')
+      ->set('url', [
+        'source' => 'path_prefix',
+        'prefixes' => [
+          'en' => '',
+          'fr' => 'fr'
+        ]
+      ])
+      ->save();
+
+    // Add language types configuration.
+    \Drupal::configFactory()
+      ->getEditable('language.types')
+      ->set('negotiation.language_interface.enabled.language-url', 1)
+      ->set('configurable', ['language_interface'])
+      ->set('all', ['language_interface', 'language_content', 'language_url'])
+      ->save();
+
+    // This is required to register the Language path processor.
+    // @todo Find better way.
+    drupal_flush_all_caches();
+  }
+
+  /**
+   * Tests whether the processor converts a path alias in different language.
+   */
+  public function testAliasInDifferentLanguageConverted() {
+    /** @var PathProcessorManager $pathProcessor */
+    $pathProcessor = \Drupal::service('path_processor_manager');
+
+    // Test that the language path processor works.
+    $langAlias = '/fr/user/login';
+    $request = Request::create($langAlias);
+    $processedPath = $pathProcessor->processInbound($langAlias, $request);
+
+    $this->assertEquals('/user/login', $processedPath, 'The language prefix was removed.');
+
+    $alias = '/some-alias';
+    $path = '/some-path';
+
+    // Create a new alias.
+    \Drupal::service('path.alias_storage')->save($alias, $path, 'fr');
+
+    // Attempt to process the alias and convert it.
+    $langAlias = '/fr' . $alias;
+    $request = Request::create($langAlias);
+    $processedPath = $pathProcessor->processInbound($langAlias, $request);
+
+    $this->assertEquals($path, $processedPath, 'The alias was converted to the real path.');
+  }
+
+}
