diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 5579dbf..81d86ae 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -27,6 +27,7 @@
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Routing\Route;
 
+use GuzzleHttp\Exception\BadResponseException;
 use GuzzleHttp\Exception\RequestException;
 
 /**
@@ -67,6 +68,21 @@
 const INSTALL_TASK_RUN_IF_NOT_COMPLETED = 3;
 
 /**
+ * HTTP request result: file not found.
+ */
+const INSTALL_HTTP_NOT_FOUND = 'not found';
+
+/**
+ * HTTP request result: CURL response error. Possibly no internet connection.
+ */
+const INSTALL_HTTP_OFFLINE = 'offline';
+
+/**
+ * HTTP request result: translation file could not be downloaded.
+ */
+const INSTALL_HTTP_NOT_DOWNLOADED = 'not downloaded';
+
+/**
  * Installs Drupal either interactively or via an array of passed-in settings.
  *
  * The Drupal installation happens in a series of steps, which may be spread
@@ -1344,14 +1360,21 @@ function install_retrieve_file($uri, $destination) {
   try {
     $request = \Drupal::httpClient()->get($uri, array('headers' => array('Accept' => 'text/plain')));
     $data = $request->getBody(TRUE);
-    if (empty($data)) {
-      return FALSE;
-    }
+  }
+  catch (BadResponseException $e) {
+    // HTTP 4xx and 5xx errors.
+    return INSTALL_HTTP_NOT_FOUND;
   }
   catch (RequestException $e) {
-    return FALSE;
+    // Curl errors, no HTTP response, probably offline.
+    return INSTALL_HTTP_OFFLINE;
+  }
+  if (file_put_contents($path, $data)) {
+    return TRUE;
+  }
+  else {
+    return INSTALL_HTTP_NOT_DOWNLOADED;
   }
-  return file_put_contents($path, $data) !== FALSE;
 }
 
 /**
@@ -1368,8 +1391,13 @@ function install_check_localization_server($uri) {
     \Drupal::httpClient()->head($uri);
     return TRUE;
   }
+  catch (BadResponseException $e) {
+    // HTTP 4xx and 5xx errors.
+    return INSTALL_HTTP_NOT_FOUND;
+  }
   catch (RequestException $e) {
-    return FALSE;
+    // Curl errors, no HTTP response, probably offline.
+    return INSTALL_HTTP_OFFLINE;
   }
 }
 
@@ -1889,6 +1917,7 @@ function install_check_translations($langcode, $server_pattern) {
   $translations_directory = conf_path() . '/files/translations';
   $translations_directory_exists = FALSE;
   $translation_available = FALSE;
+  $server_available = FALSE;
   $online = FALSE;
 
   // First attempt to create or make writable the files directory.
@@ -1931,15 +1960,27 @@ function install_check_translations($langcode, $server_pattern) {
   // translation server can be reached. In other words, check if we are online
   // and have an internet connection.
   foreach ($translation_urls as $translation_url) {
-    if ($translation_available = install_check_localization_server($translation_url)) {
-      $online = TRUE;
-      break;
+    if ($result = install_check_localization_server($translation_url)) {
+      switch ($result) {
+        case ($result === TRUE):
+          $translation_available = TRUE;
+          $server_available = TRUE;
+          $online = TRUE;
+          break 2;
+
+        case INSTALL_HTTP_NOT_FOUND:
+          $online = TRUE;
+          break;
+
+        case INSTALL_HTTP_OFFLINE:
+          break 2;
+      }
     }
   }
-  if (!$translation_available) {
-    if (install_check_localization_server($server_url)) {
-      $online = TRUE;
-    }
+  // No translation file was be found. Check if the server is available.
+  if ($online && !$translation_available) {
+    $result = install_check_localization_server($server_url);
+    $server_available = $result === TRUE;
   }
 
   // If the translations directory does not exists, throw an error.
@@ -1982,40 +2023,59 @@ function install_check_translations($langcode, $server_pattern) {
     }
   }
 
-  // If the translations server can not be contacted, throw an error.
+  // If we failed to complete the http request, throw an error.
   if (!$online) {
     $requirements['online'] = array(
       'title'       => t('Internet'),
-      'value'       => t('The translation server is offline.'),
+      'value'       => t('Failed to connect.'),
       'severity'    => REQUIREMENT_ERROR,
-      'description' => t('The installer requires to contact the translation server to download a translation file. Check your internet connection and verify that your website can reach the translation server at <a href="!server_url">!server_url</a>.', array('!server_url' => $server_url)),
+      'description' => t('The installer failed to connect to the translation server. Verify your internet connection and verify that your website can contact the translation server at <a href="!server_url">!server_url</a>. You can also <a href="!url">install in English</a> and get your language later.', array('!server_url' => $server_url, '!url' => check_url($_SERVER['SCRIPT_NAME']))),
     );
   }
   else {
     $requirements['online'] = array(
       'title'       => t('Internet'),
-      'value'       => t('The translation server is online.'),
+      'value'       => t('The internet connection is working.'),
     );
     // If translation file is not found at the translation server, throw an
     // error.
-    if (!$translation_available) {
-      $requirements['translation available'] = array(
-        'title'       => t('Translation'),
-        'value'       => t('The %language translation is not available.', array('%language' => $language)),
+    // If the translations server can not be contacted, throw an error.
+    if (!$server_available) {
+      $requirements['server available'] = array(
+        'title'       => t('Internet'),
+        'value'       => t('Failed to contact the translation server.'),
         'severity'    => REQUIREMENT_ERROR,
-        'description' => t('The %language translation file is not available at the translation server. <a href="!url">Choose a different language</a> or select English and translate your website later.', array('%language' => $language, '!url' => check_url($_SERVER['SCRIPT_NAME']))),
+        'description' => t('The installer failed to connect to the translation server. Verify that your website can contact the translation server at <a href="!server_url">!server_url</a>. This fault may be caused by firewall or proxy settings. You can also <a href="!url">install in English</a> and get your language later.', array('!server_url' => $server_url, '!url' => check_url($_SERVER['SCRIPT_NAME']))),
       );
     }
     else {
-      $requirements['translation available'] = array(
-        'title'       => t('Translation'),
-        'value'       => t('The %language translation is available.', array('%language' => $language)),
+      $requirements['server available'] = array(
+        'title'       => t('Internet'),
+        'value'       => t('The translation server is online.'),
       );
+      // If translation file is not found at the translation server, throw an
+      // error.
+      if (!$translation_available) {
+        $requirements['translation available'] = array(
+          'title'       => t('Translation'),
+          'value'       => t('The %language translation is not available.', array('%language' => $language)),
+          'severity'    => REQUIREMENT_ERROR,
+          'description' => t('The %language translation file is not available at the translation server. <a href="!url">Choose a different language</a> or select English and get your language later.', array('%language' => $language, '!url' => check_url($_SERVER['SCRIPT_NAME']))),
+        );
+      }
+      else {
+        $requirements['translation available'] = array(
+          'title'       => t('Translation'),
+          'value'       => t('The %language translation is available.', array('%language' => $language)),
+        );
+      }
     }
   }
 
   if ($translations_directory_exists && $readable && $writable && $translation_available) {
-    $translation_downloaded = install_retrieve_file($translation_url, $translations_directory);
+    $result = install_retrieve_file($translation_url, $translations_directory);
+
+    $translation_downloaded = $result === TRUE;
 
     if (!$translation_downloaded) {
       $requirements['translation downloaded'] = array(
