diff --git a/system/libraries/Router.php b/system/libraries/Router.php
index b61dfb7..7839de2 100644
--- a/system/libraries/Router.php
+++ b/system/libraries/Router.php
@@ -34,6 +34,7 @@
 	var $routes 		= array();
 	var $class			= '';
 	var $method			= 'index';
+	var $directory		= '';
 	var $uri_protocol 	= 'auto';
 	var $default_controller;
 	var $scaffolding_request = FALSE; // Must be set to FALSE
@@ -121,6 +122,7 @@
 			log_message('debug', "No URI present. Default controller set.");
 			return;
 		}
+		unset($this->routes['default_controller']);
 		
 		// Do we need to remove the suffix specified in the config file?
 		if  ($this->config->item('url_suffix') != "")
@@ -129,13 +131,20 @@
 		}
 
 		// Explode the URI Segments. The individual segments will
-		// be stored in the $this->segments array.
-		$this->_compile_segments(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)));
-
-
-		// Remap the class/method if a route exists
-		unset($this->routes['default_controller']);
+		// be stored in the $this->segments array.	
+		$i = 1;
+		foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
+		{
+			// Filter segments for security
+			$val = trim($this->_filter_uri($val));
+			
+			if ($val != '')
+				$this->segments[$i++] = $val;
+		}
 		
+		$this->_compile_segments($this->segments);
+		
+		// Do we have any custom routing to deal with?
 		if (count($this->routes) > 0)
 		{
 			$this->_parse_routes();
@@ -157,19 +166,15 @@
 	 * @param	bool
 	 * @return	void
 	 */
-	function _compile_segments($segs, $route = FALSE)
-	{		
-		$segments = array();
-	
-		$i = 1;
-		foreach($segs as $val)
-		{
-			$val = trim($this->_filter_uri($val));
-			
-			if ($val != '')
-				$segments[$i++] = $val;
-		}
+	function _compile_segments($segments = array())
+	{	
+		$segments = $this->_validate_segments($segments);
 		
+		if (count($segments) == 0)
+		{
+			return;
+		}
+						
 		$this->set_class($segments['1']);
 		
 		if (isset($segments['2']))
@@ -186,19 +191,58 @@
 				$this->set_method($segments['2']);
 			}
 		}
-		
-		if ($route == FALSE)
-		{
-			$this->segments = $segments;
-		}
-		
-		unset($segments);
 	}
 	// END _compile_segments()
 	
 	// --------------------------------------------------------------------
 	
 	/**
+	 * Validates the supplied segments.  Attempts to determine the path to
+	 * the controller.
+	 *
+	 * @access	private
+	 * @param	array
+	 * @return	array
+	 */	
+	function _validate_segments($segments)
+	{
+		// Does the requested controller exist?
+		if ( ! file_exists(APPPATH.'controllers/'.$segments['1'].EXT))
+		{
+			// Is it a directory?  No?  Smite them!
+			if ( ! is_dir(APPPATH.'controllers/'.$segments['1']))
+			{
+				show_404();
+			}
+			else
+			{
+				$this->set_directory($segments['1']);	
+				$segs = array_slice($segments, 1);
+				
+				if (count($segs) == 0)
+				{
+					$this->set_class($this->default_controller);
+					$this->set_method('index');
+					$this->directory = '';
+					return array();
+				}
+	
+				$i = 1;
+				$segments = array();
+				foreach ($segs as $val)
+				{
+					$segments[$i++] = $val;
+				}
+			}
+		}
+		
+		return $segments;
+	}
+	// END _validate_segments()
+	
+	// --------------------------------------------------------------------
+	
+	/**
 	 * Filter segments for malicious characters
 	 *
 	 * @access	private
@@ -219,64 +263,6 @@
 	// --------------------------------------------------------------------
 	
 	/**
-	 * Set the class name
-	 *
-	 * @access	public
-	 * @param	string
-	 * @return	void
-	 */	
-	function set_class($class)
-	{
-		$this->class = $class;
-	}
-	// END _filter_uri()
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Fetch the current class
-	 *
-	 * @access	public
-	 * @return	string
-	 */	
-	function fetch_class()
-	{
-		return $this->class;
-	}
-	// END _filter_uri()
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 *  Set the method name
-	 *
-	 * @access	public
-	 * @param	string
-	 * @return	void
-	 */	
-	function set_method($method)
-	{
-		$this->method = $method;
-	}
-	// END set_method()
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 *  Fetch the current method
-	 *
-	 * @access	public
-	 * @return	string
-	 */	
-	function fetch_method()
-	{
-		return $this->method;
-	}
-	// END set_method()
-	
-	// --------------------------------------------------------------------
-	
-	/**
 	 *  Parse Routes
 	 *
 	 * This function matches any routes that may exist in
@@ -295,7 +281,7 @@
 		// Is there a literal match?  If so we're done
 		if (isset($this->routes[$uri]))
 		{
-			$this->_compile_segments(explode('/', $this->routes[$uri]), TRUE);		
+			$this->_compile_segments(explode('/', $this->routes[$uri]));		
 			return;
 		}
 		
@@ -308,22 +294,109 @@
 			// Convert wildcards to RegEx
 			$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
 			
-			// Does the regex match this URI ?
+			// Does the RegEx match?
 			if (preg_match('|^'.$key.'$|', $uri))
 			{			
-				// Do we have a replacemnt?
+				// Do we have a back-reference?
 				if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
 				{
 					$val = preg_replace('|^'.$key.'$|', $val, $uri);
 				}
 			
-				$this->_compile_segments(explode('/', $val), TRUE);		
-				break;
+				$this->_compile_segments(explode('/', $val));		
+				return;
 			}
-		
 		}	
 	}
 	// END set_method()
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Set the class name
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */	
+	function set_class($class)
+	{
+		$this->class = $class;
+	}
+	// END set_class()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Fetch the current class
+	 *
+	 * @access	public
+	 * @return	string
+	 */	
+	function fetch_class()
+	{
+		return $this->class;
+	}
+	// END fetch_class()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 *  Set the method name
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */	
+	function set_method($method)
+	{
+		$this->method = $method;
+	}
+	// END set_method()
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 *  Fetch the current method
+	 *
+	 * @access	public
+	 * @return	string
+	 */	
+	function fetch_method()
+	{
+		return $this->method;
+	}
+	// END fetch_method()
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 *  Set the directory name
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */	
+	function set_directory($dir)
+	{
+		$this->directory = $dir.'/';
+	}
+	// END set_directory()
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 *  Fetch the sub-directory (if any) that contains the requested controller class
+	 *
+	 * @access	public
+	 * @return	string
+	 */	
+	function fetch_directory()
+	{
+		return $this->directory;
+	}
+	// END fetch_directory()
+
 }
 // END Router Class
 ?>
\ No newline at end of file