diff --git a/core/includes/common.inc b/core/includes/common.inc
index 7ba47fba679d26446d8e8e871ecbd766be84ea29..ba508fd31daf7f6b455502b2805a926826bfa594 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -5174,7 +5174,7 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1)
   // distribution we need to include the profile of the parent site (in which
   // test runs are triggered).
   if (drupal_valid_test_ua()) {
-    $testing_profile = variable_get('simpletest_parent_profile', FALSE);
+    $testing_profile = config('simpletest.settings')->get('parent_profile');
     if ($testing_profile && $testing_profile != $profile) {
       $profiles[] = $testing_profile;
     }
diff --git a/core/modules/simpletest/config/simpletest.settings.yml b/core/modules/simpletest/config/simpletest.settings.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1fe90563844c8c8af2d9fe74210257694419625b
--- /dev/null
+++ b/core/modules/simpletest/config/simpletest.settings.yml
@@ -0,0 +1,8 @@
+clear_results: '1'
+httpauth:
+    method: '1'
+    password: ''
+    username: ''
+maximum_redirects: '5'
+parent_profile: ''
+verbose: '1'
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
index cccd0112f7d79c76470d67c7102cccb54debdcfe..a9c4c41eb3f7e244926f2f6cdc1d7902559d0089 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
@@ -529,8 +529,10 @@ protected function verbose($message) {
    *   methods during debugging.
    */
   public function run(array $methods = array()) {
+    $simpletest_config = config('simpletest.settings');
+
     $class = get_class($this);
-    if (variable_get('simpletest_verbose', TRUE)) {
+    if ($simpletest_config->get('verbose')) {
       // Initialize verbose debugging.
       $this->verbose = TRUE;
       $this->verboseDirectory = variable_get('file_public_path', conf_path() . '/files') . '/simpletest/verbose';
@@ -541,13 +543,16 @@ public function run(array $methods = array()) {
     }
     // HTTP auth settings (<username>:<password>) for the simpletest browser
     // when sending requests to the test site.
-    $this->httpauth_method = variable_get('simpletest_httpauth_method', CURLAUTH_BASIC);
-    $username = variable_get('simpletest_httpauth_username', NULL);
-    $password = variable_get('simpletest_httpauth_password', NULL);
-    if ($username && $password) {
+    $this->httpauth_method = (int) $simpletest_config->get('httpauth.method');
+    $username = $simpletest_config->get('httpauth.username');
+    $password = $simpletest_config->get('httpauth.password');
+    if (!empty($username) && !empty($password)) {
       $this->httpauth_credentials = $username . ':' . $password;
     }
 
+    // Maximum redirects setting for the simpletest browser.
+    $this->maximumRedirects = $simpletest_config->get('maximum_redirects');
+
     set_error_handler(array($this, 'errorHandler'));
     // Iterate through all the methods in this class, unless a specific list of
     // methods to run was passed.
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/Tests/SimpleTestTest.php b/core/modules/simpletest/lib/Drupal/simpletest/Tests/SimpleTestTest.php
index 938054a75b63c10d22694bf9a8c3ba1ff52c682a..7fddae43bdd2ed63d4e65077a49a137f3a0c8e18 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/Tests/SimpleTestTest.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/Tests/SimpleTestTest.php
@@ -76,7 +76,7 @@ function testInternalBrowser() {
         'name' => $user->name,
         'pass' => $user->pass_raw
       );
-      variable_set('simpletest_maximum_redirects', 1);
+      $this->maximumRedirects = 1;
       $this->drupalPost('user', $edit, t('Log in'), array(
         'query' => array('destination' => 'user/logout'),
       ));
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
index ae2626fac01f2699424d745fa79337019064a8a5..9ead9264b139f2c141469cbcc6ed30dd08a7d68b 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
@@ -621,11 +621,11 @@ protected function setUp() {
     variable_set('file_private_path', $this->private_files_directory);
     variable_set('file_temporary_path', $this->temp_files_directory);
 
-    // Set the 'simpletest_parent_profile' variable to add the parent profile's
+    // Set 'parent_profile' of simpletest to add the parent profile's
     // search path to the child site's search paths.
     // @see drupal_system_listing()
     // @todo This may need to be primed like 'install_profile' above.
-    variable_set('simpletest_parent_profile', $this->originalProfile);
+    config('simpletest.settings')->set('parent_profile', $this->originalProfile)->save();
 
     // Include the testing profile.
     variable_set('install_profile', $this->profile);
@@ -917,7 +917,7 @@ protected function curlExec($curl_options, $redirect = FALSE) {
     // to prevent fragments being sent to the web server as part
     // of the request.
     // TODO: Remove this for Drupal 8, since fixed in curl 7.20.0.
-    if (in_array($status, array(300, 301, 302, 303, 305, 307)) && $this->redirect_count < variable_get('simpletest_maximum_redirects', 5)) {
+    if (in_array($status, array(300, 301, 302, 303, 305, 307)) && $this->redirect_count < $this->maximumRedirects) {
       if ($this->drupalGetHeader('location')) {
         $this->redirect_count++;
         $curl_options = array();
diff --git a/core/modules/simpletest/simpletest.install b/core/modules/simpletest/simpletest.install
index 23db4dc7f679a5d96e60252848b1adfc5b55cabd..821a0db9f3ee65af588a5b12a8118060a8c4a2f4 100644
--- a/core/modules/simpletest/simpletest.install
+++ b/core/modules/simpletest/simpletest.install
@@ -170,13 +170,21 @@ function simpletest_uninstall() {
   drupal_load('module', 'simpletest');
   simpletest_clean_database();
 
-  // Remove settings variables.
-  variable_del('simpletest_httpauth_method');
-  variable_del('simpletest_httpauth_username');
-  variable_del('simpletest_httpauth_password');
-  variable_del('simpletest_clear_results');
-  variable_del('simpletest_verbose');
-
   // Remove generated files.
   file_unmanaged_delete_recursive('public://simpletest');
 }
+
+/**
+ * Move simpletest settings from variables to config.
+ */
+function simpletest_update_8000() {
+  update_variables_to_config('simpletest.settings', array(
+    'simpletest_clear_results' => 'clear_results',
+    'simpletest_httpauth_method' => 'httpauth.method',
+    'simpletest_httpauth_password' => 'httpauth.password',
+    'simpletest_httpauth_username' => 'httpauth.username',
+    'simpletest_maximum_redirects' => 'maximum_redirects',
+    'simpletest_parent_profile' => 'parent_profile',
+    'simpletest_verbose' => 'verbose',
+  ));
+}
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index 413891695fc895f336b2ad72cbc16cc2d33d0093..0fd025e32933f0f9a878a23a1927bc50661cb568 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -460,7 +460,7 @@ function simpletest_generate_file($filename, $width, $lines, $type = 'binary-tex
 function simpletest_clean_environment() {
   simpletest_clean_database();
   simpletest_clean_temporary_directories();
-  if (variable_get('simpletest_clear_results', TRUE)) {
+  if (config('simpletest.settings')->get('clear_results')) {
     $count = simpletest_clean_results_table();
     drupal_set_message(format_plural($count, 'Removed 1 test result.', 'Removed @count test results.'));
   }
@@ -530,7 +530,7 @@ function simpletest_clean_temporary_directories() {
  *   The number of results removed.
  */
 function simpletest_clean_results_table($test_id = NULL) {
-  if (variable_get('simpletest_clear_results', TRUE)) {
+  if (config('simpletest.settings')->get('clear_results')) {
     if ($test_id) {
       $count = db_query('SELECT COUNT(test_id) FROM {simpletest_test_id} WHERE test_id = :test_id', array(':test_id' => $test_id))->fetchField();
 
diff --git a/core/modules/simpletest/simpletest.pages.inc b/core/modules/simpletest/simpletest.pages.inc
index a98b445548d61dea62675db92b438730131866d4..8b8ee74a4c4710a2ceafc69c13497d8bdb1361f9 100644
--- a/core/modules/simpletest/simpletest.pages.inc
+++ b/core/modules/simpletest/simpletest.pages.inc
@@ -434,8 +434,10 @@ function simpletest_result_status_image($status) {
  *
  * @ingroup forms
  * @see simpletest_settings_form_validate()
+ * @see simpletest_settings_form_submit()
  */
 function simpletest_settings_form($form, &$form_state) {
+  $config = config('simpletest.settings');
   $form['general'] = array(
     '#type' => 'fieldset',
     '#title' => t('General'),
@@ -444,13 +446,13 @@ function simpletest_settings_form($form, &$form_state) {
     '#type' => 'checkbox',
     '#title' => t('Clear results after each complete test suite run'),
     '#description' => t('By default SimpleTest will clear the results after they have been viewed on the results page, but in some cases it may be useful to leave the results in the database. The results can then be viewed at <em>admin/config/development/testing/[test_id]</em>. The test ID can be found in the database, simpletest table, or kept track of when viewing the results the first time. Additionally, some modules may provide more analysis or features that require this setting to be disabled.'),
-    '#default_value' => variable_get('simpletest_clear_results', TRUE),
+    '#default_value' => $config->get('clear_results'),
   );
   $form['general']['simpletest_verbose'] = array(
     '#type' => 'checkbox',
     '#title' => t('Provide verbose information when running tests'),
     '#description' => t('The verbose data will be printed along with the standard assertions and is useful for debugging. The verbose data will be erased between each test suite run. The verbose data output is very detailed and should only be used when debugging.'),
-    '#default_value' => variable_get('simpletest_verbose', TRUE),
+    '#default_value' => $config->get('verbose'),
   );
 
   $form['httpauth'] = array(
@@ -471,16 +473,16 @@ function simpletest_settings_form($form, &$form_state) {
       CURLAUTH_ANY => t('Any'),
       CURLAUTH_ANYSAFE => t('Any safe'),
     ),
-    '#default_value' => variable_get('simpletest_httpauth_method', CURLAUTH_BASIC),
+    '#default_value' => $config->get('httpauth.method'),
   );
-  $username = variable_get('simpletest_httpauth_username');
-  $password = variable_get('simpletest_httpauth_password');
+  $username = $config->get('httpauth.username');
+  $password = $config->get('httpauth.password');
   $form['httpauth']['simpletest_httpauth_username'] = array(
     '#type' => 'textfield',
     '#title' => t('Username'),
     '#default_value' => $username,
   );
-  if ($username && $password) {
+  if (!empty($username) && !empty($password)) {
     $form['httpauth']['simpletest_httpauth_username']['#description'] = t('Leave this blank to delete both the existing username and password.');
   }
   $form['httpauth']['simpletest_httpauth_password'] = array(
@@ -491,7 +493,20 @@ function simpletest_settings_form($form, &$form_state) {
     $form['httpauth']['simpletest_httpauth_password']['#description'] = t('To change the password, enter the new password here.');
   }
 
-  return system_settings_form($form);
+  return system_config_form($form, $form_state);
+}
+
+/**
+ * Form submission handler for simpletest_settings_form().
+ */
+function simpletest_settings_form_submit($form, &$form_state) {
+  config('simpletest.settings')
+    ->set('clear_results', $form_state['values']['simpletest_clear_results'])
+    ->set('verbose', $form_state['values']['simpletest_verbose'])
+    ->set('httpauth.method', $form_state['values']['simpletest_httpauth_method'])
+    ->set('httpauth.username', $form_state['values']['simpletest_httpauth_username'])
+    ->set('httpauth.password', $form_state['values']['simpletest_httpauth_password'])
+    ->save();
 }
 
 /**
@@ -501,7 +516,7 @@ function simpletest_settings_form_validate($form, &$form_state) {
   // If a username was provided but a password wasn't, preserve the existing
   // password.
   if (!empty($form_state['values']['simpletest_httpauth_username']) && empty($form_state['values']['simpletest_httpauth_password'])) {
-    $form_state['values']['simpletest_httpauth_password'] = variable_get('simpletest_httpauth_password', '');
+    $form_state['values']['simpletest_httpauth_password'] = config('simpletest.settings')->get('httpauth.password');
   }
 
   // If a password was provided but a username wasn't, the credentials are