diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 3.0.20.0
+
+* runSessionWith (runSession variant that gives access to ClientState) [#629](https://github.com/yesodweb/wai/pull/629)
+
 ## 3.0.19.1
 
 * All loggers follow the autoFlush setting [#604](https://github.com/yesodweb/wai/pull/604)
diff --git a/Network/Wai/Middleware/MethodOverride.hs b/Network/Wai/Middleware/MethodOverride.hs
--- a/Network/Wai/Middleware/MethodOverride.hs
+++ b/Network/Wai/Middleware/MethodOverride.hs
@@ -5,12 +5,11 @@
 import Network.Wai
 import Control.Monad (join)
 
--- | Allows overriding of the HTTP request method via the _method query string
--- parameter.
+-- | Overriding of HTTP request method via `_method` query string parameter.
 --
--- This middleware only applies when the initial request method is POST. This
--- allow submitting of normal HTML forms, without worries of semantics
--- mismatches in the HTTP spec.
+-- This middleware only applies when the initial request method is POST.
+-- Allows submitting of normal HTML forms, without worries of semantic
+-- mismatches with the HTTP spec.
 methodOverride :: Middleware
 methodOverride app req =
     app req'
diff --git a/Network/Wai/Test.hs b/Network/Wai/Test.hs
--- a/Network/Wai/Test.hs
+++ b/Network/Wai/Test.hs
@@ -39,15 +39,15 @@
 
 import Network.Wai
 import Network.Wai.Internal (ResponseReceived (ResponseReceived))
+import Network.Wai.Test.Internal
 import Control.Monad.IO.Class (liftIO)
 import Control.Monad.Trans.Class (lift)
 import qualified Control.Monad.Trans.State as ST
-import Control.Monad.Trans.Reader (ReaderT, runReaderT, ask)
+import Control.Monad.Trans.Reader (runReaderT, ask)
 import Control.Monad (unless)
 import Control.DeepSeq (deepseq)
 import Control.Exception (throwIO, Exception)
 import Data.Typeable (Typeable)
-import Data.Map (Map)
 import qualified Data.Map as Map
 import qualified Web.Cookie as Cookie
 import Data.ByteString (ByteString)
@@ -64,20 +64,9 @@
 import Data.IORef
 import Data.Time.Clock (getCurrentTime)
 
-type Session = ReaderT Application (ST.StateT ClientState IO)
-
 -- |
 --
 -- Since 3.0.6
-type ClientCookies = Map ByteString Cookie.SetCookie
-
-data ClientState = ClientState
-    { clientCookies :: ClientCookies
-    }
-
--- |
---
--- Since 3.0.6
 getClientCookies :: Session ClientCookies
 getClientCookies = clientCookies <$> lift ST.get
 
@@ -104,9 +93,7 @@
   modifyClientCookies
     (Map.delete cookieName)
 
-initState :: ClientState
-initState = ClientState Map.empty
-
+-- | See also: 'runSessionWith'.
 runSession :: Session a -> Application -> IO a
 runSession session app = ST.evalStateT (runReaderT session app) initState
 
@@ -337,4 +324,3 @@
           ]
         )
         (Cookie.setCookieValue c == cookieValue)
-
diff --git a/Network/Wai/Test/Internal.hs b/Network/Wai/Test/Internal.hs
new file mode 100644
--- /dev/null
+++ b/Network/Wai/Test/Internal.hs
@@ -0,0 +1,35 @@
+module Network.Wai.Test.Internal where
+
+import Network.Wai
+import qualified Control.Monad.Trans.State as ST
+import Control.Monad.Trans.Reader (ReaderT, runReaderT)
+import Data.Map (Map)
+import qualified Data.Map as Map
+import qualified Web.Cookie as Cookie
+import Data.ByteString (ByteString)
+
+type Session = ReaderT Application (ST.StateT ClientState IO)
+
+-- |
+--
+-- Since 3.0.6
+type ClientCookies = Map ByteString Cookie.SetCookie
+
+data ClientState = ClientState
+    { clientCookies :: ClientCookies
+    }
+
+-- |
+--
+-- Since 3.0.20.0
+initState :: ClientState
+initState = ClientState Map.empty
+
+-- | Like 'runSession', but if allows you to hand in cookies and get
+-- the updated cookies back.  One use case for this is writing tests
+-- that address the application under test alternatingly through rest
+-- api and through db handle.
+--
+-- Since 3.0.20.0
+runSessionWith :: ClientState -> Session a -> Application -> IO (a, ClientState)
+runSessionWith st session app = ST.runStateT (runReaderT session app) st
diff --git a/wai-extra.cabal b/wai-extra.cabal
--- a/wai-extra.cabal
+++ b/wai-extra.cabal
@@ -1,5 +1,5 @@
 Name:                wai-extra
-Version:             3.0.19.1
+Version:             3.0.20.0
 Synopsis:            Provides some basic WAI handlers and middleware.
 description:
   Provides basic WAI handler and middleware functionality:
@@ -148,6 +148,7 @@
                      Network.Wai.Request
                      Network.Wai.UrlMap
                      Network.Wai.Test
+                     Network.Wai.Test.Internal
                      Network.Wai.EventSource
                      Network.Wai.EventSource.EventStream
   other-modules:     Network.Wai.Middleware.RequestLogger.Internal
