diff --git a/core/CHANGELOG.txt b/core/CHANGELOG.txt
index 88ea516..85f9bc6 100644
--- a/core/CHANGELOG.txt
+++ b/core/CHANGELOG.txt
@@ -16,6 +16,8 @@ Drupal 8.0, xxxx-xx-xx (development version)
       * Profile
       * Trigger
 - Removed the Garland theme from core.
+- Removed backwards-compatibility with 'magic_quotes_gpc'/'magic_quotes_runtime'
+  PHP configuration settings. Both are required to be disabled.
 - Universally Unique IDentifier (UUID):
     * Support for generating and validating UUIDs.
 - JavaScript changes:
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 42de880..6bfa1a3 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -561,8 +561,13 @@ function drupal_environment_initialize() {
   // sites/default/default.settings.php contains more runtime settings.
   // The .htaccess file contains settings that cannot be changed at runtime.
 
-  // Don't escape quotes when reading files from the database, disk, etc.
-  ini_set('magic_quotes_runtime', '0');
+  // Deny execution with enabled "magic quotes" (both GPC and runtime).
+  if (get_magic_quotes_gpc() || get_magic_quotes_runtime()) {
+    header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');
+    print "PHP's 'magic_quotes_gpc' and 'magic_quotes_runtime' settings are not supported and must be disabled.";
+    exit;
+  }
+
   // Use session cookies, not transparent sessions that puts the session id in
   // the query string.
   ini_set('session.use_cookies', '1');
@@ -577,6 +582,10 @@ function drupal_environment_initialize() {
   // Set sane locale settings, to ensure consistent string, dates, times and
   // numbers handling.
   setlocale(LC_ALL, 'C');
+
+  // Detect string handling method.
+  require_once DRUPAL_ROOT . '/core/includes/unicode.inc';
+  unicode_check();
 }
 
 /**
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 19e0d59..1a4597a 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -1024,67 +1024,6 @@ function drupal_http_request($url, array $options = array()) {
  */
 
 /**
- * Strips slashes from a string or array of strings.
- *
- * Callback for array_walk() within fix_gpx_magic().
- *
- * @param $item
- *   An individual string or array of strings from superglobals.
- */
-function _fix_gpc_magic(&$item) {
-  if (is_array($item)) {
-    array_walk($item, '_fix_gpc_magic');
-  }
-  else {
-    $item = stripslashes($item);
-  }
-}
-
-/**
- * Strips slashes from $_FILES items.
- *
- * Callback for array_walk() within fix_gpc_magic().
- *
- * The tmp_name key is skipped keys since PHP generates single backslashes for
- * file paths on Windows systems.
- *
- * @param $item
- *   An item from $_FILES.
- * @param $key
- *   The key for the item within $_FILES.
- *
- * @see http://php.net/manual/features.file-upload.php#42280
- */
-function _fix_gpc_magic_files(&$item, $key) {
-  if ($key != 'tmp_name') {
-    if (is_array($item)) {
-      array_walk($item, '_fix_gpc_magic_files');
-    }
-    else {
-      $item = stripslashes($item);
-    }
-  }
-}
-
-/**
- * Fixes double-escaping caused by "magic quotes" in some PHP installations.
- *
- * @see _fix_gpc_magic()
- * @see _fix_gpc_magic_files()
- */
-function fix_gpc_magic() {
-  static $fixed = FALSE;
-  if (!$fixed && ini_get('magic_quotes_gpc')) {
-    array_walk($_GET, '_fix_gpc_magic');
-    array_walk($_POST, '_fix_gpc_magic');
-    array_walk($_COOKIE, '_fix_gpc_magic');
-    array_walk($_REQUEST, '_fix_gpc_magic');
-    array_walk($_FILES, '_fix_gpc_magic_files');
-  }
-  $fixed = TRUE;
-}
-
-/**
  * @defgroup validation Input validation
  * @{
  * Functions to validate user input.
@@ -5171,7 +5110,6 @@ function _drupal_bootstrap_full() {
   require_once DRUPAL_ROOT . '/' . variable_get('menu_inc', 'core/includes/menu.inc');
   require_once DRUPAL_ROOT . '/core/includes/tablesort.inc';
   require_once DRUPAL_ROOT . '/core/includes/file.inc';
-  require_once DRUPAL_ROOT . '/core/includes/unicode.inc';
   require_once DRUPAL_ROOT . '/core/includes/image.inc';
   require_once DRUPAL_ROOT . '/core/includes/form.inc';
   require_once DRUPAL_ROOT . '/core/includes/mail.inc';
@@ -5181,10 +5119,6 @@ function _drupal_bootstrap_full() {
   require_once DRUPAL_ROOT . '/core/includes/errors.inc';
   require_once DRUPAL_ROOT . '/core/includes/schema.inc';
 
-  // Detect string handling method
-  unicode_check();
-  // Undo magic quotes
-  fix_gpc_magic();
   // Load all enabled modules
   module_load_all();
   // Make sure all stream wrappers are registered.
diff --git a/core/includes/unicode.inc b/core/includes/unicode.inc
index 1450b43..c4ffca7 100644
--- a/core/includes/unicode.inc
+++ b/core/includes/unicode.inc
@@ -92,33 +92,34 @@ function unicode_check() {
  * not support mbstring function overloading. HTTP input/output conversion must
  * be disabled for similar reasons.
  *
- * @param $errors
- *   Whether to report any fatal errors with form_set_error().
+ * @return array
+ *   An indexed array containing:
+ *   - The available unicode library; one of UNICODE_MULTIBYTE,
+ *     UNICODE_SINGLEBYTE, or UNICODE_ERROR.
+ *   - The identifier of a failed multibyte extension check, if any. Otherwise,
+ *     an empty string.
  */
 function _unicode_check() {
-  // Ensure translations don't break at install time
-  $t = get_t();
-
-  // Check for mbstring extension
+  // Check for mbstring extension.
   if (!function_exists('mb_strlen')) {
-    return array(UNICODE_SINGLEBYTE, $t('Operations on Unicode strings are emulated on a best-effort basis. Install the <a href="@url">PHP mbstring extension</a> for improved Unicode support.', array('@url' => 'http://www.php.net/mbstring')));
+    return array(UNICODE_SINGLEBYTE, 'mb_strlen');
   }
 
-  // Check mbstring configuration
+  // Check mbstring configuration.
   if (ini_get('mbstring.func_overload') != 0) {
-    return array(UNICODE_ERROR, $t('Multibyte string function overloading in PHP is active and must be disabled. Check the php.ini <em>mbstring.func_overload</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+    return array(UNICODE_ERROR, 'mbstring.func_overload');
   }
   if (ini_get('mbstring.encoding_translation') != 0) {
-    return array(UNICODE_ERROR, $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.encoding_translation</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+    return array(UNICODE_ERROR, 'mbstring.encoding_translation');
   }
   if (ini_get('mbstring.http_input') != 'pass') {
-    return array(UNICODE_ERROR, $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_input</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+    return array(UNICODE_ERROR, 'mbstring.http_input');
   }
   if (ini_get('mbstring.http_output') != 'pass') {
-    return array(UNICODE_ERROR, $t('Multibyte string output conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_output</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+    return array(UNICODE_ERROR, 'mbstring.http_output');
   }
 
-  // Set appropriate configuration
+  // Set appropriate configuration.
   mb_internal_encoding('utf-8');
   mb_language('uni');
   return array(UNICODE_MULTIBYTE, '');
@@ -141,14 +142,33 @@ function unicode_requirements() {
     UNICODE_MULTIBYTE => REQUIREMENT_OK,
     UNICODE_ERROR => REQUIREMENT_ERROR,
   );
-  list($library, $description) = _unicode_check();
+  list($library, $failed_check) = _unicode_check();
 
   $requirements['unicode'] = array(
     'title' => $t('Unicode library'),
     'value' => $libraries[$library],
   );
-  if ($description) {
-    $requirements['unicode']['description'] = $description;
+  $t_args = array('@url' => 'http://www.php.net/mbstring');
+  switch ($failed_check) {
+    case 'mb_strlen':
+      $requirements['unicode']['description'] = $t('Operations on Unicode strings are emulated on a best-effort basis. Install the <a href="@url">PHP mbstring extension</a> for improved Unicode support.', $t_args);
+      break;
+
+    case 'mbstring.func_overload':
+      $requirements['unicode']['description'] = $t('Multibyte string function overloading in PHP is active and must be disabled. Check the php.ini <em>mbstring.func_overload</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring'));
+      break;
+
+    case 'mbstring.encoding_translation':
+      $requirements['unicode']['description'] = $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.encoding_translation</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', $t_args);
+      break;
+
+    case 'mbstring.http_input':
+      $requirements['unicode']['description'] = $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_input</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', $t_args);
+      break;
+
+    case 'mbstring.http_output':
+      $requirements['unicode']['description'] = $t('Multibyte string output conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_output</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', $t_args);
+      break;
   }
 
   $requirements['unicode']['severity'] = $severities[$library];
