diff --git a/cake/libs/model/datasources/dbo/dbo_mysql.php b/cake/libs/model/datasources/dbo/dbo_mysql.php
index 0788d8c69..24d623290 100644
--- a/cake/libs/model/datasources/dbo/dbo_mysql.php
+++ b/cake/libs/model/datasources/dbo/dbo_mysql.php
@@ -142,31 +142,19 @@ class DboMysql extends DboSource {
 		if ($cache != null) {
 			return $cache;
 		}
-		$tables = array();
-		$result = mysql_list_tables($this->config['database'], $this->connection);
+		$result = $this->_execute('SHOW TABLES FROM ' . $this->config['database'] . ';');
+
+		if (!$result) {
+			return array();
+		} else {
+			$tables = array();
 
-		if ($result) {
 			while ($line = mysql_fetch_array($result)) {
 				$tables[] = $line[0];
 			}
+			parent::listSources($tables);
+			return $tables;
 		}
-
-		if (empty($tables)) {
-			$result = $this->query('SHOW TABLES');
-			$key1 = $key2 = null;
-			if ($result) {
-				foreach ($result as $item) {
-					if (empty($key1)) {
-						$key1 = key($item);
-						$key2 = key($item[$key1]);
-					}
-					$tables[] = $item[$key1][$key2];
-				}
-			}
-		}
-
-		parent::listSources($tables);
-		return $tables;
 	}
 /**
  * Returns an array of the fields in given table name.
@@ -182,7 +170,7 @@ class DboMysql extends DboSource {
 		}
 
 		$fields = false;
-		$cols = $this->query('DESC ' . $this->fullTableName($model));
+		$cols = $this->query('DESCRIBE ' . $this->fullTableName($model));
 
 		foreach ($cols as $column) {
 			$colKey = array_keys($column);
@@ -354,7 +342,7 @@ class DboMysql extends DboSource {
 
 		$col = r(')', '', $real);
 		$limit = $this->length($real);
-		@list($col) = explode('(', $col);
+		@list($col,$vals) = explode('(', $col);
 
 		if (in_array($col, array('date', 'time', 'datetime', 'timestamp'))) {
 			return $col;
@@ -378,7 +366,7 @@ class DboMysql extends DboSource {
 			return 'float';
 		}
 		if (strpos($col, 'enum') !== false) {
-			return "enum($limit)";
+			return "enum($vals)";
 		}
 		if ($col == 'boolean') {
 			return $col;
diff --git a/cake/libs/model/datasources/dbo/dbo_mysqli.php b/cake/libs/model/datasources/dbo/dbo_mysqli.php
index a47770535..68ae6bc50 100644
--- a/cake/libs/model/datasources/dbo/dbo_mysqli.php
+++ b/cake/libs/model/datasources/dbo/dbo_mysqli.php
@@ -132,15 +132,15 @@ class DboMysqli extends DboSource {
 			return $cache;
 		}
 		$result = $this->_execute('SHOW TABLES FROM ' . $this->config['database'] . ';');
+
 		if (!$result) {
 			return array();
 		} else {
-
 			$tables = array();
+
 			while ($line = mysqli_fetch_array($result)) {
 				$tables[] = $line[0];
 			}
-
 			parent::listSources($tables);
 			return $tables;
 		}
@@ -168,15 +168,16 @@ class DboMysqli extends DboSource {
 			}
 			if (isset($column[0])) {
 				$fields[] = array(
-					'name' => $column[0]['Field'],
-					'type' => $this->column($column[0]['Type']),
-					'null' => $column[0]['Null'],
-					'default' => $column[0]['Default']
+					'name'		=> $column[0]['Field'],
+					'type'		=> $this->column($column[0]['Type']),
+					'null'		=> ($column[0]['Null'] == 'YES' ? true : false),
+					'default'	=> $column[0]['Default'],
+					'length'	=> $this->length($column[0]['Type'])
 				);
 			}
 		}
 
-		$this->__cacheDescription($model->tablePrefix.$model->table, $fields);
+		$this->__cacheDescription($this->fullTableName($model, false), $fields);
 		return $fields;
 	}
 /**
@@ -310,7 +311,7 @@ class DboMysqli extends DboSource {
 		if ($id !== false && !empty($id) && !empty($id[0]) && isset($id[0][0]['insertID'])) {
 			return $id[0][0]['insertID'];
 		}
-		
+
 		return null;
 	}
 /**
@@ -322,21 +323,20 @@ class DboMysqli extends DboSource {
 	function column($real) {
 		if (is_array($real)) {
 			$col = $real['name'];
-			if (isset($real['limit']))
-			{
+			if (isset($real['limit'])) {
 				$col .= '('.$real['limit'].')';
 			}
 			return $col;
 		}
 
 		$col = r(')', '', $real);
-		$limit = null;
-		@list($col, $limit) = explode('(', $col);
+		$limit = $this->length($real);
+		@list($col,$vals) = explode('(', $col);
 
 		if (in_array($col, array('date', 'time', 'datetime', 'timestamp'))) {
 			return $col;
 		}
-		if ($col == 'tinyint' && $limit == '1') {
+		if ($col == 'tinyint' && $limit == 1) {
 			return 'boolean';
 		}
 		if (strpos($col, 'int') !== false) {
@@ -355,13 +355,32 @@ class DboMysqli extends DboSource {
 			return 'float';
 		}
 		if (strpos($col, 'enum') !== false) {
-			return "enum($limit)";
+			return "enum($vals)";
 		}
 		if ($col == 'boolean') {
 			return $col;
 		}
 		return 'text';
 	}
+/**
+ * Gets the length of a database-native column description, or null if no length
+ *
+ * @param string $real Real database-layer column type (i.e. "varchar(255)")
+ * @return int An integer representing the length of the column
+ */
+	function length($real) {
+		$col = r(array(')', 'unsigned'), '', $real);
+		$limit = null;
+
+		if (strpos($col, '(') !== false) {
+			list($col, $limit) = explode('(', $col);
+		}
+
+		if ($limit != null) {
+			return intval($limit);
+		}
+		return null;
+	}
 /**
  * Enter description here...
  *
@@ -411,11 +430,105 @@ class DboMysqli extends DboSource {
 	function setEncoding($enc) {
 		return $this->_execute('SET NAMES ' . $enc) != false;
 	}
+/**
+ * Gets the database encoding
+ *
+ * @return string The database encoding
+ */
+	function getEncoding() {
+		return mysql_client_encoding($this->connection);
+	}
+/**
+ * Generate a MySQL schema for the given Schema object
+ *
+ * @param object $schema An instance of a subclass of CakeSchema
+ * @param string $table Optional.  If specified only the table name given will be generated.
+ *                      Otherwise, all tables defined in the schema are generated.
+ * @return string
+ */
+	function generateSchema($schema, $table = null) {
+		if (!is_a($schema, 'CakeSchema')) {
+			trigger_error(__('Invalid schema object', true), E_USER_WARNING);
+			return null;
+		}
+		$out = '';
+
+		foreach ($schema->tables as $curTable => $columns) {
+			if (empty($table) || $table == $curTable) {
+				$out .= 'CREATE TABLE ' . $this->fullTableName($curTable) . " (\n";
+				$colList = array();
+				$primary = null;
+
+				foreach ($columns as $col) {
+					if (isset($col['key']) && $col['key'] == 'primary') {
+						$primary = $col;
+					}
+					$colList[] = $this->generateColumnSchema($col);
+				}
+				if (empty($primary)) {
+					$primary = array('id', 'integer', 'key' => 'primary');
+					array_unshift($colList, $this->generateColumnSchema($primary));
+				}
+				$colList[] = 'PRIMARY KEY (' . $this->name($primary[0]) . ')';
+				$out .= "\t" . join(",\n\t", $colList) . "\n);\n\n";
+			}
+		}
+		return $out;
+	}
+/**
+ * Generate a MySQL-native column schema string
+ *
+ * @param array $column An array structured like the following: array('name', 'type'[, options]),
+ *                      where options can be 'default', 'length', or 'key'.
+ * @return string
+ */
+	function generateColumnSchema($column) {
+		$name = $type = null;
+		$column = am(array('null' => true), $column);
+		list($name, $type) = $column;
+
+		if (empty($name) || empty($type)) {
+			trigger_error('Column name or type not defined in schema', E_USER_WARNING);
+			return null;
+		}
+		if (!isset($this->columns[$type])) {
+			trigger_error("Column type {$type} does not exist", E_USER_WARNING);
+			return null;
+		}
+		$real = $this->columns[$type];
+		$out = $this->name($name) . ' ' . $real['name'];
+
+		if (isset($real['limit']) || isset($real['length']) || isset($column['limit']) || isset($column['length'])) {
+			if (isset($column['length'])) {
+				$length = $column['length'];
+			} elseif (isset($column['limit'])) {
+				$length = $column['limit'];
+			} elseif (isset($real['length'])) {
+				$length = $real['length'];
+			} else {
+				$length = $real['limit'];
+			}
+			$out .= '(' . $length . ')';
+		}
+
+		if (isset($column['key']) && $column['key'] == 'primary') {
+			$out .= ' NOT NULL AUTO_INCREMENT';
+		} elseif (isset($column['default'])) {
+			$out .= ' DEFAULT ' . $this->value($column['default'], $type);
+		} elseif (isset($column['null']) && $column['null'] == true) {
+			$out .= ' DEFAULT NULL';
+		} elseif (isset($column['default']) && isset($column['null']) && $column['null'] == false) {
+			$out .= ' DEFAULT ' . $this->value($column['default'], $type) . ' NOT NULL';
+		} elseif (isset($column['null']) && $column['null'] == false) {
+			$out .= ' NOT NULL';
+		}
+		return $out;
+	}
 /**
  * Enter description here...
  *
  * @param unknown_type $schema
- *  @return unknown
+ * @return unknown
  */
 	function buildSchemaQuery($schema) {
 		$search = array('{AUTOINCREMENT}', '{PRIMARY}', '{UNSIGNED}', '{FULLTEXT}',