diff --git a/core/modules/simpletest/css/simpletest.module.css b/core/modules/simpletest/css/simpletest.module.css
index 86bd04b..0337e62 100644
--- a/core/modules/simpletest/css/simpletest.module.css
+++ b/core/modules/simpletest/css/simpletest.module.css
@@ -30,8 +30,12 @@ th.simpletest_test {
   background-color: #edf5fa;
   color: #494949;
 }
+.simpletest-test-select .form-item {
+  margin-bottom: 0;
+  margin-top: 0;
+}
 
-table#simpletest-form-table tr.simpletest-group label {
+#simpletest-form-table tr.simpletest-group label {
   display: inline;
 }
 
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/Form/SimpletestResultsForm.php b/core/modules/simpletest/lib/Drupal/simpletest/Form/SimpletestResultsForm.php
index d1d339a..aca7492 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/Form/SimpletestResultsForm.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/Form/SimpletestResultsForm.php
@@ -118,7 +118,6 @@ public function buildForm(array $form, array &$form_state, $test_id = NULL) {
       '#title' => $this->t('Results'),
     );
     $form['result']['summary'] = $summary = array(
-      '#theme' => 'simpletest_result_summary',
       '#pass' => 0,
       '#fail' => 0,
       '#exception' => 0,
@@ -169,7 +168,7 @@ public function buildForm(array $form, array &$form_state, $test_id = NULL) {
         $form['result']['summary']['#' . $assertion->status]++;
       }
       $form['result']['results'][$group]['table'] = array(
-        '#theme' => 'table',
+        '#type' => 'table',
         '#header' => $header,
         '#rows' => $rows,
       );
@@ -180,11 +179,25 @@ public function buildForm(array $form, array &$form_state, $test_id = NULL) {
 
       // Store test group (class) as for use in filter.
       $filter[$group_summary['#ok'] ? 'pass' : 'fail'][] = $group;
+
+      // Render summary information.
+      $group_summary += array(
+        '#prefix' => '<div class="simpletest-' . ($group_summary['#ok'] ? 'pass' : 'fail') . '">',
+        '#markup' => _simpletest_format_summary_line($group_summary),
+        '#suffix' => '</div>',
+      );
     }
 
     // Overall summary status.
     $form['result']['summary']['#ok'] = $form['result']['summary']['#fail'] + $form['result']['summary']['#exception'] == 0;
 
+    // Render overall summary.
+    $form['result']['summary'] += array(
+      '#prefix' => '<div class="simpletest-' . ($form['result']['summary']['#ok'] ? 'pass' : 'fail') . '">',
+      '#markup' => _simpletest_format_summary_line($form['result']['summary']),
+      '#suffix' => '</div>',
+    );
+
     // Actions.
     $form['#action'] = url('admin/config/development/testing/results/re-run');
     $form['action'] = array(
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index 1c17909..56892d5 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -77,10 +77,7 @@ function simpletest_theme() {
     'simpletest_test_table' => array(
       'render element' => 'table',
       'file' => 'simpletest.theme.inc',
-    ),
-    'simpletest_result_summary' => array(
-      'render element' => 'form',
-      'file' => 'simpletest.theme.inc',
+      'template' => 'simpletest-test-table',
     ),
   );
 }
diff --git a/core/modules/simpletest/simpletest.theme.inc b/core/modules/simpletest/simpletest.theme.inc
index 31cbb02..ad09954 100644
--- a/core/modules/simpletest/simpletest.theme.inc
+++ b/core/modules/simpletest/simpletest.theme.inc
@@ -5,27 +5,22 @@
  * Page callbacks for simpletest module.
  */
 
+use Drupal\Core\Template\Attribute;
+
 /**
- * Returns an HTML table for a test list generated by simpletest_test_form().
+ * Prepares variables for test list table templates.
+ *
+ * Default template: simpletest-test-table.html.twig.
  *
- * @param $variables
+ * @param array $variables
  *   An associative array containing:
  *   - table: A render element representing the table.
- *
- * @ingroup themeable
  */
-function theme_simpletest_test_table($variables) {
+function template_preprocess_simpletest_test_table(&$variables) {
   $table = $variables['table'];
 
   drupal_add_library('simpletest', 'drupal.simpletest');
 
-  // Create header for test selection table.
-  $header = array(
-    array('class' => array('select-all')),
-    array('data' => t('Test'), 'class' => array('simpletest_test')),
-    array('data' => t('Description'), 'class' => array('simpletest_description')),
-  );
-
   // Define the images used to expand/collapse the test groups.
   $image_collapsed = array(
     '#theme' => 'image',
@@ -53,36 +48,25 @@ function theme_simpletest_test_table($variables) {
   );
 
   // Cycle through each test group and create a row.
-  $rows = array();
+
+  $variables['test_groups'] = array();
   foreach (element_children($table) as $key) {
     $element = &$table[$key];
-    $row = array();
+
+    $variables['test_groups'][$key] = new stdClass();
 
     // Make the class name safe for output on the page by replacing all
     // non-word/decimal characters with a dash (-).
     $test_class = strtolower(trim(preg_replace("/[^\w\d]/", "-", $key)));
+    $variables['test_groups'][$key]->test_class = $test_class;
 
     // Select the right "expand"/"collapse" image, depending on whether the
     // category is expanded (at least one test selected) or not.
     $collapsed = !empty($element['#collapsed']);
     $image_index = $collapsed ? 0 : 1;
 
-    // Place-holder for checkboxes to select group of tests.
-    $row[] = array('id' => $test_class, 'class' => array('simpletest-select-all'));
-
     // Expand/collapse image and group title.
-    $row[] = array(
-      'data' => '<div class="simpletest-image" id="simpletest-test-group-' . $test_class . '"></div>' .
-        '<label for="' . $test_class . '-select-all" class="simpletest-group-label">' . $key . '</label>',
-      'class' => array('simpletest-group-label'),
-    );
-
-    $row[] = array(
-      'data' => '&nbsp;',
-      'class' => array('simpletest-group-description'),
-    );
-
-    $rows[] = array('data' => $row, 'class' => array('simpletest-group'));
+    $variables['test_groups'][$key]->label = $key;
 
     // Add individual tests to group.
     $current_js = array(
@@ -95,69 +79,40 @@ function theme_simpletest_test_table($variables) {
     // Sorting $element by children's #title attribute instead of by class name.
     uasort($element, 'element_sort_by_title');
 
+    $variables['test_groups'][$key]->tests = array();
+
     // Cycle through each test within the current group.
     foreach (element_children($element) as $test_name) {
       $test = $element[$test_name];
-      $row = array();
+      $test_data = new stdClass();
+      $test_data->attributes = new Attribute(array('class' => array()));
+      $test_data->id = $test['#id'];
 
       $current_js['testNames'][] = $test['#id'];
 
       // Store test title and description so that checkbox won't render them.
-      $title = $test['#title'];
-      $description = $test['#description'];
+      $test_data->title = $test['#title'];
+      $test_data->description = $test['#description'];
+      unset($test['#description']);
 
       $test['#title_display'] = 'invisible';
-      unset($test['#description']);
 
       // Test name is used to determine what tests to run.
       $test['#name'] = $test_name;
 
-      $row[] = array(
-        'data' => drupal_render($test),
-        'class' => array('simpletest-test-select'),
-      );
-      $row[] = array(
-        'data' => '<label for="' . $test['#id'] . '">' . $title . '</label>',
-        'class' => array('simpletest-test-label', 'table-filter-text-source'),
-      );
-      $row[] = array(
-        'data' => '<div class="description">' . format_string('@description (@class)', array('@description' => $description, '@class' => $test_name)) . '</div>',
-        'class' => array('simpletest-test-description', 'table-filter-text-source'),
-      );
-
-      $rows[] = array('data' => $row, 'class' => array($test_class . '-test', ($collapsed ? 'js-hide' : '')));
+      // Add the checkbox field.
+      $test_data->field = $test;
+
+      $test_data->attributes['class'][] = $test_class . '-test';
+      $test_data->attributes['class'][] = ($collapsed ? 'js-hide' : '');
+
+      $variables['test_groups'][$key]->tests[$test_name] = $test_data;
     }
     $js['simpletest-test-group-' . $test_class] = $current_js;
-    unset($table[$key]);
   }
 
   // Add js array of settings.
   drupal_add_js(array('simpleTest' => $js), 'setting');
-
-  if (empty($rows)) {
-    return '<strong>' . t('No tests to display.') . '</strong>';
-  }
-  else {
-    $simpletest_form_table = array(
-      '#theme' => 'table',
-      '#header' => $header,
-      '#rows' => $rows,
-      '#attributes' => array('id' => 'simpletest-form-table'),
-    );
-    return drupal_render($simpletest_form_table);
-  }
-}
-
-/**
- * Returns HTML for the summary status of a simpletest result.
- *
- * @param $variables
- *   An associative array containing:
- *   - form: A render element representing the form.
- *
- * @ingroup themeable
- */
-function theme_simpletest_result_summary($variables) {
-  $form = $variables['form'];
-  return '<div class="simpletest-' . ($form['#ok'] ? 'pass' : 'fail') . '">' . _simpletest_format_summary_line($form) . '</div>';
+  // Add responsive table script to page.
+  drupal_add_library('system', 'drupal.tableresponsive');
 }
diff --git a/core/modules/simpletest/templates/simpletest-test-table.html.twig b/core/modules/simpletest/templates/simpletest-test-table.html.twig
new file mode 100644
index 0000000..e725f0a
--- /dev/null
+++ b/core/modules/simpletest/templates/simpletest-test-table.html.twig
@@ -0,0 +1,53 @@
+{#
+/**
+ * @file
+ * Default theme implementation for the content of simpletest test table.
+ *
+ * Available variables:
+ * - test_groups: A list of test groups.
+ *   - label: The test group label.
+ *   - test_class: The test group class name.
+ *   - tests: A list of tests in the group. Each containing:
+ *     - attributes: The test row HTML attributes.
+ *     - id: The checkbox field's ID.
+ *     - field: The checkbox form field to select the test.
+ *     - title: Thte test title.
+ *     - description: the test description.
+ *
+ * @see template_preprocess_simpletest_test_table()
+ *
+ * @ingroup themeable
+ */
+#}
+<table id="simpletest-form-table" class="responsive-enabled">
+  <thead>
+    <tr>
+      <th class="select-all"></th>
+      <th class="simpletest_test">{{ 'Test'|t }}</th>
+      <th class="simpletest_description">{{ 'Description'|t }}</th>
+    </tr>
+  </thead>
+  <tbody>
+    {% for test_group in test_groups %}
+      <tr class="simpletest-group">
+        <td id="{{ test_group.test_class }}" class="simpletest-select-all"></td>
+        <td class="simpletest-group-label">
+          <div class="simpletest-image" id="simpletest-test-group-{{ test_group.test_class }}"></div>
+          <label for="{{ test_group.test_class }}-select-all" class="simpletest-group-label">{{ test_group.label }}</label>
+        </td>
+        <td class="simpletest-group-description">&nbsp;</td>
+      </tr>
+      {% for test in test_group.tests %}
+        <tr{{ test.attributes }}>
+          <td class="simpletest-test-select">{{ test.field }}</td>
+          <td class="simpletest-test-label"><label for="{{ test.id }}">{{ test.title }}</label></td>
+          <td class="simpletest-test-description"><div class="description">{{ test.description }}</div></td>
+        </tr>
+      {% endfor %}
+    {% else %}
+      <tr>
+        <td colspan="3">{{ 'No tests to display.'|t }}</td>
+      </tr>
+    {% endfor %}
+  </tbody>
+</table>
