diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+0.12
+-----------------------------------------------------------------------------
+- Update `wai-route` dependency and change `prepare` and `route` to work on
+  `Tree (App m)` instead of `[(ByteString, App m)]`.
+
 0.11.1
 -----------------------------------------------------------------------------
 - Bugfix release
diff --git a/src/Network/Wai/Routing/Route.hs b/src/Network/Wai/Routing/Route.hs
--- a/src/Network/Wai/Routing/Route.hs
+++ b/src/Network/Wai/Routing/Route.hs
@@ -29,6 +29,16 @@
     , patch
     , Renderer
     , renderer
+
+      -- * Re-exports
+    , Tree
+    , Tree.toList
+    , Tree.foldTree
+    , Tree.mapTree
+
+    , Tree.Payload
+    , Tree.path
+    , Tree.value
     ) where
 
 import Control.Applicative hiding (Const)
@@ -44,6 +54,7 @@
 import Network.Wai
 import Network.Wai.Predicate
 import Network.Wai.Predicate.Request
+import Network.Wai.Route.Tree (Tree)
 import Network.Wai.Routing.Request
 
 import qualified Data.ByteString.Char8  as C
@@ -184,11 +195,11 @@
 -- | Routes requests to handlers based on predicated route declarations.
 -- Note that @route (prepare ...)@ behaves like a WAI 'Application' generalised to
 -- arbitrary monads.
-route :: Monad m => [(ByteString, App m)] -> Request -> Continue m -> m ResponseReceived
-route rm = let !tr = Tree.fromList rm in \rq k ->
+route :: Monad m => Tree (App m) -> Request -> Continue m -> m ResponseReceived
+route tr rq k =
     case Tree.lookup tr (Tree.segments $ rawPathInfo rq) of
-        Just (f, v) -> f (fromReq v (fromRequest rq)) k
-        Nothing     -> k notFound
+        Just  e -> Tree.value e (fromReq (Tree.captured $ Tree.captures e) (fromRequest rq)) k
+        Nothing -> k notFound
   where
     notFound = responseLBS status404 [] Lazy.empty
 
@@ -212,10 +223,11 @@
 {-# INLINE continue #-}
 
 -- | Run the 'Routes' monad and return the handlers per path.
-prepare :: Monad m => Routes a m b -> [(ByteString, App m)]
+prepare :: Monad m => Routes a m b -> Tree (App m)
 prepare (Routes rr) =
-    let s = execState rr zero in
-    map (\g -> (_path (L.head g), select (renderfn s) g)) (normalise (routes s))
+    let s = execState rr zero
+        r = normalise (routes s)
+    in Tree.fromList $ map (\g -> (_path (L.head g), select (renderfn s) g)) r
 
 -- | Group routes by path.
 normalise :: [Route a m] -> [[Route a m]]
diff --git a/test/Tests/Wai/Route.hs b/test/Tests/Wai/Route.hs
--- a/test/Tests/Wai/Route.hs
+++ b/test/Tests/Wai/Route.hs
@@ -22,6 +22,7 @@
 import Test.Tasty.HUnit
 import Tests.Wai.Util
 
+import qualified Data.Set             as Set
 import qualified Data.ByteString.Lazy as Lazy
 
 type ApplicationM m = Request -> (Response -> m ResponseReceived) -> m ResponseReceived
@@ -38,8 +39,11 @@
     let routes = prepare sitemap
 
     [7,6,5,4,3,2,1,0] @=? map routeMeta (examine sitemap)
-    ["/a", "/b", "/c", "/d", "/e", "/f", "/g", "/h"] @=? map fst routes
 
+    let ra = Set.fromList ["/a", "/b", "/c", "/d", "/e", "/f", "/g", "/h"]
+    let rb = foldTree (\p a -> path p `Set.insert` a) Set.empty routes
+    ra @=? rb
+
     let handler = route routes
 
     testEndpointA handler
@@ -231,7 +235,7 @@
 
 testMedia :: IO ()
 testMedia = do
-    let [(_, h)] = prepare sitemapMedia
+    let [h] = map value . toList $ prepare sitemapMedia
     expectMedia "application/json;q=0.3, application/x-thrift;q=0.7" "application/x-thrift" h
     expectMedia "application/json;q=0.7, application/x-thrift;q=0.3" "application/json" h
 
@@ -257,7 +261,7 @@
 
 testErrorRenderer :: IO ()
 testErrorRenderer = do
-    let [(_, h)] = prepare sitemapErrorRenderer
+    let [h] = map value . toList $ prepare sitemapErrorRenderer
     let rq = defaultRequest { rawPathInfo = "/error" }
     rs <- apply h $ fromReq [] . fromRequest $ rq
     status400               @=? responseStatus rs
diff --git a/wai-routing.cabal b/wai-routing.cabal
--- a/wai-routing.cabal
+++ b/wai-routing.cabal
@@ -1,5 +1,5 @@
 name:                wai-routing
-version:             0.11.1
+version:             0.12
 synopsis:            Declarative routing for WAI.
 license:             OtherLicense
 license-file:        LICENSE
@@ -86,7 +86,7 @@
       , transformers          >= 0.3   && < 0.5
       , wai                   >= 3.0   && < 4.0
       , wai-predicates        == 0.8.*
-      , wai-route             == 0.2.*
+      , wai-route             == 0.3.*
 
 test-suite wai-routing-tests
     type:             exitcode-stdio-1.0
@@ -106,6 +106,7 @@
       , bytestring
       , bytestring-conversion
       , case-insensitive
+      , containers
       , http-types
       , tasty                 >= 0.8
       , tasty-hunit           >= 0.9
