diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php
index ff9407e..dc56d65 100644
--- a/system/database/DB_utility.php
+++ b/system/database/DB_utility.php
@@ -87,93 +87,6 @@
 	// --------------------------------------------------------------------
 
 	/**
-	 * List databases
-	 *
-	 * @access	public
-	 * @return	bool
-	 */
-	function list_databases()
-	{	
-		// Is there a cached result?
-		if (isset($this->cache['db_names']))
-		{
-			return $this->cache['db_names'];
-		}
-	
-		$query = $this->db->query($this->_list_database());
-		$dbs = array();
-		if ($query->num_rows() > 0)
-		{
-			foreach ($query->result_array() as $row)
-			{
-				$dbs[] = current($row);
-			}
-		}
-			
-		return $this->cache['db_names'] =& $dbs;
-	}
-
-	// --------------------------------------------------------------------
-
-	/**
-	 * Returns an array of table names
-	 * 
-	 * @access	public
-	 * @return	array		 
-	 */	
-	function list_tables()
-	{
-		// Is there a cached result?
-		if (isset($this->cache['table_names']))
-		{
-			return $this->cache['table_names'];
-		}
-	
-		if (FALSE === ($sql = $this->_list_tables()))
-		{
-            if ($this->db->db_debug)
-            {
-				return $this->db->display_error('db_unsupported_function');
-            }
-            return FALSE;        
-		}
-
-		$retval = array();
-		$query = $this->db->query($sql);
-		
-		if ($query->num_rows() > 0)
-		{
-			foreach($query->result_array() as $row)
-			{
-				if (isset($row['TABLE_NAME']))
-				{
-					$retval[] = $row['TABLE_NAME'];
-				}
-				else
-				{
-					$retval[] = array_shift($row);
-				}
-			}
-		}
-
-		return $this->cache['table_names'] =& $retval;
-	}
-	
-	// --------------------------------------------------------------------
-
-	/**
-	 * Determine if a particular table exists
-	 * @access	public
-	 * @return	boolean
-	 */
-	function table_exists($table_name)
-	{
-		return ( ! in_array($this->db->dbprefix.$table_name, $this->list_tables())) ? FALSE : TRUE;
-	}
-	
-	// --------------------------------------------------------------------
-
-	/**
 	 * Optimize Table
 	 *
 	 * @access	public
@@ -372,12 +285,231 @@
 	 * @access	public
 	 * @return	void
 	 */
-	function export()
+	function backup($params = array())
 	{
-		// The individual driver overloads this method
+		// If the parameters have not been submitted as an
+		// array then we know that it is simply the table
+		// name, which is a valid short cut.
+		if (is_string($params))
+		{
+			$params = array('tables' => $params);
+		}
+		
+		// ------------------------------------------------------
+	
+		// Set up our default preferences
+		$prefs = array(
+							'tables'		=> array(),
+							'ignore'		=> array(),
+							'format'		=> 'gzip', // gzip, zip, txt
+							'action'		=> 'download', // download, archive, echo, return
+							'filename'		=> '',
+							'filepath'		=> '',
+							'add_drop'		=> TRUE,
+							'add_insert'	=> TRUE,
+							'newline'		=> "\n"
+						);
+
+		// Did the user submit any preferences? If so set them....
+		if (count($params) > 0)
+		{
+			foreach ($prefs as $key => $val)
+			{
+				if (isset($params[$key]))
+				{
+					$prefs[$key] = $params[$key];
+				}
+			}
+		}
+
+		// ------------------------------------------------------
+
+		// Are we backing up a complete database or individual tables?	
+		// If no table names were submitted we'll fetch the entire table list
+		if (count($prefs['tables']) == 0)
+		{
+			$prefs['tables'] = $this->list_tables();
+		}
+		
+		// ------------------------------------------------------
+
+		// Validate the format
+		if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))
+		{
+			$prefs['format'] = 'txt';
+		}
+
+		// ------------------------------------------------------
+
+		// Is the encoder supported?  If not, we'll either issue an
+		// error or use plain text depending on the debug settings
+		if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode')) 
+		 OR ($prefs['format'] == 'zip'  AND ! @function_exists('gzcompress'))) 
+		{
+            if ($this->db->db_debug)
+            {
+				return $this->db->display_error('db_unsuported_compression');
+            }
+		
+			$prefs['format'] = 'txt';
+		}
+
+		// ------------------------------------------------------
+
+		// Set the filename if not provided
+		if ($prefs['filename'] == '')
+		{
+			$prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;
+			$prefs['filename'] .= '_'.date('Y-m-d_H-i', time());
+		}
+
+		// ------------------------------------------------------
+
+		// If we are archiving the export, does this filepath exist
+		// and resolve to a writable directory
+		if ($prefs['action'] == 'archive')
+		{
+			if ($prefs['filepath'] == '' OR ! is_writable($prefs['filepath']))
+			{
+				if ($this->db->db_debug)
+				{
+					return $this->db->display_error('db_filepath_error');
+				}
+			
+				$prefs['action'] = 'download';
+			}
+		}
+
+		// ------------------------------------------------------
+		
+		// Are we returning the backup data?  If so, we're done...
+		if ($prefs['action'] == 'return')
+		{
+			return $this->_backup($prefs);
+		}
+
+		// ------------------------------------------------------
+		
+		// Are we echoing the backup?  If so, format the data and spit it at the screen...
+		if ($prefs['action'] == 'echo')
+		{
+			echo '<pre>';
+			echo htmlspecialchars($this->_backup($prefs));
+			echo '</pre>';
+			
+			return TRUE;
+		}
+	
+		// ------------------------------------------------------
+
+		// Are we archiving the data to the server?
+		if ($prefs['action'] == 'archive')
+		{
+			// Make sure the filepath has a trailing slash
+			if (ereg("/$", $prefs['filepath']) === FALSE)
+			{
+				$prefs['filepath'] .= '/';
+			}
+
+			// Assemble the path and tack on the file extension
+			$ext = array('gzip' => 'gz', 'zip' => 'zip', 'txt' => 'sql');
+			$path = $prefs['filepath'].$prefs['filename'].$ext[$prefs['format']];
+			
+			// Load the file helper
+			$obj =& get_instance();
+			$obj->load->helper('file');
+			
+			// Write the file based on type
+			switch ($prefs['format'])
+			{
+				case 'gzip' : 	
+								write_file($path, gzencode($this->_backup($prefs)));
+								return TRUE;
+					break;
+				case 'txt'	: 	
+								write_file($path, $this->_backup($prefs));
+								return TRUE;
+					break;
+				default		:
+								require BASEPATH.'libraries/Zip.php';
+								$zip = new Zip;
+								$zip->add_file($this->_backup($prefs), $prefs['filename'].'.sql');
+								write_file($path, $zip->output_zipfile());
+								return TRUE;
+					break;			
+			}
+	
+		}
+
+		// ------------------------------------------------------
+				
+		// Set the mime type used in the server header
+		switch ($prefs['format'])
+		{
+			case 'zip'  : $mime = 'application/x-zip';	
+				break;
+			case 'gzip' : $mime = 'application/x-gzip';
+				break;
+			default     :						
+						if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE") || strstr($_SERVER['HTTP_USER_AGENT'], "OPERA")) 
+						{
+							$mime = 'application/octetstream';
+						}
+						else
+						{
+							$mime = 'application/octet-stream';
+						}
+				break;
+		}	
+		
+		// Grab the super object
+		$obj =& get_instance();
+		
+		// Remap the file extensions
+		$ext = array('gzip' => 'gz', 'zip' => 'zip', 'txt' => 'sql');	
+	
+		// Send headers
+		if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
+		{
+			$obj->output->set_header('Content-Type: '.$mime);
+			$obj->output->set_header('Content-Disposition: inline; filename="'.$prefs['filename'].'.'.$ext[$prefs['format']].'"');
+			$obj->output->set_header('Expires: 0');
+			$obj->output->set_header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+			$obj->output->set_header('Pragma: public');
+		} 
+		else 
+		{
+			$obj->output->set_header('Content-Type: '.$mime);
+			$obj->output->set_header('Content-Disposition: attachment; filename="'.$prefs['filename'].'.'.$ext[$prefs['format']].'"');
+			$obj->output->set_header('Expires: 0');
+			$obj->output->set_header('Pragma: no-cache');
+		}
+	
+	
+			// Write the file based on type
+			switch ($prefs['format'])
+			{
+				case 'gzip' : 	$obj->output->set_output(gzencode($this->_backup($prefs)));
+					break;
+				case 'txt'	: 	$obj->output->set_output($this->_backup($prefs));
+					break;
+				default		:
+								require BASEPATH.'libraries/Zip.php';
+							
+								$zip = new Zip;
+								$zip->add_file($this->_backup($prefs), $prefs['filename'].'.sql');
+								$obj->output->set_output($zip->output_zipfile());
+					break;			
+			}
+
+		return TRUE;
 	}
 
 
+
+
+
+
 }
 
 ?>
\ No newline at end of file