diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[Wai-Routes](https://ajnsit.github.io/wai-routes) [![Hackage](https://img.shields.io/badge/hackage-v0.9.3-brightgreen.svg)](https://hackage.haskell.org/package/wai-routes) [![Hackage-Deps](https://img.shields.io/hackage-deps/v/wai-routes.svg)](http://packdeps.haskellers.com/feed?needle=wai-routes) [![Build Status](https://img.shields.io/travis/ajnsit/wai-routes.svg)](https://travis-ci.org/ajnsit/wai-routes) [![Join the chat at https://gitter.im/ajnsit/wai-routes](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%A3-blue.svg)](https://gitter.im/ajnsit/wai-routes)
+[Wai-Routes](https://ajnsit.github.io/wai-routes) [![Hackage](https://img.shields.io/badge/hackage-v0.9.4-brightgreen.svg)](https://hackage.haskell.org/package/wai-routes) [![Hackage-Deps](https://img.shields.io/hackage-deps/v/wai-routes.svg)](http://packdeps.haskellers.com/feed?needle=wai-routes) [![Build Status](https://img.shields.io/travis/ajnsit/wai-routes.svg)](https://travis-ci.org/ajnsit/wai-routes) [![Join the chat at https://gitter.im/ajnsit/wai-routes](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%A3-blue.svg)](https://gitter.im/ajnsit/wai-routes)
 ====================================
 
 Wai-routes is a micro web framework for Haskell that focuses on typesafe URLs.
@@ -39,35 +39,39 @@
 
 Wai-routes comes with several examples in the `examples/` directory. New examples are being added regularly.
 
-**Example 1. Hello World** - [Code](examples/hello-world)
+**Example 1. Hello World** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/hello-world/src)
 
 A simple hello-world web app with two interlinked pages. This provides the simplest example of using routing and linking between pages with typesafe routes.
 
-**Example 2. Hello World with Subsites** - [Code](examples/subsites)
+**Example 2. Hello World with Subsites** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/subsites/src)
 
 Similar functionality as the first example, but uses a hello world subsites to provide the hello world functionality. A subsite is an independently developed site that can be embedded into a parent site as long as the parent site satisfies a particular api contract. It's easy to swap out subsites for different functionality as long as the api contract remains constant.
 
-**Example 3. Using Blaze-HTML to generate HTML** - [Code](examples/blaze-html)
+**Example 3. Using Blaze-HTML to generate HTML** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/blaze-html/src)
 
 A simple example of how to generate HTML using blaze-html combinators in your handlers.
 
-**Example 4. Using Shakespearean Templates (hamlet, cassius, lucius, julius) to generate HTML/CSS/JS** - [Code](examples/shakespeare)
+**Example 4. Using Shakespearean Templates (hamlet, cassius, lucius, julius) to generate HTML/CSS/JS** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/shakespeare/src)
 
 A simple example of how to generate HTML/CSS/JS using shakespearean templates. You can use both external and inline templates.
 
-**Example 5. Building a JSON REST Service** - [Code](examples/rest-json)
+**Example 5. Building a JSON REST Service** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/rest-json/src)
 
 Provides a simple example of how to build JSON REST services with wai-routes. Uses Aeson for JSON conversion. Note that this example just demonstrates the web facing side of the application. It doesn't permanently persist data, and is also not threadsafe. You must use a more robust data storage mechanism in production! An example of doing this with a Relational DB adapter (like persistent) is in the works.
 
-**Example 6. Stream a response** - [Code](examples/streaming-response)
+**Example 6. Stream a response** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/streaming-response/src)
 
 Wai has had the ability to stream content for a long time. Now wai-routes exposes this functionality with the `stream` function. This example shows how to stream content in a handler. Note that most browsers using default settings will not show content as it is being streamed. You can use "curl" to observe the effect of streaming. E.g. - `curl localhost:8080` will dump the data as it is being streamed from the server.
 
-**Example 7. Kitchen sink** - [Code](examples/kitchen)
+**Example 7. Kitchen sink** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/kitchen/src)
 
 *Work in progress*. Demonstrates all major features in wai-routes.
 
+**Example 8. Unrouted** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/unrouted/src)
 
+Demonstrates "unrouted" applications. These require no TH, or GHC extensions. Basically allow you to sequence request handlers in a cascade, with each handler having the full functionality of HandlerM monad available to them. Each handler also has access to untyped (but parsed) route information. Unrouted handlers are freely mixable with typesafe routing.
+
+
 Deployment
 ==========
 
@@ -105,6 +109,7 @@
 Changelog
 =========
 
+* 0.9.4 : Wai-3.2 compatibility. Added functions to manipulate wai "vault". Minor changes to internal types.
 * 0.9.3 : Added `content` and `whenContent`. Allow http-types-0.9.
 * 0.9.2 : Fix failing test in release tarball. (Only tests changed).
 * 0.9.1 : Greatly simplified subsites (simply use mkRouteSub). Added 'mountedAppHandler' to integrate external full wai apps.
diff --git a/src/Network/Wai/Middleware/Routes.hs b/src/Network/Wai/Middleware/Routes.hs
--- a/src/Network/Wai/Middleware/Routes.hs
+++ b/src/Network/Wai/Middleware/Routes.hs
@@ -100,6 +100,9 @@
     , setCookie              -- | Add a cookie to the response
     , getCookie              -- | Get a cookie from the request
     , getCookies             -- | Get all cookies from the request
+    , reqVault               -- | Access the vault from the request
+    , lookupVault            -- | Lookup a key in the request vault
+    , updateVault            -- | Update the request vault
 
     , module Network.HTTP.Types.Status
     , module Network.Wai.Middleware.RequestLogger
diff --git a/src/Network/Wai/Middleware/Routes/DefaultRoute.hs b/src/Network/Wai/Middleware/Routes/DefaultRoute.hs
--- a/src/Network/Wai/Middleware/Routes/DefaultRoute.hs
+++ b/src/Network/Wai/Middleware/Routes/DefaultRoute.hs
@@ -23,11 +23,11 @@
 import Network.Wai.Middleware.Routes.Routes
 
 -- Default master datatype, which is used for "unrouted" handlers
-data DefaultMaster = DefaultMaster
+data DefaultMaster = DefaultMaster deriving (Eq, Show, Ord)
 -- This makes it possible to define handlers without routing stuff
 instance RenderRoute DefaultMaster where
   -- The associated route simply contains all path information
-  data Route DefaultMaster = DefaultRoute ([Text],[(Text, Text)]) deriving Eq
+  data Route DefaultMaster = DefaultRoute ([Text],[(Text, Text)]) deriving (Eq, Show, Ord)
   renderRoute (DefaultRoute r) = r
 instance ParseRoute DefaultMaster where
   parseRoute = Just . DefaultRoute
diff --git a/src/Network/Wai/Middleware/Routes/Handler.hs b/src/Network/Wai/Middleware/Routes/Handler.hs
--- a/src/Network/Wai/Middleware/Routes/Handler.hs
+++ b/src/Network/Wai/Middleware/Routes/Handler.hs
@@ -60,12 +60,15 @@
     , setCookie              -- | Add a cookie to the response
     , getCookie              -- | Get a cookie from the request
     , getCookies             -- | Get all cookies from the request
+    , reqVault               -- | Access the vault from the request
+    , lookupVault            -- | Lookup a key in the request vault
+    , updateVault            -- | Update the request vault
     )
     where
 
 import Network.Wai (Application, Request, Response, responseRaw, responseFile, responseBuilder, responseStream, pathInfo, queryString, requestBody, StreamingBody, requestHeaders, FilePart)
 #if MIN_VERSION_wai(3,0,1)
-import Network.Wai (strictRequestBody)
+import Network.Wai (strictRequestBody, vault)
 #endif
 import Network.Wai.Middleware.Routes.Routes (Env(..), RequestData, HandlerS, waiReq, currentRoute, runNext, ResponseHandler, showRoute, showRouteQuery, readRoute, readQueryString)
 import Network.Wai.Middleware.Routes.Class (Route, RenderRoute, ParseRoute, RouteAttrs(..))
@@ -102,6 +105,8 @@
 import Data.Default.Class (def)
 import Data.List (intersect)
 
+import qualified Data.Vault.Lazy as V
+
 import qualified Network.Wai.Parse as P
 
 -- | The internal implementation of the HandlerM monad
@@ -284,6 +289,25 @@
 -- PRIVATE
 _reqHeaderBS :: CI ByteString -> HandlerM sub master (Maybe ByteString)
 _reqHeaderBS name = liftM (lookup name) reqHeaders
+
+-- VAULT
+-- | Access the vault
+reqVault :: HandlerM sub master V.Vault
+reqVault = liftM vault request
+
+-- Lookup a value in the request vault
+lookupVault :: V.Key a -> HandlerM sub master (Maybe a)
+lookupVault k = liftM (V.lookup k) reqVault
+
+-- Update the request vault
+-- For example: `updateVault (V.insert key val)`
+updateVault :: (V.Vault -> V.Vault) -> HandlerM sub master ()
+updateVault f = modify $ \st ->
+  let rd = getRequestData st
+      r = waiReq rd
+      v = f $ vault r
+  in st { getRequestData = rd { waiReq = r { vault = v } } }
+-- END VAULT
 
 -- | Get all request headers as raw case-insensitive bytestrings
 reqHeaders :: HandlerM sub master RequestHeaders
diff --git a/src/Network/Wai/Middleware/Routes/Monad.hs b/src/Network/Wai/Middleware/Routes/Monad.hs
--- a/src/Network/Wai/Middleware/Routes/Monad.hs
+++ b/src/Network/Wai/Middleware/Routes/Monad.hs
@@ -56,7 +56,7 @@
 middleware m = liftF $ M m ()
 
 -- | Add a wai-routes handler
-handler :: Handler DefaultMaster -> RouteM ()
+handler :: HandlerS DefaultMaster DefaultMaster -> RouteM ()
 handler h = middleware $ customRouteDispatch dispatcher' DefaultMaster
   where
     dispatcher' env req = runHandler h env (Just $ DefaultRoute $ getRoute req) req
diff --git a/src/Network/Wai/Middleware/Routes/Routes.hs b/src/Network/Wai/Middleware/Routes/Routes.hs
--- a/src/Network/Wai/Middleware/Routes/Routes.hs
+++ b/src/Network/Wai/Middleware/Routes/Routes.hs
@@ -134,20 +134,20 @@
                   , rinst
                   ]
 
+-- | Generates a 'Routable' instance and dispatch function
+mkRouteDispatch :: String -> [ResourceTree String] -> Q [Dec]
+mkRouteDispatch typName routes = do
+  let typ = parseType typName
+  disp <- mkRouteDispatchClause routes
+  return [InstanceD []
+          (ConT ''Routable `AppT` typ `AppT` typ)
+          [FunD (mkName "dispatcher") [disp]]]
+
 -- | Same as mkRouteDispatch but for subsites
 mkRouteSubDispatch :: String -> String -> [ResourceTree a] -> Q [Dec]
 mkRouteSubDispatch typName constraint routes = do
   let typ = parseType typName
-  disp  <- mkDispatchClause MkDispatchSettings
-        { mdsRunHandler    = [| runHandler    |]
-        , mdsSubDispatcher = [| subDispatcher |]
-        , mdsGetPathInfo   = [| getPathInfo   |]
-        , mdsMethod        = [| getReqMethod  |]
-        , mdsSetPathInfo   = [| setPathInfo   |]
-        , mds404           = [| app404        |]
-        , mds405           = [| app405        |]
-        , mdsGetHandler    = defaultGetHandler
-        } routes
+  disp <- mkRouteDispatchClause routes
   master <- newName "master"
   -- We don't simply use parseType for GHC 7.8 (TH-2.9) compatibility
   -- ParseType only works on Type (not Pred)
@@ -166,23 +166,20 @@
       ClassP className [VarT master]
 #endif
 
--- | Generates a 'Routable' instance and dispatch function
-mkRouteDispatch :: String -> [ResourceTree String] -> Q [Dec]
-mkRouteDispatch typName routes = do
-  let typ = parseType typName
-  disp <- mkDispatchClause MkDispatchSettings
-        { mdsRunHandler    = [| runHandler    |]
-        , mdsSubDispatcher = [| subDispatcher |]
-        , mdsGetPathInfo   = [| getPathInfo   |]
-        , mdsMethod        = [| getReqMethod  |]
-        , mdsSetPathInfo   = [| setPathInfo   |]
-        , mds404           = [| app404        |]
-        , mds405           = [| app405        |]
-        , mdsGetHandler    = defaultGetHandler
-        } routes
-  return [InstanceD []
-          (ConT ''Routable `AppT` typ `AppT` typ)
-          [FunD (mkName "dispatcher") [disp]]]
+-- Helper that creates the dispatch clause
+mkRouteDispatchClause :: [ResourceTree a] -> Q Clause
+mkRouteDispatchClause routes =
+  mkDispatchClause MkDispatchSettings
+    { mdsRunHandler    = [| runHandler    |]
+    , mdsSubDispatcher = [| subDispatcher |]
+    , mdsGetPathInfo   = [| getPathInfo   |]
+    , mdsMethod        = [| getReqMethod  |]
+    , mdsSetPathInfo   = [| setPathInfo   |]
+    , mds404           = [| app404        |]
+    , mds405           = [| app405        |]
+    , mdsGetHandler    = defaultGetHandler
+    } routes
+
 
 -- | Generates all the things needed for efficient routing.
 -- Including your application's `Route` datatype,
diff --git a/wai-routes.cabal b/wai-routes.cabal
--- a/wai-routes.cabal
+++ b/wai-routes.cabal
@@ -1,5 +1,5 @@
 name               : wai-routes
-version            : 0.9.3
+version            : 0.9.4
 cabal-version      : >=1.18
 build-type         : Simple
 license            : MIT
@@ -21,12 +21,12 @@
 
 source-repository this
     type     : git
-    location : http://github.com/ajnsit/wai-routes/tree/v0.9.3
-    tag      : v0.9.3
+    location : http://github.com/ajnsit/wai-routes/tree/v0.9.4
+    tag      : v0.9.4
 
 library
     build-depends      : base               >= 4.7  && < 4.9
-                       , wai                >= 3.0  && < 3.1
+                       , wai                >= 3.0  && < 3.3
                        , wai-extra          >= 3.0  && < 3.1
                        , wai-app-static     >= 3.0  && < 3.2
                        , text               >= 1.2  && < 1.3
@@ -45,6 +45,7 @@
                        , filepath           >= 1.3  && < 1.5
                        , cookie             >= 0.4  && < 0.5
                        , data-default-class >= 0.0  && < 0.1
+                       , vault              >= 0.3  && < 0.4
     exposed-modules    : Network.Wai.Middleware.Routes
     other-modules      : Network.Wai.Middleware.Routes.Parse
                          Network.Wai.Middleware.Routes.Overlap
@@ -75,7 +76,7 @@
   GHC-options      : -Wall -threaded -fno-warn-orphans
 
   build-depends    : base           >= 4.7 && < 4.9
-                   , wai            >= 3.0 && < 3.1
+                   , wai            >= 3.0 && < 3.3
                    , aeson          >= 0.8 && < 0.11
                    , hspec          >= 2.1 && < 2.3
                    , hspec-wai      >= 0.6 && < 0.7
