diff --git a/core/modules/simpletest/lib/Drupal/simpletest/Form/SimpletestTestForm.php b/core/modules/simpletest/lib/Drupal/simpletest/Form/SimpletestTestForm.php
new file mode 100644
index 0000000..230706f
--- /dev/null
+++ b/core/modules/simpletest/lib/Drupal/simpletest/Form/SimpletestTestForm.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\simpletest\Form\SimpletestTestForm.
+ */
+
+namespace Drupal\simpletest\Form;
+
+use Drupal\Core\Form\FormInterface;
+
+/**
+ * List tests arranged in groups that can be selected and run.
+ */
+class SimpletestTestForm implements FormInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'simpletest_test_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state) {
+    $form['tests'] = array(
+      '#type' => 'details',
+      '#title' => t('Tests'),
+      '#description' => t('Select the test(s) or test group(s) you would like to run, and click <em>Run tests</em>.'),
+    );
+
+    $form['tests']['table'] = array(
+      '#theme' => 'simpletest_test_table',
+    );
+
+    // Generate the list of tests arranged by group.
+    $groups = simpletest_test_get_all();
+    $groups['PHPUnit'] = simpletest_phpunit_get_available_tests();
+    $form_state['storage']['PHPUnit'] = $groups['PHPUnit'];
+
+    foreach ($groups as $group => $tests) {
+      $form['tests']['table'][$group] = array(
+        '#collapsed' => TRUE,
+      );
+
+      foreach ($tests as $class => $info) {
+        $form['tests']['table'][$group][$class] = array(
+          '#type' => 'checkbox',
+          '#title' => $info['name'],
+          '#description' => $info['description'],
+        );
+      }
+    }
+
+    // Operation buttons.
+    $form['tests']['op'] = array(
+      '#type' => 'submit',
+      '#value' => t('Run tests'),
+    );
+    $form['clean'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Clean test environment'),
+      '#description' => t('Remove tables with the prefix "simpletest" and temporary directories that are left over from tests that crashed. This is intended for developers when creating tests.'),
+    );
+    $form['clean']['op'] = array(
+      '#type' => 'submit',
+      '#value' => t('Clean environment'),
+      '#submit' => array('simpletest_clean_environment'),
+    );
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, array &$form_state) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    // Get list of tests.
+    $tests_list = array();
+    simpletest_classloader_register();
+
+    $phpunit_all = array_keys($form_state['storage']['PHPUnit']);
+
+    foreach ($form_state['values'] as $class_name => $value) {
+      // Since class_exists() will likely trigger an autoload lookup,
+      // we do the fast check first.
+      if ($value === 1 && class_exists($class_name)) {
+        $test_type = in_array($class_name, $phpunit_all) ? 'UnitTest' : 'WebTest';
+        $tests_list[$test_type][] = $class_name;
+      }
+    }
+    if (count($tests_list) > 0 ) {
+      $test_id = simpletest_run_tests($tests_list, 'drupal');
+      $form_state['redirect'] = 'admin/config/development/testing/results/' . $test_id;
+    }
+    else {
+      drupal_set_message(t('No test(s) selected.'), 'error');
+    }
+  }
+
+}
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index 0a46873..adfa355 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -34,11 +34,8 @@ function simpletest_help($path, $arg) {
 function simpletest_menu() {
   $items['admin/config/development/testing'] = array(
     'title' => 'Testing',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('simpletest_test_form'),
     'description' => 'Run tests against Drupal core and your modules. These tests help assure that your site code is working as designed.',
-    'access arguments' => array('administer unit tests'),
-    'file' => 'simpletest.pages.inc',
+    'route_name' => 'simpletest_test_form',
     'weight' => -5,
   );
   $items['admin/config/development/testing/list'] = array(
diff --git a/core/modules/simpletest/simpletest.pages.inc b/core/modules/simpletest/simpletest.pages.inc
index 4fb908d..16e37a0 100644
--- a/core/modules/simpletest/simpletest.pages.inc
+++ b/core/modules/simpletest/simpletest.pages.inc
@@ -6,58 +6,6 @@
  */
 
 /**
- * List tests arranged in groups that can be selected and run.
- */
-function simpletest_test_form($form, &$form_state) {
-  $form['tests'] = array(
-    '#type' => 'details',
-    '#title' => t('Tests'),
-    '#description' => t('Select the test(s) or test group(s) you would like to run, and click <em>Run tests</em>.'),
-  );
-
-  $form['tests']['table'] = array(
-    '#theme' => 'simpletest_test_table',
-  );
-
-  // Generate the list of tests arranged by group.
-  $groups = simpletest_test_get_all();
-  $groups['PHPUnit'] = simpletest_phpunit_get_available_tests();
-  $form_state['storage']['PHPUnit'] = $groups['PHPUnit'];
-
-  foreach ($groups as $group => $tests) {
-    $form['tests']['table'][$group] = array(
-      '#collapsed' => TRUE,
-    );
-
-    foreach ($tests as $class => $info) {
-      $form['tests']['table'][$group][$class] = array(
-        '#type' => 'checkbox',
-        '#title' => $info['name'],
-        '#description' => $info['description'],
-      );
-    }
-  }
-
-  // Operation buttons.
-  $form['tests']['op'] = array(
-    '#type' => 'submit',
-    '#value' => t('Run tests'),
-  );
-  $form['clean'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Clean test environment'),
-    '#description' => t('Remove tables with the prefix "simpletest" and temporary directories that are left over from tests that crashed. This is intended for developers when creating tests.'),
-  );
-  $form['clean']['op'] = array(
-    '#type' => 'submit',
-    '#value' => t('Clean environment'),
-    '#submit' => array('simpletest_clean_environment'),
-  );
-
-  return $form;
-}
-
-/**
  * Returns HTML for a test list generated by simpletest_test_form() into a table.
  *
  * @param $variables
@@ -177,33 +125,6 @@ function theme_simpletest_test_table($variables) {
 }
 
 /**
- * Run selected tests.
- */
-function simpletest_test_form_submit($form, &$form_state) {
-  // Get list of tests.
-  $tests_list = array();
-  simpletest_classloader_register();
-
-  $phpunit_all = array_keys($form_state['storage']['PHPUnit']);
-
-  foreach ($form_state['values'] as $class_name => $value) {
-    // Since class_exists() will likely trigger an autoload lookup,
-    // we do the fast check first.
-    if ($value === 1 && class_exists($class_name)) {
-      $test_type = in_array($class_name, $phpunit_all) ? 'UnitTest' : 'WebTest';
-      $tests_list[$test_type][] = $class_name;
-    }
-  }
-  if (count($tests_list) > 0 ) {
-    $test_id = simpletest_run_tests($tests_list, 'drupal');
-    $form_state['redirect'] = 'admin/config/development/testing/results/' . $test_id;
-  }
-  else {
-    drupal_set_message(t('No test(s) selected.'), 'error');
-  }
-}
-
-/**
  * Test results form for $test_id.
  */
 function simpletest_result_form($form, &$form_state, $test_id) {
diff --git a/core/modules/simpletest/simpletest.routing.yml b/core/modules/simpletest/simpletest.routing.yml
index 7a17bfd..c993262 100644
--- a/core/modules/simpletest/simpletest.routing.yml
+++ b/core/modules/simpletest/simpletest.routing.yml
@@ -4,3 +4,10 @@ simpletest_settings:
     _form: 'Drupal\simpletest\Form\SimpletestSettingsForm'
   requirements:
     _permission: 'administer unit tests'
+
+simpletest_test_form:
+  pattern: '/admin/config/development/testing'
+  defaults:
+    _form: '\Drupal\simpletest\Form\SimpletestTestForm'
+  requirements:
+    _permission: 'administer unit tests'
