diff --git a/core/modules/language/language.negotiation.inc b/core/modules/language/language.negotiation.inc
index e2f93220c1500e0edeb253d85473a2987131187d..7a8e99b4a44b5fd8738e30d5e42e5ebb0f88cd0b 100644
--- a/core/modules/language/language.negotiation.inc
+++ b/core/modules/language/language.negotiation.inc
@@ -1,5 +1,6 @@
 <?php
 
+use Drupal\Component\Utility\String;
 use \Symfony\Component\HttpFoundation\Request;
 
 /**
@@ -81,7 +82,8 @@ function language_from_interface() {
  *   A valid language code on success, FALSE otherwise.
  */
 function language_from_browser($languages) {
-  if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+  $accept_language = \Drupal::request()->server->get('HTTP_ACCEPT_LANGUAGE');
+  if (empty($accept_language)) {
     return FALSE;
   }
 
@@ -93,7 +95,7 @@ function language_from_browser($languages) {
   //   language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
   // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5"
   $browser_langcodes = array();
-  if (preg_match_all('@(?<=[, ]|^)([a-zA-Z-]+|\*)(?:;q=([0-9.]+))?(?:$|\s*,\s*)@', trim($_SERVER['HTTP_ACCEPT_LANGUAGE']), $matches, PREG_SET_ORDER)) {
+  if (preg_match_all('@(?<=[, ]|^)([a-zA-Z-]+|\*)(?:;q=([0-9.]+))?(?:$|\s*,\s*)@', trim($accept_language), $matches, PREG_SET_ORDER)) {
     // Load custom mappings to support browsers that are sending non standard
     // language codes.
     $mappings = language_get_browser_drupal_langcode_mappings();
@@ -250,10 +252,11 @@ function language_from_user_admin(array $languages, Request $request = NULL) {
  */
 function language_from_session($languages) {
   $param = \Drupal::config('language.negotiation')->get('session.parameter');
+  $query = \Drupal::request()->query;
 
   // Request parameter: we need to update the session parameter only if we have
   // an authenticated user.
-  if (isset($_GET[$param]) && isset($languages[$langcode = $_GET[$param]])) {
+  if ($query->has($param) && isset($languages[$langcode = $query->get($param)])) {
     $user = \Drupal::currentUser();
     if ($user->id()) {
       $_SESSION[$param] = $langcode;
@@ -302,7 +305,7 @@ function language_from_url($languages, Request $request = NULL) {
 
     case LANGUAGE_NEGOTIATION_URL_DOMAIN:
       // Get only the host, not the port.
-      $http_host= $_SERVER['HTTP_HOST'];
+      $http_host= \Drupal::request()->server->get('HTTP_HOST');
       if (strpos($http_host, ':') !== FALSE) {
         $http_host_tmp = explode(':', $http_host);
         $http_host = current($http_host_tmp);
@@ -412,7 +415,7 @@ function language_switcher_session($type, $path) {
   $languages = language_list();
   $links = array();
 
-  $query = $_GET;
+  $query = \Drupal::request()->query->all();
 
   foreach ($languages as $language) {
     $langcode = $language->id;
@@ -495,8 +498,14 @@ function language_url_rewrite_session(&$path, &$options) {
     $user = \Drupal::currentUser();
     if (!$user->id()) {
       $languages = language_list();
-      $query_param = check_plain(\Drupal::config('language.negotiation')->get('session.parameter'));
-      $query_value = isset($_GET[$query_param]) ? check_plain($_GET[$query_param]) : NULL;
+      $query_param = String::checkPlain(\Drupal::config('language.negotiation')->get('session.parameter'));
+      $query = \Drupal::request()->query;
+      if ($query->has($query_param)) {
+        $query_value = String::checkPlain(\Drupal::request()->query->get($query_param));
+      }
+      else {
+        return FALSE;
+      }
       $query_rewrite = isset($languages[$query_value]) && language_negotiation_method_enabled(LANGUAGE_NEGOTIATION_SESSION);
     }
     else {
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php
index a3694846f874940d088efbcc8f3a33177c41b1b3..6f5b33bdd97a66c3d7657b7675394f6e5a2342c9 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageBrowserDetectionUnitTest.php
@@ -154,7 +154,7 @@ function testLanguageFromBrowser() {
     );
 
     foreach ($test_cases as $accept_language => $expected_result) {
-      $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $accept_language;
+      \Drupal::request()->server->set('HTTP_ACCEPT_LANGUAGE', $accept_language);
       $result = language_from_browser($languages);
       $this->assertIdentical($result, $expected_result, format_string("Language selection '@accept-language' selects '@result', result = '@actual'", array('@accept-language' => $accept_language, '@result' => $expected_result, '@actual' => isset($result) ? $result : 'none')));
     }
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php
index 9bee36b314253fb7b125e9225c0267d8e7bf2fb4..7c037b5f64187f9579ab1937192d51a0c590a455 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php
@@ -342,8 +342,9 @@ function testUILanguageNegotiation() {
         'http_header' => $http_header_browser_fallback,
         'message' => 'URL (DOMAIN) > DEFAULT: default domain should get default language',
       ),
-      // Language domain specific URL, we set the $_SERVER['HTTP_HOST'] in
-      // \Drupal\language_test\LanguageTestManager to simulate this.
+      // Language domain specific URL, we set the 'HTTP_HOST' property of
+      // \Drupal::request()->server in \Drupal\language_test\LanguageTestManager
+      // to simulate this.
       array(
         'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_SELECTED),
         'language_negotiation_url_part' => LANGUAGE_NEGOTIATION_URL_DOMAIN,
diff --git a/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestManager.php b/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestManager.php
index 991755e41d16e2b59f58e6432b7ff048a4d2a679..3c460b658a0271ad2d2d7c07fa1f0db85d9a005a 100644
--- a/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestManager.php
+++ b/core/modules/language/tests/language_test/lib/Drupal/language_test/LanguageTestManager.php
@@ -20,7 +20,7 @@ class LanguageTestManager extends LanguageManager {
    */
   public function init() {
     if ($test_domain = \Drupal::state()->get('language_test.domain')) {
-      $_SERVER['HTTP_HOST'] = $test_domain;
+      \Drupal::request()->server->set('HTTP_HOST', $test_domain);
     }
     return parent::init();
   }