diff --git a/system/libraries/Controller.php b/system/libraries/Controller.php
index 51f4550..c02074f 100644
--- a/system/libraries/Controller.php
+++ b/system/libraries/Controller.php
@@ -80,6 +80,13 @@
 	{	
 		// Prep the class name
 		$class = strtolower(str_replace(EXT, '', $class));
+		
+		// Bug fix for backward compat.  
+		// Kill this at some point in the future
+		if ($class == 'unit_test')
+		{
+			$class = 'unit';
+		}
 
 		// Is this a class extension request?	
 		if (substr($class, 0, 3) == 'my_')
@@ -168,9 +175,8 @@
 	 * @return	null
 	 */
 	function _ci_init_class($class, $prefix = '', $config = NULL)
-	{
+	{	
 		// Is there an associated config file for this class?
-		
 		if ($config == NULL)
 		{
 			if (file_exists(APPPATH.'config/'.$class.EXT))
@@ -185,22 +191,19 @@
 		}
 		else
 		{
-			$name = $prefix.ucfirst($class);
+			$name = $prefix.$class;
 		}
-		
-		$remap = array(
-						'Unit_test' 	=> 'unit'
-						);
 						
 		$varname = ( ! isset($remap[$class])) ? $class : $remap[$class];
-		
+		$varname = strtolower($varname);
+				
 		// Instantiate the class
 		if ($config !== NULL)
 		{
 			$this->$varname = new $name($config);
 		}
 		else
-		{
+		{		
 			$this->$varname = new $name;
 		}	
 	}
diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php
deleted file mode 100644
index 0df78c2..0000000
--- a/system/libraries/Unit_test.php
+++ /dev/null
@@ -1,331 +0,0 @@
-<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * Code Igniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		Rick Ellis
- * @copyright	Copyright (c) 2006, pMachine, Inc.
- * @license		http://www.codeignitor.com/user_guide/license.html 
- * @link		http://www.codeigniter.com
- * @since		Version 1.3.1
- * @filesource
- */
- 
-// ------------------------------------------------------------------------
-
-/**
- * Unit Testing Class
- * 
- * Simple testing class
- *
- * @package		CodeIgniter
- * @subpackage	Libraries
- * @category	UnitTesting
- * @author		Rick Ellis
- * @link		http://www.codeigniter.com/user_guide/libraries/uri.html
- */
-class CI_Unit {
-
-	var $active			= TRUE;
-	var $results 		= array();
-	var $strict			= FALSE;
-	var $_template 		= NULL;
-	var $_template_rows	= NULL;
-
-	function CI_Unit()
-	{
-		log_message('debug', "Unit Testing Class Initialized");
-	}	
-
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Run the tests
-	 *
-	 * Runs the supplied tests
-	 *
-	 * @access	public
-	 * @param	mixed
-	 * @param	mixed
-	 * @param	string
-	 * @return	string
-	 */	
-	function run($test, $expected = TRUE, $test_name = 'undefined')
-	{
-		if ($this->active == FALSE)
-			return;
-			
-		if (in_array($expected, array('is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null'), TRUE))
-		{
-			$expected = str_replace('is_float', 'is_double', $expected);
-			$result = ($expected($test)) ? TRUE : FALSE;	
-			$extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected));
-		}
-		else
-		{
-			if ($this->strict == TRUE)
-				$result = ($test === $expected) ? TRUE : FALSE;	
-			else
-				$result = ($test == $expected) ? TRUE : FALSE;	
-			
-			$extype = gettype($expected);
-		}
-				
-		$back = $this->_backtrace();
-	
-		$report[] = array (
-							'test_name'			=> $test_name,
-							'test_datatype'		=> gettype($test),
-							'res_datatype'		=> $extype,
-							'result'			=> ($result === TRUE) ? 'passed' : 'failed',
-							'file'				=> $back['file'],
-							'line'				=> $back['line']
-						);
-
-		$this->results[] = $report;		
-				
-		return($this->report($this->result($report)));
-	}
-
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Generate a report
-	 *
-	 * Displays a table with the test data
-	 *
-	 * @access	public
-	 * @return	string
-	 */
-	function report($result = array())
-	{	
-		if (count($result) == 0)
-		{
-			$result = $this->result();
-		}
-		
-		$this->_parse_template();
-	
-		$r = '';
-		foreach ($result as $res)
-		{
-			$table = '';
-		
-			foreach ($res as $key => $val)
-			{
-				$temp = $this->_template_rows;			
-				$temp = str_replace('{item}', $key, $temp);
-				$temp = str_replace('{result}', $val, $temp);
-				$table .= $temp;
-			}
-			
-			$r .= str_replace('{rows}', $table, $this->_template);
-		}
-	
-		return $r;	
-	}	
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Use strict comparison
-	 *
-	 * Causes the evaluation to use === rather then ==
-	 *
-	 * @access	public
-	 * @param	bool
-	 * @return	null
-	 */
-	function use_strict($state = TRUE)
-	{
-		$this->strict = ($state == FALSE) ? FALSE : TRUE;
-	}
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Make Unit testing active
-	 *
-	 * Enables/disables unit testing  
-	 *
-	 * @access	public
-	 * @param	bool
-	 * @return	null
-	 */
-	function active($state = TRUE)
-	{
-		$this->active = ($state == FALSE) ? FALSE : TRUE;
-	}
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Result Array
-	 *
-	 * Returns the raw result data
-	 *
-	 * @access	public
-	 * @return	array
-	 */
-	function result($results = array())
-	{	
-		$obj =& get_instance();
-		$obj->load->language('unit_test');
-		
-		if (count($results) == 0)
-		{
-			$results = $this->results;
-		}
-		
-		$retval = array();
-		foreach ($results as $result)
-		{
-			$temp = array();
-			foreach ($result as $key => $val)
-			{
-				if (is_array($val))
-				{
-					foreach ($val as $k => $v)
-					{
-						if (FALSE !== ($line = $obj->lang->line(strtolower('ut_'.$v))))
-						{
-							$v = $line;
-						}				
-						$temp[$obj->lang->line('ut_'.$k)] = $v;					
-					}
-				}
-				else
-				{
-					if (FALSE !== ($line = $obj->lang->line(strtolower('ut_'.$val))))
-					{
-						$val = $line;
-					}				
-					$temp[$obj->lang->line('ut_'.$key)] = $val;
-				}
-			}
-			
-			$retval[] = $temp;
-		}
-	
-		return $retval;
-	}
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Set the template
-	 *
-	 * This lets us set the template to be used to display results
-	 *
-	 * @access	public
-	 * @params	string
-	 * @return	void
-	 */	
-	function set_template($template)
-	{
-		$this->_template = $template;
-	}
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Generate a backtrace
-	 *
-	 * This lets us show file names and line numbers 
-	 *
-	 * @access	private
-	 * @return	array
-	 */
-	function _backtrace() 
-	{
-		if (function_exists('debug_backtrace')) 
-		{
-			$back = debug_backtrace();
-			
-			$file = ( ! isset($back['1']['file'])) ? '' : $back['1']['file'];
-			$line = ( ! isset($back['1']['line'])) ? '' : $back['1']['line'];
-						
-			return array('file' => $file, 'line' => $line);
-		}
-		return array('file' => 'Unknown', 'line' => 'Unknown');
-	}
-
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Get Default Template
-	 *
-	 * @access	private
-	 * @return	string
-	 */
-	function _default_template()
-	{	
-		$this->_template = '	
-		<div style="margin:15px;background-color:#ccc;">
-		<table border="0" cellpadding="4" cellspacing="1" style="width:100%;">		
-		{rows}
-		</table></div>';
-		
-		$this->_template_rows = '
-		<tr>
-		<td style="background-color:#fff;width:140px;font-size:12px;font-weight:bold;">{item}</td>
-		<td style="background-color:#fff;font-size:12px;">{result}</td>
-		</tr>
-		';	
-	}
-	
-	// --------------------------------------------------------------------
-
-	/**
-	 * Parse Template
-	 *
-	 * Harvests the data within the template {pseudo-variables}
-	 *
-	 * @access	private
-	 * @return	void
-	 */
- 	function _parse_template()
- 	{
- 		if ( ! is_null($this->_template_rows))
- 		{
- 			return;
- 		}
- 		
- 		if (is_null($this->_template))
- 		{
- 			$this->_default_template();
- 			return;
- 		}
- 		
-		if ( ! preg_match("/\{rows\}(.*?)\{\/rows\}/si", $this->_template, $match))
-		{
- 			$this->_default_template();
- 			return;
-		}
-
-		$this->_template_rows = $match['1'];
-		$this->_template = str_replace($match['0'], '{rows}', $this->_template); 	
- 	}
- 	
-}
-// END Unit_test Class
-
-/**
- * Helper functions to test boolean true/false
- * 
- *
- * @access	private
- * @return	bool
- */
-function is_true($test)
-{
-	return (is_bool($test) AND $test === TRUE) ? TRUE : FALSE;
-}
-function is_false($test)
-{
-	return (is_bool($test) AND $test === FALSE) ? TRUE : FALSE;
-}
-
-?>
\ No newline at end of file
diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php
index aa26438..2ffed9f 100644
--- a/system/libraries/Zip.php
+++ b/system/libraries/Zip.php
@@ -18,9 +18,11 @@
 /**
  * Zip Compression Class
  *
- * This class is based on a library aquired at Zend:
+ * This class is based on a library I found at Zend:
  * http://www.zend.com/codex.php?id=696&single=1
  *
+ * The original library is a little rough around the edges so I 
+ * refactored it and added several additional methods -- Rick Ellis
  * 
  * @package		CodeIgniter
  * @subpackage	Libraries
@@ -28,12 +30,18 @@
  * @author		Rick Ellis
  * @link		http://www.codeigniter.com/user_guide/general/encryption.html
  */
-class Zip  {  
-	
+class CI_Zip  {  
+
+	var $zipfile	= '';	
 	var $zipdata	= array();
 	var $directory	= array();
 	var $offset		= 0;
-	var $zipfile	= '';
+
+	function CI_Zip()
+	{
+		log_message('debug', "Zip Compression Class Initialized");
+	}
+	
 
 	/**
 	 * Add Directory
@@ -41,13 +49,33 @@
 	 * Lets you add a virtual directory into which you can place files.
 	 *
 	 * @access	public
+	 * @param	mixed	the directory name. Can be string or array
+	 * @return	void
+	 */
+	function add_dir($directory) 
+	{
+		foreach ((array)$directory as $dir)
+		{
+			if ( ! preg_match("|.+/$|", $dir))
+			{
+				$dir .= '/';
+			}
+		
+			$this->_add_dir($dir);
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Add Directory
+	 *
+	 * @access	private
 	 * @param	string	the directory name
 	 * @return	void
 	 */
-	function add_dir($dir) 
+	function _add_dir($dir) 
 	{
-		$this->zipfile = '';
-	
 		$dir = str_replace("\\", "/", $dir);  
 		
 		$this->zipdata[] = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
@@ -78,27 +106,50 @@
 		
 		$this->offset = $newoffset;
 		$this->directory[] = $record;  
-	}	 
-
+	}
+	
 	// --------------------------------------------------------------------
 
 	/**
-	 * Add File
+	 * Add Data to Zip
 	 *
 	 * Lets you add files to the archive. If the path is included
 	 * in the filename it will be placed within a directory.  Make
 	 * sure you use add_dir() first to create the folder.
 	 *
 	 * @access	public
-	 * @param	string	the file name
+	 * @param	mixed
+	 * @param	string
+	 * @return	void
+	 */	
+	function add_data($filepath, $data = NULL)
+	{
+		if (is_array($filepath))
+		{
+			foreach ($filepath as $path => $data)
+			{
+				$this->_add_data($path, $data);
+			}
+		}
+		else
+		{
+			$this->_add_data($filepath, $data);
+		}
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Add Data to Zip
+	 *
+	 * @access	private
+	 * @param	string	the file name/path
 	 * @param	string	the data to be encoded
 	 * @return	void
 	 */	
-	function add_file($filename, $data)
-	{
-		$this->zipfile = '';
-	
-		$filename = str_replace("\\", "/", $filename);  
+	function _add_data($filepath, $data)
+	{	
+		$filepath = str_replace("\\", "/", $filepath);  
 			
 		$oldlen	= strlen($data);  
 		$crc32	= crc32($data);  
@@ -111,9 +162,9 @@
 							.pack('V', $crc32)
 							.pack('V', $newlen)
 							.pack('V', $oldlen)
-							.pack('v', strlen($filename))
+							.pack('v', strlen($filepath))
 							.pack('v', 0)
-							.$filename
+							.$filepath
 							.$gzdata
 							.pack('V', $crc32)
 							.pack('V', $newlen)
@@ -125,7 +176,7 @@
 					.pack('V', $crc32)
 					.pack('V', $newlen)
 					.pack('V', $oldlen)
-					.pack('v', strlen($filename))
+					.pack('v', strlen($filepath))
 					.pack('v', 0)
 					.pack('v', 0)
 					.pack('v', 0)
@@ -134,26 +185,7 @@
 					.pack('V', $this->offset); 
 		
 		$this->offset = $newoffset;
-		$this->directory[] = $record.$filename;  
-	}
-
-	// --------------------------------------------------------------------
-
-	/**
-	 * Read the content of a file
-	 *
-	 * @access	public
-	 * @param	string	the file path
-	 * @return	string
-	 */	
-	function read_file($filepath)
-	{
-		if ( ! file_exists($filepath))
-		{
-			return FALSE;
-		}
-	
-		return file_get_contents($filepath);
+		$this->directory[] = $record.$filepath;  
 	}
 	
 	// --------------------------------------------------------------------
@@ -166,11 +198,19 @@
 	 */	
 	function get_zip()
 	{ 
+		// We cache the zip data so multiple calls
+		// do not require recompiling
 		if ($this->zipfile != '')
 		{
 			return $this->zipfile;
 		}
 	
+		// Is there any data to return?
+		if (count($this->zipdata) == 0)
+		{
+			return FALSE;
+		}
+	
 		$data	= implode('', $this->zipdata);  
 		$dir	= implode('', $this->directory);  
 				
@@ -180,7 +220,7 @@
 						.pack('V', strlen($dir))
 						.pack('V', strlen($data))
 						."\x00\x00";
-						
+		
 		return $this->zipfile;
 	}
 	
@@ -196,15 +236,15 @@
 	 * @param	string	the data to be encoded
 	 * @return	bool
 	 */	
-	function write_file($filename, $data)
+	function write_zip($filepath)
 	{
-		if ( ! ($fp = fopen($filename, "wb")))
+		if ( ! ($fp = fopen($filepath, "wb")))
 		{
 			return FALSE;
 		}
 		
 		flock($fp, LOCK_EX);	
-		fwrite($fp, $data);
+		fwrite($fp, $this->get_zip());
 		flock($fp, LOCK_UN);
 		fclose($fp);
 
@@ -216,13 +256,12 @@
 	/**
 	 * Download
 	 *
-	 *
 	 * @access	public
 	 * @param	string	the file name
 	 * @param	string	the data to be encoded
 	 * @return	bool
 	 */		
-	function download($filename, $data)
+	function download($filename)
 	{
 		if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
 		{
@@ -232,7 +271,7 @@
 			header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
 			header("Content-Transfer-Encoding: binary");
 			header('Pragma: public');
-			header("Content-Length: ".strlen($data));
+			header("Content-Length: ".strlen($this->get_zip()));
 		} 
 		else 
 		{
@@ -241,10 +280,29 @@
 			header("Content-Transfer-Encoding: binary");
 			header('Expires: 0');
 			header('Pragma: no-cache');
-			header("Content-Length: ".strlen($data));
+			header("Content-Length: ".strlen($this->get_zip()));
 		}
 	
-		echo $data;
+		echo $this->get_zip();
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Initialize Data
+	 *
+	 * Lets you clear current zip data.  Useful if you need to create 
+	 * multiple zips with different data.
+	 *
+	 * @access	public
+	 * @return	void
+	 */		
+	function clear_data()
+	{
+		$this->zipfile		= '';
+		$this->zipdata 		= array();
+		$this->directory	= array();
+		$this->offset		= array();
 	}
 	
 }