diff --git a/src/Lunr/Gravity/Database/SQLite3/SQLite3QueryResult.php b/src/Lunr/Gravity/Database/SQLite3/SQLite3QueryResult.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4e5235c4c696eb578e6dfb560b7f359ea9b8f27
--- /dev/null
+++ b/src/Lunr/Gravity/Database/SQLite3/SQLite3QueryResult.php
@@ -0,0 +1,319 @@
+<?php
+
+/**
+ * Contains SQLite3QueryResult class.
+ *
+ * @package  Lunr\Gravity\Database\SQLite3\Tests
+ * @author   Ruben de Groot
+ */
+
+namespace Lunr\Gravity\Database\SQLite3;
+
+use Lunr\Gravity\Database\DatabaseQueryResultInterface;
+
+/**
+ * Class SQLite3QueryResult
+ *
+ * This class contains methods for the result of a query using SQLite3.
+ */
+class SQLite3QueryResult implements DatabaseQueryResultInterface
+{
+
+    /**
+     * The Sqlite3 error code for transaction deadlock.
+     * @var Integer
+     */
+    const DEADLOCK_ERR_CODE = 6;
+
+    /**
+     * The query string that was executed.
+     * @var String
+     */
+    protected $query;
+
+    /**
+     * Return value from sqlite3->query().
+     * @var mixed
+     */
+    protected $result;
+
+    /**
+     * Shared instance of the sqlite3 class.
+     * @var LunrSQLite3
+     */
+    protected $sqlite3;
+
+    /**
+     * Flag whether the query was successful or not.
+     * @var Boolean
+     */
+    protected $success;
+
+    /**
+     * Flag whether the memory has been freed or not.
+     * @var Boolean
+     */
+    protected $freed;
+
+    /**
+     * Description of the error.
+     * @var String
+     */
+    protected $error_message;
+
+    /**
+     * Error code.
+     * @var Integer
+     */
+    protected $error_number;
+
+    /**
+     * Auto incremented ID generated on last insert.
+     * @var mixed
+     */
+    protected $insert_id;
+
+    /**
+     * Number of affected rows.
+     * @var Integer
+     */
+    protected $affected_rows;
+
+    /**
+     * Number of rows in the result set.
+     * @var Integer
+     */
+    protected $num_rows;
+
+    /**
+     * Constructor to build the results.
+     *
+     * @param String      $query    Executed query
+     * @param mixed       $result   Query result
+     * @param LunrSQLite3 $sqlite3  Instance of the LunrSQLite3 class
+     */
+    public function __construct($query, $result, $sqlite3)
+    {
+        if (is_object($result))
+        {
+            $this->success = TRUE;
+            $this->freed   = FALSE;
+        }
+        else
+        {
+            $this->success = $result;
+            $this->freed   = TRUE;
+        }
+
+        $this->result = $result;
+        $this->sqlite3 = $sqlite3;
+        $this->query  = $query;
+
+        $this->error_message = $sqlite3->lastErrorMsg();
+        $this->error_number  = $sqlite3->lastErrorCode();
+        $this->insert_id     = $sqlite3->lastInsertRowID();
+        $this->affected_rows = $sqlite3->changes();
+    }
+
+    /**
+     * Destructor to free the results.
+     */
+    public function __destruct()
+    {
+        $this->free_result();
+
+        unset($this->success);
+        unset($this->freed);
+        unset($this->result);
+        unset($this->sqlite3);
+        unset($this->query);
+        unset($this->error_message);
+        unset($this->error_number);
+        unset($this->insert_id);
+        unset($this->affected_rows);
+        unset($this->num_rows);
+    }
+
+    /**
+     * Free memory associated with a result.
+     *
+     * @return void
+     */
+    protected function free_result()
+    {
+        if ($this->freed === FALSE)
+        {
+            $this->result->finalize();
+            $this->freed = TRUE;
+        }
+    }
+
+    /**
+     * Check whether the query has a deadlock or not.
+     *
+     * @return Boolean $return TRUE if it failed, FALSE otherwise
+     */
+    public function has_deadlock()
+    {
+        return ($this->error_number == self::DEADLOCK_ERR_CODE) ? TRUE : FALSE;
+    }
+
+    /**
+     * Check whether the query has failed or not.
+     *
+     * @return Boolean $return TRUE if it failed, FALSE otherwise
+     */
+    public function has_failed()
+    {
+        return !$this->success;
+    }
+
+    /**
+     * Get string description of the error, if there was one.
+     *
+     * @return String $message Error Message
+     */
+    public function error_message()
+    {
+        return $this->error_message;
+    }
+
+    /**
+     * Get numerical error code of the error, if there was one.
+     *
+     * @return Integer $code Error Code
+     */
+    public function error_number()
+    {
+        return $this->error_number;
+    }
+
+    /**
+     * Get auto incremented ID generated on last insert.
+     *
+     * @return mixed $id If the number is greater than maximal int value it's a String
+     *                   otherwise an Integer
+     */
+    public function insert_id()
+    {
+        return $this->insert_id;
+    }
+
+    /**
+     * Get the executed query.
+     *
+     * @return String $query The executed query
+     */
+    public function query()
+    {
+        return $this->query;
+    }
+
+    /**
+     * Returns the number of rows affected by the last query.
+     *
+     * @return mixed $number Number of rows in the result set.
+     */
+    public function affected_rows()
+    {
+        return $this->affected_rows;
+    }
+
+    /**
+     * Returns the number of rows in the result set.
+     *
+     * @return mixed $number Number of rows in the result set.
+     */
+    public function number_of_rows()
+    {
+        // not supported by SQLite3
+    }
+
+    /**
+     * Get the entire result set as an array.
+     *
+     * @return array $output Result set as array
+     */
+    public function result_array()
+    {
+        $output = array();
+
+        if (!is_object($this->result))
+        {
+            return $output;
+        }
+
+        while ($row = $this->result->fetchArray(SQLITE3_ASSOC))
+        {
+            $output[] = $row;
+        }
+
+        $this->free_result();
+
+        return $output;
+    }
+
+    /**
+     * Get the first row of the result set.
+     *
+     * @return array $output First result row as array
+     */
+    public function result_row()
+    {
+        $output = is_object($this->result) ? $this->result->fetchArray(SQLITE3_ASSOC) : array();
+
+        $this->free_result();
+
+        return $output;
+    }
+
+    /**
+     * Get a specific column of the result set.
+     *
+     * @param String $column Column or Alias name
+     *
+     * @return array $output Result column as array
+     */
+    public function result_column($column)
+    {
+        $output = array();
+
+        if (!is_object($this->result))
+        {
+            return $output;
+        }
+
+        while ($row = $this->result->fetchArray(SQLITE3_ASSOC))
+        {
+            $output[] = $row[$column];
+        }
+
+        $this->free_result();
+
+        return $output;
+    }
+
+    /**
+     * Get a specific column of the first row of the result set.
+     *
+     * @param String $column Column or Alias name
+     *
+     * @return mixed $output NULL if it does not exist, the value otherwise
+     */
+    public function result_cell($column)
+    {
+        if (!is_object($this->result))
+        {
+            return NULL;
+        }
+
+        $line = $this->result->fetchArray(SQLITE3_ASSOC);
+
+        $this->free_result();
+
+        return isset($line[$column]) ? $line[$column] : NULL;
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/Lunr/Gravity/Database/SQLite3/Tests/MockSQLite3Result.php b/src/Lunr/Gravity/Database/SQLite3/Tests/MockSQLite3Result.php
new file mode 100644
index 0000000000000000000000000000000000000000..31a12dd86ab423069eac5cd8f68cd5c41be5b24b
--- /dev/null
+++ b/src/Lunr/Gravity/Database/SQLite3/Tests/MockSQLite3Result.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * Contains MockSQLite3Result class.
+ *
+ * @package  Lunr\Gravity\Database\SQLite3\Tests
+ * @author   Ruben de Groot
+ */
+
+namespace Lunr\Gravity\Database\SQLite3\Tests;
+
+use SQLite3Result;
+
+class MockSQLite3Result
+{
+
+    /**
+     * Instance of a real SQLite3Result class.
+     * @var \SQLite3Result
+     */
+    private $sqlite3_result;
+
+    /**
+     * Constructor.
+     *
+     * @param SQLite3Result $sqlite3_result Instance of the SQLite3Result class
+     */
+    public function __construct($sqlite3_result)
+    {
+        $this->sqlite3_result = $sqlite3_result;
+    }
+
+    /**
+     * Destructor.
+     */
+    public function __destruct()
+    {
+        unset($this->mysqli_result);
+    }
+
+    /**
+     * Forward non-mocked methods to the SQLite3 class.
+     *
+     * @param String $method    Method name
+     * @param array  $arguments Arguments to that method
+     *
+     * @return mixed $return Return value of the respective SQLite3 method.
+     */
+    public function __call($method, $arguments)
+    {
+        return call_user_func_array(array($this->sqlite3_result, $method), $arguments);
+    }
+
+    /**
+     * Fake property access to the SQLite3 class.
+     *
+     * @param String $name Property name
+     *
+     * @return mixed $return Property value.
+     */
+    public function __get($name)
+    {
+        switch ($name)
+        {
+            case 'affected_rows':
+                return 8;
+            case 'num_rows':
+                return 8;
+            default:
+                return $this->sqlite3_result->{$name};
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/Lunr/Gravity/Database/SQLite3/Tests/SQLite3QueryResultResultTest.php b/src/Lunr/Gravity/Database/SQLite3/Tests/SQLite3QueryResultResultTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..23aec9644b0ccf55853bd41c01d2b50dca45ae6c
--- /dev/null
+++ b/src/Lunr/Gravity/Database/SQLite3/Tests/SQLite3QueryResultResultTest.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Contains SQLite3QueryResultResultTest class.
+ *
+ * @package  Lunr\Gravity\Database\SQLite3\Tests
+ * @author   Ruben de Groot
+ */
+
+namespace Lunr\Gravity\Database\SQLite3\Tests;
+
+class SQLite3QueryResultResultTest extends SQLite3QueryResultTest
+{
+
+    /**
+     * TestCase Constructor.
+     */
+    public function setUp()
+    {
+        $this->resultSetSetup();
+    }
+
+    /**
+     * Test that the success flag is TRUE.
+     *
+     * @requires extension sqlite3
+     */
+    public function testSuccessIsTrue()
+    {
+        $property = $this->result_reflection->getProperty('success');
+        $property->setAccessible(TRUE);
+
+        $this->assertTrue($property->getValue($this->result));
+    }
+
+    /**
+     * Test that the freed flag is FALSE.
+     *
+     * @requires extension sqlite3
+     */
+    public function testFreedIsFalse()
+    {
+        $property = $this->result_reflection->getProperty('freed');
+        $property->setAccessible(TRUE);
+
+        $this->assertFalse($property->getValue($this->result));
+    }
+
+    /**
+     * Test that affected_rows() returns a number.
+     *
+     * @requires extension SQLite3
+     * @covers   Lunr\Gravity\Database\SQLite3\SQLite3QueryResult::affected_rows
+     */
+    public function testNumberOfRowsReturnsNumber()
+    {
+        $class = $this->result_reflection->getProperty('affected_rows');
+        $class->setAccessible(TRUE);
+        $class->setValue($this->result, 8);
+
+        $value = $this->result->affected_rows();
+        $this->assertInternalType('int', $value);
+        $this->assertEquals(8, $value);
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/Lunr/Gravity/Database/SQLite3/Tests/SQLite3QueryResultTest.php b/src/Lunr/Gravity/Database/SQLite3/Tests/SQLite3QueryResultTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..176ffb4a51253310cd81094f08708a545101c61a
--- /dev/null
+++ b/src/Lunr/Gravity/Database/SQLite3/Tests/SQLite3QueryResultTest.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Contains SQLite3QueryResultTest class.
+ *
+ * @package  Lunr\Gravity\Database\SQLite3\Tests
+ * @author   Ruben de Groot
+ */
+
+namespace Lunr\Gravity\Database\SQLite3\Tests;
+
+use Lunr\Gravity\Database\SQLite3\SQLite3QueryResult;
+use Lunr\Halo\LunrBaseTest;
+use ReflectionClass;
+use SQLite3;
+use SQLite3Result;
+
+class SQLite3QueryResultTest extends LunrBaseTest
+{
+
+    /**
+     * Instance of the SQLite3Result class.
+     * @var SQLite3Result
+     */
+    protected $result;
+
+    /**
+     * Reflection instance of the SQLite3QueryResult class.
+     * @var ReflectionClass
+     */
+    protected $result_reflection;
+
+    /**
+     * Query result
+     * @var mixed
+     */
+    protected $query_result;
+
+    /**
+     * Instance of the SQLite3 class.
+     * @var SQLite3
+     */
+    protected $sqlite3;
+
+    /**
+     * The executed query.
+     * @var String
+     */
+    protected $query;
+
+
+    /**
+     * TestCase Constructor passing a SQLite3Result object.
+     *
+     * @return void
+     */
+    public function resultSetSetup()
+    {
+        $this->sqlite3 = $this->getMock('Lunr\Gravity\Database\SQLite3\LunrSQLite3');
+
+        $this->query = 'SELECT * FROM table';
+
+        $this->query_result = $this->getMockBuilder('Lunr\Gravity\Database\SQLite3\MockSQLite3Result')
+                                   ->setMethods(array('finalize'))
+                                   ->getMock();
+
+        $this->result = new SQLite3QueryResult($this->query, $this->query_result, $this->sqlite3);
+
+        $this->result_reflection = new ReflectionClass('Lunr\Gravity\Database\SQLite3\SQLite3QueryResult');
+    }
+
+    /**
+     * TestCase Destructor.
+     */
+    public function tearDown()
+    {
+        unset($this->sqlite3);
+        unset($this->query);
+        unset($this->query_result);
+        unset($this->result);
+        unset($this->result_reflection);
+    }
+
+}
+
+?>
\ No newline at end of file
