Fix issue #658 (:any wildcard matching slashes)
diff --git a/system/core/Router.php b/system/core/Router.php
index efee243..a5e29f1 100644
--- a/system/core/Router.php
+++ b/system/core/Router.php
@@ -368,7 +368,7 @@
 		foreach ($this->routes as $key => $val)
 		{
 			// Convert wild-cards to RegEx
-			$key = str_replace(array(':any', ':num'), array('.+', '[0-9]+'), $key);
+			$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);
 
 			// Does the RegEx match?
 			if (preg_match('#^'.$key.'$#', $uri))
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index c7f72f6..5b3ca3e 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -399,6 +399,7 @@
 -  Fixed a bug (#1630) - :doc:`Form Helper <helpers/form_helper>` function ``set_value()`` didn't escape HTML entities.
 -  Fixed a bug (#142) - :doc:`Form Helper <helpers/form_helper>` function ``form_dropdown()`` didn't escape HTML entities in option values.
 -  Fixed a bug (#50) - :doc:`Session Library <libraries/sessions>` unnecessarily stripped slashed from serialized data, making it impossible to read objects in a namespace.
+-  Fixed a bug (#658) - :doc:`Routing <general/routing>` wildcard **:any** didn't work as advertised and matched multiple URI segments instead of all characters within a single segment.
 
 Version 2.1.3
 =============
diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst
index c039370..a6332c9 100644
--- a/user_guide_src/source/general/routing.rst
+++ b/user_guide_src/source/general/routing.rst
@@ -29,7 +29,7 @@
 Routing rules are defined in your application/config/routes.php file. In
 it you'll see an array called $route that permits you to specify your
 own routing criteria. Routes can either be specified using wildcards or
-Regular Expressions
+Regular Expressions.
 
 Wildcards
 =========
@@ -47,7 +47,11 @@
 You can match literal values or you can use two wildcard types:
 
 **(:num)** will match a segment containing only numbers.
-**(:any)** will match a segment containing any character.
+**(:any)** will match a segment containing any character (except for '/', which is the segment delimiter).
+
+.. note:: Wildcards are actually aliases for regular expressions, with
+	**:any** being translated to **[^/]+** and **:num** to **[0-9]+**,
+	respectively.
 
 .. note:: Routes will run in the order they are defined. Higher routes
 	will always take precedence over lower ones.
@@ -104,12 +108,28 @@
 
 A typical RegEx route might look something like this::
 
-	$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
+	$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
 
 In the above example, a URI similar to products/shirts/123 would instead
-call the shirts controller class and the id_123 function.
+call the shirts controller class and the id_123 method.
 
-You can also mix and match wildcards with regular expressions.
+With regular expressions, you can also catch a segment containing a
+forward slash ('/'), which would usually represent the delimiter between
+multiple segments.
+For example, if a user accesses a password protected area of your web
+application and you wish to be able to redirect them back to the same
+page after they log in, you may find this example useful::
+
+	$route['login/(.+)'] = 'auth/login/$1';
+
+That will call the auth controller class and its ``login()`` method,
+passing everything contained in the URI after *login/* as a parameter.
+
+For those of you who don't know regular expressions and want to learn
+more about them, `regular-expressions.info <http://www.regular-expressions.info/>`
+might be a good starting point.
+
+..note:: You can also mix and match wildcards with regular expressions.
 
 Reserved Routes
 ===============
diff --git a/user_guide_src/source/installation/upgrade_300.rst b/user_guide_src/source/installation/upgrade_300.rst
index dcdd6e3..6d99f46 100644
--- a/user_guide_src/source/installation/upgrade_300.rst
+++ b/user_guide_src/source/installation/upgrade_300.rst
@@ -52,11 +52,12 @@
 ***************************************
 
 Due to 3.0.0's renaming of Active Record to Query Builder, inside your `config/database.php`, you will
-need to rename the `$active_record` variable to `$query_builder`.
+need to rename the `$active_record` variable to `$query_builder`
+::
 
-    $active_group = 'default';
-    // $active_record = TRUE;
-    $query_builder = TRUE;
+	$active_group = 'default';
+	// $active_record = TRUE;
+	$query_builder = TRUE;
 
 *******************************
 Step 6: Move your errors folder
@@ -64,15 +65,36 @@
 
 In version 3.0.0, the errors folder has been moved from _application/errors* to _application/views/errors*.
 
+*******************************************************
+Step 7: Update your config/routes.php containing (:any)
+*******************************************************
+
+Historically, CodeIgniter has always provided the **:any** wildcard in routing,
+with the intention of providing a way to match any character **within** an URI segment.
+
+However, the **:any** wildcard is actually just an alias for a regular expression
+and used to be executed in that manner as **.+**. This is considered a bug, as it
+also matches the / (forward slash) character, which is the URI segment delimiter
+and that was never the intention. In CodeIgniter 3, the **:any** wildcard will now
+represent **[^/]+**, so that it will not match a forward slash.
+
+There are certainly many developers that have utilized this bug as an actual feature.
+If you're one of them and want to match a forward slash, please use the **.+**
+regular expression::
+
+	(.+)	// matches ANYTHING
+	(:any)	// matches any character, except for '/'
+
+
 ****************************************************************************
-Step 7: Check the calls to Array Helper's element() and elements() functions
+Step 8: Check the calls to Array Helper's element() and elements() functions
 ****************************************************************************
 
 The default return value of these functions, when the required elements
 don't exist, has been changed from FALSE to NULL.
 
 **********************************************************
-Step 8: Change usage of Email library with multiple emails
+Step 9: Change usage of Email library with multiple emails
 **********************************************************
 
 The :doc:`Email library <../libraries/email>` will automatically clear the
@@ -87,9 +109,9 @@
  	}
 
 
-***************************************************************
-Step 9: Remove usage of (previously) deprecated functionalities
-***************************************************************
+****************************************************************
+Step 10: Remove usage of (previously) deprecated functionalities
+****************************************************************
 
 In addition to the ``$autoload['core']`` configuration setting, there's a number of other functionalities
 that have been removed in CodeIgniter 3.0.0: