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/Log/Atomic.hs b/lib/Polysemy/Log/Atomic.hs
--- a/lib/Polysemy/Log/Atomic.hs
+++ b/lib/Polysemy/Log/Atomic.hs
@@ -1,10 +1,10 @@
--- |Description: Internal
+-- |Description: Interpreters for 'DataLog' that write to 'AtomicState'.
 module Polysemy.Log.Atomic where
 
-import Polysemy.Internal (InterpretersFor)
+import Control.Concurrent.STM (newTVarIO)
 
 import Polysemy.Log.Data.DataLog (DataLog)
-import Polysemy.Log.Data.Log (Log(Log))
+import Polysemy.Log.Data.Log (Log (Log))
 import Polysemy.Log.Data.LogMessage (LogMessage)
 import Polysemy.Log.Log (interpretDataLog)
 
@@ -18,13 +18,13 @@
 {-# inline interpretDataLogAtomic' #-}
 
 -- |Interpret 'DataLog' by prepending each message to a list in an 'AtomicState', then interpret the 'AtomicState' in a
--- 'TVar'.
+-- 'Control.Concurrent.STM.TVar'.
 interpretDataLogAtomic ::
   ∀ a r .
   Member (Embed IO) r =>
   InterpretersFor [DataLog a, AtomicState [a]] r
 interpretDataLogAtomic sem = do
-  tv <- newTVarIO []
+  tv <- embed (newTVarIO [])
   runAtomicStateTVar tv (interpretDataLogAtomic' sem)
 {-# inline interpretDataLogAtomic #-}
 
@@ -38,11 +38,11 @@
 {-# inline interpretLogAtomic' #-}
 
 -- |Interpret 'Log' by prepending each message to a list in an 'AtomicState', then interpret the 'AtomicState' in a
--- 'TVar'.
+-- 'Control.Concurrent.STM.TVar'.
 interpretLogAtomic ::
   Member (Embed IO) r =>
   InterpretersFor [Log, AtomicState [LogMessage]] r
 interpretLogAtomic sem = do
-  tv <- newTVarIO []
+  tv <- embed (newTVarIO [])
   runAtomicStateTVar tv (interpretLogAtomic' sem)
 {-# inline interpretLogAtomic #-}
diff --git a/lib/Polysemy/Log/Conc.hs b/lib/Polysemy/Log/Conc.hs
--- a/lib/Polysemy/Log/Conc.hs
+++ b/lib/Polysemy/Log/Conc.hs
@@ -1,19 +1,17 @@
 -- |Description: Internal
 module Polysemy.Log.Conc where
 
-import Polysemy (interceptH, runT, subsume)
-import Polysemy.Async (Async, async, await)
+import qualified Control.Concurrent.Async as Base
+import qualified Polysemy.Conc as Conc
 import Polysemy.Conc (Queue, Race, interpretQueueTBM)
 import qualified Polysemy.Conc.Queue as Queue
 import Polysemy.Conc.Queue.Result (resultToMaybe)
 import Polysemy.Internal.Tactics (liftT)
-import Polysemy.Resource (Resource, finally)
+import Polysemy.Time (Seconds (Seconds))
+import Prelude hiding (Local)
 
 import qualified Polysemy.Log.Data.DataLog as DataLog
 import Polysemy.Log.Data.DataLog (DataLog (DataLog, Local))
-import qualified Control.Concurrent.Async as Base
-import qualified Polysemy.Conc as Conc
-import Polysemy.Time (Seconds(Seconds))
 
 -- |Intercept 'DataLog' for concurrent processing.
 -- This does not send any action to the ultimate interpreter but writes all log messages to the provided queue.
diff --git a/lib/Polysemy/Log/Data/DataLog.hs b/lib/Polysemy/Log/Data/DataLog.hs
--- a/lib/Polysemy/Log/Data/DataLog.hs
+++ b/lib/Polysemy/Log/Data/DataLog.hs
@@ -3,7 +3,7 @@
 -- |Description: Internal
 module Polysemy.Log.Data.DataLog where
 
-import Polysemy.Internal (send)
+import GHC.Stack (withFrozenCallStack)
 import Polysemy.Time (GhcTime)
 
 import Polysemy.Log.Data.LogEntry (LogEntry, annotate)
@@ -79,7 +79,7 @@
   withFrozenCallStack (log Warn)
 {-# inline warn #-}
 
--- |Log a text message with the 'Error' severity.
+-- |Log a text message with the 'Polysemy.Log.Data.Severity.Error' severity.
 error ::
   HasCallStack =>
   Members [Logger, GhcTime] r =>
diff --git a/lib/Polysemy/Log/Data/Log.hs b/lib/Polysemy/Log/Data/Log.hs
--- a/lib/Polysemy/Log/Data/Log.hs
+++ b/lib/Polysemy/Log/Data/Log.hs
@@ -1,7 +1,7 @@
 -- |Description: Internal
 module Polysemy.Log.Data.Log where
 
-import Polysemy.Internal (send)
+import GHC.Stack (withFrozenCallStack)
 
 import Polysemy.Log.Data.LogMessage (LogMessage (LogMessage))
 import Polysemy.Log.Data.Severity (Severity (Crit, Debug, Error, Info, Trace, Warn))
@@ -79,7 +79,7 @@
   log Warn
 {-# inline warn #-}
 
--- |Log a message with the 'Error' severity.
+-- |Log a message with the 'Polysemy.Log.Data.Severity.Error' severity.
 error ::
   HasCallStack =>
   Member Log r =>
diff --git a/lib/Polysemy/Log/Data/LogEntry.hs b/lib/Polysemy/Log/Data/LogEntry.hs
--- a/lib/Polysemy/Log/Data/LogEntry.hs
+++ b/lib/Polysemy/Log/Data/LogEntry.hs
@@ -3,6 +3,7 @@
 
 import Data.Time (UTCTime)
 import Data.Time.Calendar (Day)
+import GHC.Stack (CallStack, callStack)
 import qualified Polysemy.Time as Time
 import Polysemy.Time (GhcTime)
 
diff --git a/lib/Polysemy/Log/Data/LogMetadata.hs b/lib/Polysemy/Log/Data/LogMetadata.hs
--- a/lib/Polysemy/Log/Data/LogMetadata.hs
+++ b/lib/Polysemy/Log/Data/LogMetadata.hs
@@ -1,9 +1,6 @@
 -- |Description: Internal
-{-# options_haddock prune #-}
 module Polysemy.Log.Data.LogMetadata where
 
-import Polysemy.Internal (send)
-
 -- |Internal effect used as an intermediate stage between 'Polysemy.Log.Log' and 'Polysemy.Log.DataLog', for the purpose
 -- of isolating the metadata annotation task.
 --
@@ -13,6 +10,7 @@
   -- |Schedule a message to be annotated and logged.
   Annotated :: HasCallStack => msg -> LogMetadata msg m ()
 
+-- |Schedule a message to be annotated and logged.
 annotated ::
   HasCallStack =>
   Member (LogMetadata msg) r =>
diff --git a/lib/Polysemy/Log/Format.hs b/lib/Polysemy/Log/Format.hs
--- a/lib/Polysemy/Log/Format.hs
+++ b/lib/Polysemy/Log/Format.hs
@@ -2,7 +2,7 @@
 module Polysemy.Log.Format where
 
 import qualified Data.Text as Text
-import GHC.Exception (SrcLoc (..))
+import GHC.Exception (CallStack, SrcLoc (..), getCallStack)
 import System.Console.ANSI (Color (..), ColorIntensity (Dull), ConsoleLayer (Foreground), SGR (..), setSGRCode)
 
 import Polysemy.Log.Data.LogEntry (LogEntry (LogEntry))
diff --git a/lib/Polysemy/Log/Handle.hs b/lib/Polysemy/Log/Handle.hs
--- a/lib/Polysemy/Log/Handle.hs
+++ b/lib/Polysemy/Log/Handle.hs
@@ -1,16 +1,11 @@
-{-# language CPP #-}
-
 -- |Description: Handle Interpreters, Internal
 module Polysemy.Log.Handle where
 
 import qualified Data.Text.IO as Text
+import System.IO (BufferMode (LineBuffering), Handle, hSetBuffering)
 
 import Polysemy.Log.Data.DataLog (DataLog)
 import Polysemy.Log.Log (interpretDataLog)
-
-#if !MIN_VERSION_relude(1,0,0)
-import System.IO (hSetBuffering, BufferMode (LineBuffering))
-#endif
 
 -- |Interpret 'DataLog' by printing to the given handle, converting messages to 'Text' with the supplied function.
 -- Sets the handle into 'LineBuffering' mode.
diff --git a/lib/Polysemy/Log/Level.hs b/lib/Polysemy/Log/Level.hs
--- a/lib/Polysemy/Log/Level.hs
+++ b/lib/Polysemy/Log/Level.hs
@@ -1,7 +1,7 @@
 -- |Description: Internal
 module Polysemy.Log.Level where
 
-import Polysemy (interceptH, runTSimple)
+import Prelude hiding (Local)
 
 import qualified Polysemy.Log.Data.DataLog as DataLog
 import Polysemy.Log.Data.DataLog (DataLog (DataLog, Local))
diff --git a/lib/Polysemy/Log/Log.hs b/lib/Polysemy/Log/Log.hs
--- a/lib/Polysemy/Log/Log.hs
+++ b/lib/Polysemy/Log/Log.hs
@@ -1,13 +1,10 @@
 -- |Description: Internal
 module Polysemy.Log.Log where
 
-import Polysemy (interpretH, runT)
-import Polysemy.Async (Async)
 import Polysemy.Conc (Race)
-import Polysemy.Internal (InterpretersFor)
 import Polysemy.Internal.Tactics (liftT)
-import Polysemy.Resource (Resource)
 import Polysemy.Time (GhcTime, interpretTimeGhc)
+import Prelude hiding (Local)
 
 import Polysemy.Log.Conc (interceptDataLogConc)
 import Polysemy.Log.Data.DataLog (DataLog (DataLog, Local), dataLog)
diff --git a/lib/Polysemy/Log/Prelude.hs b/lib/Polysemy/Log/Prelude.hs
deleted file mode 100644
--- a/lib/Polysemy/Log/Prelude.hs
+++ /dev/null
@@ -1,57 +0,0 @@
-{-# options_haddock hide #-}
-{-# language NoImplicitPrelude #-}
-
-module Polysemy.Log.Prelude (
-  module GHC.Err,
-  module Polysemy,
-  module Polysemy.AtomicState,
-  module Relude,
-) where
-
-import GHC.Err (undefined)
-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 Relude hiding (
-  Reader,
-  State,
-  Sum,
-  Type,
-  ask,
-  asks,
-  evalState,
-  filterM,
-  get,
-  gets,
-  hoistEither,
-  modify,
-  modify',
-  put,
-  readFile,
-  runReader,
-  runState,
-  state,
-  trace,
-  traceShow,
-  undefined,
-  )
diff --git a/lib/Polysemy/Log/Pure.hs b/lib/Polysemy/Log/Pure.hs
--- a/lib/Polysemy/Log/Pure.hs
+++ b/lib/Polysemy/Log/Pure.hs
@@ -1,9 +1,7 @@
--- |Description: Internal
+-- |Description: Pure interpreters for 'Log'.
 module Polysemy.Log.Pure where
 
-import Polysemy.Output (Output, output)
-
-import Polysemy.Log.Data.Log (Log(Log))
+import Polysemy.Log.Data.Log (Log (Log))
 import Polysemy.Log.Data.LogMessage (LogMessage)
 
 -- |Interpret 'Log' in terms of 'Output'.
diff --git a/lib/Polysemy/Log/Stderr.hs b/lib/Polysemy/Log/Stderr.hs
--- a/lib/Polysemy/Log/Stderr.hs
+++ b/lib/Polysemy/Log/Stderr.hs
@@ -1,10 +1,9 @@
 -- |Description: Stderr Interpreters, Internal
 module Polysemy.Log.Stderr where
 
-import Polysemy.Async (Async)
 import Polysemy.Conc (Race)
-import Polysemy.Resource (Resource)
 import Polysemy.Time (GhcTime, interpretTimeGhc)
+import System.IO (stderr)
 
 import Polysemy.Log.Data.DataLog (DataLog)
 import Polysemy.Log.Data.Log (Log)
diff --git a/lib/Polysemy/Log/Stdout.hs b/lib/Polysemy/Log/Stdout.hs
--- a/lib/Polysemy/Log/Stdout.hs
+++ b/lib/Polysemy/Log/Stdout.hs
@@ -1,10 +1,9 @@
 -- |Description: Stdout Interpreters, Internal
 module Polysemy.Log.Stdout where
 
-import Polysemy.Async (Async)
 import Polysemy.Conc (Race)
-import Polysemy.Resource (Resource)
 import Polysemy.Time (GhcTime, interpretTimeGhc)
+import System.IO (stdout)
 
 import Polysemy.Log.Data.DataLog (DataLog)
 import Polysemy.Log.Data.Log (Log)
diff --git a/lib/Prelude.hs b/lib/Prelude.hs
deleted file mode 100644
--- a/lib/Prelude.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-module Prelude (
-  module Polysemy.Log.Prelude,
-) where
-
-import Polysemy.Log.Prelude
diff --git a/polysemy-log.cabal b/polysemy-log.cabal
--- a/polysemy-log.cabal
+++ b/polysemy-log.cabal
@@ -1,11 +1,11 @@
 cabal-version: 2.2
 
--- This file has been generated from package.yaml by hpack version 0.34.4.
+-- This file has been generated from package.yaml by hpack version 0.34.6.
 --
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-log
-version:        0.4.3.0
+version:        0.5.0.0
 synopsis:       Polysemy Effects for Logging
 description:    See <https://hackage.haskell.org/package/polysemy-log/docs/Polysemy-Log.html>
 category:       Logging
@@ -40,15 +40,9 @@
       Polysemy.Log.Handle
       Polysemy.Log.Level
       Polysemy.Log.Log
-      Polysemy.Log.Prelude
       Polysemy.Log.Pure
       Polysemy.Log.Stderr
       Polysemy.Log.Stdout
-  other-modules:
-      Prelude
-      Paths_polysemy_log
-  autogen-modules:
-      Paths_polysemy_log
   hs-source-dirs:
       lib
   default-extensions:
@@ -114,12 +108,11 @@
       ansi-terminal >=0.10.3
     , async
     , base ==4.*
+    , incipit-core >=0.1.0.1
     , polysemy >=1.5
-    , polysemy-conc >=0.3
-    , polysemy-time >=0.1.4
-    , relude >=0.7
-    , template-haskell
-    , text
+    , polysemy-conc >=0.6
+    , polysemy-time >=0.3
+    , stm
     , time
   mixins:
       base hiding (Prelude)
@@ -131,10 +124,10 @@
   other-modules:
       Polysemy.Log.Test.ConcTest
       Polysemy.Log.Test.DataLogTest
+      Polysemy.Log.Test.ExampleTest
       Polysemy.Log.Test.LocalTest
       Polysemy.Log.Test.LogEntryTest
       Polysemy.Log.Test.SimpleTest
-      Paths_polysemy_log
   hs-source-dirs:
       test
   default-extensions:
@@ -198,15 +191,15 @@
   ghc-options: -Wall -Wredundant-constraints -Wunused-packages -Widentities -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       base ==4.*
+    , incipit-core >=0.1.0.1
     , polysemy >=1.5
     , polysemy-conc
     , polysemy-log
+    , polysemy-plugin
     , polysemy-test
     , polysemy-time
     , tasty
     , time
   mixins:
       base hiding (Prelude)
-    , polysemy-log hiding (Polysemy.Log.Prelude)
-    , polysemy-log (Polysemy.Log.Prelude as Prelude)
   default-language: Haskell2010
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -1,81 +1,6 @@
-> Log thrice, debug once.
->
-> –– Г. Любенов
-
-# About
-
-A common interface for the polysemy logging backend adapters.
-
-An example program using a simple logger with predefined formatting and a custom data type:
-
-```haskell
-import Colog (logTextStdout)
-import Colog.Polysemy (runLogAction)
-import Polysemy (runM)
-
-import Polysemy.Log.Colog (interpretDataLogColog, interpretLogStdout)
-import qualified Polysemy.Log.Data.DataLog as DataLog
-import Polysemy.Log.Data.DataLog (DataLog)
-import qualified Polysemy.Log.Data.Log as Log
-import Polysemy.Log.Data.Log (Log)
-
-progSimple ::
-  Member Log r =>
-  Sem r ()
-progSimple = do
-  Log.debug "debug"
-  Log.warn "warn"
-
-data Message =
-  Message {
-    severity :: Text,
-    message :: Text
-  }
-  deriving (Eq, Show)
-
-progData ::
-  Member (DataLog Message) r =>
-  Sem r ()
-progData = do
-  DataLog.dataLog (Message "warn" "warning!")
-  DataLog.local (\ msg@Message{message} -> msg {message = "context: " <> message}) do
-    DataLog.dataLog (Message "error" "segfault!")
-
-main :: IO ()
-main =
-  runM do
-    interpretLogStdout progSimple
-    runLogAction @IO (contramap message logTextStdout) $ interpretDataLogColog @Message $ progData
-```
-
-For more documentation, please consult Hackage:
-* [polysemy-log](https://hackage.haskell.org/package/polysemy-log)
-* [polysemy-log-co](https://hackage.haskell.org/package/polysemy-log-co)
-* [polysemy-log-di](https://hackage.haskell.org/package/polysemy-log-di)
-
-# Building the Project
-
-The build is defined in [nix], supporting `flake` and legacy `nix-build`.
-
-With `nix-build`:
-
-```bash
-nix-build -A defaultPackage
-nix-build -A packages.x86_64-linux.polysemy-log-co
-```
-
-With `nix flake`:
-
-```
-nix build
-nix build '.#polysemy-log-co'
-```
-
-To run all tests:
+A logging library for [Polysemy].
 
-```bash
-nix flake check
-```
+For docs, please visit [Hackage].
 
-[nix]: https://nixos.org/manual/nix/unstable
-[co-log]: https://hackage.haskell.org/package/co-log
+[Polysemy](https://hackage.haskell.org/package/polysemy)
+[Hackage](https://hackage.haskell.org/package/polysemy-log)
diff --git a/test/Polysemy/Log/Test/ConcTest.hs b/test/Polysemy/Log/Test/ConcTest.hs
--- a/test/Polysemy/Log/Test/ConcTest.hs
+++ b/test/Polysemy/Log/Test/ConcTest.hs
@@ -1,11 +1,10 @@
 module Polysemy.Log.Test.ConcTest where
 
 import Data.Time (Day, UTCTime)
-import Polysemy.Async (asyncToIOFinal)
 import Polysemy.Conc (interpretRace)
 import Polysemy.Test (UnitTest, assertEq, runTestAuto)
 import qualified Polysemy.Time as Time
-import Polysemy.Time (GhcTime, MilliSeconds(MilliSeconds), interpretTimeGhc)
+import Polysemy.Time (GhcTime, MilliSeconds (MilliSeconds), interpretTimeGhc)
 
 import Polysemy.Log.Atomic (interpretDataLogAtomic)
 import Polysemy.Log.Conc (interceptDataLogConc)
diff --git a/test/Polysemy/Log/Test/ExampleTest.hs b/test/Polysemy/Log/Test/ExampleTest.hs
new file mode 100644
--- /dev/null
+++ b/test/Polysemy/Log/Test/ExampleTest.hs
@@ -0,0 +1,37 @@
+{-# options_ghc -fplugin=Polysemy.Plugin #-}
+
+module Polysemy.Log.Test.ExampleTest where
+
+import Polysemy.Conc (runConc)
+
+import qualified Polysemy.Log as Log
+import Polysemy.Log (DataLog, Log, interpretDataLogStdout, interpretLogStdoutConc)
+import qualified Polysemy.Log.Data.DataLog as DataLog
+
+progSimple ::
+  Member Log r =>
+  Sem r ()
+progSimple = do
+  Log.debug "debug"
+  Log.warn "warn"
+
+data Message =
+  Message {
+    severity :: Text,
+    message :: Text
+  }
+  deriving (Eq, Show)
+
+progData ::
+  Member (DataLog Message) r =>
+  Sem r ()
+progData = do
+  DataLog.dataLog (Message "warn" "warning!")
+  DataLog.local (\ msg@Message{message} -> msg {message = "context: " <> message}) do
+    DataLog.dataLog (Message "error" "segfault!")
+
+main :: IO ()
+main =
+  runConc do
+    interpretLogStdoutConc progSimple
+    interpretDataLogStdout progData
