diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index 811f090..a7a89a9 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -156,7 +156,7 @@
 		// Is there a cache direcotry specified in the config file?
 		if ($this->cachedir != '')
 		{
-			$this->cache_set_dir($this->cachedir);
+			$this->cache_set_path($this->cachedir);
 		}
 	}
 	
@@ -221,7 +221,7 @@
 	 * @return	mixed		 
 	 */	
 	function query($sql, $binds = FALSE, $return_object = TRUE)
-	{	
+	{
 		if ($sql == '')
 		{
 			if ($this->db_debug)
@@ -235,7 +235,7 @@
 		// 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->cache_on == TRUE AND stristr($sql, 'SELECT'))
-		{		
+		{				
 			if (FALSE !== ($cache = $this->cache_read($sql)))
 			{
 				return $cache;
@@ -285,7 +285,15 @@
 		// Was the query a "write" type?
 		// If so we'll simply return true
 		if ($this->is_write_type($sql) === TRUE)
-		{		
+		{
+			// If caching is enabled we'll auto-cleanup any
+			// existing files related to this particular URI
+			
+			if ($this->cache_on == TRUE)
+			{
+				$this->cache_delete();
+			}
+		
 			return TRUE;
 		}
 		
@@ -296,19 +304,12 @@
 		{
 			return TRUE;
 		}
-		
-		// Define the result driver name
-		$result = 'CI_DB_'.$this->dbdriver.'_result';
-		
-		// Load the result classes
-		if ( ! class_exists($result))
-		{
-			include_once(BASEPATH.'database/DB_result'.EXT);
-			include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result'.EXT);		
-		}
+	
+		// Load and instantiate the result driver	
 
-		// Instantiate the result object	
-		$RES = new $result();
+		$driver = $this->load_rdriver();
+		
+		$RES = new $driver();
 		$RES->conn_id	= $this->conn_id;
 		$RES->db_debug	= $this->db_debug;
 		$RES->result_id	= $this->result_id;
@@ -319,9 +320,37 @@
 			$RES->curs_id   = NULL;
 			$RES->limit_used = $this->limit_used;
 		}
-
+		
+		// Is query caching enabled?  If so, we'll serialize the 
+		// result object and save it to a cache file
+		if ($this->cache_on == TRUE)
+		{				
+			$this->cache_write($sql, $RES);
+		}
+		
 		return $RES;
 	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Load the result drivers
+	 * 
+	 * @access	public
+	 * @return	string 	the name of the result class		 
+	 */		
+	function load_rdriver()
+	{
+		$driver = 'CI_DB_'.$this->dbdriver.'_result';
+
+		if ( ! class_exists($driver))
+		{
+			include_once(BASEPATH.'database/DB_result'.EXT);
+			include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result'.EXT);
+		}
+		
+		return $driver;
+	}
 	
 	// --------------------------------------------------------------------
 
@@ -859,7 +888,7 @@
 	 */		
 	function cache_on()
 	{
-		$this->query_caching = TRUE;
+		return $this->query_caching = TRUE;
 	}
 
 	// --------------------------------------------------------------------
@@ -872,7 +901,7 @@
 	 */	
 	function cache_off()
 	{
-		$this->query_caching = FALSE;
+		return $this->query_caching = FALSE;
 	}
 	
 	// --------------------------------------------------------------------
@@ -882,10 +911,15 @@
 	 *
 	 * @access	public
 	 * @param	string	the path to the cache directory
-	 * @return	void
+	 * @return	bool
 	 */		
-	function cache_set_dir($path = '')
+	function cache_set_path($path = '')
 	{
+		if ($path == '')
+		{
+			return $this->cache_off();
+		}
+	
 		// Add a trailing slash to the path if needed
 		$path = preg_replace("/(.+?)\/*$/", "\\1/",  $path);
 	
@@ -896,33 +930,12 @@
 				return $this->display_error('db_invalid_cache_path');
 			}
 			
-			$this->enable_caching(FALSE);
-			return FALSE;
+			// If the path is wrong we'll turn off caching
+			return $this->cache_off();
 		}
 		
 		$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);
+		return TRUE;
 	}
 	
 	// --------------------------------------------------------------------
@@ -930,31 +943,27 @@
 	/**
 	 * Retreive a cached query
 	 *
+	 * The URI being requested will become the name of the cache sub-folder.
+	 * An MD5 hash of the SQL statement will become the cache file name
+	 *
 	 * @access	public
 	 * @return	string
 	 */
 	function cache_read($sql)
-	{	
-		if ( ! @is_dir($this->cache_dir))
+	{
+		if ( ! $this->cache_set_path($this->cache_dir))
 		{
-			return $this->cache_on = FALSE;
+			return $this->cache_off();
 		}
 	
-		$filepath = $this->cache_set_path($sql);
-	
-		if ( ! @file_exists($this->cache_dir.$filepath))
-		{
-			return FALSE;
-		}
+		$obj =& get_instance();	
+		$uri  = ($obj->uri->segment(1) == FALSE) ? 'base'  : $obj->uri->segment(2);
+		$uri .= ($obj->uri->segment(2) == FALSE) ? 'index' : $obj->uri->segment(2);
 		
-		if ( ! $fp = @fopen($this->cache_dir.$filepath, 'rb'))
-		{
-			return FALSE;
-		}
-
-		$cachedata = file_get_contents($this->cache_dir.$filepath);
+		$filepath = md5($uri).'/'.md5($sql);
 		
-		if ( ! is_string($cachedata))
+		$obj->load->helper('file');	
+		if (FALSE === ($cachedata = read_file($this->cache_dir.$filepath)))
 		{	
 			return FALSE;
 		}
@@ -972,51 +981,79 @@
 	 */
 	function cache_write($sql, $object)
 	{
-		if ( ! @is_dir($this->cache_dir))
+		if ( ! $this->cache_set_path($this->cache_dir))
 		{
-			return $this->cache_on = FALSE;
+			return $this->cache_off();
 		}
-	
-		$filepath = $this->cache_set_path($sql);
-	
-	
-	
+
+		$obj =& get_instance();	
+		$uri  = ($obj->uri->segment(1) == FALSE) ? 'base'  : $obj->uri->segment(2);
+		$uri .= ($obj->uri->segment(2) == FALSE) ? 'index' : $obj->uri->segment(2);
 		
-	
-	
-		$dirs = array(PATH_CACHE.'db_cache', substr($this->cache_dir, 0, -1));
+		$dir_path = $this->cache_dir.md5($uri).'/';
 		
-		foreach ($dirs as $dir)
-		{	   
-			if ( ! @is_dir($dir))
+		$filename = md5($sql);
+	
+		if ( ! @is_dir($dir_path))
+		{
+			if ( ! @mkdir($dir_path, 0777))
 			{
-				if ( ! @mkdir($dir, 0777))
-				{
-					return;
-				}
-				
-				@chmod($dir, 0777);			
+				return FALSE;
 			}
+			
+			@chmod($dir_path, 0777);			
 		}
-		  
-		if ( ! $fp = @fopen($this->cache_dir.$this->cache_file, 'wb'))
+		
+		$obj->load->helper('file');	
+		if (write_file($dir_path.$filename, serialize($object)) === FALSE)
 		{
 			return FALSE;
 		}
 		
-		flock($fp, LOCK_EX);
-		fwrite($fp, $object);
-		flock($fp, LOCK_UN);
-		fclose($fp);
-		
-		@chmod($this->cache_dir.$this->cache_file, 0777);			
-
+		@chmod($dir_path.$filename, 0777);
 		return TRUE;
 	}
 
 	// --------------------------------------------------------------------
 
 	/**
+	 * Delete cache files within a particular directory
+	 *
+	 * @access	public
+	 * @return	bool
+	 */
+	function cache_delete()
+	{
+		$obj =& get_instance();	
+		$uri  = ($obj->uri->segment(1) == FALSE) ? 'base'  : $obj->uri->segment(2);
+		$uri .= ($obj->uri->segment(2) == FALSE) ? 'index' : $obj->uri->segment(2);
+		
+		$dir_path = $this->cache_dir.md5($uri).'/';
+		
+		$obj->load->helper('file');	
+		delete_files($dir_path, TRUE);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Delete all existing cache files
+	 *
+	 * @access	public
+	 * @return	bool
+	 */
+	// --------------------------------------------------------------------
+
+	function cache_delete_all()
+	{
+		$obj =& get_instance();	
+		$obj->load->helper('file');
+		delete_files($this->cache_dir, TRUE);
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
 	 * Close DB Connection
 	 * 
 	 * @access	public