diff --git a/system/application/config/autoload.php b/system/application/config/autoload.php
index 6a62cd6..06d8780 100644
--- a/system/application/config/autoload.php
+++ b/system/application/config/autoload.php
@@ -37,7 +37,7 @@
 |	$autoload['libraries'] = array('database', 'session', 'xmlrpc');
 */
 
-$autoload['libraries'] = array('database', 'calendar');
+$autoload['libraries'] = array();
 
 
 /*
diff --git a/system/application/config/config.php b/system/application/config/config.php
index 12501e6..31094f3 100644
--- a/system/application/config/config.php
+++ b/system/application/config/config.php
@@ -31,7 +31,7 @@
 |--------------------------------------------------------------------------
 |
 | This item determines which server global should be used to retrieve the 
-| URI string.  The default setting of "auto" works for most servers.
+| URI string.  The default setting of "AUTO" works for most servers.
 | If your links do not seem to work, try one of the other delicious flavors:
 | 
 | 'AUTO'			Default - auto detects
diff --git a/system/application/config/database.php b/system/application/config/database.php
index 5e64208..7a5764d 100644
--- a/system/application/config/database.php
+++ b/system/application/config/database.php
@@ -34,11 +34,30 @@
 $db['default']['hostname'] = "localhost";
 $db['default']['username'] = "root";
 $db['default']['password'] = "";
-$db['default']['database'] = "tester";
+$db['default']['database'] = "ellislab";
 $db['default']['dbdriver'] = "mysql";
 $db['default']['dbprefix'] = "";
 $db['default']['active_r'] = TRUE;
 $db['default']['pconnect'] = FALSE;
 $db['default']['db_debug'] = TRUE;
+$db['default']['cache_on'] = TRUE;
+$db['default']['cachedir'] = APPPATH.'db_cache/';
+
+
+
+$db['test']['hostname'] = "localhost";
+$db['test']['username'] = "root";
+$db['test']['password'] = "";
+$db['test']['database'] = "exp4";
+$db['test']['dbdriver'] = "mysql";
+$db['test']['dbprefix'] = "";
+$db['test']['active_r'] = TRUE;
+$db['test']['pconnect'] = FALSE;
+$db['test']['db_debug'] = TRUE;
+
+
+
+
+
 
 ?>
\ No newline at end of file
diff --git a/system/codeigniter/Base4.php b/system/codeigniter/Base4.php
index 5d945c2..eccf58e 100644
--- a/system/codeigniter/Base4.php
+++ b/system/codeigniter/Base4.php
@@ -20,9 +20,9 @@
  * 
  * This file is used only when Code Igniter is being run under PHP 4.  
  * Since PHP 4 has such poor object handling we had to come up with 
- * a hack to resolve some scoping problems.  PHP 5 doesn't suffer from 
- * this problem so we load one of two files based on the version of 
- * PHP being run.
+ * a hack (and a really ugly one at that...) to resolve some scoping 
+ * problems.  PHP 5 doesn't suffer from this problem so we load one of 
+ * two files based on the version of PHP being run.
  * 
  * @package		CodeIgniter
  * @subpackage	codeigniter
@@ -45,14 +45,7 @@
 {
 	global $OBJ, $CI;
 	
-	if (is_object($CI))
-	{
-		return $CI;
-	}
-	else
-	{
-		return $OBJ->load;
-	}
+	return (is_object($CI)) ? $CI : $OBJ->load;
 }
 
 ?>
\ No newline at end of file
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index 73c723d..811f090 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -41,8 +41,6 @@
 	var $conn_id		= FALSE;
 	var $result_id		= FALSE;
 	var $db_debug		= FALSE;
-	var $query_caching	= FALSE;
-	var $cache_dir		= '';
 	var $benchmark		= 0;
 	var $query_count	= 0;
 	var $bind_marker	= '?';
@@ -51,11 +49,14 @@
 	var $trans_enabled	= TRUE;
 	var $_trans_depth	= 0;
 	var $_trans_failure	= FALSE; // Used with transactions to determine if a rollback should occur
+	var $cache_on		= FALSE;
+	var $cachedir		= '';
 
-    // These are use with Oracle
-    var $stmt_id;
-    var $curs_id;
-    var $limit_used;
+
+	// These are use with Oracle
+	var $stmt_id;
+	var $curs_id;
+	var $limit_used;
 
 
 	
@@ -86,10 +87,24 @@
 	 * @return	void
 	 */	
 	function initialize($params = '')
-	{	
+	{
 		if (is_array($params))
 		{
-			foreach (array('hostname' => '', 'username' => '', 'password' => '', 'database' => '', 'dbdriver' => 'mysql', 'dbprefix' => '', 'port' => '', 'pconnect' => FALSE, 'db_debug' => FALSE) as $key => $val)
+			$defaults = array(
+								'hostname'	=> '', 
+								'username'	=> '', 
+								'password'	=> '', 
+								'database'	=> '', 
+								'dbdriver'	=> 'mysql', 
+								'dbprefix'	=> '', 
+								'port'		=> '', 
+								'pconnect'	=> FALSE, 
+								'db_debug'	=> FALSE, 
+								'cachedir'	=> '', 
+								'cache_on'	=> FALSE
+							);
+		
+			foreach ($defaults as $key => $val)
 			{
 				$this->$key = ( ! isset($params[$key])) ? $val : $params[$key];
 			}
@@ -112,25 +127,19 @@
 			$this->password = ( ! isset($dsn['pass'])) ? '' : rawurldecode($dsn['pass']);
 			$this->database = ( ! isset($dsn['path'])) ? '' : rawurldecode(substr($dsn['path'], 1));
 		}
-	
-		if ($this->pconnect == FALSE)
-		{
-			$this->conn_id = $this->db_connect();
-		}
-		else
-		{
-			$this->conn_id = $this->db_pconnect();
-		}	
-       
-        if ( ! $this->conn_id)
-        { 
+		
+		// Connect to the database
+		$this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
+	   
+		if ( ! $this->conn_id)
+		{ 
 			log_message('error', 'Unable to connect to the database');
 			
-            if ($this->db_debug)
-            {
+			if ($this->db_debug)
+			{
 				$this->display_error('db_unable_to_connect');
-            }
-        }
+			}
+		}
 		else
 		{
 			if ( ! $this->db_select())
@@ -142,7 +151,13 @@
 					$this->display_error('db_unable_to_select', $this->database);
 				}
 			}	
-		}	
+		}
+		
+		// Is there a cache direcotry specified in the config file?
+		if ($this->cachedir != '')
+		{
+			$this->cache_set_dir($this->cachedir);
+		}
 	}
 	
 	
@@ -172,15 +187,15 @@
 	{
 		if (FALSE === ($sql = $this->_version()))
 		{
-            if ($this->db_debug)
-            {
+			if ($this->db_debug)
+			{
 				return $this->display_error('db_unsupported_function');
-            }
-            return FALSE;        
+			}
+			return FALSE;		
 		}
 		
-        if ($this->dbdriver == 'oci8')
-        {
+		if ($this->dbdriver == 'oci8')
+		{
 			return $sql;
 		}
 	
@@ -205,30 +220,25 @@
 	 * @param	array	An array of binding data
 	 * @return	mixed		 
 	 */	
-    function query($sql, $binds = FALSE, $return_object = TRUE)
-    {    
+	function query($sql, $binds = FALSE, $return_object = TRUE)
+	{	
 		if ($sql == '')
 		{
-            if ($this->db_debug)
-            {
+			if ($this->db_debug)
+			{
 				log_message('error', 'Invalid query: '.$sql);
 				return $this->display_error('db_invalid_query');
-            }
-            return FALSE;        
+			}
+			return FALSE;		
 		}
 		
-		// Is query caching enabled?  If the query is a "read type" we'll
+		// Is query caching enabled?  If the query is a "read type" we will
 		// grab the previously cached query if it exists and return it.
-		if ($this->query_caching == TRUE)
-		{
-			if (stristr($sql, 'SELECT'))
+		if ($this->cache_on == TRUE AND stristr($sql, 'SELECT'))
+		{		
+			if (FALSE !== ($cache = $this->cache_read($sql)))
 			{
-				$CACHE =& _load_cache_class();			
-			
-				if (FALSE !== ($CACHE->cache_exists($sql)))
-				{
-					return $CACHE->get_cache($sql);
-				}
+				return $cache;
 			}
 		}
 		
@@ -238,20 +248,20 @@
 			$sql = $this->compile_binds($sql, $binds);
 		}
 
-        // Save the  query for debugging
-        $this->queries[] = $sql;
+		// Save the  query for debugging
+		$this->queries[] = $sql;
 
 		// Start the Query Timer
-        $time_start = list($sm, $ss) = explode(' ', microtime());
-      
+		$time_start = list($sm, $ss) = explode(' ', microtime());
+	  
 		// Run the Query
-        if (FALSE === ($this->result_id = $this->simple_query($sql)))
-        { 
-        	// This will trigger a rollback if transactions are being used
-        	$this->_trans_failure = TRUE;
-        	
-            if ($this->db_debug)
-            {
+		if (FALSE === ($this->result_id = $this->simple_query($sql)))
+		{ 
+			// This will trigger a rollback if transactions are being used
+			$this->_trans_failure = TRUE;
+			
+			if ($this->db_debug)
+			{
 				log_message('error', 'Query error: '.$this->_error_message());
 				return $this->display_error(
 										array(
@@ -260,18 +270,18 @@
 												$sql
 											)
 										);
-            }
-          
-          return FALSE;
-        }
-        
+			}
+		  
+		  return FALSE;
+		}
+		
 		// Stop and aggregate the query time results
 		$time_end = list($em, $es) = explode(' ', microtime());
 		$this->benchmark += ($em + $es) - ($sm + $ss);
 
 		// Increment the query counter
-        $this->query_count++;
-        
+		$this->query_count++;
+		
 		// Was the query a "write" type?
 		// If so we'll simply return true
 		if ($this->is_write_type($sql) === TRUE)
@@ -298,17 +308,17 @@
 		}
 
 		// Instantiate the result object	
-        $RES = new $result();
-        $RES->conn_id	= $this->conn_id;
-        $RES->db_debug	= $this->db_debug;
-        $RES->result_id	= $this->result_id;
-        
-        if ($this->dbdriver == 'oci8')
-        {
+		$RES = new $result();
+		$RES->conn_id	= $this->conn_id;
+		$RES->db_debug	= $this->db_debug;
+		$RES->result_id	= $this->result_id;
+		
+		if ($this->dbdriver == 'oci8')
+		{
 			$RES->stmt_id   = $this->stmt_id;
 			$RES->curs_id   = NULL;
 			$RES->limit_used = $this->limit_used;
-        }
+		}
 
 		return $RES;
 	}
@@ -589,11 +599,11 @@
 	
 		if (FALSE === ($sql = $this->_list_tables()))
 		{
-            if ($this->db_debug)
-            {
+			if ($this->db_debug)
+			{
 				return $this->display_error('db_unsupported_function');
-            }
-            return FALSE;        
+			}
+			return FALSE;		
 		}
 
 		$retval = array();
@@ -638,35 +648,35 @@
 	 * @param	string	the table name
 	 * @return	array		 
 	 */
-    function list_fields($table = '')
-    {
+	function list_fields($table = '')
+	{
 		// Is there a cached result?
 		if (isset($this->data_cache['field_names'][$table]))
 		{
 			return $this->data_cache['field_names'][$table];
 		}
-    
-    	if ($table == '')
-    	{
+	
+		if ($table == '')
+		{
 			if ($this->db_debug)
 			{
 				return $this->display_error('db_field_param_missing');
 			}
 			return FALSE;			
-    	}
-    	
+		}
+		
 		if (FALSE === ($sql = $this->_list_columns($this->dbprefix.$table)))
 		{
-            if ($this->db_debug)
-            {
+			if ($this->db_debug)
+			{
 				return $this->display_error('db_unsupported_function');
-            }
-            return FALSE;        
+			}
+			return FALSE;		
 		}
-    	
-    	$query = $this->query($sql);
-    	
-    	$retval = array();
+		
+		$query = $this->query($sql);
+		
+		$retval = array();
 		foreach($query->result_array() as $row)
 		{
 			if (isset($row['COLUMN_NAME']))
@@ -676,11 +686,11 @@
 			else
 			{
 				$retval[] = current($row);
-			}    	
+			}		
 		}
-    	
+		
 		return $this->data_cache['field_names'][$table] =& $retval;
-    }
+	}
 
 	// --------------------------------------------------------------------
 
@@ -695,16 +705,16 @@
 	{	
 		return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE;
 	}
-    
+	
 	// --------------------------------------------------------------------
 
 	/**
 	 * DEPRECATED - use list_fields()
 	 */
-    function field_names($table = '') 
-    {
-    	return $this->list_fields($table);
-    }
+	function field_names($table = '') 
+	{
+		return $this->list_fields($table);
+	}
 	
 	// --------------------------------------------------------------------
 
@@ -717,15 +727,15 @@
 	 */	
 	function field_data($table = '')
 	{
-    	if ($table == '')
-    	{
+		if ($table == '')
+		{
 			if ($this->db_debug)
 			{
 				return $this->display_error('db_field_param_missing');
 			}
 			return FALSE;			
-    	}
-    	
+		}
+		
 		$query = $this->query($this->_field_data($this->dbprefix.$table));
 		return $query->field_data();
 	}	
@@ -742,7 +752,7 @@
 	 */	
 	function insert_string($table, $data)
 	{
-		$fields = array();      
+		$fields = array();	  
 		$values = array();
 		
 		foreach($data as $key => $val) 
@@ -802,7 +812,7 @@
 		}		
 
 		return $this->_update($this->dbprefix.$table, $fields, $dest);
-	}    
+	}	
 
 	// --------------------------------------------------------------------
 
@@ -838,31 +848,6 @@
 			return call_user_func_array($function, $args); 
 		}
 	}
-
-	// --------------------------------------------------------------------
-
-	/**
-	 * Set Cache Path
-	 *
-	 * @access	public
-	 * @param	string	the path to the cache directory
-	 * @return	void
-	 */		
-	function set_cache_path($path = '')
-	{
-		if ( ! is_dir($path) OR ! is_writable($path))
-		{
-			if ($this->db_debug)
-			{
-				return $this->display_error('db_invalid_cache_path');
-			}
-			
-			$this->enable_caching(FALSE);
-			return FALSE;
-		}
-	
-		$this->cache_dir = $path;
-	}
 	
 	// --------------------------------------------------------------------
 
@@ -889,29 +874,146 @@
 	{
 		$this->query_caching = FALSE;
 	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set Cache Directory Path
+	 *
+	 * @access	public
+	 * @param	string	the path to the cache directory
+	 * @return	void
+	 */		
+	function cache_set_dir($path = '')
+	{
+		// Add a trailing slash to the path if needed
+		$path = preg_replace("/(.+?)\/*$/", "\\1/",  $path);
+	
+		if ( ! is_dir($path) OR ! is_writable($path))
+		{
+			if ($this->db_debug)
+			{
+				return $this->display_error('db_invalid_cache_path');
+			}
+			
+			$this->enable_caching(FALSE);
+			return FALSE;
+		}
+		
+		$this->cache_dir = $path;
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Set Cache Path
+	 *
+	 * @access	public
+	 * @param	string	the path to the cache directory
+	 * @return	void
+	 */	
+	function cache_set_path($sql)
+	{
+		$obj =& get_instance();		
+				
+		// The URI being requested will become the name of the cache sub-folder
+		
+		$uri = ($obj->uri->uri_string() == '') ? 'index' : $obj->uri->uri_string();
+		
+		// Convert the SQL query into a hash.  This will become the cache file name.
+	
+		return md5($uri).'/'.md5($sql);
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Retreive a cached query
+	 *
+	 * @access	public
+	 * @return	string
+	 */
+	function cache_read($sql)
+	{	
+		if ( ! @is_dir($this->cache_dir))
+		{
+			return $this->cache_on = FALSE;
+		}
+	
+		$filepath = $this->cache_set_path($sql);
+	
+		if ( ! @file_exists($this->cache_dir.$filepath))
+		{
+			return FALSE;
+		}
+		
+		if ( ! $fp = @fopen($this->cache_dir.$filepath, 'rb'))
+		{
+			return FALSE;
+		}
+
+		$cachedata = file_get_contents($this->cache_dir.$filepath);
+		
+		if ( ! is_string($cachedata))
+		{	
+			return FALSE;
+		}
+		
+		return unserialize($cachedata);			
+	}	
 
 	// --------------------------------------------------------------------
 
 	/**
-	 * Load Caching Class
-	 * 
-	 * @access	private
-	 * @return	object		 
-	 */	
-	function _load_cache_class()
+	 * Write a query to a cache file
+	 *
+	 * @access	public
+	 * @return	bool
+	 */
+	function cache_write($sql, $object)
 	{
-		static $CACHE = NULL;
-		
-		if (is_object($CACHE))
+		if ( ! @is_dir($this->cache_dir))
 		{
-			return $CACHE;
+			return $this->cache_on = FALSE;
 		}
 	
-		require_once BASEPATH.'database/DB_cache'.EXT;
-		$CACHE = new DB_cache();		
-		return $CACHE;
-	}
+		$filepath = $this->cache_set_path($sql);
 	
+	
+	
+		
+	
+	
+		$dirs = array(PATH_CACHE.'db_cache', substr($this->cache_dir, 0, -1));
+		
+		foreach ($dirs as $dir)
+		{	   
+			if ( ! @is_dir($dir))
+			{
+				if ( ! @mkdir($dir, 0777))
+				{
+					return;
+				}
+				
+				@chmod($dir, 0777);			
+			}
+		}
+		  
+		if ( ! $fp = @fopen($this->cache_dir.$this->cache_file, 'wb'))
+		{
+			return FALSE;
+		}
+		
+		flock($fp, LOCK_EX);
+		fwrite($fp, $object);
+		flock($fp, LOCK_UN);
+		fclose($fp);
+		
+		@chmod($this->cache_dir.$this->cache_file, 0777);			
+
+		return TRUE;
+	}
+
 	// --------------------------------------------------------------------
 
 	/**
@@ -920,14 +1022,14 @@
 	 * @access	public
 	 * @return	void		 
 	 */	
-    function close()
-    {
-        if (is_resource($this->conn_id))
-        {
-            $this->_close($this->conn_id);
+	function close()
+	{
+		if (is_resource($this->conn_id))
+		{
+			$this->_close($this->conn_id);
 		}   
 		$this->conn_id = FALSE;
-    }
+	}
 	
 	// --------------------------------------------------------------------
 
@@ -940,8 +1042,8 @@
 	 * @param	boolean	whether to localize the message
 	 * @return	string	sends the application/errror_db.php template		 
 	 */	
-    function display_error($error = '', $swap = '', $native = FALSE) 
-    {
+	function display_error($error = '', $swap = '', $native = FALSE) 
+	{
 		$LANG = new CI_Language();
 		$LANG->load('db');
 
@@ -965,7 +1067,7 @@
 		echo $error->show_error('An Error Was Encountered', $message, 'error_db');
 		exit;
 
-    }  
+	}  
 	
 }
 
diff --git a/system/libraries/Controller.php b/system/libraries/Controller.php
index c02074f..6a3ea99 100644
--- a/system/libraries/Controller.php
+++ b/system/libraries/Controller.php
@@ -430,6 +430,7 @@
 	 * @access	private
 	 * @param	mixed	database connection values
 	 * @param	bool	whether to return the object for multiple connections
+	 * @param	bool	whether to load the active record class
 	 * @return	void
 	 */
 	function _ci_init_database($params = '', $return = FALSE, $active_record = FALSE)
@@ -439,7 +440,7 @@
 			return;
 		}
 	
-		// Load the DB config file if needed
+		// Load the DB config file if needed.  We'll test for a DSN string
 		if (is_string($params) AND strpos($params, '://') === FALSE)
 		{
 			include(APPPATH.'config/database'.EXT);