Remove dead code written for PHP 5.2
diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
index 70f33d5..22072e9 100644
--- a/system/core/CodeIgniter.php
+++ b/system/core/CodeIgniter.php
@@ -416,11 +416,7 @@
 			$params = array($method, array_slice($URI->rsegments, 2));
 			$method = '_remap';
 		}
-		// WARNING: It appears that there are issues with is_callable() even in PHP 5.2!
-		// Furthermore, there are bug reports and feature/change requests related to it
-		// that make it unreliable to use in this context. Please, DO NOT change this
-		// work-around until a better alternative is available.
-		elseif ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($class)), TRUE))
+		elseif ( ! is_callable(array($class, $method)))
 		{
 			$e404 = TRUE;
 		}
diff --git a/system/core/Security.php b/system/core/Security.php
index d5305d1..a290700 100644
--- a/system/core/Security.php
+++ b/system/core/Security.php
@@ -678,12 +678,7 @@
 			{
 				if ( ! isset($_entities))
 				{
-					$_entities = array_map(
-						'strtolower',
-						is_php('5.3.4')
-							? get_html_translation_table(HTML_ENTITIES, $flag, $charset)
-							: get_html_translation_table(HTML_ENTITIES, $flag)
-					);
+					$_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset));
 
 					// If we're not on PHP 5.4+, add the possibly dangerous HTML 5
 					// entities to the array manually
diff --git a/system/core/compat/password.php b/system/core/compat/password.php
index 76dd2cf..1b5219e 100644
--- a/system/core/compat/password.php
+++ b/system/core/compat/password.php
@@ -50,7 +50,7 @@
 
 // ------------------------------------------------------------------------
 
-if (is_php('5.5') OR ! is_php('5.3.7') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION'))
+if (is_php('5.5') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION'))
 {
 	return;
 }
diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php
index c54cab9..c839c9b 100644
--- a/system/core/compat/standard.php
+++ b/system/core/compat/standard.php
@@ -180,210 +180,3 @@
 		return pack('H*', $data);
 	}
 }
-
-// ------------------------------------------------------------------------
-
-if (is_php('5.3'))
-{
-	return;
-}
-
-// ------------------------------------------------------------------------
-
-if ( ! function_exists('array_replace'))
-{
-	/**
-	 * array_replace()
-	 *
-	 * @link	http://php.net/array_replace
-	 * @return	array
-	 */
-	function array_replace()
-	{
-		$arrays = func_get_args();
-
-		if (($c = count($arrays)) === 0)
-		{
-			trigger_error('array_replace() expects at least 1 parameter, 0 given', E_USER_WARNING);
-			return NULL;
-		}
-		elseif ($c === 1)
-		{
-			if ( ! is_array($arrays[0]))
-			{
-				trigger_error('array_replace(): Argument #1 is not an array', E_USER_WARNING);
-				return NULL;
-			}
-
-			return $arrays[0];
-		}
-
-		$array = array_shift($arrays);
-		$c--;
-
-		for ($i = 0; $i < $c; $i++)
-		{
-			if ( ! is_array($arrays[$i]))
-			{
-				trigger_error('array_replace(): Argument #'.($i + 2).' is not an array', E_USER_WARNING);
-				return NULL;
-			}
-			elseif (empty($arrays[$i]))
-			{
-				continue;
-			}
-
-			foreach (array_keys($arrays[$i]) as $key)
-			{
-				$array[$key] = $arrays[$i][$key];
-			}
-		}
-
-		return $array;
-	}
-}
-
-// ------------------------------------------------------------------------
-
-if ( ! function_exists('array_replace_recursive'))
-{
-	/**
-	 * array_replace_recursive()
-	 *
-	 * @link	http://php.net/array_replace_recursive
-	 * @return	array
-	 */
-	function array_replace_recursive()
-	{
-		$arrays = func_get_args();
-
-		if (($c = count($arrays)) === 0)
-		{
-			trigger_error('array_replace_recursive() expects at least 1 parameter, 0 given', E_USER_WARNING);
-			return NULL;
-		}
-		elseif ($c === 1)
-		{
-			if ( ! is_array($arrays[0]))
-			{
-				trigger_error('array_replace_recursive(): Argument #1 is not an array', E_USER_WARNING);
-				return NULL;
-			}
-
-			return $arrays[0];
-		}
-
-		$array = array_shift($arrays);
-		$c--;
-
-		for ($i = 0; $i < $c; $i++)
-		{
-			if ( ! is_array($arrays[$i]))
-			{
-				trigger_error('array_replace_recursive(): Argument #'.($i + 2).' is not an array', E_USER_WARNING);
-				return NULL;
-			}
-			elseif (empty($arrays[$i]))
-			{
-				continue;
-			}
-
-			foreach (array_keys($arrays[$i]) as $key)
-			{
-				$array[$key] = (is_array($arrays[$i][$key]) && isset($array[$key]) && is_array($array[$key]))
-					? array_replace_recursive($array[$key], $arrays[$i][$key])
-					: $arrays[$i][$key];
-			}
-		}
-
-		return $array;
-	}
-}
-
-// ------------------------------------------------------------------------
-
-if ( ! function_exists('quoted_printable_encode'))
-{
-	/**
-	 * quoted_printable_encode()
-	 *
-	 * @link	http://php.net/quoted_printable_encode
-	 * @param	string	$str
-	 * @return	string
-	 */
-	function quoted_printable_encode($str)
-	{
-		if (strlen($str) === 0)
-		{
-			return '';
-		}
-		elseif (in_array($type = gettype($str), array('array', 'object'), TRUE))
-		{
-			if ($type === 'object' && method_exists($str, '__toString'))
-			{
-				$str = (string) $str;
-			}
-			else
-			{
-				trigger_error('quoted_printable_encode() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING);
-				return NULL;
-			}
-		}
-
-		if (function_exists('imap_8bit'))
-		{
-			return imap_8bit($str);
-		}
-
-		$i = $lp = 0;
-		$output = '';
-		$hex = '0123456789ABCDEF';
-		$length = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'))
-			? mb_strlen($str, '8bit')
-			: strlen($str);
-
-		while ($length--)
-		{
-			if ((($c = $str[$i++]) === "\015") && isset($str[$i]) && ($str[$i] === "\012") && $length > 0)
-			{
-				$output .= "\015".$str[$i++];
-				$length--;
-				$lp = 0;
-				continue;
-			}
-
-			if (
-				ctype_cntrl($c)
-				OR (ord($c) === 0x7f)
-				OR (ord($c) & 0x80)
-				OR ($c === '=')
-				OR ($c === ' ' && isset($str[$i]) && $str[$i] === "\015")
-			)
-			{
-				if (
-					(($lp += 3) > 75 && ord($c) <= 0x7f)
-					OR (ord($c) > 0x7f && ord($c) <= 0xdf && ($lp + 3) > 75)
-					OR (ord($c) > 0xdf && ord($c) <= 0xef && ($lp + 6) > 75)
-					OR (ord($c) > 0xef && ord($c) <= 0xf4 && ($lp + 9) > 75)
-				)
-				{
-					$output .= "=\015\012";
-					$lp = 3;
-				}
-
-				$output .= '='.$hex[ord($c) >> 4].$hex[ord($c) & 0xf];
-				continue;
-			}
-
-			if ((++$lp) > 75)
-			{
-				$output .= "=\015\012";
-				$lp = 1;
-			}
-
-			$output .= $c;
-		}
-
-		return $output;
-	}
-}
diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php
index f52163c..f4597c7 100644
--- a/system/database/drivers/mysqli/mysqli_driver.php
+++ b/system/database/drivers/mysqli/mysqli_driver.php
@@ -125,8 +125,7 @@
 		}
 		else
 		{
-			// Persistent connection support was added in PHP 5.3.0
-			$hostname = ($persistent === TRUE && is_php('5.3'))
+			$hostname = ($persistent === TRUE)
 				? 'p:'.$this->hostname : $this->hostname;
 			$port = empty($this->port) ? NULL : $this->port;
 			$socket = NULL;
@@ -502,8 +501,8 @@
 		if ( ! empty($this->_mysqli->connect_errno))
 		{
 			return array(
-				'code' => $this->_mysqli->connect_errno,
-				'message' => is_php('5.2.9') ? $this->_mysqli->connect_error : mysqli_connect_error()
+				'code'    => $this->_mysqli->connect_errno,
+				'message' => $this->_mysqli->connect_error
 			);
 		}
 
diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php
index df7e084..56fdf32 100644
--- a/system/database/drivers/oci8/oci8_driver.php
+++ b/system/database/drivers/oci8/oci8_driver.php
@@ -386,7 +386,7 @@
 	 */
 	protected function _trans_begin()
 	{
-		$this->commit_mode = is_php('5.3.2') ? OCI_NO_AUTO_COMMIT : OCI_DEFAULT;
+		$this->commit_mode = OCI_NO_AUTO_COMMIT;
 		return TRUE;
 	}
 
diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
index 38a5a8a..3631cdf 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
@@ -106,7 +106,7 @@
 			empty($this->database) OR $this->dsn .= ';dbname='.$this->database;
 			empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set;
 		}
-		elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE && is_php('5.3.6'))
+		elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE)
 		{
 			$this->dsn .= ';charset='.$this->char_set;
 		}
@@ -122,17 +122,6 @@
 	 */
 	public function db_connect($persistent = FALSE)
 	{
-		/* Prior to PHP 5.3.6, even if the charset was supplied in the DSN
-		 * on connect - it was ignored. This is a work-around for the issue.
-		 *
-		 * Reference: http://www.php.net/manual/en/ref.pdo-mysql.connection.php
-		 */
-		if ( ! is_php('5.3.6') && ! empty($this->char_set))
-		{
-			$this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$this->char_set
-				.(empty($this->dbcollat) ? '' : ' COLLATE '.$this->dbcollat);
-		}
-
 		if (isset($this->stricton))
 		{
 			if ($this->stricton)
@@ -169,8 +158,7 @@
 			$this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE;
 		}
 
-		// SSL support was added to PDO_MYSQL in PHP 5.3.7
-		if (is_array($this->encrypt) && is_php('5.3.7'))
+		if (is_array($this->encrypt))
 		{
 			$ssl = array();
 			empty($this->encrypt['ssl_key'])    OR $ssl[PDO::MYSQL_ATTR_SSL_KEY]    = $this->encrypt['ssl_key'];
diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php
index c43209f..5f1fcf0 100644
--- a/system/helpers/date_helper.php
+++ b/system/helpers/date_helper.php
@@ -707,87 +707,32 @@
 
 		$range = array();
 
-		/* NOTE: Even though the DateTime object has many useful features, it appears that
-		 *	 it doesn't always handle properly timezones, when timestamps are passed
-		 *	 directly to its constructor. Neither of the following gave proper results:
-		 *
-		 *		new DateTime('<timestamp>')
-		 *		new DateTime('<timestamp>', '<timezone>')
-		 *
-		 *	 --- available in PHP 5.3:
-		 *
-		 *		DateTime::createFromFormat('<format>', '<timestamp>')
-		 *		DateTime::createFromFormat('<format>', '<timestamp>', '<timezone')
-		 *
-		 *	 ... so we'll have to set the timestamp after the object is instantiated.
-		 *	 Furthermore, in PHP 5.3 we can use DateTime::setTimestamp() to do that and
-		 *	 given that we have UNIX timestamps - we should use it.
-		*/
 		$from = new DateTime();
+		$from->setTimestamp($unix_start);
 
-		if (is_php('5.3'))
-		{
-			$from->setTimestamp($unix_start);
-			if ($is_unix)
-			{
-				$arg = new DateTime();
-				$arg->setTimestamp($mixed);
-			}
-			else
-			{
-				$arg = (int) $mixed;
-			}
-
-			$period = new DatePeriod($from, new DateInterval('P1D'), $arg);
-			foreach ($period as $date)
-			{
-				$range[] = $date->format($format);
-			}
-
-			/* If a period end date was passed to the DatePeriod constructor, it might not
-			 * be in our results. Not sure if this is a bug or it's just possible because
-			 * the end date might actually be less than 24 hours away from the previously
-			 * generated DateTime object, but either way - we have to append it manually.
-			 */
-			if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format))
-			{
-				$range[] = $arg->format($format);
-			}
-
-			return $range;
-		}
-
-		$from->setDate(date('Y', $unix_start), date('n', $unix_start), date('j', $unix_start));
-		$from->setTime(date('G', $unix_start), date('i', $unix_start), date('s', $unix_start));
 		if ($is_unix)
 		{
 			$arg = new DateTime();
-			$arg->setDate(date('Y', $mixed), date('n', $mixed), date('j', $mixed));
-			$arg->setTime(date('G', $mixed), date('i', $mixed), date('s', $mixed));
+			$arg->setTimestamp($mixed);
 		}
 		else
 		{
 			$arg = (int) $mixed;
 		}
-		$range[] = $from->format($format);
 
-		if (is_int($arg)) // Day intervals
+		$period = new DatePeriod($from, new DateInterval('P1D'), $arg);
+		foreach ($period as $date)
 		{
-			do
-			{
-				$from->modify('+1 day');
-				$range[] = $from->format($format);
-			}
-			while (--$arg > 0);
+			$range[] = $date->format($format);
 		}
-		else // end date UNIX timestamp
-		{
-			for ($from->modify('+1 day'), $end_check = $arg->format('Ymd'); $from->format('Ymd') < $end_check; $from->modify('+1 day'))
-			{
-				$range[] = $from->format($format);
-			}
 
-			// Our loop only appended dates prior to our end date
+		/* If a period end date was passed to the DatePeriod constructor, it might not
+		 * be in our results. Not sure if this is a bug or it's just possible because
+		 * the end date might actually be less than 24 hours away from the previously
+		 * generated DateTime object, but either way - we have to append it manually.
+		 */
+		if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format))
+		{
 			$range[] = $arg->format($format);
 		}
 
diff --git a/system/libraries/Email.php b/system/libraries/Email.php
index be89d65..5049578 100644
--- a/system/libraries/Email.php
+++ b/system/libraries/Email.php
@@ -1514,14 +1514,7 @@
 		// which only works with "\n".
 		if ($this->crlf === "\r\n")
 		{
-			if (is_php('5.3'))
-			{
-				return quoted_printable_encode($str);
-			}
-			elseif (function_exists('imap_8bit'))
-			{
-				return imap_8bit($str);
-			}
+			return quoted_printable_encode($str);
 		}
 
 		// Reduce multiple spaces & remove nulls
diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php
index a10a5c2..06284c2 100644
--- a/system/libraries/Encryption.php
+++ b/system/libraries/Encryption.php
@@ -152,10 +152,8 @@
 	public function __construct(array $params = array())
 	{
 		$this->_drivers = array(
-			'mcrypt' => defined('MCRYPT_DEV_URANDOM'),
-			// While OpenSSL is available for PHP 5.3.0, an IV parameter
-			// for the encrypt/decrypt functions is only available since 5.3.3
-			'openssl' => (is_php('5.3.3') && extension_loaded('openssl'))
+			'mcrypt'  => defined('MCRYPT_DEV_URANDOM'),
+			'openssl' => extension_loaded('openssl')
 		);
 
 		if ( ! $this->_drivers['mcrypt'] && ! $this->_drivers['openssl'])
diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php
index 04445f5..25dc0d4 100644
--- a/system/libraries/Form_validation.php
+++ b/system/libraries/Form_validation.php
@@ -1216,18 +1216,7 @@
 			$str = 'ipv6.host'.substr($str, strlen($matches[1]) + 2);
 		}
 
-		$str = 'http://'.$str;
-
-		// There's a bug affecting PHP 5.2.13, 5.3.2 that considers the
-		// underscore to be a valid hostname character instead of a dash.
-		// Reference: https://bugs.php.net/bug.php?id=51192
-		if (version_compare(PHP_VERSION, '5.2.13', '==') OR version_compare(PHP_VERSION, '5.3.2', '=='))
-		{
-			sscanf($str, 'http://%[^/]', $host);
-			$str = substr_replace($str, strtr($host, array('_' => '-', '-' => '_')), 7, strlen($host));
-		}
-
-		return (filter_var($str, FILTER_VALIDATE_URL) !== FALSE);
+		return (filter_var('http://'.$str, FILTER_VALIDATE_URL) !== FALSE);
 	}
 
 	// --------------------------------------------------------------------
diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php
index 316c94a..3e2107e 100644
--- a/system/libraries/Migration.php
+++ b/system/libraries/Migration.php
@@ -288,10 +288,7 @@
 				$this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class);
 				return FALSE;
 			}
-			// method_exists() returns true for non-public methods,
-			// while is_callable() can't be used without instantiating.
-			// Only get_class_methods() satisfies both conditions.
-			elseif ( ! in_array($method, array_map('strtolower', get_class_methods($class))))
+			elseif ( ! is_callable(array($class, $method)))
 			{
 				$this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class);
 				return FALSE;
diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php
index 57c3777..bf4df8b 100644
--- a/system/libraries/Session/drivers/Session_files_driver.php
+++ b/system/libraries/Session/drivers/Session_files_driver.php
@@ -149,18 +149,9 @@
 		// which re-reads session data
 		if ($this->_file_handle === NULL)
 		{
-			// Just using fopen() with 'c+b' mode would be perfect, but it is only
-			// available since PHP 5.2.6 and we have to set permissions for new files,
-			// so we'd have to hack around this ...
-			if (($this->_file_new = ! file_exists($this->_file_path.$session_id)) === TRUE)
-			{
-				if (($this->_file_handle = fopen($this->_file_path.$session_id, 'w+b')) === FALSE)
-				{
-					log_message('error', "Session: File '".$this->_file_path.$session_id."' doesn't exist and cannot be created.");
-					return $this->_failure;
-				}
-			}
-			elseif (($this->_file_handle = fopen($this->_file_path.$session_id, 'r+b')) === FALSE)
+			$this->_file_new = ! file_exists($this->_file_path.$session_id);
+
+			if (($this->_file_handle = fopen($this->_file_path.$session_id, 'c+b')) === FALSE)
 			{
 				log_message('error', "Session: Unable to open file '".$this->_file_path.$session_id."'.");
 				return $this->_failure;
diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php
index 056f6de..a8cf752 100644
--- a/system/libraries/Upload.php
+++ b/system/libraries/Upload.php
@@ -1086,13 +1086,7 @@
 		if (memory_get_usage() && ($memory_limit = ini_get('memory_limit')))
 		{
 			$memory_limit *= 1024 * 1024;
-
-			// There was a bug/behavioural change in PHP 5.2, where numbers over one million get output
-			// into scientific notation. number_format() ensures this number is an integer
-			// http://bugs.php.net/bug.php?id=43053
-
-			$memory_limit = number_format(ceil(filesize($file) + $memory_limit), 0, '.', '');
-
+			$memory_limit = (int) ceil(filesize($file) + $memory_limit);
 			ini_set('memory_limit', $memory_limit); // When an integer is used, the value is measured in bytes. - PHP.net
 		}
 
@@ -1207,28 +1201,21 @@
 		// We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii)
 		$regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/';
 
-		/* Fileinfo extension - most reliable method
-		 *
-		 * Unfortunately, prior to PHP 5.3 - it's only available as a PECL extension and the
-		 * more convenient FILEINFO_MIME_TYPE flag doesn't exist.
-		 */
-		if (function_exists('finfo_file'))
+		// Fileinfo extension - most reliable method
+		$finfo = @finfo_open(FILEINFO_MIME);
+		if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system
 		{
-			$finfo = @finfo_open(FILEINFO_MIME);
-			if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system
-			{
-				$mime = @finfo_file($finfo, $file['tmp_name']);
-				finfo_close($finfo);
+			$mime = @finfo_file($finfo, $file['tmp_name']);
+			finfo_close($finfo);
 
-				/* According to the comments section of the PHP manual page,
-				 * it is possible that this function returns an empty string
-				 * for some files (e.g. if they don't exist in the magic MIME database)
-				 */
-				if (is_string($mime) && preg_match($regexp, $mime, $matches))
-				{
-					$this->file_type = $matches[1];
-					return;
-				}
+			/* According to the comments section of the PHP manual page,
+			 * it is possible that this function returns an empty string
+			 * for some files (e.g. if they don't exist in the magic MIME database)
+			 */
+			if (is_string($mime) && preg_match($regexp, $mime, $matches))
+			{
+				$this->file_type = $matches[1];
+				return;
 			}
 		}
 
diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php
index 8240d23..b4e56bd 100644
--- a/tests/Bootstrap.php
+++ b/tests/Bootstrap.php
@@ -1,10 +1,4 @@
 <?php
-// For some reason, setting this fixes the 5.2 tests but breaks the 5.3 ones ...
-if (version_compare(PHP_VERSION, '5.3.0', '<'))
-{
-	ini_set('memory_limit', '128M');
-}
-
 // Errors on full!
 ini_set('display_errors', 1);
 error_reporting(E_ALL | E_STRICT);
diff --git a/tests/codeigniter/core/Log_test.php b/tests/codeigniter/core/Log_test.php
index 2dd9d90..d5a6fcb 100644
--- a/tests/codeigniter/core/Log_test.php
+++ b/tests/codeigniter/core/Log_test.php
@@ -3,11 +3,6 @@
 
 	public function test_configuration()
 	{
-		if ( ! is_php('5.3'))
-		{
-			return $this->markTestSkipped("PHP 5.2 doesn't have ReflectionProperty::setAccessible() and can't run this test");
-		}
-
 		$path       = new ReflectionProperty('CI_Log', '_log_path');
 		$path->setAccessible(TRUE);
 		$threshold  = new ReflectionProperty('CI_Log', '_threshold');
@@ -54,11 +49,6 @@
 
 	public function test_format_line()
 	{
-		if ( ! is_php('5.3'))
-		{
-			return $this->markTestSkipped("PHP 5.2 doesn't have ReflectionProperty::setAccessible() and can't run this test");
-		}
-
 		$this->ci_set_config('log_path', '');
 		$this->ci_set_config('log_threshold', 0);
 		$instance = new CI_Log();
diff --git a/tests/codeigniter/core/compat/password_test.php b/tests/codeigniter/core/compat/password_test.php
index 8a507d1..77f5eba 100644
--- a/tests/codeigniter/core/compat/password_test.php
+++ b/tests/codeigniter/core/compat/password_test.php
@@ -8,11 +8,6 @@
 		{
 			return $this->markTestSkipped('ext/standard/password is available on PHP 5.5');
 		}
-		elseif ( ! is_php('5.3.7'))
-		{
-			$this->assertFalse(defined('PASSWORD_BCRYPT'));
-			return $this->markTestSkipped("PHP versions prior to 5.3.7 don't have the '2y' Blowfish version");
-		}
 		// defined as of HHVM 2.3.0, which is also when they introduce password_*() as well
 		// Note: Do NOT move this after the CRYPT_BLOWFISH check
 		elseif (defined('HHVM_VERSION'))
diff --git a/tests/codeigniter/core/compat/standard_test.php b/tests/codeigniter/core/compat/standard_test.php
index 4077a5c..a984601 100644
--- a/tests/codeigniter/core/compat/standard_test.php
+++ b/tests/codeigniter/core/compat/standard_test.php
@@ -15,13 +15,6 @@
 		{
 			$this->assertTrue(function_exists('hex2bin'));
 		}
-
-		if ( ! is_php('5.3'))
-		{
-			$this->assertTrue(function_exists('array_replace'));
-			$this->assertTrue(function_exists('array_replace_recursive'));
-			$this->assertTrue(function_exists('quoted_printable_encode'));
-		}
 	}
 
 	// ------------------------------------------------------------------------
@@ -356,193 +349,6 @@
 		$this->assertEquals('', hex2bin(''));
 		$this->assertEquals("\x01\x02\x03", hex2bin(new FooHex()));
 	}
-
-	// ------------------------------------------------------------------------
-
-	/**
-	 * array_replace(), array_replace_recursive() tests
-	 *
-	 * Borrowed from PHP's own tests
-	 *
-	 * @depends	test_bootstrap
-	 */
-	public function test_array_replace_recursive()
-	{
-		if (is_php('5.3'))
-		{
-			return $this->markTestSkipped('array_replace() and array_replace_recursive() are already available on PHP 5.3');
-		}
-
-		$array1 = array(
-			0 => 'dontclobber',
-			'1' => 'unclobbered',
-			'test2' => 0.0,
-			'test3' => array(
-				'testarray2' => TRUE,
-				1 => array(
-					'testsubarray1' => 'dontclobber2',
-					'testsubarray2' => 'dontclobber3'
-				)
-			)
-		);
-
-		$array2 = array(
-			1 => 'clobbered',
-			'test3' => array(
-				'testarray2' => FALSE
-			),
-			'test4' => array(
-				'clobbered3' => array(0, 1, 2)
-			)
-		);
-
-		// array_replace()
-		$this->assertEquals(
-			array(
-				0 => 'dontclobber',
-				1 => 'clobbered',
-				'test2' => 0.0,
-				'test3' => array(
-					'testarray2' => FALSE
-				),
-				'test4' => array(
-					'clobbered3' => array(0, 1, 2)
-				)
-			),
-			array_replace($array1, $array2)
-		);
-
-		// array_replace_recursive()
-		$this->assertEquals(
-			array(
-				0 => 'dontclobber',
-				1 => 'clobbered',
-				'test2' => 0.0,
-				'test3' => array(
-					'testarray2' => FALSE,
-					1 => array(
-						'testsubarray1' => 'dontclobber2',
-						'testsubarray2' => 'dontclobber3'
-					)
-				),
-				'test4' => array(
-					'clobbered3' => array(0, 1, 2)
-				)
-			),
-			array_replace_recursive($array1, $array2)
-		);
-	}
-
-	// ------------------------------------------------------------------------
-
-	/**
-	 * quoted_printable_encode() tests
-	 *
-	 * Borrowed from PHP's own tests
-	 *
-	 * @depends	test_bootstrap
-	 */
-	public function test_quoted_printable_encode()
-	{
-		if (is_php('5.3'))
-		{
-			return $this->markTestSkipped('quoted_printable_encode() is already available on PHP 5.3');
-		}
-
-		// These are actually imap_8bit() tests:
-		$this->assertEquals("String with CRLF at end=20\r\n", quoted_printable_encode("String with CRLF at end \r\n"));
-		// ext/imap/tests/imap_8bit_basic.phpt says for this line:
-		// NB this appears to be a bug in cclient; a space at end of string should be encoded as =20
-		$this->assertEquals("String with space at end ", quoted_printable_encode("String with space at end "));
-		$this->assertEquals("String with tabs =09=09 in middle", quoted_printable_encode("String with tabs \t\t in middle"));
-		$this->assertEquals("String with tab at end =09", quoted_printable_encode("String with tab at end \t"));
-		$this->assertEquals("=00=01=02=03=04=FE=FF=0A=0D", quoted_printable_encode("\x00\x01\x02\x03\x04\xfe\xff\x0a\x0d"));
-
-		if (function_exists('imap_8bit'))
-		{
-			return $this->markTestIncomplete('imap_8bit() exists and is called as an alias for quoted_printable_encode()');
-		}
-
-		// And these are from ext/standard/tests/strings/quoted_printable_encode_002.phpt:
-		$this->assertEquals(
-			"=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n"
-			."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n"
-			."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n"
-			."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n"
-			."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n"
-			."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n"
-			."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=\r\n"
-			."=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00",
-			$d = quoted_printable_encode(str_repeat("\0", 200))
-		);
-		$this->assertEquals(str_repeat("\x0", 200), quoted_printable_decode($d));
-		$this->assertEquals(
-			"=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=\r\n"
-			."=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=\r\n"
-			."=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=\r\n"
-			."=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=\r\n"
-			."=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=\r\n"
-			."=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=\r\n"
-			."=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=\r\n"
-			."=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=\r\n"
-			."=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =\r\n"
-			."=D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=\r\n"
-			."=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=\r\n"
-			."=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=\r\n"
-			."=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=\r\n"
-			."=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=\r\n"
-			."=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=\r\n"
-			."=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=\r\n"
-			."=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=\r\n"
-			."=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=\r\n"
-			."=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=\r\n"
-			."=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =\r\n"
-			."=D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=\r\n"
-			."=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=\r\n"
-			."=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=\r\n"
-			."=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=\r\n"
-			."=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=\r\n"
-			."=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=\r\n"
-			."=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=\r\n"
-			."=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=\r\n"
-			."=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=\r\n"
-			."=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=\r\n"
-			."=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=\r\n"
-			."=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =\r\n"
-			."=D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=\r\n"
-			."=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=\r\n"
-			."=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=\r\n"
-			."=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=\r\n"
-			."=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=\r\n"
-			."=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=\r\n"
-			."=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=\r\n"
-			."=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=\r\n"
-			."=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=\r\n"
-			."=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=\r\n"
-			."=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =\r\n"
-			."=D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=\r\n"
-			."=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=\r\n"
-			."=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=\r\n"
-			."=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=\r\n"
-			."=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=\r\n"
-			."=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=\r\n"
-			."=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=\r\n"
-			."=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=\r\n"
-			."=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=\r\n"
-			."=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=\r\n"
-			."=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=\r\n"
-			."=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =\r\n"
-			."=D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=\r\n"
-			."=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=\r\n"
-			."=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=\r\n"
-			."=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=8E=D0=BD=D0=B8=\r\n"
-			."=D0=BA=D0=BE=D0=B4=D0=B5=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0 =D0=B2 =D1=\r\n"
-			."=8E=D0=BD=D0=B8=D0=BA=D0=BE=D0=B4=D0=B5",
-			$d = quoted_printable_encode(str_repeat('строка в юникоде', 50))
-		);
-		$this->assertEquals(str_repeat('строка в юникоде', 50), quoted_printable_decode($d));
-		$this->assertEquals('this is a foo', quoted_printable_encode(new FooObject()));
-	}
 }
 
 // ------------------------------------------------------------------------
@@ -570,11 +376,3 @@
 		return '010203';
 	}
 }
-
-class FooObject
-{
-	public function __toString()
-	{
-		return 'this is a foo';
-	}
-}
\ No newline at end of file
diff --git a/tests/codeigniter/libraries/Upload_test.php b/tests/codeigniter/libraries/Upload_test.php
index 4fbc11e..820bd37 100644
--- a/tests/codeigniter/libraries/Upload_test.php
+++ b/tests/codeigniter/libraries/Upload_test.php
@@ -25,14 +25,10 @@
 			)
 		);
 
-		// ReflectionProperty::setAccessible() is not available in PHP 5.2.x
-		if (is_php('5.3'))
-		{
-			$reflection = new ReflectionClass($upload);
-			$reflection = $reflection->getProperty('_file_name_override');
-			$reflection->setAccessible(TRUE);
-			$this->assertEquals('foo', $reflection->getValue($upload));
-		}
+		$reflection = new ReflectionClass($upload);
+		$reflection = $reflection->getProperty('_file_name_override');
+		$reflection->setAccessible(TRUE);
+		$this->assertEquals('foo', $reflection->getValue($upload));
 
 		$this->assertTrue($upload->file_ext_tolower);
 
diff --git a/user_guide_src/source/general/compatibility_functions.rst b/user_guide_src/source/general/compatibility_functions.rst
index 434b098..936f2a2 100644
--- a/user_guide_src/source/general/compatibility_functions.rst
+++ b/user_guide_src/source/general/compatibility_functions.rst
@@ -222,29 +222,6 @@
 	For more information, please refer to the `PHP manual for
 	array_column() <http://php.net/array_column>`_.
 
-.. php:function:: array_replace(array $array1[, ...])
-
-	:param	array	$array1: Array in which to replace elements
-	:param	array	...: Array (or multiple ones) from which to extract elements
-	:returns:	Modified array
-	:rtype:	array
-
-	For more information, please refer to the `PHP manual for
-	array_replace() <http://php.net/array_replace>`_.
-
-.. php:function:: array_replace_recursive(array $array1[, ...])
-
-	:param	array	$array1: Array in which to replace elements
-	:param	array	...: Array (or multiple ones) from which to extract elements
-	:returns:	Modified array
-	:rtype:	array
-
-	For more information, please refer to the `PHP manual for
-	array_replace_recursive() <http://php.net/array_replace_recursive>`_.
-
-	.. important:: Only PHP's native function can detect endless recursion.
-		Unless you are running PHP 5.3+, be careful with references!
-
 .. php:function:: hex2bin($data)
 
 	:param	array	$data: Hexadecimal representation of data
@@ -253,12 +230,3 @@
 
 	For more information, please refer to the `PHP manual for hex2bin()
 	<http://php.net/hex2bin>`_.
-
-.. php:function:: quoted_printable_encode($str)
-
-	:param	string	$str: Input string
-	:returns:	8bit-encoded string
-	:rtype:	string
-
-	For more information, please refer to the `PHP manual for
-	quoted_printable_encode() <http://php.net/quoted_printable_encode>`_.
\ No newline at end of file
diff --git a/user_guide_src/source/general/hooks.rst b/user_guide_src/source/general/hooks.rst
index ffe3fef..6cc3407 100644
--- a/user_guide_src/source/general/hooks.rst
+++ b/user_guide_src/source/general/hooks.rst
@@ -56,8 +56,8 @@
 -  **params** Any parameters you wish to pass to your script. This item
    is optional.
 
-If you're running PHP 5.3+, you can also use lambda/anoymous functions
-(or closures) as hooks, with a simpler syntax::
+You can also use lambda/anoymous functions (or closures) as hooks, with
+a simpler syntax::
 
 	$hook['post_controller'] = function()
 	{
diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst
index 5153680..b53a85d 100644
--- a/user_guide_src/source/general/routing.rst
+++ b/user_guide_src/source/general/routing.rst
@@ -133,8 +133,8 @@
 Callbacks
 =========
 
-If you are using PHP >= 5.3 you can use callbacks in place of the normal
-routing rules to process the back-references. Example::
+You can also use callbacks in place of the normal routing rules to process
+the back-references. Example::
 
 	$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
 	{
diff --git a/user_guide_src/source/general/security.rst b/user_guide_src/source/general/security.rst
index 8afdaca..744a2c9 100644
--- a/user_guide_src/source/general/security.rst
+++ b/user_guide_src/source/general/security.rst
@@ -133,12 +133,7 @@
    in PHP's own `Password Hashing <http://php.net/password>`_ functions.
 
    Please use them, even if you're not running PHP 5.5+, CodeIgniter
-   provides them for you as long as you're running at least PHP version
-   5.3.7 (and if you don't meet that requirement - please, upgrade).
-
-   If you're one of the really unlucky people who can't even upgrade to a
-   more recent PHP version, use `hash_pbkdf() <http://php.net/hash_pbkdf2>`,
-   which we also provide in our compatibility layer.
+   provides them for you.
 
 -  DO NOT ever display or send a password in plain-text format!
 
diff --git a/user_guide_src/source/libraries/encryption.rst b/user_guide_src/source/libraries/encryption.rst
index cac4b79..377e650 100644
--- a/user_guide_src/source/libraries/encryption.rst
+++ b/user_guide_src/source/libraries/encryption.rst
@@ -13,7 +13,7 @@
 You must meet one of the following dependencies in order to use this
 library:
 
-- `OpenSSL <http://php.net/openssl>`_ (and PHP 5.3.3)
+- `OpenSSL <http://php.net/openssl>`_
 - `MCrypt <http://php.net/mcrypt>`_ (and `MCRYPT_DEV_URANDOM` availability)
 
 If neither of the above dependencies is met, we simply cannot offer
diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst
index b03b544..5b9a742 100644
--- a/user_guide_src/source/libraries/form_validation.rst
+++ b/user_guide_src/source/libraries/form_validation.rst
@@ -495,8 +495,7 @@
 
 This is just an example of course, and callbacks aren't limited to models.
 You can use any object/method that accepts the field value as its' first
-parameter. Or if you're running PHP 5.3+, you can also use an anonymous
-function::
+parameter. You can also use an anonymous function::
 
 	$this->form_validation->set_rules(
 		'username', 'Username',
@@ -522,7 +521,7 @@
 		)
 	);
 
-Anonymous function (PHP 5.3+) version::
+Anonymous function version::
 
 	$this->form_validation->set_rules(
 		'username', 'Username',