diff --git a/RoboFile.php b/RoboFile.php
new file mode 100644
index 0000000..8ff0e4b
--- /dev/null
+++ b/RoboFile.php
@@ -0,0 +1,332 @@
+prepare();
+ $this->lint();
+ $this->phploc(TRUE);
+ $this->phpcs(TRUE);
+ $this->dependencyReport();
+ $this->phpcpdReport();
+ }
+
+ /**
+ * Run all tests, generate coverage, generate docs, generate code statistics
+ */
+ public function build()
+ {
+ $this->analyze();
+ $this->coverage();
+ $this->docs();
+ }
+
+ /**
+ * Cleanup temporary files
+ */
+ public function clean()
+ {
+ $cleanFiles = [
+ 'build/humbug.json',
+ 'build/humbug-log.txt',
+ ];
+ array_map(function ($file) {
+ @unlink($file);
+ }, $cleanFiles);
+
+ // So the task doesn't complain,
+ // make any 'missing' dirs to cleanup
+ array_map(function ($dir) {
+ if ( ! is_dir($dir))
+ {
+ `mkdir -p {$dir}`;
+ }
+ }, $this->cleanDirs);
+
+ $this->_cleanDir($this->cleanDirs);
+ $this->_deleteDir($this->cleanDirs);
+ }
+
+ /**
+ * Run unit tests and generate coverage reports
+ */
+ public function coverage()
+ {
+ $this->taskPhpUnit()
+ ->configFile('build/phpunit.xml')
+ ->printed(true)
+ ->run();
+ }
+
+ /**
+ * Generate documentation with phpdox
+ */
+ public function docs()
+ {
+ $cmd_parts = [
+ 'cd build',
+ '../vendor/bin/phpdox',
+ 'cd ..'
+ ];
+ $this->_run($cmd_parts, ' && ');
+ }
+
+ /**
+ * Verify that source files are valid
+ */
+ public function lint()
+ {
+ $files = $this->getAllSourceFiles();
+
+ $chunks = array_chunk($files, (int)`getconf _NPROCESSORS_ONLN`);
+
+ foreach($chunks as $chunk)
+ {
+ $this->parallelLint($chunk);
+ }
+ }
+
+
+ /**
+ * Run mutation tests with humbug
+ *
+ * @param bool $stats - if true, generates stats rather than running mutation tests
+ */
+ public function mutate($stats = FALSE)
+ {
+ $test_parts = [
+ 'vendor/bin/humbug'
+ ];
+
+ $stat_parts = [
+ 'vendor/bin/humbug',
+ '--skip-killed=yes',
+ '-v',
+ './build/humbug.json'
+ ];
+
+ $cmd_parts = ($stats) ? $stat_parts : $test_parts;
+ $this->_run($cmd_parts);
+ }
+
+ /**
+ * Run the phpcs tool
+ *
+ * @param bool $report - if true, generates reports instead of direct output
+ */
+ public function phpcs($report = FALSE)
+ {
+ $dir = __DIR__;
+
+ $report_cmd_parts = [
+ 'vendor/bin/phpcs',
+ "--standard=./build/CodeIgniter",
+ "--report-checkstyle=./build/logs/phpcs.xml",
+ ];
+
+ $normal_cmd_parts = [
+ 'vendor/bin/phpcs',
+ "--standard=./build/CodeIgniter",
+ ];
+
+ $cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts;
+
+ $this->_run($cmd_parts);
+ }
+
+ /**
+ * Run the phploc tool
+ *
+ * @param bool $report - if true, generates reports instead of direct output
+ */
+ public function phploc($report = FALSE)
+ {
+ // Command for generating reports
+ $report_cmd_parts = [
+ 'vendor/bin/phploc',
+ '--count-tests',
+ '--log-csv=build/logs/phploc.csv',
+ '--log-xml=build/logs/phploc.xml',
+ 'src',
+ 'tests'
+ ];
+
+ // Command for generating direct output
+ $normal_cmd_parts = [
+ 'vendor/bin/phploc',
+ '--count-tests',
+ 'src',
+ 'tests'
+ ];
+
+ $cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts;
+
+ $this->_run($cmd_parts);
+ }
+
+ /**
+ * Create temporary directories
+ */
+ public function prepare()
+ {
+ array_map([$this, '_mkdir'], $this->taskDirs);
+ }
+
+ /**
+ * Lint php files and run unit tests
+ */
+ public function test()
+ {
+ $this->lint();
+ $this->taskPHPUnit()
+ ->configFile('phpunit.xml')
+ ->printed(true)
+ ->run();
+ }
+
+ /**
+ * Watches for file updates, and automatically runs appropriate actions
+ */
+ public function watch()
+ {
+ $this->taskWatch()
+ ->monitor('composer.json', function() {
+ $this->taskComposerUpdate()->run();
+ })
+ ->monitor('src', function () {
+ $this->taskExec('test')->run();
+ })
+ ->monitor('tests', function () {
+ $this->taskExec('test')->run();
+ })
+ ->run();
+ }
+
+ /**
+ * Create pdepend reports
+ */
+ protected function dependencyReport()
+ {
+ $cmd_parts = [
+ 'vendor/bin/pdepend',
+ '--jdepend-xml=build/logs/jdepend.xml',
+ '--jdepend-chart=build/pdepend/dependencies.svg',
+ '--overview-pyramid=build/pdepend/overview-pyramid.svg',
+ 'src'
+ ];
+ $this->_run($cmd_parts);
+ }
+
+ /**
+ * Get the total list of source files, including tests
+ *
+ * @return array
+ */
+ protected function getAllSourceFiles()
+ {
+ $files = array_merge(
+ glob_recursive('build/*.php'),
+ glob_recursive('src/*.php'),
+ glob_recursive('tests/*.php'),
+ glob('*.php')
+ );
+
+ sort($files);
+
+ return $files;
+ }
+
+ /**
+ * Run php's linter in one parallel task for the passed chunk
+ *
+ * @param array $chunk
+ */
+ protected function parallelLint(array $chunk)
+ {
+ $task = $this->taskParallelExec()
+ ->timeout(5)
+ ->printed(FALSE);
+
+ foreach($chunk as $file)
+ {
+ $task = $task->process("php -l {$file}");
+ }
+
+ $task->run();
+ }
+
+ /**
+ * Generate copy paste detector report
+ */
+ protected function phpcpdReport()
+ {
+ $cmd_parts = [
+ 'vendor/bin/phpcpd',
+ '--log-pmd build/logs/pmd-cpd.xml',
+ 'src'
+ ];
+ $this->_run($cmd_parts);
+ }
+
+ /**
+ * Shortcut for joining an array of command arguments
+ * and then running it
+ *
+ * @param array $cmd_parts - command arguments
+ * @param string $join_on - what to join the command arguments with
+ */
+ protected function _run(array $cmd_parts, $join_on = ' ')
+ {
+ $this->taskExec(implode($join_on, $cmd_parts))->run();
+ }
+}
\ No newline at end of file
diff --git a/autoload.php b/autoload.php
deleted file mode 100644
index 405933b..0000000
--- a/autoload.php
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build/CodeIgniter/ruleset.xml b/build/CodeIgniter/ruleset.xml
new file mode 100644
index 0000000..e943a4b
--- /dev/null
+++ b/build/CodeIgniter/ruleset.xml
@@ -0,0 +1,84 @@
+
+
+ A variation of the CodeIgniter standard
+
+ ../../src/
+
+ utf-8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build/docker_install.sh b/build/docker_install.sh
index 5c25333..63e1fe3 100644
--- a/build/docker_install.sh
+++ b/build/docker_install.sh
@@ -10,7 +10,7 @@ set -xe
# Install git (the php image doesn't have it) which is required by composer
apt-get update -yqq
-apt-get install git libpq-dev libmysqlclient18 unzip -yqq
+apt-get install git libpq-dev libmysqlclient18 unzip firebird2.5-superclassic -yqq
# Install phpunit, the tool that we will use for testing
curl -Lo /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar
@@ -25,4 +25,5 @@ mv "$DIR/../tests/settings-ci.json" "$DIR/../tests/settings.json"
docker-php-ext-install pdo_mysql
docker-php-ext-install pdo_pgsql
#docker-php-ext-install pdo_oci
-#docker-php-ext-install interbase
+docker-php-ext-install interbase
+docker-php-ext-install pdo_firebird
diff --git a/build/header_comment.txt b/build/header_comment.txt
new file mode 100644
index 0000000..6fd37bc
--- /dev/null
+++ b/build/header_comment.txt
@@ -0,0 +1,13 @@
+/**
+ * Query
+ *
+ * SQL Query Builder / Database Abstraction Layer
+ *
+ * PHP version 5.4
+ *
+ * @package Query
+ * @author Timothy J. Warren
+ * @copyright 2012 - 2015 Timothy J. Warren
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link https://git.timshomepage.net/aviat4ion/Query
+ */
diff --git a/build/phpdox.xml b/build/phpdox.xml
index a5f4e9c..edcdc07 100644
--- a/build/phpdox.xml
+++ b/build/phpdox.xml
@@ -99,6 +99,7 @@