Altering the loader to be able to load views from packages when adding the package path with add_package_path().
diff --git a/system/core/Loader.php b/system/core/Loader.php
index 59415b7..8146cd5 100644
--- a/system/core/Loader.php
+++ b/system/core/Loader.php
@@ -30,8 +30,8 @@
 
 	// All these are set automatically. Don't mess with them.
 	var $_ci_ob_level;
-	var $_ci_view_path		= '';
-	var $_ci_library_paths	= array();
+	var $_ci_view_paths		= array();
+	protected $_ci_library_paths	= array();
 	var $_ci_model_paths	= array();
 	var $_ci_helper_paths	= array();
 	var $_base_classes		= array(); // Set by the controller class
@@ -47,17 +47,15 @@
 	 * Constructor
 	 *
 	 * Sets the path to the view files and gets the initial output buffering level
-	 *
-	 * @access	public
 	 */
-	function __construct()
+	public function __construct()
 	{
-		$this->_ci_view_path = APPPATH.'views/';
 		$this->_ci_ob_level  = ob_get_level();
 		$this->_ci_library_paths = array(APPPATH, BASEPATH);
 		$this->_ci_helper_paths = array(APPPATH, BASEPATH);
 		$this->_ci_model_paths = array(APPPATH);
-
+		$this->_ci_view_paths = array(APPPATH.'views/'	=> TRUE);
+		
 		log_message('debug', "Loader Class Initialized");
 	}
 
@@ -107,13 +105,12 @@
 	 *
 	 * This function lets users load and instantiate models.
 	 *
-	 * @access	public
 	 * @param	string	the name of the class
 	 * @param	string	name for the model
 	 * @param	bool	database connection
 	 * @return	void
 	 */
-	function model($model, $name = '', $db_conn = FALSE)
+	public function model($model, $name = '', $db_conn = FALSE)
 	{
 		if (is_array($model))
 		{
@@ -200,13 +197,12 @@
 	/**
 	 * Database Loader
 	 *
-	 * @access	public
 	 * @param	string	the DB credentials
 	 * @param	bool	whether to return the DB object
 	 * @param	bool	whether to enable active record (this allows us to override the config setting)
 	 * @return	object
 	 */
-	function database($params = '', $return = FALSE, $active_record = NULL)
+	public function database($params = '', $return = FALSE, $active_record = NULL)
 	{
 		// Grab the super object
 		$CI =& get_instance();
@@ -237,10 +233,9 @@
 	/**
 	 * Load the Utilities Class
 	 *
-	 * @access	public
 	 * @return	string
 	 */
-	function dbutil()
+	public function dbutil()
 	{
 		if ( ! class_exists('CI_DB'))
 		{
@@ -265,10 +260,9 @@
 	/**
 	 * Load the Database Forge Class
 	 *
-	 * @access	public
 	 * @return	string
 	 */
-	function dbforge()
+	public function dbforge()
 	{
 		if ( ! class_exists('CI_DB'))
 		{
@@ -297,13 +291,12 @@
 	 * some cases it's advantageous to be able to return data so that
 	 * a developer can process it in some way.
 	 *
-	 * @access	public
 	 * @param	string
 	 * @param	array
 	 * @param	bool
 	 * @return	void
 	 */
-	function view($view, $vars = array(), $return = FALSE)
+	public function view($view, $vars = array(), $return = FALSE)
 	{
 		return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
 	}
@@ -315,12 +308,11 @@
 	 *
 	 * This is a generic file loader
 	 *
-	 * @access	public
 	 * @param	string
 	 * @param	bool
 	 * @return	string
 	 */
-	function file($path, $return = FALSE)
+	public function file($path, $return = FALSE)
 	{
 		return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
 	}
@@ -333,11 +325,10 @@
 	 * Once variables are set they become available within
 	 * the controller class and its "view" files.
 	 *
-	 * @access	public
 	 * @param	array
 	 * @return	void
 	 */
-	function vars($vars = array(), $val = '')
+	public function vars($vars = array(), $val = '')
 	{
 		if ($val != '' AND is_string($vars))
 		{
@@ -362,11 +353,10 @@
 	 *
 	 * This function loads the specified helper file.
 	 *
-	 * @access	public
 	 * @param	mixed
 	 * @return	void
 	 */
-	function helper($helpers = array())
+	public function helper($helpers = array())
 	{
 		foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper)
 		{
@@ -424,11 +414,10 @@
 	 * This is simply an alias to the above function in case the
 	 * user has written the plural form of this function.
 	 *
-	 * @access	public
 	 * @param	array
 	 * @return	void
 	 */
-	function helpers($helpers = array())
+	public function helpers($helpers = array())
 	{
 		$this->helper($helpers);
 	}
@@ -438,12 +427,11 @@
 	/**
 	 * Loads a language file
 	 *
-	 * @access	public
 	 * @param	array
 	 * @param	string
 	 * @return	void
 	 */
-	function language($file = array(), $lang = '')
+	public function language($file = array(), $lang = '')
 	{
 		$CI =& get_instance();
 
@@ -463,11 +451,10 @@
 	/**
 	 * Loads a config file
 	 *
-	 * @access	public
 	 * @param	string
 	 * @return	void
 	 */
-	function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
+	public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
 	{
 		$CI =& get_instance();
 		$CI->config->load($file, $use_sections, $fail_gracefully);
@@ -485,7 +472,7 @@
 	 * @param	string	an optional object name
 	 * @return	void
 	 */
-	function driver($library = '', $params = NULL, $object_name = NULL)
+	public function driver($library = '', $params = NULL, $object_name = NULL)
 	{
 		if ( ! class_exists('CI_Driver_Library'))
 		{
@@ -510,18 +497,20 @@
 	 *
 	 * Prepends a parent path to the library, model, helper, and config path arrays
 	 *
-	 * @access	public
 	 * @param	string
+	 * @param 	boolean 	
 	 * @return	void
 	 */
-	function add_package_path($path)
+	public function add_package_path($path, $view_cascade=TRUE)
 	{
 		$path = rtrim($path, '/').'/';
-
+		
 		array_unshift($this->_ci_library_paths, $path);
 		array_unshift($this->_ci_model_paths, $path);
 		array_unshift($this->_ci_helper_paths, $path);
 
+		$this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;
+
 		// Add config file path
 		$config =& $this->_ci_get_component('config');
 		array_unshift($config->_config_paths, $path);
@@ -534,11 +523,10 @@
 	 *
 	 * Return a list of all package paths, by default it will ignore BASEPATH.
 	 *
-	 * @access	public
 	 * @param	string
 	 * @return	void
 	 */
-	function get_package_paths($include_base = FALSE)
+	public function get_package_paths($include_base = FALSE)
 	{
 		return $include_base === TRUE ? $this->_ci_library_paths : $this->_ci_model_paths;
 	}
@@ -551,11 +539,10 @@
 	 * Remove a path from the library, model, and helper path arrays if it exists
 	 * If no path is provided, the most recently added path is removed.
 	 *
-	 * @access	public
 	 * @param	type
 	 * @return	type
 	 */
-	function remove_package_path($path = '', $remove_config_path = TRUE)
+	public function remove_package_path($path = '', $remove_config_path = TRUE)
 	{
 		$config =& $this->_ci_get_component('config');
 
@@ -564,12 +551,12 @@
 			$void = array_shift($this->_ci_library_paths);
 			$void = array_shift($this->_ci_model_paths);
 			$void = array_shift($this->_ci_helper_paths);
+			$void = array_shift($this->_ci_view_paths);
 			$void = array_shift($config->_config_paths);
 		}
 		else
 		{
 			$path = rtrim($path, '/').'/';
-
 			foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var)
 			{
 				if (($key = array_search($path, $this->{$var})) !== FALSE)
@@ -577,6 +564,11 @@
 					unset($this->{$var}[$key]);
 				}
 			}
+			
+			if (isset($this->_ci_view_paths[$path.'views/']))
+			{
+				unset($this->_ci_view_paths[$path.'views/']);
+			}
 
 			if (($key = array_search($path, $config->_config_paths)) !== FALSE)
 			{
@@ -588,6 +580,7 @@
 		$this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH)));
 		$this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH)));
 		$this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));
+		$this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));
 		$config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));
 	}
 
@@ -600,24 +593,39 @@
 	 * Variables are prefixed with _ci_ to avoid symbol collision with
 	 * variables made available to view files
 	 *
-	 * @access	private
 	 * @param	array
 	 * @return	void
 	 */
-	function _ci_load($_ci_data)
+	protected function _ci_load($_ci_data)
 	{
 		// Set the default data variables
 		foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
 		{
 			$$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
 		}
+		
+		$file_exists = FALSE;
 
 		// Set the path to the requested file
 		if ($_ci_path == '')
 		{
 			$_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
 			$_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view;
-			$_ci_path = $this->_ci_view_path.$_ci_file;
+
+			foreach ($this->_ci_view_paths as $view_file => $cascade)
+			{
+				if (file_exists($view_file.$_ci_file))
+				{
+					$_ci_path = $view_file.$_ci_file;
+					$file_exists = TRUE;
+					break;
+				}
+				
+				if ( ! $cascade)
+				{
+					break;
+				}				
+			}
 		}
 		else
 		{
@@ -625,7 +633,7 @@
 			$_ci_file = end($_ci_x);
 		}
 
-		if ( ! file_exists($_ci_path))
+		if ( ! $file_exists && ! file_exists($_ci_path))
 		{
 			show_error('Unable to load the requested file: '.$_ci_file);
 		}
@@ -721,13 +729,12 @@
 	 *
 	 * This function loads the requested class.
 	 *
-	 * @access	private
 	 * @param	string	the item that is being loaded
 	 * @param	mixed	any additional parameters
 	 * @param	string	an optional object name
 	 * @return	void
 	 */
-	function _ci_load_class($class, $params = NULL, $object_name = NULL)
+	protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
 	{
 		// Get the class name, and while we're at it trim any slashes.
 		// The directory path can be included as part of the class name,
@@ -959,11 +966,13 @@
 	 * The config/autoload.php file contains an array that permits sub-systems,
 	 * libraries, and helpers to be loaded automatically.
 	 *
-	 * @access	private
+	 * This function is public, as it's used in the CI_Controller class.  
+	 * However, there is no reason you should ever needs to use it.
+	 *
 	 * @param	array
 	 * @return	void
 	 */
-	function _ci_autoloader()
+	public function ci_autoloader()
 	{
 		if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
 		{
@@ -1046,11 +1055,10 @@
 	 *
 	 * Takes an object as input and converts the class variables to array key/vals
 	 *
-	 * @access	private
 	 * @param	object
 	 * @return	array
 	 */
-	function _ci_object_to_array($object)
+	protected function _ci_object_to_array($object)
 	{
 		return (is_object($object)) ? get_object_vars($object) : $object;
 	}
@@ -1060,10 +1068,9 @@
 	/**
 	 * Get a reference to a specific library or model
 	 *
-	 * @access	private
 	 * @return	bool
 	 */
-	function &_ci_get_component($component)
+	protected function &_ci_get_component($component)
 	{
 		$CI =& get_instance();
 		return $CI->$component;
@@ -1076,11 +1083,10 @@
 	 *
 	 * This function preps the name of various items to make loading them more reliable.
 	 *
-	 * @access	private
 	 * @param	mixed
 	 * @return	array
 	 */
-	function _ci_prep_filename($filename, $extension)
+	protected function _ci_prep_filename($filename, $extension)
 	{
 		if ( ! is_array($filename))
 		{