diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2020 Torsten Schmits
+Copyright (c) 2022 Torsten Schmits
 
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 following conditions are met:
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/lib/Polysemy/Test/Data/Hedgehog.hs b/lib/Polysemy/Test/Data/Hedgehog.hs
--- a/lib/Polysemy/Test/Data/Hedgehog.hs
+++ b/lib/Polysemy/Test/Data/Hedgehog.hs
@@ -1,8 +1,7 @@
-{-# options_haddock hide #-}
+{-# options_haddock prune #-}
 
+-- |Hedgehog Effect, Internal
 module Polysemy.Test.Data.Hedgehog where
-
-import Polysemy.Internal (send)
 
 import Hedgehog (TestT)
 
diff --git a/lib/Polysemy/Test/Data/Test.hs b/lib/Polysemy/Test/Data/Test.hs
--- a/lib/Polysemy/Test/Data/Test.hs
+++ b/lib/Polysemy/Test/Data/Test.hs
@@ -1,9 +1,7 @@
-{-# options_haddock hide #-}
-
+-- |Test Effect, Internal
 module Polysemy.Test.Data.Test where
 
 import Path (Abs, Dir, File, Path, Rel)
-import Polysemy (makeSem_)
 
 -- |Operations for interacting with fixtures and temp files in a test.
 data Test :: Effect where
@@ -29,7 +27,7 @@
   Path Rel Dir ->
   Sem r (Path Abs Dir)
 
--- |Write the specified lines of 'Text' to a file under the temp dir and return its absolute path.
+-- |Write the specified lines of 'Data.Text.Text' to a file under the temp dir and return its absolute path.
 tempFile ::
   ∀ r .
   Member Test r =>
diff --git a/lib/Polysemy/Test/Data/TestError.hs b/lib/Polysemy/Test/Data/TestError.hs
--- a/lib/Polysemy/Test/Data/TestError.hs
+++ b/lib/Polysemy/Test/Data/TestError.hs
@@ -1,5 +1,6 @@
-{-# options_haddock hide #-}
+{-# options_haddock prune #-}
 
+-- |TestError Newtype, Internal
 module Polysemy.Test.Data.TestError where
 
 -- |An error that occured in the test machinery.
diff --git a/lib/Polysemy/Test/Files.hs b/lib/Polysemy/Test/Files.hs
--- a/lib/Polysemy/Test/Files.hs
+++ b/lib/Polysemy/Test/Files.hs
@@ -1,5 +1,6 @@
-{-# options_haddock hide #-}
+{-# options_haddock prune #-}
 
+-- |File Utilities, Internal
 module Polysemy.Test.Files where
 
 import qualified Data.Text as Text
@@ -59,12 +60,12 @@
   Path Rel p ->
   Sem r (Path Abs p)
 fixturePath base path = do
-  return $ base </> [reldir|fixtures|] </> path
+  pure (base </> [reldir|fixtures|] </> path)
 
 fixture ::
   Member (Embed IO) r =>
   Path Abs Dir ->
   Path Rel File ->
   Sem r Text
-fixture base subPath = do
+fixture base subPath =
   readFile =<< fixturePath base subPath
diff --git a/lib/Polysemy/Test/Hedgehog.hs b/lib/Polysemy/Test/Hedgehog.hs
--- a/lib/Polysemy/Test/Hedgehog.hs
+++ b/lib/Polysemy/Test/Hedgehog.hs
@@ -1,11 +1,13 @@
-{-# options_haddock hide #-}
+{-# options_haddock prune #-}
 
+-- |Hedgehog interpreters, internal
 module Polysemy.Test.Hedgehog where
 
+import Control.Monad.Trans.Except (runExceptT)
 import qualified Control.Monad.Trans.Writer.Lazy as MTL
+import GHC.Stack (withFrozenCallStack)
 import qualified Hedgehog as Native
 import Hedgehog.Internal.Property (Failure, Journal, TestT (TestT), failWith)
-import Polysemy.Writer (Writer, tell)
 
 import qualified Polysemy.Test.Data.Hedgehog as Hedgehog
 import Polysemy.Test.Data.Hedgehog (Hedgehog, liftH)
diff --git a/lib/Polysemy/Test/Prelude.hs b/lib/Polysemy/Test/Prelude.hs
deleted file mode 100644
--- a/lib/Polysemy/Test/Prelude.hs
+++ /dev/null
@@ -1,231 +0,0 @@
-{-# options_haddock hide #-}
-{-# options_ghc -Wno-missing-import-lists #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Polysemy.Test.Prelude (
-  module Polysemy.Test.Prelude,
-  module Data.Either.Combinators,
-  module Data.Foldable,
-  module Data.Map.Strict,
-  module Debug.Trace,
-  module GHC.Err,
-  module Polysemy,
-  module Polysemy.AtomicState,
-  module Polysemy.Error,
-  module Polysemy.Reader,
-  module Polysemy.State,
-  module Relude,
-) where
-
-import Control.Exception (throwIO, try)
-import Data.Either.Combinators (mapLeft)
-import Data.Foldable (foldl, traverse_)
-import Data.Map.Strict (Map, lookup)
-import qualified Data.Text as Text
-import Debug.Trace (trace, traceShow)
-import GHC.Err (undefined)
-import GHC.IO.Unsafe (unsafePerformIO)
-import Polysemy (
-  Effect,
-  EffectRow,
-  Embed,
-  Final,
-  InterpreterFor,
-  Member,
-  Members,
-  Sem,
-  WithTactics,
-  embed,
-  embedToFinal,
-  interpret,
-  makeSem,
-  pureT,
-  raise,
-  raiseUnder,
-  raiseUnder2,
-  raiseUnder3,
-  reinterpret,
-  runFinal,
-  )
-import Polysemy.AtomicState (AtomicState, atomicGet, atomicGets, atomicModify', atomicPut, runAtomicStateTVar)
-import Polysemy.Error (Error, fromEither, mapError, note, runError, throw)
-import Polysemy.Reader (Reader)
-import Polysemy.State (State, evalState, get, gets, modify, modify', put, runState)
-import Relude hiding (
-  Reader,
-  State,
-  Type,
-  ask,
-  asks,
-  evalState,
-  filterM,
-  get,
-  gets,
-  hoistEither,
-  modify,
-  modify',
-  put,
-  readFile,
-  runReader,
-  runState,
-  state,
-  trace,
-  traceShow,
-  undefined,
-  )
-import System.IO.Error (userError)
-
-dbg :: Monad m => Text -> m ()
-dbg msg = do
-  () <- return $ unsafePerformIO (putStrLn (toString msg))
-  return ()
-{-# INLINE dbg #-}
-
-dbgs :: Monad m => Show a => a -> m ()
-dbgs a =
-  dbg (show a)
-{-# INLINE dbgs_ #-}
-
-dbgs_ :: Monad m => Show a => a -> m a
-dbgs_ a =
-  a <$ dbg (show a)
-{-# INLINE dbgs #-}
-
-unit ::
-  Applicative f =>
-  f ()
-unit =
-  pure ()
-{-# INLINE unit #-}
-
-tuple ::
-  Applicative f =>
-  f a ->
-  f b ->
-  f (a, b)
-tuple fa fb =
-  (,) <$> fa <*> fb
-{-# INLINE tuple #-}
-
-unsafeLogSAnd :: Show a => a -> b -> b
-unsafeLogSAnd a b =
-  unsafePerformIO $ print a >> return b
-{-# INLINE unsafeLogSAnd #-}
-
-unsafeLogAnd :: Text -> b -> b
-unsafeLogAnd a b =
-  unsafePerformIO $ putStrLn (toString a) >> return b
-{-# INLINE unsafeLogAnd #-}
-
-unsafeLogS :: Show a => a -> a
-unsafeLogS a =
-  unsafePerformIO $ print a >> return a
-{-# INLINE unsafeLogS #-}
-
-liftT ::
-  forall m f r e a .
-  Functor f =>
-  Sem r a ->
-  Sem (WithTactics e f m r) (f a)
-liftT =
-  pureT <=< raise
-{-# INLINE liftT #-}
-
-hoistEither ::
-  Member (Error e2) r =>
-  (e1 -> e2) ->
-  Either e1 a ->
-  Sem r a
-hoistEither f =
-  fromEither . mapLeft f
-{-# INLINE hoistEither #-}
-
-hoistEitherWith ::
-  (e -> Sem r a) ->
-  Either e a ->
-  Sem r a
-hoistEitherWith f =
-  either f pure
-{-# INLINE hoistEitherWith #-}
-
-hoistEitherShow ::
-  Show e1 =>
-  Member (Error e2) r =>
-  (Text -> e2) ->
-  Either e1 a ->
-  Sem r a
-hoistEitherShow f =
-  fromEither . mapLeft (f . Text.replace "\\" "" . show)
-{-# INLINE hoistEitherShow #-}
-
-hoistErrorWith ::
-  (e -> Sem r a) ->
-  Sem (Error e : r) a ->
-  Sem r a
-hoistErrorWith f =
-  hoistEitherWith f <=< runError
-{-# INLINE hoistErrorWith #-}
-
-tryAny ::
-  Member (Embed IO) r =>
-  IO a ->
-  Sem r (Either Text a)
-tryAny =
-  embed . fmap (mapLeft show) . try @SomeException
-{-# INLINE tryAny #-}
-
-tryHoist ::
-  Member (Embed IO) r =>
-  (Text -> e) ->
-  IO a ->
-  Sem r (Either e a)
-tryHoist f =
-  fmap (mapLeft f) . tryAny
-{-# INLINE tryHoist #-}
-
-tryThrow ::
-  Members [Embed IO, Error e] r =>
-  (Text -> e) ->
-  IO a ->
-  Sem r a
-tryThrow f =
-  fromEither <=< tryHoist f
-{-# INLINE tryThrow #-}
-
-throwTextIO :: Text -> IO a
-throwTextIO =
-  throwIO . userError . toString
-{-# INLINE throwTextIO #-}
-
-throwEitherIO :: Either Text a -> IO a
-throwEitherIO =
-  traverseLeft throwTextIO
-{-# INLINE throwEitherIO #-}
-
-rightOr :: (a -> b) -> Either a b -> b
-rightOr f =
-  either f id
-{-# INLINE rightOr #-}
-
-traverseLeft ::
-  Applicative m =>
-  (a -> m b) ->
-  Either a b ->
-  m b
-traverseLeft f =
-  either f pure
-{-# INLINE traverseLeft #-}
-
-as ::
-  Functor m =>
-  a ->
-  m b ->
-  m a
-as =
-  (<$)
-{-# INLINE as #-}
-
-mneToList :: Maybe (NonEmpty a) -> [a]
-mneToList =
-  maybe [] toList
-{-# INLINE mneToList #-}
diff --git a/lib/Polysemy/Test/Run.hs b/lib/Polysemy/Test/Run.hs
--- a/lib/Polysemy/Test/Run.hs
+++ b/lib/Polysemy/Test/Run.hs
@@ -1,17 +1,18 @@
-{-# options_haddock hide #-}
+{-# options_haddock prune #-}
 
+-- |Test Interpreters, Internal
 module Polysemy.Test.Run where
 
-import Control.Exception (catch)
+import qualified Control.Exception as Base
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.Trans.Except (ExceptT (ExceptT))
 import qualified Control.Monad.Trans.Writer.Lazy as MTL
 import qualified Data.Text as Text
-import GHC.Stack.Types (SrcLoc (SrcLoc, srcLocFile), srcLocModule)
+import GHC.Stack (callStack)
+import GHC.Stack.Types (SrcLoc (SrcLoc, srcLocFile), getCallStack, srcLocModule)
 import Hedgehog.Internal.Property (Failure, Journal, TestT (TestT), failWith)
 import Path (Abs, Dir, Path, parseAbsDir, parseRelDir, (</>))
 import Path.IO (canonicalizePath, createTempDir, getCurrentDir, getTempDir, removeDirRecur)
-import Polysemy.Fail (Fail, failToError)
-import Polysemy.Resource (Resource, bracket, resourceToIOFinal)
-import Polysemy.Writer (runWriter)
 import System.IO.Error (IOError)
 
 import Polysemy.Test.Data.Hedgehog (Hedgehog, liftH)
@@ -25,7 +26,7 @@
   IO () ->
   IO ()
 ignoringIOErrors ioe =
-  catch ioe handler
+  Base.catch ioe handler
   where
     handler :: Monad m => IOError -> m ()
     handler =
@@ -55,7 +56,7 @@
   Members [Error TestError, Embed IO] r =>
   Sem r (Path Abs Dir)
 createTemp =
-  fromEither . mapLeft TestError =<< tryAny do
+  fromEither . first TestError =<< tryAny do
     systemTmp <- getTempDir
     createTempDir systemTmp "polysemy-test-"
 
@@ -70,7 +71,7 @@
   InterpreterFor Test r
 interpretTestKeepTemp base sem = do
   tempBase <- createTemp
-  (interpretTestIn' base tempBase) sem
+  interpretTestIn' base tempBase sem
 
 -- |like 'interpretTestKeepTemp', but deletes the temp dir after the test.
 interpretTest ::
@@ -83,7 +84,7 @@
     release tempBase =
       embed (ignoringIOErrors (removeDirRecur tempBase))
     use tempBase =
-      (interpretTestIn' base tempBase) sem
+      interpretTestIn' base tempBase sem
 
 -- |Call 'interpretTest' with the subdirectory @prefix@ of the current working directory as the base dir, which is
 -- most likely something like @test@.
@@ -95,7 +96,7 @@
 interpretTestInSubdir prefix sem = do
   prefixPath <- embed (parseRelDir @IO (toString prefix))
   base <- embed (canonicalizePath @_ @IO prefixPath)
-  (interpretTest base) sem
+  interpretTest base sem
 
 errorToFailure ::
   ∀ m r a .
@@ -136,8 +137,8 @@
   (∀ x . Sem r x -> m x) ->
   Sem (Fail : Error TestError : Hedgehog m : r) a ->
   TestT m a
-semToTestT run sem = do
-  (journal, result) <- lift (run (unwrapLiftedTestT sem))
+semToTestT runSem sem = do
+  (journal, result) <- lift (runSem (unwrapLiftedTestT sem))
   TestT (ExceptT (result <$ MTL.tell journal))
 
 -- |'Final' version of 'semToTestT'.
@@ -208,8 +209,8 @@
   (∀ x . Sem r x -> IO x) ->
   Sem (Test : Fail : Error TestError : Hedgehog IO : r) a ->
   TestT IO a
-runTestAutoWith run sem =
-  semToTestT run do
+runTestAutoWith runSem sem =
+  semToTestT runSem do
     base <- callingTestDir
     interpretTest base sem
 
diff --git a/lib/Prelude.hs b/lib/Prelude.hs
deleted file mode 100644
--- a/lib/Prelude.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-{-# options_haddock hide #-}
-{-# options_ghc -Wno-missing-import-lists #-}
-
-module Prelude (
-  module Polysemy.Test.Prelude,
-) where
-
-import Polysemy.Test.Prelude
diff --git a/polysemy-test.cabal b/polysemy-test.cabal
--- a/polysemy-test.cabal
+++ b/polysemy-test.cabal
@@ -5,13 +5,13 @@
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-test
-version:        0.3.1.9
+version:        0.4.0.0
 synopsis:       Polysemy Effects for Testing
 description:    See https://hackage.haskell.org/package/polysemy-test/docs/Polysemy-Test.html
 category:       Test
 author:         Torsten Schmits
 maintainer:     haskell@tryp.io
-copyright:      2021 Torsten Schmits
+copyright:      2022 Torsten Schmits
 license:        BSD-2-Clause-Patent
 license-file:   LICENSE
 build-type:     Simple
@@ -29,13 +29,7 @@
       Polysemy.Test.Data.TestError
       Polysemy.Test.Files
       Polysemy.Test.Hedgehog
-      Polysemy.Test.Prelude
       Polysemy.Test.Run
-  other-modules:
-      Prelude
-      Paths_polysemy_test
-  autogen-modules:
-      Paths_polysemy_test
   hs-source-dirs:
       lib
   default-extensions:
@@ -98,16 +92,13 @@
   ghc-options: -Wall -Wredundant-constraints -Wunused-packages
   build-depends:
       base >=4.12 && <5
-    , containers
-    , either
     , hedgehog >=1.0.2
+    , incipit-core
     , path >=0.7
     , path-io >=0.2
     , polysemy >=1.3
-    , relude >=0.7
     , tasty >=1.1
     , tasty-hedgehog >=1.0.0.2
-    , text
     , transformers
   mixins:
       base hiding (Prelude)
@@ -119,9 +110,6 @@
   other-modules:
       Polysemy.Test.Test.FilesTest
       Polysemy.Test.Test.HedgehogTest
-      Paths_polysemy_test
-  autogen-modules:
-      Paths_polysemy_test
   hs-source-dirs:
       test
   default-extensions:
@@ -185,13 +173,11 @@
   build-depends:
       base >=4.12 && <5
     , hedgehog
+    , incipit-core
     , path
     , polysemy
     , polysemy-test
     , tasty
-    , text
   mixins:
       base hiding (Prelude)
-    , polysemy-test hiding (Polysemy.Test.Prelude)
-    , polysemy-test (Polysemy.Test.Prelude as Prelude)
   default-language: Haskell2010
diff --git a/test/Polysemy/Test/Test/HedgehogTest.hs b/test/Polysemy/Test/Test/HedgehogTest.hs
--- a/test/Polysemy/Test/Test/HedgehogTest.hs
+++ b/test/Polysemy/Test/Test/HedgehogTest.hs
@@ -1,9 +1,8 @@
 module Polysemy.Test.Test.HedgehogTest where
 
+import Control.Monad.IO.Class (liftIO)
 import Hedgehog (TestT, assert)
 import Hedgehog.Internal.Property (Failure (Failure), runTestT)
-import Polysemy.Fail (Fail)
-import Polysemy.Resource (Resource)
 
 import Polysemy.Test (UnitTest, runTestAuto, (/==))
 import Polysemy.Test.Data.Hedgehog (Hedgehog)
@@ -20,7 +19,7 @@
   Sem [Test, Fail, Error TestError, Hedgehog IO, Embed IO, Resource, Final IO] () ->
   TestT IO Bool
 hedgehogTest prog =
-  extract . fst <$> liftIO (runTestT $ runTestAuto $ prog)
+  extract . fst <$> liftIO (runTestT (runTestAuto prog))
   where
     extract = \case
       Left (Failure (Just _) _ _) ->
