diff --git a/blog-example/Example/Blog.hs b/blog-example/Example/Blog.hs
--- a/blog-example/Example/Blog.hs
+++ b/blog-example/Example/Blog.hs
@@ -1,6 +1,8 @@
+{-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DerivingStrategies #-}
 {-# LANGUAGE EmptyDataDecls #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
diff --git a/blog-example/Example/BlogSpec.hs b/blog-example/Example/BlogSpec.hs
--- a/blog-example/Example/BlogSpec.hs
+++ b/blog-example/Example/BlogSpec.hs
@@ -7,22 +7,13 @@
 import Database.Persist (selectList)
 import Database.Persist.Sql (Entity (..), SqlPersistT)
 import Example.Blog
-import Network.HTTP.Client as HTTP
 import Test.QuickCheck
 import Test.Syd
 import Test.Syd.Persistent.Sqlite
 import Test.Syd.Yesod
 
--- | A 'SetupFunc' to provide the App and clean up around it.
---
--- The 'HTTP.Manager' here is the one that is used for doing the test requests.
--- It is setup only once and it is shared accross tests for performance reasons.
--- If you also need an 'HTTP.Manager' in your 'App', then you can use it in your 'SetupFunc' here
--- but in this case we don't need it.
-appSetupFunc :: HTTP.Manager -> SetupFunc () App
-appSetupFunc _ = do
-  pool <- connectionPoolSetupFunc migrateThoughts
-  pure $ App {appConnectionPool = pool}
+appSupplier :: (App -> IO r) -> IO r
+appSupplier func = withConnectionPool migrateThoughts $ \pool -> func App {appConnectionPool = pool}
 
 testDB :: SqlPersistT IO a -> YesodClientM App a
 testDB func = do
@@ -30,7 +21,7 @@
   liftIO $ runSqlPool func pool
 
 spec :: Spec
-spec = yesodSpecWithSiteSetupFunc appSetupFunc $ do
+spec = yesodSpecWithSiteSupplier appSupplier $ do
   -- A simple read-only test: We can request the home page succesfully.
   yit "can GET the home page" $ do
     get HomeR
diff --git a/src/Test/Syd/Yesod.hs b/src/Test/Syd/Yesod.hs
--- a/src/Test/Syd/Yesod.hs
+++ b/src/Test/Syd/Yesod.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
 
 -- | Testing a yesod site.
 --
@@ -23,6 +23,7 @@
     -- ** Core
     YesodSpec,
     YesodClient (..),
+    YesodClientState (..),
     YesodClientM (..),
     runYesodClientM,
     YesodExample,
@@ -72,7 +73,12 @@
     locationShouldBe,
     bodyContains,
 
-    -- ** Reexports
+    -- * Just to be sure we didn't forget any exports
+    module Test.Syd.Yesod.Client,
+    module Test.Syd.Yesod.Def,
+    module Test.Syd.Yesod.Request,
+
+    -- * Reexports
     module HTTP,
   )
 where
diff --git a/src/Test/Syd/Yesod/Client.hs b/src/Test/Syd/Yesod/Client.hs
--- a/src/Test/Syd/Yesod/Client.hs
+++ b/src/Test/Syd/Yesod/Client.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -17,9 +18,12 @@
 import qualified Data.ByteString.Lazy as LB
 import Data.Text (Text)
 import qualified Data.Text as T
+import GHC.Generics (Generic)
 import Network.HTTP.Client as HTTP
 import Network.HTTP.Types as HTTP
+import Network.Socket (PortNumber)
 import Test.Syd
+import Test.Syd.Wai.Client (lastRequestResponseContext)
 import Yesod.Core as Yesod
 
 -- | A client environment to call a Yesod app.
@@ -29,19 +33,21 @@
     -- | The 'HTTP.Manager' to make the requests
     yesodClientManager :: !HTTP.Manager,
     -- | The port that the site is running on, using @warp@
-    yesodClientSitePort :: !Int
+    yesodClientSitePort :: !PortNumber
   }
+  deriving (Generic)
 
 -- | The state that is maintained throughout a 'YesodClientM'
-data YesodClientState site = YesodClientState
+data YesodClientState = YesodClientState
   { -- | The last request and response pair
     yesodClientStateLast :: !(Maybe (Request, Response LB.ByteString)),
     -- | The cookies to pass along
     yesodClientStateCookies :: !CookieJar
   }
+  deriving (Generic)
 
 -- | The starting point of the 'YesodClientState site' of a 'YesodClientM site'
-initYesodClientState :: YesodClientState site
+initYesodClientState :: YesodClientState
 initYesodClientState =
   YesodClientState
     { yesodClientStateLast = Nothing,
@@ -52,7 +58,7 @@
 --
 -- This has access to a 'YesodClient site'.
 newtype YesodClientM site a = YesodClientM
-  { unYesodClientM :: StateT (YesodClientState site) (ReaderT (YesodClient site) IO) a
+  { unYesodClientM :: StateT YesodClientState (ReaderT (YesodClient site) IO) a
   }
   deriving
     ( Functor,
@@ -60,7 +66,7 @@
       Monad,
       MonadIO,
       MonadReader (YesodClient site),
-      MonadState (YesodClientState site),
+      MonadState YesodClientState,
       MonadFail,
       MonadThrow
     )
@@ -113,13 +119,7 @@
       YesodClientM $ do
         s <- get
         c <- ask
-        let ctx =
-              unlines
-                [ "last request:",
-                  ppShow req,
-                  "full response:",
-                  ppShow resp
-                ]
+        let ctx = lastRequestResponseContext req resp
         (r, s') <- liftIO $ context ctx $ runReaderT (runStateT func s) c
         put s'
         pure r
diff --git a/src/Test/Syd/Yesod/Def.hs b/src/Test/Syd/Yesod/Def.hs
--- a/src/Test/Syd/Yesod/Def.hs
+++ b/src/Test/Syd/Yesod/Def.hs
@@ -21,7 +21,7 @@
   )
 where
 
-import GHC.Stack
+import GHC.Stack (HasCallStack)
 import Network.HTTP.Client as HTTP
 import Test.Syd
 import Test.Syd.Wai
@@ -134,23 +134,35 @@
 yesodSpecWithSiteSupplier func = yesodSpecWithSiteSupplierWith (\f () -> func f)
 
 -- | Using a function that supplies a 'site', based on an inner resource, run a test suite.
-yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> (a -> IO r)) -> YesodSpec site -> SpecWith a
-yesodSpecWithSiteSupplierWith func = yesodSpecWithSiteSetupFunc $ \_ -> SetupFunc func
+yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> (inner -> IO r)) -> YesodSpec site -> SpecWith inner
+yesodSpecWithSiteSupplierWith func = managerSpec . yesodSpecWithSiteSetupFunc' (\_ inner -> SetupFunc $ \takeSite -> func takeSite inner)
 
 -- | Using a function that supplies a 'site', using a 'SetupFunc'
-yesodSpecWithSiteSetupFunc :: YesodDispatch site => (HTTP.Manager -> SetupFunc a site) -> TestDef (HTTP.Manager ': l) (YesodClient site) -> TestDef l a
-yesodSpecWithSiteSetupFunc setupFunc = managerSpec . yesodSpecWithSiteSetupFunc' setupFunc
+--
+-- This function assumed that you've already set up the 'HTTP.Manager' beforehand using something like 'managerSpec'.
+yesodSpecWithSiteSetupFunc ::
+  YesodDispatch site =>
+  (HTTP.Manager -> SetupFunc site) ->
+  TestDef (HTTP.Manager ': outers) (YesodClient site) ->
+  TestDef (HTTP.Manager ': outers) ()
+yesodSpecWithSiteSetupFunc setupFunc = yesodSpecWithSiteSetupFunc' $ \man () -> setupFunc man
 
--- | Using a function that supplies a 'site', using a 'SetupFunc' but without setting up the 'HTTP.Manager' beforehand.
+-- | Using a function that supplies a 'site', using a 'SetupFunc'.
 --
 -- This function assumed that you've already set up the 'HTTP.Manager' beforehand using something like 'managerSpec'.
-yesodSpecWithSiteSetupFunc' :: YesodDispatch site => (HTTP.Manager -> SetupFunc a site) -> TestDef (HTTP.Manager ': l) (YesodClient site) -> TestDef (HTTP.Manager ': l) a
-yesodSpecWithSiteSetupFunc' setupFunc = setupAroundWith' (\man -> setupFunc man `connectSetupFunc` yesodClientSetupFunc man)
+yesodSpecWithSiteSetupFunc' ::
+  YesodDispatch site =>
+  (HTTP.Manager -> inner -> SetupFunc site) ->
+  TestDef (HTTP.Manager ': outers) (YesodClient site) ->
+  TestDef (HTTP.Manager ': outers) inner
+yesodSpecWithSiteSetupFunc' setupFunc = setupAroundWith' $ \man inner -> do
+  site <- setupFunc man inner
+  yesodClientSetupFunc man site
 
-yesodClientSetupFunc :: YesodDispatch site => HTTP.Manager -> SetupFunc site (YesodClient site)
-yesodClientSetupFunc man = wrapSetupFunc $ \site -> do
+yesodClientSetupFunc :: YesodDispatch site => HTTP.Manager -> site -> SetupFunc (YesodClient site)
+yesodClientSetupFunc man site = do
   application <- liftIO $ Yesod.toWaiAppPlain site
-  p <- unwrapSetupFunc applicationSetupFunc application
+  p <- applicationSetupFunc application
   let client =
         YesodClient
           { yesodClientManager = man,
@@ -175,7 +187,7 @@
   YesodSpec site
 yit s f = it s ((\cenv -> runYesodClientM cenv f) :: YesodClient site -> IO e)
 
--- | For backward compatibility
+-- | For compatibility with `yesod-test`
 --
 -- > ydescribe = describe
 ydescribe :: String -> YesodSpec site -> YesodSpec site
diff --git a/src/Test/Syd/Yesod/Request.hs b/src/Test/Syd/Yesod/Request.hs
--- a/src/Test/Syd/Yesod/Request.hs
+++ b/src/Test/Syd/Yesod/Request.hs
@@ -209,7 +209,7 @@
   let (req', cj') =
         insertCookiesIntoRequest
           ( req
-              { port = p,
+              { port = fromIntegral p, -- Safe because it is PortNumber -> Int
                 method = requestBuilderDataMethod,
                 requestHeaders =
                   concat
diff --git a/sydtest-yesod.cabal b/sydtest-yesod.cabal
--- a/sydtest-yesod.cabal
+++ b/sydtest-yesod.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           sydtest-yesod
-version:        0.0.0.0
+version:        0.1.0.0
 synopsis:       A yesod companion library for sydtest
 category:       Testing
 homepage:       https://github.com/NorfairKing/sydtest#readme
@@ -42,6 +42,7 @@
     , http-client
     , http-types
     , mtl
+    , network
     , pretty-show
     , sydtest
     , sydtest-wai
