diff --git a/client/review/db/sqlite_d8runner.php b/client/review/db/sqlite_d8runner.php
new file mode 100644
index 0000000..d2a5693
--- /dev/null
+++ b/client/review/db/sqlite_d8runner.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * @file
+ * SQLite implementation for querying Drupal 8's sqlite test runner.
+ */
+require_once 'sqlite.inc';
+
+/**
+ * SQLite implementation for querying Drupal 8's sqlite test runner.
+ */
+class pifr_client_db_interface_sqlite_d8runner extends pifr_client_db_interface_sqlite {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function get_information() {
+    throw new \Exception('Calling get_information is invalid.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function create_database() {
+    throw new \Exception('Calling create_database is invalid.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function drop_database() {
+    throw new \Exception('Calling drop_database is invalid.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query($sql) {
+    return parent::query($sql);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function import($file) {
+    throw new \Exception('Calling import is invalid.');
+  }
+
+  /**
+   * Return a connection to the D8 test result SQLite database.
+   *
+   * We use one connection per query. Because we can, and to avoid having to do
+   * crazy exception handling.
+   */
+  protected function connection() {
+    return new PDO('sqlite:/tmpfs/pifr/test.sqlite', NULL, NULL, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
+  }
+
+}
\ No newline at end of file
diff --git a/review/drupal/pifr_drupal.client.inc b/review/drupal/pifr_drupal.client.inc
index e1a1006..e9bff0e 100644
--- a/review/drupal/pifr_drupal.client.inc
+++ b/review/drupal/pifr_drupal.client.inc
@@ -198,6 +198,15 @@ class pifr_client_review_pifr_drupal extends pifr_client_review {
   protected function install() {
     global $base_url, $base_path;
 
+    // Use paths relative to checkout directory so that SimpleTest browser will function.
+    $base_url .= '/checkout';
+    $base_path = '/checkout';
+
+    // Drupal 8 does not need a parent/test-runner site.
+    if ($this->arguments['drupal.core.version'] >= 8) {
+      return;
+    }
+
     // Since the drush installation technique doesn't break the confirmation
     // install.patch, we'll pretend to break just because we got it. This
     // can be improved by changing the *server* logic and patch.
@@ -250,10 +259,6 @@ class pifr_client_review_pifr_drupal extends pifr_client_review {
       return;
     }
 
-    // Use paths relative to checkout directory so that SimpleTest browser will function.
-    $base_url .= '/checkout';
-    $base_path = '/checkout';
-
     // Set Drupal variables if specified.
     if (!empty($this->arguments['drupal.variables'])) {
       $this->install_variables($this->arguments['drupal.variables']);
diff --git a/review/simpletest/pifr_simpletest.client.inc b/review/simpletest/pifr_simpletest.client.inc
index 184b5c0..5364533 100644
--- a/review/simpletest/pifr_simpletest.client.inc
+++ b/review/simpletest/pifr_simpletest.client.inc
@@ -78,7 +78,7 @@ class pifr_client_review_pifr_simpletest extends pifr_client_review_pifr_drupal
    * Run SimpleTest tests.
    */
   protected function review() {
-    global $base_url, $base_path;
+    global $base_url, $base_path, $db_url;
 
     // If Drupal 6 then we need to perform SimpleTest installation.
     if ($this->arguments['drupal.core.version'] == 6) {
@@ -86,17 +86,18 @@ class pifr_client_review_pifr_simpletest extends pifr_client_review_pifr_drupal
         return;
       }
     }
-
-    $cwd = getcwd();
-    $output = "";
-    $result = $this->exec("cd {$this->checkout_directory} && drush en -y simpletest", TRUE, $output, TRUE);
-    $this->exec("cd {$cwd}");
-    if ($result !== TRUE) {
-      $this->set_error(array('@reason' => "Failed to drush en simpletest, output={$output}" ));
-      return;
+    // Drupal 8 does not need a parent/test-runner site.
+    if ($this->arguments['drupal.core.version'] < 8) {
+      $cwd = getcwd();
+      $output = "";
+      $result = $this->exec("cd {$this->checkout_directory} && drush en -y simpletest", TRUE, $output, TRUE);
+      $this->exec("cd {$cwd}");
+      if ($result !== TRUE) {
+        $this->set_error(array('@reason' => "Failed to drush en simpletest, output={$output}" ));
+        return;
+      }
     }
 
-
     // Assumes it is currently outside of checkout directory.
     $test_list = $this->test_list();
 
@@ -114,6 +115,8 @@ class pifr_client_review_pifr_simpletest extends pifr_client_review_pifr_drupal
     $command .= ' --php ' . PIFR_CLIENT_PHP;
     $command .= ' --url ' . $url;
     if ($this->arguments['drupal.core.version'] >= 8) {
+      $command .= ' --sqlite /tmpfs/pifr/test.sqlite';
+      $command .= ' --dburl ' . $db_url['pifr_checkout'];
       $command .= ' --keep-results';
     }
     $command .= ' ' . $test_list;
@@ -329,6 +332,14 @@ class pifr_client_review_pifr_simpletest extends pifr_client_review_pifr_drupal
   public function get_result() {
     $result = parent::get_result();
 
+    if ($this->arguments['drupal.core.version'] < 8) {
+      $database = $this->database;
+    }
+    else {
+      $base = drupal_get_path('module', 'pifr_client') . '/review/db';
+      require_once "$base/sqlite_d8runner.php";
+      $database = new pifr_client_db_interface_sqlite_d8runner();
+    }
     // If result code is fail then all the operations passed, so the test
     // results need to be added and the proper result code assigned.
     if ($result['code'] == $this->result_codes['fail']) {
@@ -346,11 +357,11 @@ class pifr_client_review_pifr_simpletest extends pifr_client_review_pifr_drupal
       // Process assertions in batches of 10,000 to keep down memory usage.
       $message_id = 0;
       do {
-        $assertions = $this->database->query('SELECT *
-                                              FROM {simpletest}
-                                              WHERE message_id > ' . $message_id . '
-                                              ORDER BY message_id
-                                              LIMIT 10000');
+        $assertions = $database->query('SELECT *
+                                        FROM {simpletest}
+                                        WHERE message_id > ' . $message_id . '
+                                        ORDER BY message_id
+                                        LIMIT 10000');
         $non_pass = 0;
         foreach ($assertions as $assertion) {
           // Fill in details with summary of assertion counts.
