diff --git a/growler.cabal b/growler.cabal
--- a/growler.cabal
+++ b/growler.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                growler
-version:             0.3.0
+version:             0.3.1
 synopsis:            A revised version of the scotty library that attempts to be simpler and more performant.
 description:         Growler provides a very similar interface to scotty, with slight tweaks for performance and a few feature tradeoffs. Growler provides the ability to abort actions (handlers) with arbitrary responses, not just in the event of redirects or raising errors. Growler avoids coercing everything into lazy Text values and reading the whole request body into memory. It also eliminates the ability to abort the handler and have another handler handle the request instead (Scotty's 'next' function).
 		     .
@@ -20,8 +20,7 @@
 cabal-version:       >=1.10
 
 library
-  exposed-modules:   Web.Growler
-  other-modules:     Web.Growler.Handler, Web.Growler.Parsable, Web.Growler.Router, Web.Growler.Types
+  exposed-modules:   Web.Growler, Web.Growler.Handler, Web.Growler.Parsable, Web.Growler.Router, Web.Growler.Types
   other-extensions:    OverloadedStrings, FlexibleContexts, FlexibleInstances, LambdaCase, RankNTypes, ScopedTypeVariables
   build-depends:       base >=4.7 && <4.8, lens >=4.4 && <5, mtl >=2.2 && <3, bytestring >=0.10 && <0.20, http-types >=0.8 && <1, text >=1.1 && <2, wai >=3.0 && <4, wai-extra >=3.0 && <4, regex-compat >=0.95 && <1, blaze-builder >=0.3 && <0.7, unordered-containers >=0.2 && <0.9, aeson, vector, case-insensitive, warp, pipes, pipes-aeson, pipes-wai, monad-control, either >= 4.3.1, transformers-base
   hs-source-dirs:      src
diff --git a/src/Web/Growler.hs b/src/Web/Growler.hs
--- a/src/Web/Growler.hs
+++ b/src/Web/Growler.hs
@@ -21,6 +21,8 @@
 , capture
 , function
 , literal
+, mount
+, handlerHook
 -- ** Handlers
 , Handler
 , HandlerT
@@ -94,5 +96,5 @@
   where
     processResponse (m, pat, respond) = case route r m pat of
       Nothing -> Nothing
-      Just ps -> Just $ runHandler initialState (Just pat) r ps respond
+      Just (patRep, ps) -> Just $ runHandler initialState (Just patRep) r ps respond
 
diff --git a/src/Web/Growler/Handler.hs b/src/Web/Growler/Handler.hs
--- a/src/Web/Growler/Handler.hs
+++ b/src/Web/Growler/Handler.hs
@@ -108,10 +108,10 @@
   setHeader hContentType "text/html; charset=utf-8"
   raw $ TL.encodeUtf8 t
 
-routePattern :: Monad m => HandlerT m (Maybe RoutePattern)
+routePattern :: Monad m => HandlerT m (Maybe T.Text)
 routePattern = HandlerT $ view $ L.matchedPattern
 
-runHandler :: Monad m => ResponseState -> Maybe RoutePattern -> Request -> [Param] -> HandlerT m a -> m (Either ResponseState (a, ResponseState))
+runHandler :: Monad m => ResponseState -> Maybe T.Text -> Request -> [Param] -> HandlerT m a -> m (Either ResponseState (a, ResponseState))
 runHandler rs pat rq ps m = runEitherT $ do
   (dx, r, ()) <- runRWST (fromHandler m) (RequestState pat (qsParams ++ ps) rq) rs
   return (dx, r)
diff --git a/src/Web/Growler/Router.hs b/src/Web/Growler/Router.hs
--- a/src/Web/Growler/Router.hs
+++ b/src/Web/Growler/Router.hs
@@ -19,6 +19,7 @@
     , mount
     , literal
     , route
+    , handlerHook
     , RoutePattern(..)
     ) where
 
@@ -107,16 +108,16 @@
 addRoute :: (MonadIO m) => StdMethod -> RoutePattern -> HandlerT m () -> GrowlerT m ()
 addRoute method pat action = GrowlerT $ modify ((method, pat, action):)
 
-route :: Request -> StdMethod -> RoutePattern -> Maybe [Param]
+route :: Request -> StdMethod -> RoutePattern -> Maybe (T.Text, [Param])
 route req method pat = if Right method == parseMethod (requestMethod req)
   then matchRoute pat req
   else Nothing
 
-matchRoute :: RoutePattern -> Request -> Maybe [Param]
-matchRoute (RoutePattern p) req = let (_, _, rps) = p req in case rps of
+matchRoute :: RoutePattern -> Request -> Maybe (T.Text, [Param])
+matchRoute (RoutePattern p) req = let (pat, _, rps) = p req in case rps of
   Fail -> Nothing
   Partial _ -> Nothing
-  Complete ps -> Just ps
+  Complete ps -> Just (pat, ps)
 
 -- Pretend we are at the top level.
 parseEncodedParams :: B.ByteString -> [Param]
diff --git a/src/Web/Growler/Types.hs b/src/Web/Growler/Types.hs
--- a/src/Web/Growler/Types.hs
+++ b/src/Web/Growler/Types.hs
@@ -44,7 +44,9 @@
       Fail -> Fail
       Partial rps -> Partial (lps <> rps)
       Complete rps -> Complete (lps <> rps)
-    Complete lps -> Fail
+    Complete lps -> case r of
+      Complete rps -> Complete (lps <> rps)
+      _ -> Fail
   mempty = Partial []
 
 instance Monoid RoutePattern where
@@ -57,7 +59,12 @@
   fromString = capture . T.pack
 
 path :: Request -> T.Text
-path = T.cons '/' . T.intercalate "/" . pathInfo
+path r = case front of
+  Just ('/', _) -> full
+  _ -> T.cons '/' full
+  where
+    full = T.intercalate "/" $ pathInfo r
+    front = T.uncons full
 
 capture :: Text -> RoutePattern
 capture pat = RoutePattern process
@@ -84,7 +91,7 @@
                 | RawSource !(IO C.ByteString -> (C.ByteString -> IO ()) -> IO ()) !Response
 
 data RequestState = RequestState
-  { requestMatchedPattern :: Maybe RoutePattern
+  { requestMatchedPattern :: Maybe T.Text
   , requestParams         :: [Param]
   , requestRequest        :: Request
   }
