diff --git a/core/HaskellWorks/Polysemy/System/IO.hs b/core/HaskellWorks/Polysemy/System/IO.hs
--- a/core/HaskellWorks/Polysemy/System/IO.hs
+++ b/core/HaskellWorks/Polysemy/System/IO.hs
@@ -1,12 +1,12 @@
 module HaskellWorks.Polysemy.System.IO
-  ( IO.BufferMode,
+  ( IO.BufferMode(..),
     IO.FilePath,
     IO.Handle,
     IO.HandlePosn,
     IO.IO,
-    IO.IOMode,
-    IO.NewlineMode,
-    IO.SeekMode,
+    IO.IOMode(..),
+    IO.NewlineMode(..),
+    IO.SeekMode(..),
     IO.TextEncoding,
 
     String,
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog.hs
@@ -4,7 +4,7 @@
 
     Hedgehog,
 
-    hedgehogToIntegrationFinal,
+    hedgehogToPropertyFinal,
     interpretDataLogHedgehog,
 
     leftFail,
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Effect/Hedgehog.hs
@@ -12,7 +12,9 @@
   , failWith
   , failWithCustom
 
-  , hedgehogToIntegrationFinal
+  , hedgehogToMonadTestFinal
+  , hedgehogToPropertyFinal
+  , hedgehogToTestFinal
 
   ) where
 
@@ -22,6 +24,8 @@
 import qualified Hedgehog                                                as H
 import qualified Hedgehog.Internal.Property                              as H
 
+import qualified Control.Monad.Catch                                     as IO
+import qualified Control.Monad.IO.Class                                  as IO
 import qualified HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog.Internal as I
 import           Polysemy
 import           Polysemy.Final
@@ -61,11 +65,14 @@
 
 makeSem ''Hedgehog
 
-hedgehogToIntegrationFinal :: ()
-  => Member (Final (H.PropertyT IO)) r
+hedgehogToMonadTestFinal :: ()
+  => IO.MonadIO m
+  => IO.MonadCatch m
+  => H.MonadTest m
+  => Member (Final m) r
   => Sem (Hedgehog ': r) a
   -> Sem r a
-hedgehogToIntegrationFinal = interpretFinal \case
+hedgehogToMonadTestFinal = interpretFinal \case
   AssertEquals a b ->
     liftS $ a H.=== b
   Eval a ->
@@ -81,3 +88,15 @@
     liftS $ I.failWithCustom cs mdiff msg
   WriteLog logValue ->
     liftS $ H.writeLog logValue
+
+hedgehogToPropertyFinal :: ()
+  => Member (Final (H.PropertyT IO)) r
+  => Sem (Hedgehog ': r) a
+  -> Sem r a
+hedgehogToPropertyFinal = hedgehogToMonadTestFinal
+
+hedgehogToTestFinal :: ()
+  => Member (Final (H.TestT IO)) r
+  => Sem (Hedgehog ': r) a
+  -> Sem r a
+hedgehogToTestFinal = hedgehogToMonadTestFinal
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs
--- a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs
@@ -16,6 +16,7 @@
 import           Polysemy
 import           Polysemy.Embed
 import           Polysemy.Log
+import           Polysemy.Resource
 import           Polysemy.Time.Interpreter.Ghc
 
 propertyOnce :: ()
@@ -27,6 +28,7 @@
         , Hedgehog
         , Embed IO
         , Embed (H.PropertyT IO)
+        , Resource
         , Final (H.PropertyT IO)
         ] ()
   -> H.Property
@@ -36,9 +38,10 @@
   & interpretDataLogHedgehog formatLogEntry getLogEntryCallStack
   & interpretDataLogHedgehog id (const GHC.callStack)
   & interpretTimeGhc
-  & hedgehogToIntegrationFinal
+  & hedgehogToPropertyFinal
   & runEmbedded liftIO
   & embedToFinal @(H.PropertyT IO)
+  & runResource
   & runFinal
   & H.property
   & H.withTests 1
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Test.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Test.hs
new file mode 100644
--- /dev/null
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Test.hs
@@ -0,0 +1,48 @@
+module HaskellWorks.Polysemy.Hedgehog.Test
+  ( Property
+  , test
+
+  ) where
+
+import qualified GHC.Stack                                      as GHC
+import           HaskellWorks.Polysemy.Prelude
+
+import           Hedgehog                                       (Property)
+import qualified Hedgehog                                       as H
+
+import           Control.Monad.IO.Class                         (liftIO)
+import           HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog
+import           HaskellWorks.Polysemy.Hedgehog.Effect.Log
+import           Polysemy
+import           Polysemy.Embed
+import           Polysemy.Log
+import           Polysemy.Resource
+import           Polysemy.Time.Interpreter.Ghc
+
+test :: ()
+  => Sem
+        [ Log
+        , DataLog (LogEntry LogMessage)
+        , DataLog Text
+        , GhcTime
+        , Hedgehog
+        , Embed IO
+        , Embed (H.TestT IO)
+        , Resource
+        , Final (H.TestT IO)
+        ] ()
+  -> H.Property
+test f = f
+  & interpretLogDataLog
+  & setLogLevel (Just Info)
+  & interpretDataLogHedgehog formatLogEntry getLogEntryCallStack
+  & interpretDataLogHedgehog id (const GHC.callStack)
+  & interpretTimeGhc
+  & hedgehogToTestFinal
+  & runEmbedded liftIO
+  & embedToFinal @(H.TestT IO)
+  & runResource
+  & runFinal
+  & H.test
+  & H.property
+  & H.withTests 1
diff --git a/hw-polysemy.cabal b/hw-polysemy.cabal
--- a/hw-polysemy.cabal
+++ b/hw-polysemy.cabal
@@ -1,6 +1,6 @@
 cabal-version:          3.4
 name:                   hw-polysemy
-version:                0.2.4.2
+version:                0.2.5.0
 synopsis:               Opinionated polysemy library
 description:            Opinionated polysemy library.
 license:                Apache-2.0
@@ -25,6 +25,7 @@
 common contravariant              { build-depends: contravariant                               < 1.6    }
 common Diff                       { build-depends: Diff                                        < 0.6    }
 common directory                  { build-depends: directory                                   < 1.4    }
+common exceptions                 { build-depends: exceptions                                  < 0.11   }
 common filepath                   { build-depends: filepath                                    < 1.6    }
 common generic-lens               { build-depends: generic-lens                                < 2.3    }
 common ghc-prim                   { build-depends: ghc-prim                                    < 0.12   }
@@ -151,6 +152,7 @@
                         bytestring,
                         contravariant,
                         Diff,
+                        exceptions,
                         filepath,
                         generic-lens,
                         ghc-prim,
@@ -174,6 +176,7 @@
                         HaskellWorks.Polysemy.Hedgehog.Process
                         HaskellWorks.Polysemy.Hedgehog.Process.Internal
                         HaskellWorks.Polysemy.Hedgehog.Property
+                        HaskellWorks.Polysemy.Hedgehog.Test
                         HaskellWorks.Polysemy.Hedgehog.Workspace
                         HaskellWorks.Polysemy.Hedgehog.Workspace.Types
   hs-source-dirs:       hedgehog
@@ -215,6 +218,7 @@
                         HaskellWorks.Polysemy.Hedgehog.Process,
                         HaskellWorks.Polysemy.Hedgehog.Process.Internal,
                         HaskellWorks.Polysemy.Hedgehog.Property,
+                        HaskellWorks.Polysemy.Hedgehog.Test,
                         HaskellWorks.Polysemy.Hedgehog.Workspace,
                         HaskellWorks.Polysemy.Prelude,
                         HaskellWorks.Polysemy.String,
diff --git a/test/HaskellWorks/Polysemy/HedgehogSpec.hs b/test/HaskellWorks/Polysemy/HedgehogSpec.hs
--- a/test/HaskellWorks/Polysemy/HedgehogSpec.hs
+++ b/test/HaskellWorks/Polysemy/HedgehogSpec.hs
@@ -3,19 +3,37 @@
 {-# LANGUAGE TypeApplications #-}
 
 module HaskellWorks.Polysemy.HedgehogSpec
-  ( hprop_example
+  ( hprop_example_property
+  , hprop_example_test
   ) where
 
 import           HaskellWorks.Polysemy.Prelude
 
-import qualified Data.List                       as L
-import qualified HaskellWorks.Polysemy.Data.Text as T
+import qualified Data.List                           as L
+import qualified HaskellWorks.Polysemy.Data.Text     as T
 import           HaskellWorks.Polysemy.Hedgehog
+import           HaskellWorks.Polysemy.Hedgehog.Test
 
 default (String)
 
-hprop_example :: Property
-hprop_example = propertyOnce $ do
+hprop_example_property :: Property
+hprop_example_property = propertyOnce $ do
+  let projectRoot = "."
+
+  contents <- T.readFile (projectRoot </> "LICENSE")
+    & trapFail @IOException
+
+  line1 <- T.lines contents
+    & L.dropWhile T.null
+    & requireHead
+    & jotShowM
+
+  let text = T.strip line1
+
+  text === "Apache License"
+
+hprop_example_test :: Property
+hprop_example_test = test $ do
   let projectRoot = "."
 
   contents <- T.readFile (projectRoot </> "LICENSE")
