diff --git a/client/review/db/sqlite_d8runner.php b/client/review/db/sqlite_d8runner.php
new file mode 100644
index 0000000..4d4daa2
--- /dev/null
+++ b/client/review/db/sqlite_d8runner.php
@@ -0,0 +1,78 @@
+<?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 {
+
+  /**
+   * @var \PDO
+   */
+  protected $connection;
+
+  /**
+   * {@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) {
+    if ($connection = $this->connection()) {
+      try {
+        // It is impossible for the tables to be prefixed.
+        $sql = strtr($sql, array('{' => '', '}' => ''));
+        $statement = $connection->prepare($sql);
+        $statement->execute();
+        return $statement->fetchAll(PDO::FETCH_ASSOC);
+      }
+      catch (PDOException $e) {
+        return array();
+      }
+    }
+    return array();
+  }
+
+  /**
+   * {@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() {
+    if (!$this->connection) {
+      $this->connection = new PDO('sqlite:/tmpfs/pifr/test.sqlite', NULL, NULL, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
+    }
+    return $this->connection;
+  }
+
+}
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..1243a40 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,16 @@ 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 {
+      // Testbots change the working directory. Build a relative path based on
+      // the location of this file.
+      require_once __DIR__ . '/../../client/review/db/db.inc';
+      require_once __DIR__ . '/../../client/review/db/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 +359,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.
@@ -442,14 +455,21 @@ class pifr_client_review_pifr_simpletest extends pifr_client_review_pifr_drupal
    */
   public static function status() {
     if (variable_get('pifr_client_operation', 'init') == 'review') {
-      module_load_include('review.inc', 'pifr_client');
-      $type = pifr_client_review_database_type();
-
       require_once drupal_get_path('module', 'pifr_client') . '/review/db/db.inc';
-      require_once drupal_get_path('module', 'pifr_client') . '/review/db/' . $type. '.inc';
-
-      $database = 'pifr_client_db_interface_' . $type;
-      $database = new $database;
+      // We can not detect that we're running Drupal 8 tests since this is a
+      // static method that runs on bots whilst they are running tests. So just,
+      // look for the sqlite file and if it exist assume Drupal 8.
+      if (file_exists('/tmpfs/pifr/test.sqlite')) {
+        require_once drupal_get_path('module', 'pifr_client') . '/review/db/sqlite_d8runner.php';
+        $database = new pifr_client_db_interface_sqlite_d8runner();
+      }
+      else {
+        module_load_include('review.inc', 'pifr_client');
+        $type = pifr_client_review_database_type();
+        require_once drupal_get_path('module', 'pifr_client') . '/review/db/' . $type . '.inc';
+        $database = 'pifr_client_db_interface_' . $type;
+        $database = new $database;
+      }
 
       $count = $database->query('SELECT COUNT(*) FROM {simpletest}');
       return t('Running tests, @count assertion(s).', array('@count' => number_format($count ? $count[0]['COUNT(*)'] : 0)));
