diff --git a/cake/libs/model/datasources/dbo/dbo_sybase.php b/cake/libs/model/datasources/dbo/dbo_sybase.php
new file mode 100644
index 000000000..8a3bf7310
--- /dev/null
+++ b/cake/libs/model/datasources/dbo/dbo_sybase.php
@@ -0,0 +1,454 @@
+<?php
+/* SVN FILE: $Id$ */
+/**
+ * MySQL layer for DBO
+ *
+ * Long description for file
+ *
+ * PHP versions 4 and 5
+ *
+ * CakePHP :  Rapid Development Framework <http://www.cakephp.org/>
+ * Copyright (c)	2006, Cake Software Foundation, Inc.
+ *								1785 E. Sahara Avenue, Suite 490-204
+ *								Las Vegas, Nevada 89104
+ *
+ * Licensed under The MIT License
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @filesource
+ * @copyright		Copyright (c) 2006, Cake Software Foundation, Inc.
+ * @link				http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
+ * @package			cake
+ * @subpackage		cake.cake.libs.model.dbo
+ * @since			CakePHP v 0.10.5.1790
+ * @version			$Revision$
+ * @modifiedby		$LastChangedBy$
+ * @lastmodified	$Date$
+ * @license			http://www.opensource.org/licenses/mit-license.php The MIT License
+ */
+/**
+ * Include DBO.
+ */
+uses('model'.DS.'datasources'.DS.'dbo_source');
+/**
+ * Short description for class.
+ *
+ * Long description for class
+ *
+ * @package		cake
+ * @subpackage	cake.cake.libs.model.dbo
+ */
+class DboSybase extends DboSource {
+/**
+ * Enter description here...
+ *
+ * @var unknown_type
+ */
+	var $description = "Sybase DBO Driver";
+/**
+ * Enter description here...
+ *
+ * @var unknown_type
+ */
+	var $startQuote = "`";
+/**
+ * Enter description here...
+ *
+ * @var unknown_type
+ */
+	var $endQuote = "`";
+/**
+ * Base configuration settings for MySQL driver
+ *
+ * @var array
+ */
+	var $_baseConfig = array('persistent' => true,
+								'host' => 'localhost',
+								'login' => 'root',
+								'password' => '',
+								'database' => 'cake',
+								'port' => '3306',
+								'connect' => 'sybase_pconnect');
+/**
+ * MySQL column definition
+ *
+ * @var array
+ */
+	var $columns = array('primary_key' => array('name' => 'int(11) DEFAULT NULL auto_increment'),
+						'string' => array('name' => 'varchar', 'limit' => '255'),
+						'text' => array('name' => 'text'),
+						'integer' => array('name' => 'int', 'limit' => '11', 'formatter' => 'intval'),
+						'float' => array('name' => 'float', 'formatter' => 'floatval'),
+						'datetime' => array('name' => 'datetime', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
+						'timestamp' => array('name' => 'timestamp', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
+						'time' => array('name' => 'time', 'format' => 'H:i:s', 'formatter' => 'date'),
+						'date' => array('name' => 'date', 'format' => 'Y-m-d', 'formatter' => 'date'),
+						'binary' => array('name' => 'blob'),
+						'boolean' => array('name' => 'tinyint', 'limit' => '1'));
+/**
+ * Connects to the database using options in the given configuration array.
+ *
+ * @return boolean True if the database could be connected, else false
+ */
+	function connect() {
+		$config = $this->config;
+		$connect = $config['connect'];
+		$this->connected = false;
+
+		if (!$config['persistent']) {
+			$this->connection = sybase_connect($config['host'], $config['login'], $config['password'], true);
+		} else {
+			$this->connection = $connect($config['host'], $config['login'], $config['password']);
+		}
+
+		if (sybase_select_db($config['database'], $this->connection)) {
+			$this->connected = true;
+		}
+		return $this->connected;
+	}
+/**
+ * Disconnects from database.
+ *
+ * @return boolean True if the database could be disconnected, else false
+ */
+	function disconnect() {
+		$this->connected = !@sybase_close($this->connection);
+		return !$this->connected;
+	}
+/**
+ * Executes given SQL statement.
+ *
+ * @param string $sql SQL statement
+ * @return resource Result resource identifier
+ * @access protected
+ */
+	function _execute($sql) {
+		return sybase_query($sql, $this->connection);
+	}
+/**
+ * Returns a row from given resultset as an array .
+ *
+ * @param bool $assoc Associative array only, or both?
+ * @return array The fetched row as an array
+ */
+	function fetchRow($assoc = false) {
+		if(is_resource($this->_result)) {
+			$this->resultSet($this->_result);
+			$resultRow = $this->fetchResult();
+			return $resultRow;
+		} else {
+			return null;
+		}
+	}
+/**
+ * Returns an array of sources (tables) in the database.
+ *
+ * @return array Array of tablenames in the database
+ */
+	function listSources() {
+		$cache = parent::listSources();
+		if ($cache != null) {
+			return $cache;
+		}
+
+		$result = $this->_execute("SHOW TABLES FROM " . $this->config['database']);
+		if (!$result) {
+			return array();
+		} else {
+
+			$tables = array();
+			while ($line = sybase_fetch_array($result)) {
+				$tables[] = $line[0];
+			}
+
+			parent::listSources($tables);
+			return $tables;
+		}
+	}
+/**
+ * Returns an array of the fields in given table name.
+ *
+ * @param string $tableName Name of database table to inspect
+ * @return array Fields in table. Keys are name and type
+ */
+	function describe(&$model) {
+
+		$cache = parent::describe($model);
+		if ($cache != null) {
+			return $cache;
+		}
+
+		$fields = false;
+		$cols = $this->query('DESC ' . $this->fullTableName($model));
+
+		foreach ($cols as $column) {
+			$colKey = array_keys($column);
+			if (isset($column[$colKey[0]]) && !isset($column[0])) {
+				$column[0] = $column[$colKey[0]];
+			}
+			if (isset($column[0])) {
+				$fields[] = array('name' => $column[0]['Field'], 'type' => $this->column($column[0]['Type']), 'null' => $column[0]['Null']);
+			}
+		}
+
+		$this->__cacheDescription($model->tablePrefix.$model->table, $fields);
+		return $fields;
+	}
+/**
+ * Returns a quoted name of $data for use in an SQL statement.
+ *
+ * @param string $data Name (table.field) to be prepared for use in an SQL statement
+ * @return string Quoted for MySQL
+ */
+	function name($data) {
+		if ($data == '*') {
+			return '*';
+		}
+		$pos = strpos($data, '`');
+		if ($pos === false) {
+			$data = '`'. str_replace('.', '`.`', $data) .'`';
+		}
+		return $data;
+	}
+/**
+ * Returns a quoted and escaped string of $data for use in an SQL statement.
+ *
+ * @param string $data String to be prepared for use in an SQL statement
+ * @param string $column The column into which this data will be inserted
+ * @param boolean $safe Whether or not numeric data should be handled automagically if no column data is provided
+ * @return string Quoted and escaped data
+ */
+	function value($data, $column = null, $safe = false) {
+		$parent = parent::value($data, $column, $safe);
+
+		if ($parent != null) {
+			return $parent;
+		}
+
+		if ($data === null) {
+			return 'NULL';
+		}
+
+		if($data == '') {
+			return  "''";
+		}
+
+		switch ($column) {
+			case 'boolean':
+				$data = $this->boolean((bool)$data);
+			break;
+			default:
+				if�(get_magic_quotes_gpc()�&&�trim(ini_get("magic_quotes_sybase"))�==�"") {
+					$data�=�stripslashes($data);
+					$data�=�str_replace("'",�"''",�$data); 
+				} elseif�(!get_magic_quotes_gpc()) { 
+					$data�=�str_replace("'",�"''",�$data); 
+				} 
+			break;
+		}
+
+		return "'" . $data . "'";
+	}
+/**
+ * Begin a transaction
+ *
+ * @param unknown_type $model
+ * @return boolean True on success, false on fail
+ * (i.e. if the database/model does not support transactions).
+ */
+	function begin(&$model) {
+		if (parent::begin($model)) {
+			if ($this->execute('START TRANSACTION')) {
+				$this->__transactionStarted = true;
+				return true;
+			}
+		}
+		return false;
+	}
+/**
+ * Commit a transaction
+ *
+ * @param unknown_type $model
+ * @return boolean True on success, false on fail
+ * (i.e. if the database/model does not support transactions,
+ * or a transaction has not started).
+ */
+	function commit(&$model) {
+		if (parent::commit($model)) {
+			$this->__transactionStarted;
+			return $this->execute('COMMIT');
+		}
+		return false;
+	}
+/**
+ * Rollback a transaction
+ *
+ * @param unknown_type $model
+ * @return boolean True on success, false on fail
+ * (i.e. if the database/model does not support transactions,
+ * or a transaction has not started).
+ */
+	function rollback(&$model) {
+		if (parent::rollback($model)) {
+			return $this->execute('ROLLBACK');
+		}
+		return false;
+	}
+/**
+ * Returns a formatted error message from previous database operation.
+ *
+ * @return string Error message with error number
+ */
+	function lastError() {
+		if (mysql_errno($this->connection)) {
+			return mysql_errno($this->connection).': '.mysql_error($this->connection);
+		}
+		return null;
+	}
+/**
+ * Returns number of affected rows in previous database operation. If no previous operation exists,
+ * this returns false.
+ *
+ * @return int Number of affected rows
+ */
+	function lastAffected() {
+		if ($this->_result) {
+			return mysql_affected_rows($this->connection);
+		}
+		return null;
+	}
+/**
+ * Returns number of rows in previous resultset. If no previous resultset exists,
+ * this returns false.
+ *
+ * @return int Number of rows in resultset
+ */
+	function lastNumRows() {
+		if ($this->_result and is_resource($this->_result)) {
+			return @mysql_num_rows($this->_result);
+		}
+		return null;
+	}
+/**
+ * Returns the ID generated from the previous INSERT operation.
+ *
+ * @param unknown_type $source
+ * @return in
+ */
+	function lastInsertId($source = null) {
+		$id = mysql_insert_id($this->connection);
+		if ($id) {
+			return $id;
+		}
+
+		$data = $this->fetchAll('SELECT LAST_INSERT_ID() as id From '.$source);
+		if ($data && isset($data[0]['id'])) {
+			return $data[0]['id'];
+		}
+	}
+/**
+ * Converts database-layer column types to basic types
+ *
+ * @param string $real Real database-layer column type (i.e. "varchar(255)")
+ * @return string Abstract column type (i.e. "string")
+ */
+	function column($real) {
+		if (is_array($real)) {
+			$col = $real['name'];
+			if (isset($real['limit']))
+			{
+				$col .= '('.$real['limit'].')';
+			}
+			return $col;
+		}
+
+		$col = r(')', '', $real);
+		$limit = null;
+		@list($col, $limit) = explode('(', $col);
+
+		if (in_array($col, array('date', 'time', 'datetime', 'timestamp'))) {
+			return $col;
+		}
+		if ($col == 'tinyint' && $limit == '1') {
+			return 'boolean';
+		}
+		if (strpos($col, 'int') !== false) {
+			return 'integer';
+		}
+		if (strpos($col, 'char') !== false || $col == 'tinytext') {
+			return 'string';
+		}
+		if (strpos($col, 'text') !== false) {
+			return 'text';
+		}
+		if (strpos($col, 'blob') !== false) {
+			return 'binary';
+		}
+		if (in_array($col, array('float', 'double', 'decimal'))) {
+			return 'float';
+		}
+		if (strpos($col, 'enum') !== false) {
+			return "enum($limit)";
+		}
+
+		return 'text';
+	}
+/**
+ * Enter description here...
+ *
+ * @param unknown_type $results
+ */
+	function resultSet(&$results) {
+		$this->results =& $results;
+		$this->map = array();
+		$num_fields = mysql_num_fields($results);
+		$index = 0;
+		$j = 0;
+
+		while ($j < $num_fields) {
+
+			$column = mysql_fetch_field($results,$j);
+			if (!empty($column->table)) {
+				$this->map[$index++] = array($column->table, $column->name);
+			} else {
+				$this->map[$index++] = array(0, $column->name);
+			}
+			$j++;
+		}
+	}
+/**
+ * Fetches the next row from the current result set
+ *
+ * @return unknown
+ */
+	function fetchResult() {
+		if ($row = mysql_fetch_row($this->results)) {
+			$resultRow = array();
+			$i = 0;
+			foreach ($row as $index => $field) {
+				list($table, $column) = $this->map[$index];
+				$resultRow[$table][$column] = $row[$index];
+				$i++;
+			}
+			return $resultRow;
+		} else {
+			return false;
+		}
+	}
+/**
+ * Enter description here...
+ *
+ * @param unknown_type $schema
+ *  @return unknown
+ */
+	function buildSchemaQuery($schema) {
+		$search = array('{AUTOINCREMENT}', '{PRIMARY}', '{UNSIGNED}', '{FULLTEXT}',
+						'{FULLTEXT_MYSQL}', '{BOOLEAN}', '{UTF_8}');
+		$replace = array('int(11) not null auto_increment', 'primary key', 'unsigned',
+						'FULLTEXT', 'FULLTEXT', 'enum (\'true\', \'false\') NOT NULL default \'true\'',
+						'/*!40100 CHARACTER SET utf8 COLLATE utf8_unicode_ci */');
+		$query = trim(r($search, $replace, $schema));
+		return $query;
+	}
+}
+?>
\ No newline at end of file