diff --git a/phpBB/includes/db/driver/mysql.php b/phpBB/includes/db/driver/mysql.php
index 9de7283a42..f3744ac09d 100644
--- a/phpBB/includes/db/driver/mysql.php
+++ b/phpBB/includes/db/driver/mysql.php
@@ -24,7 +24,7 @@ if (!defined('IN_PHPBB'))
 * MySQL 5.0+
 * @package dbal
 */
-class phpbb_db_driver_mysql extends phpbb_db_driver
+class phpbb_db_driver_mysql extends phpbb_db_driver_mysql_base
 {
 	var $multi_insert = true;
 	var $connect_error = '';
@@ -135,14 +135,6 @@ class phpbb_db_driver_mysql extends phpbb_db_driver
 		return ($raw) ? $this->sql_server_version : 'MySQL ' . $this->sql_server_version;
 	}
 
-	/**
-	* {@inheritDoc}
-	*/
-	public function sql_concatenate($expr1, $expr2)
-	{
-		return 'CONCAT(' . $expr1 . ', ' . $expr2 . ')';
-	}
-
 	/**
 	* SQL Transaction
 	* @access private
@@ -226,25 +218,6 @@ class phpbb_db_driver_mysql extends phpbb_db_driver
 		return $this->query_result;
 	}
 
-	/**
-	* Build LIMIT query
-	*/
-	function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
-	{
-		$this->query_result = false;
-
-		// if $total is set to 0 we do not want to limit the number of rows
-		if ($total == 0)
-		{
-			// Having a value of -1 was always a bug
-			$total = '18446744073709551615';
-		}
-
-		$query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);
-
-		return $this->sql_query($query, $cache_ttl);
-	}
-
 	/**
 	* Return number of affected rows
 	*/
@@ -341,101 +314,6 @@ class phpbb_db_driver_mysql extends phpbb_db_driver
 		return @mysql_real_escape_string($msg, $this->db_connect_id);
 	}
 
-	/**
-	* Gets the estimated number of rows in a specified table.
-	*
-	* @param string $table_name		Table name
-	*
-	* @return string				Number of rows in $table_name.
-	*								Prefixed with ~ if estimated (otherwise exact).
-	*
-	* @access public
-	*/
-	function get_estimated_row_count($table_name)
-	{
-		$table_status = $this->get_table_status($table_name);
-
-		if (isset($table_status['Engine']))
-		{
-			if ($table_status['Engine'] === 'MyISAM')
-			{
-				return $table_status['Rows'];
-			}
-			else if ($table_status['Engine'] === 'InnoDB' && $table_status['Rows'] > 100000)
-			{
-				return '~' . $table_status['Rows'];
-			}
-		}
-
-		return parent::get_row_count($table_name);
-	}
-
-	/**
-	* Gets the exact number of rows in a specified table.
-	*
-	* @param string $table_name		Table name
-	*
-	* @return string				Exact number of rows in $table_name.
-	*
-	* @access public
-	*/
-	function get_row_count($table_name)
-	{
-		$table_status = $this->get_table_status($table_name);
-
-		if (isset($table_status['Engine']) && $table_status['Engine'] === 'MyISAM')
-		{
-			return $table_status['Rows'];
-		}
-
-		return parent::get_row_count($table_name);
-	}
-
-	/**
-	* Gets some information about the specified table.
-	*
-	* @param string $table_name		Table name
-	*
-	* @return array
-	*
-	* @access protected
-	*/
-	function get_table_status($table_name)
-	{
-		$sql = "SHOW TABLE STATUS
-			LIKE '" . $this->sql_escape($table_name) . "'";
-		$result = $this->sql_query($sql);
-		$table_status = $this->sql_fetchrow($result);
-		$this->sql_freeresult($result);
-
-		return $table_status;
-	}
-
-	/**
-	* Build LIKE expression
-	* @access private
-	*/
-	function _sql_like_expression($expression)
-	{
-		return $expression;
-	}
-
-	/**
-	* Build db-specific query data
-	* @access private
-	*/
-	function _sql_custom_build($stage, $data)
-	{
-		switch ($stage)
-		{
-			case 'FROM':
-				$data = '(' . $data . ')';
-			break;
-		}
-
-		return $data;
-	}
-
 	/**
 	* return sql error array
 	* @access private
diff --git a/phpBB/includes/db/driver/mysql_base.php b/phpBB/includes/db/driver/mysql_base.php
new file mode 100644
index 0000000000..ba44ea61aa
--- /dev/null
+++ b/phpBB/includes/db/driver/mysql_base.php
@@ -0,0 +1,145 @@
+<?php
+/**
+*
+* @package dbal
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+/**
+* Abstract MySQL Database Base Abstraction Layer
+* @package dbal
+*/
+abstract class phpbb_db_driver_mysql_base extends phpbb_db_driver
+{
+	/**
+	* {@inheritDoc}
+	*/
+	public function sql_concatenate($expr1, $expr2)
+	{
+		return 'CONCAT(' . $expr1 . ', ' . $expr2 . ')';
+	}
+
+	/**
+	* Build LIMIT query
+	*/
+	function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
+	{
+		$this->query_result = false;
+
+		// if $total is set to 0 we do not want to limit the number of rows
+		if ($total == 0)
+		{
+			// MySQL 4.1+ no longer supports -1 in limit queries
+			$total = '18446744073709551615';
+		}
+
+		$query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);
+
+		return $this->sql_query($query, $cache_ttl);
+	}
+
+	/**
+	* Gets the estimated number of rows in a specified table.
+	*
+	* @param string $table_name		Table name
+	*
+	* @return string				Number of rows in $table_name.
+	*								Prefixed with ~ if estimated (otherwise exact).
+	*
+	* @access public
+	*/
+	function get_estimated_row_count($table_name)
+	{
+		$table_status = $this->get_table_status($table_name);
+
+		if (isset($table_status['Engine']))
+		{
+			if ($table_status['Engine'] === 'MyISAM')
+			{
+				return $table_status['Rows'];
+			}
+			else if ($table_status['Engine'] === 'InnoDB' && $table_status['Rows'] > 100000)
+			{
+				return '~' . $table_status['Rows'];
+			}
+		}
+
+		return parent::get_row_count($table_name);
+	}
+
+	/**
+	* Gets the exact number of rows in a specified table.
+	*
+	* @param string $table_name		Table name
+	*
+	* @return string				Exact number of rows in $table_name.
+	*
+	* @access public
+	*/
+	function get_row_count($table_name)
+	{
+		$table_status = $this->get_table_status($table_name);
+
+		if (isset($table_status['Engine']) && $table_status['Engine'] === 'MyISAM')
+		{
+			return $table_status['Rows'];
+		}
+
+		return parent::get_row_count($table_name);
+	}
+
+	/**
+	* Gets some information about the specified table.
+	*
+	* @param string $table_name		Table name
+	*
+	* @return array
+	*
+	* @access protected
+	*/
+	function get_table_status($table_name)
+	{
+		$sql = "SHOW TABLE STATUS
+			LIKE '" . $this->sql_escape($table_name) . "'";
+		$result = $this->sql_query($sql);
+		$table_status = $this->sql_fetchrow($result);
+		$this->sql_freeresult($result);
+
+		return $table_status;
+	}
+
+	/**
+	* Build LIKE expression
+	* @access private
+	*/
+	function _sql_like_expression($expression)
+	{
+		return $expression;
+	}
+
+	/**
+	* Build db-specific query data
+	* @access private
+	*/
+	function _sql_custom_build($stage, $data)
+	{
+		switch ($stage)
+		{
+			case 'FROM':
+				$data = '(' . $data . ')';
+			break;
+		}
+
+		return $data;
+	}
+}
diff --git a/phpBB/includes/db/driver/mysqli.php b/phpBB/includes/db/driver/mysqli.php
index 7448bf1670..0f7a73ee6e 100644
--- a/phpBB/includes/db/driver/mysqli.php
+++ b/phpBB/includes/db/driver/mysqli.php
@@ -21,7 +21,7 @@ if (!defined('IN_PHPBB'))
 * MySQL 4.1+ or MySQL 5.0+
 * @package dbal
 */
-class phpbb_db_driver_mysqli extends phpbb_db_driver
+class phpbb_db_driver_mysqli extends phpbb_db_driver_mysql_base
 {
 	var $multi_insert = true;
 	var $connect_error = '';
@@ -103,6 +103,7 @@ class phpbb_db_driver_mysqli extends phpbb_db_driver
 
 	/**
 	* Version information about used database
+	* @param bool $raw if true, only return the fetched sql_server_version
 	* @param bool $use_cache If true, it is safe to retrieve the value from the cache
 	* @return string sql server version
 	*/
@@ -127,14 +128,6 @@ class phpbb_db_driver_mysqli extends phpbb_db_driver
 		return ($raw) ? $this->sql_server_version : 'MySQL(i) ' . $this->sql_server_version;
 	}
 
-	/**
-	* {@inheritDoc}
-	*/
-	public function sql_concatenate($expr1, $expr2)
-	{
-		return 'CONCAT(' . $expr1 . ', ' . $expr2 . ')';
-	}
-
 	/**
 	* SQL Transaction
 	* @access private
@@ -217,25 +210,6 @@ class phpbb_db_driver_mysqli extends phpbb_db_driver
 		return $this->query_result;
 	}
 
-	/**
-	* Build LIMIT query
-	*/
-	function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
-	{
-		$this->query_result = false;
-
-		// if $total is set to 0 we do not want to limit the number of rows
-		if ($total == 0)
-		{
-			// MySQL 4.1+ no longer supports -1 in limit queries
-			$total = '18446744073709551615';
-		}
-
-		$query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);
-
-		return $this->sql_query($query, $cache_ttl);
-	}
-
 	/**
 	* Return number of affected rows
 	*/
@@ -327,101 +301,6 @@ class phpbb_db_driver_mysqli extends phpbb_db_driver
 		return @mysqli_real_escape_string($this->db_connect_id, $msg);
 	}
 
-	/**
-	* Gets the estimated number of rows in a specified table.
-	*
-	* @param string $table_name		Table name
-	*
-	* @return string				Number of rows in $table_name.
-	*								Prefixed with ~ if estimated (otherwise exact).
-	*
-	* @access public
-	*/
-	function get_estimated_row_count($table_name)
-	{
-		$table_status = $this->get_table_status($table_name);
-
-		if (isset($table_status['Engine']))
-		{
-			if ($table_status['Engine'] === 'MyISAM')
-			{
-				return $table_status['Rows'];
-			}
-			else if ($table_status['Engine'] === 'InnoDB' && $table_status['Rows'] > 100000)
-			{
-				return '~' . $table_status['Rows'];
-			}
-		}
-
-		return parent::get_row_count($table_name);
-	}
-
-	/**
-	* Gets the exact number of rows in a specified table.
-	*
-	* @param string $table_name		Table name
-	*
-	* @return string				Exact number of rows in $table_name.
-	*
-	* @access public
-	*/
-	function get_row_count($table_name)
-	{
-		$table_status = $this->get_table_status($table_name);
-
-		if (isset($table_status['Engine']) && $table_status['Engine'] === 'MyISAM')
-		{
-			return $table_status['Rows'];
-		}
-
-		return parent::get_row_count($table_name);
-	}
-
-	/**
-	* Gets some information about the specified table.
-	*
-	* @param string $table_name		Table name
-	*
-	* @return array
-	*
-	* @access protected
-	*/
-	function get_table_status($table_name)
-	{
-		$sql = "SHOW TABLE STATUS
-			LIKE '" . $this->sql_escape($table_name) . "'";
-		$result = $this->sql_query($sql);
-		$table_status = $this->sql_fetchrow($result);
-		$this->sql_freeresult($result);
-
-		return $table_status;
-	}
-
-	/**
-	* Build LIKE expression
-	* @access private
-	*/
-	function _sql_like_expression($expression)
-	{
-		return $expression;
-	}
-
-	/**
-	* Build db-specific query data
-	* @access private
-	*/
-	function _sql_custom_build($stage, $data)
-	{
-		switch ($stage)
-		{
-			case 'FROM':
-				$data = '(' . $data . ')';
-			break;
-		}
-
-		return $data;
-	}
-
 	/**
 	* return sql error array
 	* @access private