Simulate a complete custom exception handler by redirecting uncaught events.
diff --git a/index.php b/index.php
index 3040ef0..a38ea99 100755
--- a/index.php
+++ b/index.php
@@ -196,6 +196,18 @@
 	}
 
 /*
+ *---------------------------------------------------------------
+ * WORKING DIRECTORY FOR SHUTDOWN HANDLER
+ *---------------------------------------------------------------
+ *
+ * CI assumes the directory containing index.php, while shutdown
+ * handlers execute in process's initial working directory. To make
+ * logging work, we need to change directory in the shutdown handler.
+ * 
+ */
+	define('CIPATH', getcwd());
+
+/*
  * -------------------------------------------------------------------
  *  Now that we know the path, set the main path constants
  * -------------------------------------------------------------------
diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
index c962fda..67c94cf 100644
--- a/system/core/CodeIgniter.php
+++ b/system/core/CodeIgniter.php
@@ -73,6 +73,7 @@
  * ------------------------------------------------------
  */
 	set_error_handler('_exception_handler');
+	register_shutdown_function('_shutdown_handler');
 
 	if ( ! is_php('5.4'))
 	{
diff --git a/system/core/Common.php b/system/core/Common.php
index 7f296b1..0353a9d 100644
--- a/system/core/Common.php
+++ b/system/core/Common.php
@@ -577,6 +577,35 @@
 	}
 }
 
+// ------------------------------------------------------------------------
+
+if ( ! function_exists('_shutdown_handler'))
+{
+	/**
+	 * Shutdown Handler
+	 *
+	 * This is the shutdown handler that is declared at the top
+	 * of CodeIgniter.php. The main reason we use this is to simulate
+	 * a complete custom exception handler.
+	 *
+	 * E_STRICT is purposivly neglected because such events may have 
+	 * been caught. Duplication or none? None is preferred for now.
+	 *
+	 * @link	http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a
+	 * @return	void
+	 */
+	function _shutdown_handler()
+	{
+		$last_error = function_exists('error_get_last') ? error_get_last() : NULL;
+		if (isset($last_error) &&
+			($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING)))
+		{
+			chdir(CIPATH);
+			_exception_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']);
+		}
+	}
+}
+
 // --------------------------------------------------------------------
 
 if ( ! function_exists('remove_invisible_characters'))