diff --git a/core/modules/user/config/user.mail.yml b/core/modules/user/config/user.mail.yml
new file mode 100644
index 0000000..edd78b9
--- /dev/null
+++ b/core/modules/user/config/user.mail.yml
@@ -0,0 +1,24 @@
+cancel_confirm:
+  body: "[user:name],\n\nA request to cancel your account has been made at [site:name].\n\nYou may now cancel your account on [site:url-brief] by clicking this link or copying and pasting it into your browser:\n\n[user:cancel-url]\n\nNOTE: The cancellation of your account is not reversible.\n\nThis link expires in one day and nothing will happen if it is not used.\n\n--  [site:name] team"
+  subject: 'Account cancellation request for [user:name] at [site:name]'
+password_reset:
+  body: "[user:name],\n\nA request to reset the password for your account has been made at [site:name].\n\nYou may now log in by clicking this link or copying and pasting it to your browser:\n\n[user:one-time-login-url]\n\nThis link can only be used once to log in and will lead you to a page where you can set your password. It expires after one day and nothing will happen if it's not used.\n\n--  [site:name] team"
+  subject: 'Replacement login information for [user:name] at [site:name]'
+register_admin_created:
+  body: "[user:name],\n\nA site administrator at [site:name] has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:\n\n[user:one-time-login-url]\n\nThis link can only be used once to log in and will lead you to a page where you can set your password.\n\nAfter setting your password, you will be able to log in at [site:login-url] in the future using:\n\nusername: [user:name]\npassword: Your password\n\n--  [site:name] team"
+  subject: 'An administrator created an account for you at [site:name]'
+register_no_approval_required:
+  body: "[user:name],\n\nThank you for registering at [site:name]. You may now log in by clicking this link or copying and pasting it to your browser:\n\n[user:one-time-login-url]\n\nThis link can only be used once to log in and will lead you to a page where you can set your password.\n\nAfter setting your password, you will be able to log in at [site:login-url] in the future using:\n\nusername: [user:name]\npassword: Your password\n\n--  [site:name] team"
+  subject: 'Account details for [user:name] at [site:name]'
+register_pending_approval:
+  body: "[user:name],\n\nThank you for registering at [site:name]. Your application for an account is currently pending approval. Once it has been approved, you will receive another e-mail containing information about how to log in, set your password, and other details.\n\n\n--  [site:name] team"
+  subject: 'Account details for [user:name] at [site:name] (pending admin approval)'
+status_activated:
+  body: "[user:name],\n\nYour account at [site:name] has been activated.\n\nYou may now log in by clicking this link or copying and pasting it into your browser:\n\n[user:one-time-login-url]\n\nThis link can only be used once to log in and will lead you to a page where you can set your password.\n\nAfter setting your password, you will be able to log in at [site:login-url] in the future using:\n\nusername: [user:name]\npassword: Your password\n\n--  [site:name] team"
+  subject: 'Account details for [user:name] at [site:name] (approved)'
+status_blocked:
+  body: "[user:name],\n\nYour account on [site:name] has been blocked.\n\n--  [site:name] team"
+  subject: 'Account details for [user:name] at [site:name] (blocked)'
+status_canceled:
+  body: "[user:name],\n\nYour account on [site:name] has been canceled.\n\n--  [site:name] team"
+  subject: 'Account details for [user:name] at [site:name] (canceled)'
diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc
index 3c39f24..f9b1c23 100644
--- a/core/modules/user/user.admin.inc
+++ b/core/modules/user/user.admin.inc
@@ -262,6 +262,8 @@ function user_admin_account_validate($form, &$form_state) {
  */
 function user_admin_settings($form, &$form_state) {
   $config = config('user.settings');
+  $mail_config = config('user.mail');
+
   // Settings for anonymous users.
   $form['anonymous_settings'] = array(
     '#type' => 'fieldset',
@@ -441,13 +443,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_admin_created']['user_mail_register_admin_created_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('register_admin_created_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('register_admin_created.subject'),
     '#maxlength' => 180,
   );
   $form['email_admin_created']['user_mail_register_admin_created_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('register_admin_created_body', NULL, array(), FALSE),
+    '#default_value' =>  $mail_config->get('register_admin_created.body'),
     '#rows' => 15,
   );
 
@@ -462,13 +464,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_pending_approval']['user_mail_register_pending_approval_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('register_pending_approval_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('register_pending_approval.subject'),
     '#maxlength' => 180,
   );
   $form['email_pending_approval']['user_mail_register_pending_approval_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('register_pending_approval_body', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('register_pending_approval.body'),
     '#rows' => 8,
   );
 
@@ -483,13 +485,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_no_approval_required']['user_mail_register_no_approval_required_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('register_no_approval_required_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('register_no_approval_required.subject'),
     '#maxlength' => 180,
   );
   $form['email_no_approval_required']['user_mail_register_no_approval_required_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('register_no_approval_required_body', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('register_no_approval_required.body'),
     '#rows' => 15,
   );
 
@@ -505,13 +507,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_password_reset']['user_mail_password_reset_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('password_reset_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('password_reset.subject'),
     '#maxlength' => 180,
   );
   $form['email_password_reset']['user_mail_password_reset_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('password_reset_body', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('password_reset.body'),
     '#rows' => 12,
   );
 
@@ -540,13 +542,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_activated']['settings']['user_mail_status_activated_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('status_activated_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('status_activated.subject'),
     '#maxlength' => 180,
   );
   $form['email_activated']['settings']['user_mail_status_activated_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('status_activated_body', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('status_activated.body'),
     '#rows' => 15,
   );
 
@@ -575,13 +577,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_blocked']['settings']['user_mail_status_blocked_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('status_blocked_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('status_blocked.subject'),
     '#maxlength' => 180,
   );
   $form['email_blocked']['settings']['user_mail_status_blocked_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('status_blocked_body', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('status_blocked.body'),
     '#rows' => 3,
   );
 
@@ -596,13 +598,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_cancel_confirm']['user_mail_cancel_confirm_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('cancel_confirm_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('cancel_confirm.subject'),
     '#maxlength' => 180,
   );
   $form['email_cancel_confirm']['user_mail_cancel_confirm_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('cancel_confirm_body', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('cancel_confirm.body'),
     '#rows' => 3,
   );
 
@@ -631,13 +633,13 @@ function user_admin_settings($form, &$form_state) {
   $form['email_canceled']['settings']['user_mail_status_canceled_subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => _user_mail_text('status_canceled_subject', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('status_canceled.subject'),
     '#maxlength' => 180,
   );
   $form['email_canceled']['settings']['user_mail_status_canceled_body'] = array(
     '#type' => 'textarea',
     '#title' => t('Body'),
-    '#default_value' => _user_mail_text('status_canceled_body', NULL, array(), FALSE),
+    '#default_value' => $mail_config->get('status_canceled.body'),
     '#rows' => 3,
   );
 
@@ -658,6 +660,24 @@ function user_admin_settings_submit($form, &$form_state) {
     ->set('notify.status_blocked', $form_state['values']['user_mail_status_blocked_notify'])
     ->set('notify.status_canceled', $form_state['values']['user_mail_status_canceled_notify'])
     ->save();
+  config('user.mail')
+    ->set('cancel_confirm.body', $form_state['values']['user_mail_cancel_confirm_body'])
+    ->set('cancel_confirm.subject', $form_state['values']['user_mail_cancel_confirm_subject'])
+    ->set('password_reset.body', $form_state['values']['user_mail_password_reset_body'])
+    ->set('password_reset.subject', $form_state['values']['user_mail_password_reset_subject'])
+    ->set('register_admin_created.body', $form_state['values']['user_mail_register_admin_created_body'])
+    ->set('register_admin_created.subject', $form_state['values']['user_mail_register_admin_created_subject'])
+    ->set('register_no_approval_required.body', $form_state['values']['user_mail_register_no_approval_required_body'])
+    ->set('register_no_approval_required.subject', $form_state['values']['user_mail_register_no_approval_required_subject'])
+    ->set('register_pending_approval.body', $form_state['values']['user_mail_register_pending_approval_body'])
+    ->set('register_pending_approval.subject', $form_state['values']['user_mail_register_pending_approval_subject'])
+    ->set('status_activated.body', $form_state['values']['user_mail_status_activated_body'])
+    ->set('status_activated.subject', $form_state['values']['user_mail_status_activated_subject'])
+    ->set('status_blocked.body', $form_state['values']['user_mail_status_blocked_body'])
+    ->set('status_blocked.subject', $form_state['values']['user_mail_status_blocked_subject'])
+    ->set('status_canceled.body', $form_state['values']['user_mail_status_canceled_body'])
+    ->set('status_canceled.subject', $form_state['values']['user_mail_status_canceled_subject'])
+    ->save();
 }
 
 /**
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index 67957da..f05d9b5 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -525,6 +525,32 @@ function user_update_8005() {
   );
   db_add_field('users', 'preferred_admin_langcode', $spec);
 }
+
+/**
+ * Moves user mail settings from variable to config.
+ *
+ * @ingroup config_upgrade
+ */
+function user_update_8006() {
+  update_variables_to_config('user.mail', array(
+    'register_admin_created_subject' => 'register_admin_created.subject',
+    'register_admin_created_body' => 'register_admin_created.body',
+    'register_pending_approval_subject' => 'register_pending_approval.subject',
+    'register_pending_approval_body' => 'register_pending_approval.body',
+    'register_no_approval_required_subject' => 'register_no_approval_required.subject',
+    'register_no_approval_required_body' => 'register_no_approval_required.body',
+    'password_reset_subject' => 'password_reset.subject',
+    'password_reset_body' => 'password_reset.body',
+    'status_activated_subject' => 'status_activated.subject',
+    'status_activated_body' => 'status_activated.body',
+    'status_blocked_subject' => 'status_blocked.subject',
+    'status_blocked_body' => 'status_blocked.body',
+    'cancel_confirm_subject' => 'cancel_confirm.subject',
+    'cancel_confirm_body' => 'cancel_confirm.body',
+    'status_canceled_subject' => 'status_canceled.subject',
+    'status_canceled_body' => 'status_canceled.body',
+  ));
+}
 /**
  * @} End of "addtogroup updates-7.x-to-8.x".
  */
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 9dd47da..fdeebd7 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -2124,172 +2124,28 @@ function user_build_content($account, $view_mode = 'full', $langcode = NULL) {
 function user_mail($key, &$message, $params) {
   $language = $message['language'];
   $variables = array('user' => $params['account']);
-  $message['subject'] .= _user_mail_text($key . '_subject', $language, $variables);
-  $message['body'][] = _user_mail_text($key . '_body', $language, $variables);
+  $message['subject'] .= _user_mail_text($key . '.subject', $language, $variables);
+  $message['body'][] = _user_mail_text($key . '.body', $language, $variables);
 }
 
 /**
  * Returns a mail string for a variable name.
  *
- * Used by user_mail() and the settings forms to retrieve strings.
+ * @param string $key
+ *   The config key that provides the mail text.
+ * @param object $language
+ *   A language object.
+ * @param array $variables
+ *   An array of token keys and values.
+ *
+ * @return
+ *   A string value containing the text for the user.mail config key.
  */
-function _user_mail_text($key, $language = NULL, $variables = array(), $replace = TRUE) {
+function _user_mail_text($key, $language = NULL, $variables = array()) {
   $langcode = isset($language) ? $language->langcode : NULL;
-
-  if ($admin_setting = variable_get('user_mail_' . $key, FALSE)) {
-    // An admin setting overrides the default string.
-    $text = $admin_setting;
-  }
-  else {
-    // No override, return default string.
-    switch ($key) {
-      case 'register_no_approval_required_subject':
-        $text = t('Account details for [user:name] at [site:name]', array(), array('langcode' => $langcode));
-        break;
-      case 'register_no_approval_required_body':
-        $text = t("[user:name],
-
-Thank you for registering at [site:name]. You may now log in by clicking this link or copying and pasting it to your browser:
-
-[user:one-time-login-url]
-
-This link can only be used once to log in and will lead you to a page where you can set your password.
-
-After setting your password, you will be able to log in at [site:login-url] in the future using:
-
-username: [user:name]
-password: Your password
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-
-      case 'register_admin_created_subject':
-        $text = t('An administrator created an account for you at [site:name]', array(), array('langcode' => $langcode));
-        break;
-      case 'register_admin_created_body':
-        $text = t("[user:name],
-
-A site administrator at [site:name] has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:
-
-[user:one-time-login-url]
-
-This link can only be used once to log in and will lead you to a page where you can set your password.
-
-After setting your password, you will be able to log in at [site:login-url] in the future using:
-
-username: [user:name]
-password: Your password
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-
-      case 'register_pending_approval_subject':
-      case 'register_pending_approval_admin_subject':
-        $text = t('Account details for [user:name] at [site:name] (pending admin approval)', array(), array('langcode' => $langcode));
-        break;
-      case 'register_pending_approval_body':
-        $text = t("[user:name],
-
-Thank you for registering at [site:name]. Your application for an account is currently pending approval. Once it has been approved, you will receive another e-mail containing information about how to log in, set your password, and other details.
-
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-      case 'register_pending_approval_admin_body':
-        $text = t("[user:name] has applied for an account.
-
-[user:edit-url]", array(), array('langcode' => $langcode));
-        break;
-
-      case 'password_reset_subject':
-        $text = t('Replacement login information for [user:name] at [site:name]', array(), array('langcode' => $langcode));
-        break;
-      case 'password_reset_body':
-        $text = t("[user:name],
-
-A request to reset the password for your account has been made at [site:name].
-
-You may now log in by clicking this link or copying and pasting it to your browser:
-
-[user:one-time-login-url]
-
-This link can only be used once to log in and will lead you to a page where you can set your password. It expires after one day and nothing will happen if it's not used.
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-
-      case 'status_activated_subject':
-        $text = t('Account details for [user:name] at [site:name] (approved)', array(), array('langcode' => $langcode));
-        break;
-      case 'status_activated_body':
-        $text = t("[user:name],
-
-Your account at [site:name] has been activated.
-
-You may now log in by clicking this link or copying and pasting it into your browser:
-
-[user:one-time-login-url]
-
-This link can only be used once to log in and will lead you to a page where you can set your password.
-
-After setting your password, you will be able to log in at [site:login-url] in the future using:
-
-username: [user:name]
-password: Your password
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-
-      case 'status_blocked_subject':
-        $text = t('Account details for [user:name] at [site:name] (blocked)', array(), array('langcode' => $langcode));
-        break;
-      case 'status_blocked_body':
-        $text = t("[user:name],
-
-Your account on [site:name] has been blocked.
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-
-      case 'cancel_confirm_subject':
-        $text = t('Account cancellation request for [user:name] at [site:name]', array(), array('langcode' => $langcode));
-        break;
-      case 'cancel_confirm_body':
-        $text = t("[user:name],
-
-A request to cancel your account has been made at [site:name].
-
-You may now cancel your account on [site:url-brief] by clicking this link or copying and pasting it into your browser:
-
-[user:cancel-url]
-
-NOTE: The cancellation of your account is not reversible.
-
-This link expires in one day and nothing will happen if it is not used.
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-
-      case 'status_canceled_subject':
-        $text = t('Account details for [user:name] at [site:name] (canceled)', array(), array('langcode' => $langcode));
-        break;
-      case 'status_canceled_body':
-        $text = t("[user:name],
-
-Your account on [site:name] has been canceled.
-
---  [site:name] team", array(), array('langcode' => $langcode));
-        break;
-    }
-  }
-
-  if ($replace) {
-    // We do not sanitize the token replacement, since the output of this
-    // replacement is intended for an e-mail message, not a web browser.
-    return token_replace($text, $variables, array('langcode' => $langcode, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
-  }
-
-  return $text;
+  // We do not sanitize the token replacement, since the output of this
+  // replacement is intended for an e-mail message, not a web browser.
+  return token_replace(config('user.mail')->get($key), $variables, array('langcode' => $langcode, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
 }
 
 /**
