diff --git a/system/libraries/Benchmark.php b/system/libraries/Benchmark.php
index feedbf5..d29e917 100644
--- a/system/libraries/Benchmark.php
+++ b/system/libraries/Benchmark.php
@@ -48,7 +48,6 @@
     {
         $this->marker[$name] = microtime();
     }
-  	// END mark()
   	
 	// --------------------------------------------------------------------
 
@@ -81,39 +80,6 @@
                         
         return number_format(($em + $es) - ($sm + $ss), $decimals);
     }
- 	// END elapsed_time()
- 	
-	// --------------------------------------------------------------------
-
-	/**
-	 * Auto Profiler
-	 *
-	 * This function cycles through the entire array of mark points and
-	 * matches any two points that are named identially (ending in "_start"
-	 * and "_end" respectively).  It then compiles the execution times for
-	 * all points and returns it as an array
-	 *
-	 * @access	public
-	 * @return	array
-	 */
- 	function auto_profiler()
- 	{  		
- 		$marker_keys = array_reverse(array_keys($this->marker));
- 
-  		$times = array();
- 		foreach ($marker_keys as $val)
- 		{
- 			if (preg_match("/(.+?)_start/i", $val, $match))
- 			{ 			
- 				if (isset($this->marker[$match[1].'_end']))
- 				{
- 					$times[$match[1]] = $this->elapsed_time($val, $match[1].'_end');
- 				}
- 			}
- 		}
- 	
- 		return $times;
- 	}
  	
 	// --------------------------------------------------------------------
 
@@ -132,7 +98,6 @@
 	{
 		return '{memory_usage}';
 	}
-	// END memory_usage()
 
 }
 
diff --git a/system/libraries/Output.php b/system/libraries/Output.php
index b5b7c9e..4ab5dd2 100644
--- a/system/libraries/Output.php
+++ b/system/libraries/Output.php
@@ -29,9 +29,10 @@
 class CI_Output {
 
 	var $final_output;
-	var $cache_expiration = 0;
-	var $headers = array();
-	var $enable_profiler = FALSE;
+	var $cache_expiration	= 0;
+	var $headers 			= array();
+	var $enable_profiler 	= FALSE;
+
 
 	function CI_Output()
 	{
@@ -121,47 +122,53 @@
 	/**
 	 * Display Output
 	 *
-	 * All "view" data is automatically put into this variable 
-	 * by the controller class:
+	 * All "view" data is automatically put into this variable by the controller class:
 	 *
 	 * $this->final_output
 	 *
-	 * This function simply echos the variable out.  It also does the following:
-	 * 
-	 * Stops the benchmark timer so the page rendering speed can be shown.
-	 *
-	 * Determines if the "memory_get_usage' function is available so that 
-	 * the memory usage can be shown.
+	 * This function sends the finalized output data to the browser along
+	 * with any server headers and profile data.  It also stops the
+	 * benchmark timer so the page rendering speed and memory usage can be shown.
 	 *
 	 * @access	public
-	 * @return	void
+	 * @return	mixed
 	 */		
 	function _display($output = '')
 	{	
-		// Note:  We can't use $obj =& get_instance() since this function 
-		// is sometimes called by the caching mechanism, which happens before 
-		// it's available.  Instead we'll use globals...
+		// Note:  We use globals because we can't use $obj =& get_instance() 
+		// since this function is sometimes called by the caching mechanism, 
+		// which happens before the CI super object is available.
 		global $BM, $CFG;
-			
+		
+		// --------------------------------------------------------------------
+		
+		// Set the output data
 		if ($output == '')
 		{
 			$output =& $this->final_output;
 		}
 		
+		// --------------------------------------------------------------------
+		
 		// Do we need to write a cache file?
 		if ($this->cache_expiration > 0)
 		{
 			$this->_write_cache($output);
 		}
+		
+		// --------------------------------------------------------------------
 
-		// Parse out the elapsed time and memory usage, and 
-		// swap the pseudo-variables with the data
+		// Parse out the elapsed time and memory usage, 
+		// then swap the pseudo-variables with the data
+				
 		$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');		
-		$memory	 = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
-
-		$output = str_replace('{memory_usage}', $memory, $output);		
 		$output = str_replace('{elapsed_time}', $elapsed, $output);
 		
+		$memory	 = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
+		$output = str_replace('{memory_usage}', $memory, $output);		
+
+		// --------------------------------------------------------------------
+		
 		// Is compression requested?
 		if ($CFG->item('compress_output') === TRUE)
 		{
@@ -173,6 +180,8 @@
 				}
 			}
 		}
+
+		// --------------------------------------------------------------------
 		
 		// Are there any server headers to send?
 		if (count($this->headers) > 0)
@@ -182,30 +191,54 @@
 				@header($header);
 			}
 		}		
+
+		// --------------------------------------------------------------------
 		
-		// Send the finalized output either directly
-		// to the browser or to the user's _output() 
-		// function if it exists
-		if (function_exists('get_instance'))
+		// Does the get_instance() function exist?
+		// If not we know we are dealing with a cache file so we'll
+		// simply echo out the data and exit.
+		if ( ! function_exists('get_instance'))
 		{
-			$obj =& get_instance();
+			echo $output;
+			log_message('debug', "Final output sent to browser");
+			log_message('debug', "Total execution time: ".$elapsed);		
+		}
+	
+		// --------------------------------------------------------------------
+
+		// Grab the super object.  We'll need it in a moment...
+		$obj =& get_instance();
 		
-			if ($this->enable_profiler == TRUE)
+		// Do we need to generate profile data?
+		// If so, load the Profile class and run it.
+		if ($this->enable_profiler == TRUE)
+		{
+			$obj->load->library('profiler');				
+										
+			// If the output data contains closing </body> and </html> tags
+			// we will remove them and add them back after we insert the profile data
+			if (preg_match("|</body>.*?</html>|is", $output))
 			{
-				$output .= $this->_run_profiler();
-			}
-		
-			if (method_exists($obj, '_output'))
-			{
-				$obj->_output($output);
+				$output  = preg_replace("|</body>.*?</html>|is", '', $output);
+				$output .= $obj->profiler->run();
+				$output .= '</body></html>';
 			}
 			else
 			{
-				echo $output;  // Send it to the browser!
+				$output .= $obj->profiler->run();
 			}
 		}
+		
+		// --------------------------------------------------------------------
+
+		// Does the controller contain a function named _output()?
+		// If so send the output there.  Otherwise, echo it.
+		if (method_exists($obj, '_output'))
+		{
+			$obj->_output($output);
+		}
 		else
-		{		
+		{
 			echo $output;  // Send it to the browser!
 		}
 		
@@ -324,36 +357,6 @@
 		return TRUE;
 	}
 
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Run the Auto-profiler
-	 *
-	 * @access	private
-	 * @return	string
-	 */	
-	function _run_profiler()
-	{
-		$obj =& get_instance();
-		
-		$profile = $obj->benchmark->auto_profiler();
-		
-		$output = '';
-		if (count($profile) > 0)
-		{
-			$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0'>\n";
-			
-			foreach ($profile as $key => $val)
-			{
-				$key = ucwords(str_replace(array('_', '-'), ' ', $key));
-				$output .= "<tr><td><strong>".$key."</strong></td><td>".$val."</td></tr>\n";
-			}
-			
-			$output .= "</table>\n";
-		}
-		
-		return $output;
-	}
 
 }
 // END Output Class
diff --git a/system/libraries/Router.php b/system/libraries/Router.php
index d62cf50..7a4fd38 100644
--- a/system/libraries/Router.php
+++ b/system/libraries/Router.php
@@ -530,6 +530,11 @@
 	 */	
 	function fetch_method()
 	{
+		if ($this->method == $this->fetch_class())
+		{
+			return 'index';
+		}
+
 		return $this->method;
 	}