diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ccee4e13d113be1f96a4ab108233c83907912dde
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+/hyperdb/
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..dda995133ece7c9e5a3dc05f48afa5c17c350768
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,28 @@
+{
+    "name": "lucha/r2db",
+    "description": "r2db wordpress database",
+    "type": "libray",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "lucha",
+            "email": "lucha@paranoici.org"
+        }
+    ],
+    "repositories": [
+        {
+            "type": "composer",
+            "url" : "https://wpackagist.org"
+        }
+    ],
+    "require": {
+        "flexihash/flexihash": "^2.0",
+        "wpackagist-plugin/hyperdb": "^1.6",
+        "composer/installers": "^1.9"
+    },
+    "extra": {    
+        "installer-paths": {
+            "hyperdb": ["wpackagist-plugin/hyperdb"]
+        }
+    }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..7ff6da461789c12462c1ef4129955615b9d33ef4
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,218 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "969ecb964c3720238fbd1b5024615354",
+    "packages": [
+        {
+            "name": "composer/installers",
+            "version": "v1.9.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/installers.git",
+                "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca",
+                "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.0 || ^2.0"
+            },
+            "replace": {
+                "roundcube/plugin-installer": "*",
+                "shama/baton": "*"
+            },
+            "require-dev": {
+                "composer/composer": "1.6.* || 2.0.*@dev",
+                "composer/semver": "1.0.* || 2.0.*@dev",
+                "phpunit/phpunit": "^4.8.36",
+                "sebastian/comparator": "^1.2.4",
+                "symfony/process": "^2.3"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "Composer\\Installers\\Plugin",
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Installers\\": "src/Composer/Installers"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kyle Robinson Young",
+                    "email": "kyle@dontkry.com",
+                    "homepage": "https://github.com/shama"
+                }
+            ],
+            "description": "A multi-framework Composer library installer",
+            "homepage": "https://composer.github.io/installers/",
+            "keywords": [
+                "Craft",
+                "Dolibarr",
+                "Eliasis",
+                "Hurad",
+                "ImageCMS",
+                "Kanboard",
+                "Lan Management System",
+                "MODX Evo",
+                "MantisBT",
+                "Mautic",
+                "Maya",
+                "OXID",
+                "Plentymarkets",
+                "Porto",
+                "RadPHP",
+                "SMF",
+                "Thelia",
+                "Whmcs",
+                "WolfCMS",
+                "agl",
+                "aimeos",
+                "annotatecms",
+                "attogram",
+                "bitrix",
+                "cakephp",
+                "chef",
+                "cockpit",
+                "codeigniter",
+                "concrete5",
+                "croogo",
+                "dokuwiki",
+                "drupal",
+                "eZ Platform",
+                "elgg",
+                "expressionengine",
+                "fuelphp",
+                "grav",
+                "installer",
+                "itop",
+                "joomla",
+                "known",
+                "kohana",
+                "laravel",
+                "lavalite",
+                "lithium",
+                "magento",
+                "majima",
+                "mako",
+                "mediawiki",
+                "modulework",
+                "modx",
+                "moodle",
+                "osclass",
+                "phpbb",
+                "piwik",
+                "ppi",
+                "puppet",
+                "pxcms",
+                "reindex",
+                "roundcube",
+                "shopware",
+                "silverstripe",
+                "sydes",
+                "sylius",
+                "symfony",
+                "typo3",
+                "wordpress",
+                "yawik",
+                "zend",
+                "zikula"
+            ],
+            "time": "2020-04-07T06:57:05+00:00"
+        },
+        {
+            "name": "flexihash/flexihash",
+            "version": "v2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/pda/flexihash.git",
+                "reference": "497ba5782606d998f8ab0b4e5942e3a799bec018"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/pda/flexihash/zipball/497ba5782606d998f8ab0b4e5942e3a799bec018",
+                "reference": "497ba5782606d998f8ab0b4e5942e3a799bec018",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8",
+                "satooshi/php-coveralls": "~1.0",
+                "squizlabs/php_codesniffer": "^2.3",
+                "symfony/config": "^2.0.0",
+                "symfony/console": "^2.0.0",
+                "symfony/filesystem": "^2.0.0",
+                "symfony/stopwatch": "^2.0.0",
+                "symfony/yaml": "^2.0.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Flexihash\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paul Annesley",
+                    "email": "paul@annesley.cc",
+                    "homepage": "http://paul.annesley.cc"
+                },
+                {
+                    "name": "Dom Morgan",
+                    "email": "dom@d3r.com",
+                    "homepage": "https://d3r.com"
+                }
+            ],
+            "description": "Flexihash is a small PHP library which implements consistent hashing",
+            "homepage": "https://github.com/pda/flexihash",
+            "time": "2016-04-22T21:03:23+00:00"
+        },
+        {
+            "name": "wpackagist-plugin/hyperdb",
+            "version": "1.6",
+            "source": {
+                "type": "svn",
+                "url": "https://plugins.svn.wordpress.org/hyperdb/",
+                "reference": "tags/1.6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://downloads.wordpress.org/plugin/hyperdb.1.6.zip",
+                "reference": null,
+                "shasum": null
+            },
+            "require": {
+                "composer/installers": "~1.0"
+            },
+            "type": "wordpress-plugin",
+            "homepage": "https://wordpress.org/plugins/hyperdb/"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}
diff --git a/r2db/flexihash.php b/r2db/flexihash.php
deleted file mode 100644
index 33ad4714604a333f814752740431b4fc81a59aa3..0000000000000000000000000000000000000000
--- a/r2db/flexihash.php
+++ /dev/null
@@ -1,363 +0,0 @@
-<?php
-/**
- * Flexihash - A simple consistent hashing implementation for PHP.
- * 
- * The MIT License
- * 
- * Copyright (c) 2008 Paul Annesley
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- * 
- * @author Paul Annesley
- * @link http://paul.annesley.cc/
- * @copyright Paul Annesley, 2008
- */
-
-/**
- * A simple consistent hashing implementation with pluggable hash algorithms.
- *
- * @author Paul Annesley
- * @package Flexihash
- * @licence http://www.opensource.org/licenses/mit-license.php
- */
-class Flexihash
-{
-
-	/**
-	 * The number of positions to hash each target to.
-	 *
-	 * @var int
-	 */
-	private $_replicas = 64;
-
-	/**
-	 * The hash algorithm, encapsulated in a Flexihash_Hasher implementation.
-	 * @var object Flexihash_Hasher
-	 */
-	private $_hasher;
-
-	/**
-	 * Internal counter for current number of targets.
-	 * @var int
-	 */
-	private $_targetCount = 0;
-
-	/**
-	 * Internal map of positions (hash outputs) to targets
-	 * @var array { position => target, ... }
-	 */
-	private $_positionToTarget = array();
-
-	/**
-	 * Internal map of targets to lists of positions that target is hashed to.
-	 * @var array { target => [ position, position, ... ], ... }
-	 */
-	private $_targetToPositions = array();
-
-	/**
-	 * Whether the internal map of positions to targets is already sorted.
-	 * @var boolean
-	 */
-	private $_positionToTargetSorted = false;
-
-	/**
-	 * Constructor
-	 * @param object $hasher Flexihash_Hasher
-	 * @param int $replicas Amount of positions to hash each target to.
-	 */
-	public function __construct(Flexihash_Hasher $hasher = null, $replicas = null)
-	{
-		$this->_hasher = $hasher ? $hasher : new Flexihash_Crc32Hasher();
-		if (!empty($replicas)) $this->_replicas = $replicas;
-	}
-
-	/**
-	 * Add a target.
-	 * @param string $target
-         * @param float $weight
-	 * @chainable
-	 */
-	public function addTarget($target, $weight=1)
-	{
-		if (isset($this->_targetToPositions[$target]))
-		{
-			throw new Flexihash_Exception("Target '$target' already exists.");
-		}
-
-		$this->_targetToPositions[$target] = array();
-
-		// hash the target into multiple positions
-		for ($i = 0; $i < round($this->_replicas*$weight); $i++)
-		{
-			$position = $this->_hasher->hash($target . $i);
-			$this->_positionToTarget[$position] = $target; // lookup
-			$this->_targetToPositions[$target] []= $position; // target removal
-		}
-
-		$this->_positionToTargetSorted = false;
-		$this->_targetCount++;
-
-		return $this;
-	}
-
-	/**
-	 * Add a list of targets.
-	 * @param array $targets
-         * @param float $weight
-	 * @chainable
-	 */
-	public function addTargets($targets, $weight=1)
-	{
-		foreach ($targets as $target)
-		{
-			$this->addTarget($target,$weight);
-		}
-
-		return $this;
-	}
-
-	/**
-	 * Remove a target.
-	 * @param string $target
-	 * @chainable
-	 */
-	public function removeTarget($target)
-	{
-		if (!isset($this->_targetToPositions[$target]))
-		{
-			throw new Flexihash_Exception("Target '$target' does not exist.");
-		}
-
-		foreach ($this->_targetToPositions[$target] as $position)
-		{
-			unset($this->_positionToTarget[$position]);
-		}
-
-		unset($this->_targetToPositions[$target]);
-
-		$this->_targetCount--;
-
-		return $this;
-	}
-
-	/**
-	 * A list of all potential targets
-	 * @return array
-	 */
-	public function getAllTargets()
-	{
-		return array_keys($this->_targetToPositions);
-	}
-
-	/**
-	 * Looks up the target for the given resource.
-	 * @param string $resource
-	 * @return string
-	 */
-	public function lookup($resource)
-	{
-		$targets = $this->lookupList($resource, 1);
-		if (empty($targets)) throw new Flexihash_Exception('No targets exist');
-		return $targets[0];
-	}
-
-	/**
-	 * Get a list of targets for the resource, in order of precedence.
-	 * Up to $requestedCount targets are returned, less if there are fewer in total.
-	 *
-	 * @param string $resource
-	 * @param int $requestedCount The length of the list to return
-	 * @return array List of targets
-	 */
-	public function lookupList($resource, $requestedCount)
-	{
-		if (!$requestedCount)
-			throw new Flexihash_Exception('Invalid count requested');
-
-		// handle no targets
-		if (empty($this->_positionToTarget))
-			return array();
-
-		// optimize single target
-		if ($this->_targetCount == 1)
-			return array_unique(array_values($this->_positionToTarget));
-
-		// hash resource to a position
-		$resourcePosition = $this->_hasher->hash($resource);
-
-		$results = array();
-		$collect = false;
-
-		$this->_sortPositionTargets();
-
-		// search values above the resourcePosition
-		foreach ($this->_positionToTarget as $key => $value)
-		{
-			// start collecting targets after passing resource position
-			if (!$collect && $key > $resourcePosition)
-			{
-				$collect = true;
-			}
-
-			// only collect the first instance of any target
-			if ($collect && !in_array($value, $results))
-			{
-				$results []= $value;
-			}
-
-			// return when enough results, or list exhausted
-			if (count($results) == $requestedCount || count($results) == $this->_targetCount)
-			{
-				return $results;
-			}
-		}
-
-		// loop to start - search values below the resourcePosition
-		foreach ($this->_positionToTarget as $key => $value)
-		{
-			if (!in_array($value, $results))
-			{
-				$results []= $value;
-			}
-
-			// return when enough results, or list exhausted
-			if (count($results) == $requestedCount || count($results) == $this->_targetCount)
-			{
-				return $results;
-			}
-		}
-
-		// return results after iterating through both "parts"
-		return $results;
-	}
-
-	public function __toString()
-	{
-		return sprintf(
-			'%s{targets:[%s]}',
-			get_class($this),
-			implode(',', $this->getAllTargets())
-		);
-	}
-
-	// ----------------------------------------
-	// private methods
-
-	/**
-	 * Sorts the internal mapping (positions to targets) by position
-	 */
-	private function _sortPositionTargets()
-	{
-		// sort by key (position) if not already
-		if (!$this->_positionToTargetSorted)
-		{
-			ksort($this->_positionToTarget, SORT_REGULAR);
-			$this->_positionToTargetSorted = true;
-		}
-	}
-
-}
-
-
-/**
- * Hashes given values into a sortable fixed size address space.
- *
- * @author Paul Annesley
- * @package Flexihash
- * @licence http://www.opensource.org/licenses/mit-license.php
- */
-interface Flexihash_Hasher
-{
-
-	/**
-	 * Hashes the given string into a 32bit address space.
-	 *
-	 * Note that the output may be more than 32bits of raw data, for example
-	 * hexidecimal characters representing a 32bit value.
-	 *
-	 * The data must have 0xFFFFFFFF possible values, and be sortable by
-	 * PHP sort functions using SORT_REGULAR.
-	 *
-	 * @param string
-	 * @return mixed A sortable format with 0xFFFFFFFF possible values
-	 */
-	public function hash($string);
-
-}
-
-
-/**
- * Uses CRC32 to hash a value into a signed 32bit int address space.
- * Under 32bit PHP this (safely) overflows into negatives ints.
- *
- * @author Paul Annesley
- * @package Flexihash
- * @licence http://www.opensource.org/licenses/mit-license.php
- */
-class Flexihash_Crc32Hasher
-	implements Flexihash_Hasher
-{
-
-	/* (non-phpdoc)
-	 * @see Flexihash_Hasher::hash()
-	 */
-	public function hash($string)
-	{
-		return crc32($string);
-	}
-
-}
-
-
-/**
- * Uses CRC32 to hash a value into a 32bit binary string data address space.
- *
- * @author Paul Annesley
- * @package Flexihash
- * @licence http://www.opensource.org/licenses/mit-license.php
- */
-class Flexihash_Md5Hasher
-	implements Flexihash_Hasher
-{
-
-	/* (non-phpdoc)
-	 * @see Flexihash_Hasher::hash()
-	 */
-	public function hash($string)
-	{
-		return substr(md5($string), 0, 8); // 8 hexits = 32bit
-
-		// 4 bytes of binary md5 data could also be used, but
-		// performance seems to be the same.
-	}
-
-}
-
-
-/**
- * An exception thrown by Flexihash.
- *
- * @author Paul Annesley
- * @package Flexihash
- * @licence http://www.opensource.org/licenses/mit-license.php
- */
-class Flexihash_Exception extends Exception
-{
-}
-
diff --git a/r2db/db-backends.php b/src/db-backends.php
similarity index 100%
rename from r2db/db-backends.php
rename to src/db-backends.php
diff --git a/r2db/db-hash.php b/src/db-hash.php
similarity index 90%
rename from r2db/db-hash.php
rename to src/db-hash.php
index 8938929ed9c228e46c637a0d6b43a606a10c6bfd..289458ded71521903b87d97238a3c4dbcf07a495 100644
--- a/r2db/db-hash.php
+++ b/src/db-hash.php
@@ -1,6 +1,7 @@
 <?php
 
-require_once(dirname(__FILE__) . '/flexihash.php');
+require __DIR__ . '../vendor/autoload.php';
+
 require_once( ABSPATH . 'wp-config.php' );
 
 $wpdb->hash_map = new Flexihash(null, R2DB_FLEXIHASH_REPLICAS);