diff --git a/system/application/config/config.php b/system/application/config/config.php
index 0b4f33f..c33bda3 100644
--- a/system/application/config/config.php
+++ b/system/application/config/config.php
@@ -37,6 +37,8 @@
 | 'auto'			Default - auto detects
 | 'path_info'		Uses the PATH_INFO 
 | 'query_string'	Uses the QUERY_STRING
+| 'orig_path_info'	Uses the ORIG_PATH_INFO 
+| 'request_uri'		Uses the REQUEST_URI
 |
 */
 $config['uri_protocol']	= "auto";
diff --git a/system/application/config/routes.php b/system/application/config/routes.php
index 5167f75..dc8a32d 100644
--- a/system/application/config/routes.php
+++ b/system/application/config/routes.php
@@ -45,7 +45,8 @@
 
 // Define your own routes below -------------------------------------------
 
+$route['products/([a-z]+)/(\d+)'] = "bamo/$1/a$2";
 
-$route['products\/([a-z]+)\/(\d+)'] = "$1/a$2";
+
 
 ?>
\ No newline at end of file
diff --git a/system/codeigniter/CodeIgniter.php b/system/codeigniter/CodeIgniter.php
index de7f89a..872f4c0 100644
--- a/system/codeigniter/CodeIgniter.php
+++ b/system/codeigniter/CodeIgniter.php
@@ -27,7 +27,7 @@
  * @link		http://www.codeigniter.com/user_guide/
  */
  
-define('APPVER', '1.4');
+define('APPVER', '1.4.0');
 
 /*
  * ------------------------------------------------------
@@ -122,7 +122,7 @@
  * 
  */
  
-_load_class('CI_Loader'); 
+_load_class('CI_Loader', FALSE); 
   
 if (floor(phpversion()) < 5)
 {
@@ -133,7 +133,7 @@
 	require(BASEPATH.'codeigniter/Base5'.EXT);
 }
 
-_load_class('CI_Controller'); 
+_load_class('CI_Controller', FALSE); 
 
 require(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT);
 
diff --git a/system/codeigniter/Common.php b/system/codeigniter/Common.php
index 2ec1c3d..4879e70 100644
--- a/system/codeigniter/Common.php
+++ b/system/codeigniter/Common.php
@@ -63,11 +63,10 @@
 		}
 		else
 		{
-			$objects[$class] = TRUE;
+			$objects[$class] = FALSE;
 		}
 	}
 	
-	
 	return $objects[$class];
 }
 
diff --git a/system/drivers/DB_mssql.php b/system/drivers/DB_mssql.php
index 6156ec3..48d1929 100644
--- a/system/drivers/DB_mssql.php
+++ b/system/drivers/DB_mssql.php
@@ -93,7 +93,7 @@
 	 * @param	string	an SQL query
 	 * @return	string
 	 */	
-    function &_prep_query($sql)
+    function _prep_query($sql)
     {
 		return $sql;
     }
diff --git a/system/drivers/DB_mysql.php b/system/drivers/DB_mysql.php
index 18c080b..82e677a 100644
--- a/system/drivers/DB_mysql.php
+++ b/system/drivers/DB_mysql.php
@@ -100,7 +100,7 @@
 	 * @param	string	an SQL query
 	 * @return	string
 	 */	
-    function &_prep_query($sql)
+    function _prep_query($sql)
     {
 		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies 
 		// the query so that it returns the number of affected rows
diff --git a/system/drivers/DB_mysqli.php b/system/drivers/DB_mysqli.php
index f8cb19d..32c4c0f 100644
--- a/system/drivers/DB_mysqli.php
+++ b/system/drivers/DB_mysqli.php
@@ -102,7 +102,7 @@
 	 * @param	string	an SQL query
 	 * @return	string
 	 */	
-    function &_prep_query($sql)
+    function _prep_query($sql)
     {
 		// "DELETE FROM TABLE" returns 0 affected rows This hack modifies 
 		// the query so that it returns the number of affected rows
diff --git a/system/drivers/DB_odbc.php b/system/drivers/DB_odbc.php
index fac4490..50f39ac 100644
--- a/system/drivers/DB_odbc.php
+++ b/system/drivers/DB_odbc.php
@@ -94,7 +94,7 @@
 	 * @param	string	an SQL query
 	 * @return	string
 	 */	
-    function &_prep_query($sql)
+    function _prep_query($sql)
     {
 		return $sql;
     }
diff --git a/system/drivers/DB_postgre.php b/system/drivers/DB_postgre.php
index 01d4b3d..3829b04 100644
--- a/system/drivers/DB_postgre.php
+++ b/system/drivers/DB_postgre.php
@@ -94,7 +94,7 @@
 	 * @param	string	an SQL query
 	 * @return	string
 	 */	
-    function &_prep_query($sql)
+    function _prep_query($sql)
     {
 		return $sql;
     }
@@ -174,7 +174,7 @@
 		if ($table == '')
 			return '0';
 	
-		$query = $this->query("SELECT COUNT(*) AS numrows FROM `".$this->dbprefix.$table."`");
+		$query = $this->query("SELECT COUNT(*) AS numrows FROM ".$this->dbprefix.$table."");
 		
 		if ($query->num_rows() == 0)
 			return '0';
@@ -225,7 +225,7 @@
 	{
 		if (stristr($table, '.'))
 		{
-			$table = preg_replace("/\./", "`.`", $table);
+			$table = preg_replace("/\./", ".", $table);
 		}
 		
 		return $table;
@@ -432,7 +432,7 @@
 			$F->name 		= pg_field_name($this->result_id, $i);
 			$F->type 		= pg_field_type($this->result_id, $i);
 			$F->max_length	= pg_field_size($this->result_id, $i);
-			$F->primary_key = 0;
+			$F->primary_key = $i == 0;
 			$F->default		= '';
 
 			$retval[] = $F;
diff --git a/system/drivers/DB_sqlite.php b/system/drivers/DB_sqlite.php
index 6428dd5..1192e6d 100644
--- a/system/drivers/DB_sqlite.php
+++ b/system/drivers/DB_sqlite.php
@@ -115,7 +115,7 @@
 	 * @param	string	an SQL query
 	 * @return	string
 	 */	
-    function &_prep_query($sql)
+    function _prep_query($sql)
     {
 		return $sql;
     }
diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php
index f82ad01..d4e45a0 100644
--- a/system/helpers/form_helper.php
+++ b/system/helpers/form_helper.php
@@ -326,7 +326,7 @@
  */	
 function form_prep($str = '')
 {
-	if ($str == '')
+	if ($str === '')
 	{
 		return '';
 	}
diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
index d2d2a59..03d6c3b 100644
--- a/system/helpers/url_helper.php
+++ b/system/helpers/url_helper.php
@@ -90,7 +90,7 @@
  */	
 function anchor($uri = '', $title = '', $attributes = '')
 {
-	$site_url = site_url($uri);
+	$site_url = ( ! preg_match('!^\w+://!i', $uri)) ? site_url($uri) : $uri;
 	
 	if ($title == '')
 	{
@@ -128,7 +128,7 @@
  */
 function anchor_popup($uri = '', $title = '', $attributes = FALSE)
 {	
-	$site_url = site_url($uri);
+	$site_url = ( ! preg_match('!^\w+://!i', $uri)) ? site_url($uri) : $uri;
 	
 	if ($title == '')
 	{
diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php
index 013f067..b77dd1b 100644
--- a/system/libraries/Calendar.php
+++ b/system/libraries/Calendar.php
@@ -263,7 +263,7 @@
 		}
 		else
 		{
-			$month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_mayl', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_novermber', '12' => 'cal_december');
+			$month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_mayl', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december');
 		}
 		
 		$month = $month_names[$month];
diff --git a/system/libraries/Loader.php b/system/libraries/Loader.php
index e2467fa..3d2501f 100644
--- a/system/libraries/Loader.php
+++ b/system/libraries/Loader.php
@@ -478,7 +478,7 @@
 		if ($path == '')
 		{
 			$ext = pathinfo($view, PATHINFO_EXTENSION);
-			$file = ($ext == '') ? $view.EXT : $view;
+			$file = ($ext != EXT) ? $view.EXT : $view;
 			$path = $this->view_path.$file;
 		}
 		else
diff --git a/system/libraries/Router.php b/system/libraries/Router.php
index 6781454..b28ead9 100644
--- a/system/libraries/Router.php
+++ b/system/libraries/Router.php
@@ -87,25 +87,31 @@
 
 		// Fetch the URI string Depending on the server, 
 		// the URI will be available in one of two globals
-		switch ($this->config->item('uri_protocol'))
+		if ($this->config->item('uri_protocol') == 'auto')
 		{
-			case 'path_info'	: $this->uri_string = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');	
-				break;
-			case 'query_string' : $this->uri_string = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); 
-				break;
-			default : 
-						$path_info = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
-						
-						if ($path_info != '' AND $path_info != "/".SELF)
-						{
-							$this->uri_string = $path_info;
-						}
-						else
-						{
-							$this->uri_string = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
-						}
-				break;
+			$path_info = getenv('PATH_INFO');
+			if ($path_info != '' AND $path_info != "/".SELF)
+			{
+				$this->uri_string = $path_info;
+			}
+			else
+			{
+				$path_info = getenv('ORIG_PATH_INFO');
+				if ($path_info != '' AND $path_info != "/".SELF)
+				{
+					$this->uri_string = $path_info;
+				}
+				else
+				{
+					$this->uri_string = getenv('QUERY_STRING');
+				}
+			}
 		}
+		else
+		{
+			$this->uri_string = getenv(strtoupper($this->config->item('uri_protocol')));		
+		}
+		
 	
 		// Is there a URI string? If not, the default controller specified 
 		// by the admin in the "routes" file will be shown.
@@ -291,10 +297,7 @@
 				
 		// Loop through the route array looking for wildcards
 		foreach (array_slice($this->routes, 1) as $key => $val)
-		{
-			if (count(explode('/', $key)) != $num)
-				continue;
-						
+		{						
 			// Convert wildcards to RegEx
 			$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
 			
diff --git a/system/libraries/URI.php b/system/libraries/URI.php
index 4c2fa9c..c5fd462 100644
--- a/system/libraries/URI.php
+++ b/system/libraries/URI.php
@@ -28,7 +28,7 @@
  */
 class CI_URI {
 
-	var $uri;
+	var $router;
 	var	$keyval	= array();
 
 	/**
@@ -42,7 +42,7 @@
 	 */		
 	function CI_URI()
 	{
-		$this->uri =& _load_class('CI_Router');		
+		$this->router =& _load_class('CI_Router');	
 		log_message('debug', "URI Class Initialized");
 	}
 	
@@ -60,7 +60,7 @@
 	 */
 	function segment($n, $no_result = FALSE)
 	{
-		return ( ! isset($this->uri->segments[$n])) ? $no_result : $this->uri->segments[$n];
+		return ( ! isset($this->router->segments[$n])) ? $no_result : $this->router->segments[$n];
 	}
 
 	// --------------------------------------------------------------------
@@ -196,7 +196,7 @@
 			$leading	= '/';
 			$trailing	= '/';
 		}
-		return ( ! isset($this->uri->segments[$n])) ? '' : $leading.$this->uri->segments[$n].$trailing;
+		return ( ! isset($this->router->segments[$n])) ? '' : $leading.$this->router->segments[$n].$trailing;
 	}
 	
 	// --------------------------------------------------------------------
@@ -209,7 +209,7 @@
 	 */
 	function segment_array()
 	{
-		return $this->uri->segments;
+		return $this->router->segments;
 	}
 	
 	// --------------------------------------------------------------------
@@ -222,7 +222,7 @@
 	 */
 	function total_segments()
 	{
-		return count($this->uri->segments);
+		return count($this->router->segments);
 	}
 	
 	// --------------------------------------------------------------------
@@ -235,7 +235,7 @@
 	 */
 	function uri_string()
 	{
-		return $this->uri->uri_string;
+		return $this->router->uri_string;
 	}
 
 }
diff --git a/user_guide/general/changelog.html b/user_guide/general/changelog.html
index 5f3b869..5721bc8 100644
--- a/user_guide/general/changelog.html
+++ b/user_guide/general/changelog.html
@@ -69,20 +69,28 @@
 

 <ul>

 <li>Added <a href="hooks.html">Hooks</a> feature, enabling you to tap into and modify the inner workings of the framework without hacking the core files.</li>

+<li>Added the ability to organize controller files <a href="controllers.html">into sub-folders</a>.  Kudos to Marco for <a href="http://www.codeigniter.com/forums/viewthread/627/">suggesting</a> this (and the next two) feature.</li>

+<li>Added regular expressions support for <a href="routing.html">routing rules</a>.</li>

 <li>Added the ability to <a href="core_classes.html">replace core system classes</a> with your own classes.</li>

 <li>Added support for % character in URL.</li>

-<li>Added the ability to organize <a href="controllers.html">controller</a> files into sub-folders.

-<li>Updated the <a href="routing.html">Routing feature</a> to accept regular expressions within routing rules.</li>

+<li>Added the ability to supply full URLs using the <dfn>anchor()</dfn> helper function.</li>

 <li>Moved the MIME type array out of the Upload class and into its own file in the applications/comfig/ folder.</li>

+<li>Tweaked the URI Protocol code to allow more options so that URLs will work more reliably in different environments.</li>

 <li>Removed a strtolower() call that was changing URL segments to lower case.</li>

+<li>Removed some references that were interfering with PHP 4.4.1 compatibility.</li>

+<li>Removed backticks from Postgre class since these are not needed.</li>

 <li>Deprecated the hash() function due to a naming conflict with a native PHP function with the same name.  Please use dohash() instead.</li>

-<li>Fixed a MS SQL issue.</li>

 <li>Fixed an issue when removing GET variables.</li>

 <li>Fixed <a href="http://www.codeigniter.com/forums/viewthread/773/">this</a> router bug.</li>

 <li>Fixed a bug that was preventing multiple discreet database calls.</li>

 <li>Fixed a bug in which loading a language file was producing a "file contains no data" message.</li>

 <li>Fixed a session bug caused by the XSS Filtering feature inadvertently changing the case of certain words.</li>

-<li>Removed backticks from Postgre class since these are not needed.</li>

+<li>Fixed some missing prefixes when using the database prefix feature.</li>

+<li>Fixed a bug that was causing the Loader class to incorrectly identify the file extension.</li>

+<li>Fixed a typo in the Calendar class (cal_november).</li> 

+<li>Fixed an evaluation bug in the database initialization function.</li>

+<li>Fixed some MS SQL bugs.</li>

+<li>Fixed some doc typos.</li>

 </ul>

 

 

diff --git a/user_guide/general/controllers.html b/user_guide/general/controllers.html
index 648298e..b45b5ae 100644
--- a/user_guide/general/controllers.html
+++ b/user_guide/general/controllers.html
@@ -71,6 +71,7 @@
 <li><a href="#functions">Functions</a></li>

 <li><a href="#private">Private Functions</a></li>

 <li><a href="#default">Defining a Default Controller</a></li>

+<li><a href="#subfolders">Organizing Controllers into Sub-folders</a></li>

 <li><a href="#constructors">Class Constructors</a></li>

 <li><a href="#reserved">Reserved Function Names</a></li>

 </ul>

@@ -204,6 +205,25 @@
 specifying any URI segments you'll see your Hello World message by default.</p>

 

 

+<a name="subfolders"></a>

+<h2>Organizing Your Controllers into Sub-folders</h2>

+

+<p>If you are building a large application you might find it convenient to organize your controllers into sub-folders.  Code Igniter permits you to do this.</p>

+

+<p>Simply create folders within your <dfn>application/controllers</dfn> directory and place your controller classes within them.</p>

+

+<p><strong>Note:</strong>&nbsp; When using this feature the first segment or your URI must specify the folder.  For example, lets say you have a controller

+located here:</p>

+

+<code>application/controllers/<kbd>products</kbd>/shoes.php</code>

+

+<p>To call the above controller your URI will look something like this:</p>

+

+<code>www.your-site.com/index.php/products/shoes/123</code>

+

+<p>Code Igniter also permits you to remap your URIs using its <a href="routing.html">URI Routing</a> feature.

+

+

 <a name="constructors"></a>

 <h2>Class Constructors</h2>

 

diff --git a/user_guide/general/routing.html b/user_guide/general/routing.html
index 977698b..e5dac68 100644
--- a/user_guide/general/routing.html
+++ b/user_guide/general/routing.html
@@ -138,7 +138,7 @@
 

 <p>A typical RegEx route might look something like this:</p>

 

-<code>$route['products\/([a-z]+)\/(\d+)'] = "$1/id_$2";</code>

+<code>$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";</code>

 

 <p>In the above example, a URI similar to <dfn>products/shirts/123</dfn> would instead call the <dfn>shirts</dfn> controller class and the <dfn>id_123</dfn> function.</p>

 

diff --git a/user_guide/helpers/form_helper.html b/user_guide/helpers/form_helper.html
index 8593f81..f38d4ad 100644
--- a/user_guide/helpers/form_helper.html
+++ b/user_guide/helpers/form_helper.html
@@ -208,7 +208,7 @@
 <code>$options = array(<br />

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'small'&nbsp;&nbsp;=> 'Small Shirt',<br />

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'med'&nbsp;&nbsp;&nbsp;&nbsp;=> 'Medium Shirt',<br />

-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;large'&nbsp;&nbsp; => 'Large Shirt',<br />

+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'large'&nbsp;&nbsp; => 'Large Shirt',<br />

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'xlarge' => 'Extra Large Shirt',<br />

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />

 <br />

@@ -217,10 +217,10 @@
 // Would produce:<br /><br />

 

 &lt;select name="shirts"><br />

-&lt;option value="small">Small Shirt</option><br />

-&lt;option value="med">Medium  Shirt</option><br />

-&lt;option value="large" selected>Large Shirt</option><br />

-&lt;option value="xlarge">Extra Large Shirt</option><br />

+&lt;option value="small">Small Shirt&lt;/option><br />

+&lt;option value="med">Medium  Shirt&lt;/option><br />

+&lt;option value="large" selected>Large Shirt&lt;/option><br />

+&lt;option value="xlarge">Extra Large Shirt&lt;/option><br />

 &lt;/select></code>

 

 

diff --git a/user_guide/helpers/url_helper.html b/user_guide/helpers/url_helper.html
index a8f5c14..2b5b354 100644
--- a/user_guide/helpers/url_helper.html
+++ b/user_guide/helpers/url_helper.html
@@ -117,8 +117,10 @@
 <code>anchor(<var>uri segments</var>, <var>text</var>, <var>attributes</var>)</code>

 

 <p>The first parameter can contain any segments you wish appended to the URL.  As with the <dfn>site_url()</dfn> function above,

-segments can be a string or an array. Note: Do not include the base URL.  It will be built as specified in your config file. Include

-only the URI segments you wish appended to the URL.</p>

+segments can be a string or an array.</p>

+

+<p><strong>Note:</strong>&nbsp; If you are building links that are internal to your application do not include the base URL (http://...).  This

+will be added automatically from the information specified in your config file. Include only the URI segments you wish appended to the URL.</p>

 

 <p>The second segment is the text you would like the link to say.  If you leave it blank, the URL will be used.</p>

 

diff --git a/user_guide/libraries/database/active_record.html b/user_guide/libraries/database/active_record.html
index 8fc3b81..6e5d612 100644
--- a/user_guide/libraries/database/active_record.html
+++ b/user_guide/libraries/database/active_record.html
@@ -557,7 +557,7 @@
 <p>Generates a delete SQL string and runs the query.</p>

 

 <code>

-$this->db->delete('mytable', array('id', $id));

+$this->db->delete('mytable', array('id' => $id));

 <br /><br />

 // Produces:<br />

 // DELETE FROM mytable <br />