diff --git a/reroute.cabal b/reroute.cabal
--- a/reroute.cabal
+++ b/reroute.cabal
@@ -1,5 +1,5 @@
 name:                reroute
-version:             0.3.0.2
+version:             0.3.1.0
 synopsis:            abstract implementation of typed and untyped web routing
 description:         abstraction over how urls with/without parameters are mapped to their corresponding handlers
 homepage:            http://github.com/agrafix/reroute
diff --git a/src/Web/Routing/AbstractRouter.hs b/src/Web/Routing/AbstractRouter.hs
--- a/src/Web/Routing/AbstractRouter.hs
+++ b/src/Web/Routing/AbstractRouter.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE RankNTypes #-}
 module Web.Routing.AbstractRouter where
 
 import Control.Applicative
@@ -85,6 +86,20 @@
            childSt = parentSt
        (a, parentSt', middleware') <-
            lift $ runRWST subReg childBasePath childSt
+       put parentSt'
+       tell middleware'
+       return a
+
+swapMonad ::
+    (Monad n, Monad m, AbstractRouter r)
+    => (forall b. n b -> m b)
+    -> RegistryT r middleware reqTypes n a
+    -> RegistryT r middleware reqTypes m a
+swapMonad liftLower (RegistryT subReg) =
+    do parentSt <- get
+       basePath <- ask
+       (a, parentSt', middleware') <-
+           lift $ liftLower $ runRWST subReg basePath parentSt
        put parentSt'
        tell middleware'
        return a
