diff --git a/firefly.cabal b/firefly.cabal
--- a/firefly.cabal
+++ b/firefly.cabal
@@ -1,5 +1,5 @@
 name:                firefly
-version:             0.1.1.0
+version:             0.2.0.0
 synopsis:            A simple HTTP server framework
 -- description:
 homepage:            https://github.com/ChrisPenner/firefly#readme
diff --git a/src/Web/Firefly.hs b/src/Web/Firefly.hs
--- a/src/Web/Firefly.hs
+++ b/src/Web/Firefly.hs
@@ -9,9 +9,11 @@
   -- * Types
   , App
   , Handler
+  , HeaderMap
 
   -- * Handlers
   , route
+  , runHandler
 
   -- * Requests
   , getPath
@@ -34,6 +36,7 @@
   -- * Responses
   , ToResponse(..)
   , respond
+  , respondWith
 
   -- ** Wrapper Types
   , Json(..)
diff --git a/src/Web/Firefly/Handler.hs b/src/Web/Firefly/Handler.hs
--- a/src/Web/Firefly/Handler.hs
+++ b/src/Web/Firefly/Handler.hs
@@ -28,7 +28,7 @@
 -- >   route "/" indexHandler
 -- >   route "/hello.*" helloHandler
 -- >   route "/helloHarry" helloHarryHandler
-route :: (ToResponse r) => Pattern -> Handler r -> App ()
+route :: ToResponse r => Pattern -> Handler r -> App ()
 route routePath handler = do
   doesPathMatch <- pathMatches routePath
-  when doesPathMatch (handler >>= respond . toResponse)
+  when doesPathMatch $ respondWith handler
diff --git a/src/Web/Firefly/Response.hs b/src/Web/Firefly/Response.hs
--- a/src/Web/Firefly/Response.hs
+++ b/src/Web/Firefly/Response.hs
@@ -1,10 +1,12 @@
 {-# language FlexibleInstances #-}
 {-# language OverloadedStrings #-}
 {-# language UndecidableInstances #-}
+{-# language RankNTypes #-}
 module Web.Firefly.Response
   ( ToResponse(..)
   , Json(..)
   , respond
+  , respondWith
   ) where
 
 import Data.Function ((&))
@@ -69,3 +71,8 @@
 -- in the App or Handler Monads will not be run.
 respond :: ToResponse r => r -> App ()
 respond =  throwError . toResponse
+
+-- | Use a given handler to respond to the request. 
+-- Any handlers following this will not run.
+respondWith :: ToResponse r => Handler r -> App ()
+respondWith handler = runHandler handler >>= respond
diff --git a/src/Web/Firefly/Types.hs b/src/Web/Firefly/Types.hs
--- a/src/Web/Firefly/Types.hs
+++ b/src/Web/Firefly/Types.hs
@@ -1,8 +1,9 @@
+{-# language NamedFieldPuns #-}
 module Web.Firefly.Types where
 
 import Control.Monad.Reader
 import Control.Monad.Except
-import Network.Wai as W
+import qualified Network.Wai as W
 import qualified Data.Text as T
 import qualified Data.Map as M
 import qualified Data.CaseInsensitive as CI
@@ -13,7 +14,11 @@
 
 -- | Handler is an alias for 'App', currently provided for semantic reasons,
 -- but the two may diverge in the future.
-type Handler a = App a
+type Handler a = ReaderT ReqContext IO  a
+
+-- | Runs a handler within an App WITHOUT rendering the response
+runHandler :: Handler r -> App r
+runHandler handler = ask >>= liftIO . runReaderT handler
 
 -- | A regex pattern for route matching.
 type Pattern = T.Text
