diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,5 @@
+# Revision history for heftia-effects
+
+## 0.1.0.0 -- 2023-09-18
+
+* Initial public release.
diff --git a/Example/Continuation/Main.hs b/Example/Continuation/Main.hs
new file mode 100644
--- /dev/null
+++ b/Example/Continuation/Main.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+module Main where
+
+import Control.Effect.Class (sendIns, type (~>))
+import Control.Effect.Class.Machinery.TH (makeEffectF, makeEffectH)
+import Control.Effect.Freer (Fre, interposeK, interpret, runFreerEffects, type (<|))
+import Control.Effect.Heftia (Elaborator, runElaborate)
+import Control.Monad.Trans.Heftia.Church (HeftiaChurchT)
+import Data.Function ((&))
+import Data.Hefty.Extensible (ExtensibleUnionH)
+import Data.Hefty.Union (UnionH (absurdUnionH, (|+:)))
+
+type ForkID = Int
+
+class Fork f where
+    fork :: f ForkID
+
+makeEffectF ''Fork
+
+runForkSingle :: Monad m => Fre (ForkI ': r) m ~> Fre r m
+runForkSingle = interpret \Fork -> pure 0
+
+class DelimitFork f where
+    delimitFork :: Monoid w => f w -> f w
+
+makeEffectH ''DelimitFork
+
+applyDelimitFork :: (ForkI <| es, Monad m) => Int -> Elaborator DelimitForkS (Fre es m)
+applyDelimitFork numberOfFork (DelimitFork m) =
+    m & interposeK pure \k Fork -> do
+        r <- mapM k [1 .. numberOfFork]
+        pure $ mconcat r
+
+{-
+-- In the `mconcat` section, we utilize the fact that `w` in `delimitFork` is a `Monoid`.
+-- However, `hoistHeftiaEffects` quantifies `w` into any type, so we can't make use of
+-- it being a `Monoid`. Thus, writing it this way results in a type error.
+
+runDelimitFork ::
+    (ForkI <| es, ForallHFunctor r, Monad m) =>
+    Int ->
+    Hef (DelimitForkS ': r) (Fre es m) ~> Hef r (Fre es m)
+runDelimitFork numberOfFork =
+    interpretH \(DelimitFork m) ->
+        ($ m) $ hoistHeftiaEffects $ interposeK pure \k Fork -> do
+            r <- mapM k [1 .. numberOfFork]
+            pure $ mconcat r -- Here's where the type error occurs
+-}
+
+main :: IO ()
+main =
+    runFreerEffects
+        . runForkSingle
+        . runElaborate @_ @HeftiaChurchT @ExtensibleUnionH (applyDelimitFork 4 |+: absurdUnionH)
+        $ do
+            sendIns . putStrLn . (("[out of scope] " ++) . show) =<< fork
+            s <- delimitFork do
+                fid1 <- fork
+                fid2 <- fork
+                sendIns $ putStrLn $ "[delimited continuation of `fork`] Fork ID: " ++ show (fid1, fid2)
+                pure $ show (fid1, fid2)
+            sendIns $ putStrLn $ "scope exited. result: " ++ s
diff --git a/Example/Logging/Main.hs b/Example/Logging/Main.hs
new file mode 100644
--- /dev/null
+++ b/Example/Logging/Main.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+module Main where
+
+import Control.Effect.Class (SendIns (sendIns), type (<:), type (~>))
+import Control.Effect.Class.Machinery.TH (makeEffectF, makeEffectH)
+import Control.Effect.Class.Reader (Ask (ask), AskI, Local (local), LocalS)
+import Control.Effect.Class.State (State (get), StateI, modify)
+import Control.Effect.Freer (
+    Fre,
+    flipFreer,
+    interpose,
+    interpret,
+    interpreted,
+    liftLower,
+    raise,
+    raise2,
+    runFreerEffects,
+    subsume,
+    type (<|),
+ )
+import Control.Effect.Handler.Heftia.Reader (interpretReader, liftReader)
+import Control.Effect.Handler.Heftia.State (evalState)
+import Control.Effect.Heftia (
+    ForallHFunctor,
+    Hef,
+    elaborated,
+    flipHeftia,
+    hoistHeftiaEffects,
+    hoistInterpose,
+    interpretH,
+    liftLowerH,
+    runElaborate,
+    type (<<|),
+ )
+import Control.Monad (when)
+import Control.Monad.Trans.Heftia.Church (HeftiaChurchT)
+import Data.Function ((&))
+import Data.Hefty.Extensible (ExtensibleUnionH)
+import Data.Hefty.Union (absurdUnionH, (|+:))
+import Data.Text (Text)
+import Data.Text qualified as T
+import Data.Text.IO qualified as T
+import Data.Time (UTCTime, getCurrentTime)
+import Data.Time.Format.ISO8601 (iso8601Show)
+import Prelude hiding (log)
+
+class Log f where
+    log :: Text -> f ()
+
+makeEffectF ''Log
+
+logToIO :: (IO <: Fre r m, Monad m) => Fre (LogI ': r) m ~> Fre r m
+logToIO = interpret \(Log msg) -> sendIns $ T.putStrLn msg
+
+class Time f where
+    currentTime :: f UTCTime
+
+makeEffectF ''Time
+
+timeToIO :: (IO <: Fre r m, Monad m) => Fre (TimeI ': r) m ~> Fre r m
+timeToIO = interpret \case
+    CurrentTime -> sendIns getCurrentTime
+
+logWithTime :: (LogI <| es, Time (Fre es m), Monad m) => Fre es m ~> Fre es m
+logWithTime = interpose \(Log msg) -> do
+    t <- currentTime
+    log $ "[" <> T.pack (show t) <> "] " <> msg
+
+-- | An effect that introduces a scope that represents a chunk of logs.
+class LogChunk f where
+    logChunk :: f a -> f a
+
+makeEffectH ''LogChunk
+
+-- | Output logs in log chunks as they are.
+passthroughLogChunk ::
+    (Monad m, ForallHFunctor r) =>
+    Hef (LogChunkS ': r) m ~> Hef r m
+passthroughLogChunk = interpretH \(LogChunk m) -> m
+
+-- | Limit the number of logs in a log chunk to the first @n@ logs.
+limitLogChunk ::
+    forall m.
+    (LogChunk m, Log m, Monad m) =>
+    Int ->
+    LogChunkS (Fre '[LogI] m) ~> m
+limitLogChunk n (LogChunk a) =
+    logChunk
+        . interpreted
+        . evalState 0
+        . interpretLog
+        . flipFreer
+        . raise
+        $ a
+  where
+    interpretLog :: Fre '[LogI, StateI Int] m ~> Fre '[StateI Int] m
+    interpretLog =
+        interpret \(Log msg) -> do
+            count <- get
+            when (count <= n) do
+                liftLower $
+                    if count == n
+                        then log "LOG OMITTED..."
+                        else log msg
+
+                modify @Int (+ 1)
+
+class FileSystem f where
+    mkdir :: FilePath -> f ()
+    writeFS :: FilePath -> String -> f ()
+
+makeEffectF ''FileSystem
+
+runDummyFS :: (IO <: Fre r m, Monad m) => Fre (FileSystemI ': r) m ~> Fre r m
+runDummyFS = interpret \case
+    Mkdir path -> sendIns $ putStrLn $ "<runDummyFS> mkdir " <> path
+    WriteFS path content -> sendIns $ putStrLn $ "<runDummyFS> writeFS " <> path <> " : " <> content
+
+-- | Create directories according to the log-chunk structure and save one log in one file.
+saveLogChunk ::
+    forall es es' m.
+    ( LogChunkS <<| es
+    , LogI <| es'
+    , FileSystem (Fre es' m)
+    , Time (Fre es' m)
+    , Monad m
+    , ForallHFunctor es
+    ) =>
+    Hef (LogChunkS ': es) (Fre (LogI ': es') m) ~> Hef es (Fre (LogI ': es') m)
+saveLogChunk =
+    interpretReader ("./log_chunks/" :: FilePath)
+        . hoistHeftiaEffects flipFreer
+        . interpretLogChunk
+        . hoistHeftiaEffects flipFreer
+        . flipHeftia
+        . liftReader
+  where
+    interpretLogChunk ::
+        Hef (LogChunkS ': LocalS FilePath ': es) (Fre (LogI ': AskI FilePath ': es') m)
+            ~> Hef (LocalS FilePath ': es) (Fre (LogI ': AskI FilePath ': es') m)
+    interpretLogChunk =
+        interpretH \(LogChunk a) -> logChunk do
+            chunkBeginAt <- currentTime & raise2 & liftLowerH
+            local @FilePath (++ iso8601Show chunkBeginAt ++ "/") do
+                newLogChunkDir <- ask & liftLowerH
+                mkdir newLogChunkDir & raise2 & liftLowerH
+                a & hoistInterpose \(Log msg) -> do
+                    logAt <- currentTime & raise2
+                    saveDir <- ask
+                    log msg & raise2
+                    writeFS (saveDir ++ iso8601Show logAt ++ ".log") (show msg) & raise2
+
+logs :: (LogChunk m, Log m, IO <: m, Monad m) => m ()
+logs =
+    logChunk do
+        log "foo"
+        log "bar"
+        log "baz"
+        log "qux"
+
+        sendIns $ putStrLn "------"
+
+        logChunk do
+            log "hoge"
+            log "piyo"
+            log "fuga"
+            log "hogera"
+
+        sendIns $ putStrLn "------"
+
+        log "quux"
+        log "foobar"
+
+main :: IO ()
+main =
+    runFreerEffects
+        . logToIO
+        . timeToIO
+        . logWithTime
+        . runDummyFS
+        . subsume
+        . elaborated
+        . passthroughLogChunk
+        . saveLogChunk
+        . interpreted
+        . subsume
+        . runElaborate @_ @HeftiaChurchT @ExtensibleUnionH
+            (liftLower . limitLogChunk 2 |+: absurdUnionH)
+        $ logs
diff --git a/Example/Teletype/Main.hs b/Example/Teletype/Main.hs
new file mode 100644
--- /dev/null
+++ b/Example/Teletype/Main.hs
@@ -0,0 +1,47 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+{- |
+The original of this example can be found at polysemy.
+<https://hackage.haskell.org/package/polysemy>
+-}
+module Main where
+
+import Control.Effect.Class (Taggable, getTag, sendIns, tag, type (#), type (<:), type (@#), type (~>))
+import Control.Effect.Class.Machinery.TH (makeEffectF)
+import Control.Effect.Freer (Fre, interpose, interpret, runFreerEffects, untag, type (<|))
+import Data.Function ((&))
+
+class Teletype f where
+    readTTY :: f String
+    writeTTY :: String -> f ()
+
+makeEffectF ''Teletype
+
+teletypeToIO :: (IO <: Fre es m, Monad m) => Fre (TeletypeI ': es) m ~> Fre es m
+teletypeToIO = interpret \case
+    ReadTTY -> sendIns getLine
+    WriteTTY msg -> sendIns $ putStrLn msg
+
+data TTY1
+
+echo :: (Teletype (m @# TTY1), Monad m, Taggable m) => m ()
+echo = do
+    i <- readTTY & tag @TTY1
+    case i of
+        "" -> pure ()
+        _ -> (writeTTY i & tag @TTY1) >> echo
+
+strong :: (TeletypeI # TTY1 <| es, Monad m) => Fre es m ~> Fre es m
+strong =
+    interpose @(_ # TTY1) \e -> case getTag e of
+        ReadTTY -> readTTY & tag @TTY1
+        WriteTTY msg -> writeTTY (msg <> "!") & tag @TTY1
+
+main :: IO ()
+main = runFreerEffects $ do
+    sendIns $ putStrLn "Please enter something..."
+    teletypeToIO . untag @TTY1 . strong . strong $ echo
diff --git a/Example/Writer/Main.hs b/Example/Writer/Main.hs
new file mode 100644
--- /dev/null
+++ b/Example/Writer/Main.hs
@@ -0,0 +1,49 @@
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+module Main where
+
+import Control.Effect.Class (sendIns, type (~>))
+import Control.Effect.Class.Machinery.HFunctor (HFunctor)
+import Control.Effect.Class.Writer (Writer, censor, tell)
+import Control.Effect.Freer (runFreerEffects)
+import Control.Effect.Handler.Heftia.Writer (
+    elaborateWriterT,
+    elaborateWriterTransactionalT,
+    interpretTell,
+ )
+import Control.Effect.Heftia (Elaborator, Hef, runElaborate)
+import Data.Hefty.Union (absurdUnionH, (|+:))
+
+hello :: (Writer String m, Monad m) => m ()
+hello = do
+    tell "Hello"
+    tell " world!"
+
+censorHello :: (Writer String m, Monad m) => m ()
+censorHello =
+    censor
+        (\s -> if s == "Hello" then "Goodbye" else s)
+        hello
+
+main :: IO ()
+main = runFreerEffects do
+    (s :: String, _) <-
+        interpretTell
+            . runElaborate' (elaborateWriterT @String)
+            $ censorHello
+
+    (sTransactional :: String, _) <-
+        interpretTell
+            . runElaborate' (elaborateWriterTransactionalT @String)
+            $ censorHello
+
+    sendIns $ putStrLn $ "Normal: " <> s
+    sendIns $ putStrLn $ "Transactional: " <> sTransactional
+
+runElaborate' ::
+    (HFunctor e, Monad f) =>
+    Elaborator e f ->
+    Hef '[e] f ~> f
+runElaborate' f = runElaborate $ f |+: absurdUnionH
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/NOTICE b/NOTICE
new file mode 100644
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,7 @@
+NOTICE
+======
+
+Unless explicitly stated otherwise, all Source Code Forms
+(recursively, including under subdirectories) contained in the directory
+where this NOTICE file is located are subject to the terms of the
+Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,95 @@
+# Heftia
+Heftia, a composition of hefty trees and co-Yoneda, is a higher-order effects
+version of Freer.
+
+The paper
+* Casper Bach Poulsen and Cas van der Rest. 2023. Hefty Algebras: Modular
+    Elaboration of Higher-Order Algebraic Effects. Proc. ACM Program. Lang. 7,
+    POPL, Article 62 (January 2023), 31 pages. <https://doi.org/10.1145/3571255>
+
+inspires this library.
+Hefty trees, proposed by the above paper, are extensions of free monads,
+allowing for a straightforward treatment of higher-order effects.
+
+This library offers Heftia monads and Freer monads, encoded into data
+types in several ways to enable tuning in pursuit of high performance.
+
+Additionally, it's designed to operate as a handler system based
+on [`classy-effects`](https://github.com/sayo-hs/classy-effects), which aims to
+standardize and unify the definitions of effects in Haskell.
+
+Compared to existing Effect System libraries in Haskell that handle higher-order effects, this
+library's approach allows for a more effortless and flexible handling of higher-order effects. Here
+are some examples:
+
+* Two interpretations of the `censor` effect for Writer
+
+    Let's consider the following Writer effectful program:
+
+    ```hs
+    hello :: (Writer String m, Monad m) => m ()
+    hello = do
+        tell "Hello"
+        tell " world!"
+
+    censorHello :: (Writer String m, Monad m) => m ()
+    censorHello =
+        censor
+            (\s -> if s == "Hello" then "Goodbye" else s)
+            hello
+    ```
+
+    For `censorHello`, should the final written string be `"Goodbye world!"`? Or should it be `"Hello world!"`?
+    With Heftia, you can freely choose either behavior depending on which higher-order effect interpreter (which we call an elaborator) you use.
+
+    ```hs
+    main :: IO ()
+    main = runFreerEffects do
+        (s :: String, _) <-
+            interpretTell
+                . runElaborate' (elaborateWriterT @String)
+                $ censorHello
+
+        (sTransactional :: String, _) <-
+            interpretTell
+                . runElaborate' (elaborateWriterTransactionalT @String)
+                $ censorHello
+
+        sendIns $ putStrLn $ "Normal: " <> s
+        sendIns $ putStrLn $ "Transactional: " <> sTransactional
+    ```
+
+    Using the `elaborateWriterT` elaborator, you'll get "Goodbye world!", whereas with the `elaborateWriterTransactionalT` elaborator, you'll get "Hello world!".
+    For more details, please refer to the [complete code](https://github.com/sayo-hs/heftia/blob/master/heftia-effects/Example/Writer/Main.hs) and the [implementation of the elaborator](https://github.com/sayo-hs/heftia/blob/master/heftia-effects/src/Control/Effect/Handler/Heftia/Writer.hs).
+
+* Extracting Multi-shot Delimited Continuations
+
+    In handling higher-order effects, it's easy to work with multi-shot delimited continuations.
+    This enables an almost complete emulation of "Algebraic Effects and Handlers".
+    For more details, please refer to
+    [Example 3 - Delimited Continuation](<https://github.com/sayo-hs/heftia/blob/master/docs/examples/03%20Delimited%20Continuation.md>) .
+
+Furthermore, the structure of Heftia is theoretically straightforward, with ad-hoc elements being
+eliminated.
+
+Heftia is the second objective of the [Sayo Project](https://github.com/sayo-hs).
+
+## Documentation
+Examples with explanations can be found in the [docs/examples/](https://github.com/sayo-hs/heftia/tree/master/docs/examples) directory.
+
+## Future Plans
+* Benchmarking
+* Enriching the documentation
+* Completing missing definitions such as
+    * the Heftia monad transformer encoded in tree structure
+    * handlers for the `Accum`, `Coroutine`, `Fresh`, `Input`, `Output` effect classes
+
+    and others.
+
+## License
+The license is MPL 2.0. Please refer to the [NOTICE](https://github.com/sayo-hs/heftia/blob/master/NOTICE).
+Additionally, this README.md and the documents under the `docs`/`docs-ja` directory are licensed
+under CC BY-SA 4.0.
+
+## Your contributions are welcome!
+Please see [CONTRIBUTING.md](https://github.com/sayo-hs/heftia/blob/master/CONTRIBUTING.md).
diff --git a/heftia-effects.cabal b/heftia-effects.cabal
new file mode 100644
--- /dev/null
+++ b/heftia-effects.cabal
@@ -0,0 +1,150 @@
+cabal-version:      2.4
+name:               heftia-effects
+version:            0.1.0.0
+
+-- A short (one-line) description of the package.
+synopsis: Handlers for standard effects using Heftia.
+
+-- A longer description of the package.
+description:
+    This library provides interpreters based
+    on [Heftia](https://hackage.haskell.org/package/heftia) for the standard effect classes
+    compliant with [CEPs](https://github.com/sayo-hs/classy-effects/blob/master/CEPs/README.md),
+    offered by
+    the [classy-effects](https://hackage.haskell.org/package/classy-effects) package.
+
+-- A URL where users can report bugs.
+bug-reports: https://github.com/sayo-hs/heftia
+
+-- The license under which the package is released.
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Yamada Ryo <ymdfield@outlook.jp>
+maintainer:         Yamada Ryo <ymdfield@outlook.jp>
+
+-- A copyright notice.
+copyright: 2023 Yamada Ryo
+category: Control, Effect, Monads
+
+extra-source-files:
+    ChangeLog.md
+    NOTICE
+    README.md
+
+tested-with:
+    GHC == 9.2.8
+
+source-repository head
+    type: git
+    location: https://github.com/sayo-hs/heftia
+    tag: v0.1.0
+    subdir: heftia-effects
+
+common common-base
+    ghc-options:      -Wall
+    default-language: GHC2021
+
+    default-extensions:
+        LambdaCase,
+        DerivingStrategies,
+        DataKinds,
+        TypeFamilies,
+        BlockArguments,
+        FunctionalDependencies,
+        RecordWildCards,
+        DefaultSignatures,
+        PatternSynonyms
+
+library
+    import: common-base
+
+    exposed-modules:
+        Control.Effect.Handler.Heftia.Reader
+        Control.Effect.Handler.Heftia.Writer
+        Control.Effect.Handler.Heftia.State
+        Control.Effect.Handler.Heftia.Except
+        Control.Effect.Handler.Heftia.Provider
+
+    -- Modules included in this executable, other than Main.
+    -- other-modules:
+
+    -- LANGUAGE extensions used by modules in this package.
+    -- other-extensions:
+    build-depends:
+        base                          ^>= 4.16.4.0,
+        heftia                        ^>= 0.1,
+        classy-effects                ^>= 0.1,
+        mtl                           ^>= 2.2.2,
+        transformers                  ^>= 0.5.6,
+        extensible                    ^>= 0.9,
+
+    hs-source-dirs:   src
+
+test-suite test
+    import: common-base
+
+    main-is: Driver.hs
+    hs-source-dirs: test
+    build-depends:
+        heftia-effects,
+        classy-effects,
+        heftia,
+        base,
+        tasty                         ^>= 1.4,
+        tasty-hunit                   ^>= 0.10,
+
+    build-tool-depends:
+        tasty-discover:tasty-discover
+
+    type: exitcode-stdio-1.0
+
+
+executable Teletype
+    import: common-base
+
+    main-is: Main.hs
+    hs-source-dirs: Example/Teletype
+    build-depends:
+        classy-effects,
+        heftia,
+        heftia-effects,
+        base,
+
+executable Logging
+    import: common-base
+
+    main-is: Main.hs
+    hs-source-dirs: Example/Logging
+    ghc-options: -Wall -fplugin GHC.TypeLits.KnownNat.Solver
+    build-depends:
+        classy-effects,
+        heftia,
+        heftia-effects,
+        base,
+        text ^>= 1.2.5,
+        time ^>= 1.11.1,
+        loglevel ^>= 0.1.0,
+        extra ^>= 1.7.14,
+        ghc-typelits-knownnat ^>= 0.7,
+
+executable Continuation
+    import: common-base
+
+    main-is: Main.hs
+    hs-source-dirs: Example/Continuation
+    build-depends:
+        classy-effects,
+        heftia,
+        heftia-effects,
+        base,
+
+executable Writer
+    import: common-base
+
+    main-is: Main.hs
+    hs-source-dirs: Example/Writer
+    build-depends:
+        classy-effects,
+        heftia,
+        heftia-effects,
+        base,
diff --git a/src/Control/Effect/Handler/Heftia/Except.hs b/src/Control/Effect/Handler/Heftia/Except.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Effect/Handler/Heftia/Except.hs
@@ -0,0 +1,52 @@
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+{- |
+Copyright   :  (c) 2023 Yamada Ryo
+License     :  MPL-2.0 (see the file LICENSE)
+Maintainer  :  ymdfield@outlook.jp
+Stability   :  experimental
+Portability :  portable
+
+Interpreter and elaborator for the t'Control.Effect.Class.Except.Except' effect class.
+-}
+module Control.Effect.Handler.Heftia.Except where
+
+import Control.Effect.Class (type (~>))
+import Control.Effect.Class.Except (CatchS (Catch), ThrowI (Throw))
+import Control.Effect.Freer (Fre, interposeK, interposeT, interpretK, interpretT, type (<|))
+import Control.Monad.Trans.Except (ExceptT (ExceptT), runExceptT, throwE)
+import Data.Function ((&))
+
+-- | Elaborate the 'Catch' effect using the 'ExceptT' monad transformer.
+elaborateExceptT ::
+    (ThrowI e <| es, Monad m) =>
+    CatchS e (Fre es m) ~> Fre es m
+elaborateExceptT (Catch action (hdl :: e -> Fre es m a)) = do
+    r <- runExceptT $ action & interposeT \(Throw (e :: e)) -> throwE e
+    case r of
+        Left e -> hdl e
+        Right a -> pure a
+
+{- |
+Elaborate the 'Catch' effect using the t'Control.Monad.Trans.Cont.ContT' continuation monad
+transformer.
+-}
+elaborateExceptK ::
+    (ThrowI e <| es, Monad m) =>
+    CatchS e (Fre es m) ~> Fre es m
+elaborateExceptK (Catch action (hdl :: e -> Fre es m a)) =
+    action & interposeK pure \_ (Throw (e :: e)) -> hdl e
+
+-- | Interpret the 'Throw' effect using the 'ExceptT' monad transformer.
+interpretThrowT :: Monad m => Fre (ThrowI e ': es) m ~> ExceptT e (Fre es m)
+interpretThrowT = interpretT \(Throw e) -> throwE e
+{-# INLINE interpretThrowT #-}
+
+{- |
+Interpret the 'Throw' effect using the t'Control.Monad.Trans.Cont.ContT' continuation monad
+transformer.
+-}
+interpretThrowK :: Monad m => Fre (ThrowI e ': es) m a -> Fre es m (Either e a)
+interpretThrowK = interpretK (pure . Right) \_ (Throw e) -> pure $ Left e
diff --git a/src/Control/Effect/Handler/Heftia/Provider.hs b/src/Control/Effect/Handler/Heftia/Provider.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Effect/Handler/Heftia/Provider.hs
@@ -0,0 +1,39 @@
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+{- |
+Copyright   :  (c) 2023 Yamada Ryo
+License     :  MPL-2.0 (see the file LICENSE)
+Maintainer  :  ymdfield@outlook.jp
+Stability   :  experimental
+Portability :  portable
+
+Elaborator for the t'Control.Effect.Class.Provider.Provider' effect class.
+-}
+module Control.Effect.Handler.Heftia.Provider where
+
+import Control.Effect.Class (type (~>))
+import Control.Effect.Class.Provider (ProviderS (Provide))
+import Control.Effect.Heftia (Elaborator)
+import Control.Monad.Trans (MonadTrans, lift)
+
+-- | Elaborate the t'Control.Effect.Class.Provider.Provider' effect using the given interpreter.
+elaborateProvider ::
+    (c h, e h) =>
+    (f ~> h) ->
+    (forall x. i -> h x -> f (g x)) ->
+    Elaborator (ProviderS c e i g) f
+elaborateProvider iLower run (Provide i a) = run i $ a iLower
+{-# INLINE elaborateProvider #-}
+
+{- |
+Elaborate the t'Control.Effect.Class.Provider.Provider' effect using the given interpreter for some
+monad transformer.
+-}
+elaborateProviderT ::
+    (Monad m, MonadTrans t, c (t m), e (t m)) =>
+    (forall x. i -> t m x -> m (g x)) ->
+    Elaborator (ProviderS c e i g) m
+elaborateProviderT = elaborateProvider lift
+{-# INLINE elaborateProviderT #-}
diff --git a/src/Control/Effect/Handler/Heftia/Reader.hs b/src/Control/Effect/Handler/Heftia/Reader.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Effect/Handler/Heftia/Reader.hs
@@ -0,0 +1,50 @@
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+{- |
+Copyright   :  (c) 2023 Yamada Ryo
+License     :  MPL-2.0 (see the file LICENSE)
+Maintainer  :  ymdfield@outlook.jp
+Stability   :  experimental
+Portability :  portable
+
+Interpreter and elaborator for the t'Control.Effect.Class.Reader.Reader' effect class.
+-}
+module Control.Effect.Handler.Heftia.Reader where
+
+import Control.Effect.Class (type (~>))
+import Control.Effect.Class.Reader (AskI (Ask), LocalS (Local), ask)
+import Control.Effect.Freer (Fre, interpose, interpret, raise, type (<|))
+import Control.Effect.Heftia (ForallHFunctor, Hef, hoistHeftiaEffects, hoistInterpose, interpretH, raiseH)
+import Data.Function ((&))
+
+interpretReader ::
+    (Monad m, ForallHFunctor es) =>
+    r ->
+    Hef (LocalS r ': es) (Fre (AskI r ': es') m) ~> Hef es (Fre es' m)
+interpretReader r = hoistHeftiaEffects (interpretAsk r) . interpretReaderH
+{-# INLINE interpretReader #-}
+
+interpretReaderH ::
+    (AskI r <| es', ForallHFunctor es, Monad m) =>
+    Hef (LocalS r ': es) (Fre es' m) ~> Hef es (Fre es' m)
+interpretReaderH =
+    interpretH \(Local (f :: r -> r) a) ->
+        a & hoistInterpose @(AskI r) \Ask -> f <$> ask
+
+elaborateReader ::
+    (AskI r <| es, Monad m) =>
+    LocalS r (Fre es m) ~> Fre es m
+elaborateReader (Local (f :: r -> r) a) =
+    a & interpose @(AskI r) \Ask -> f <$> ask
+
+interpretAsk :: Monad m => r -> Fre (AskI r ': es) m ~> Fre es m
+interpretAsk r = interpret \Ask -> pure r
+{-# INLINE interpretAsk #-}
+
+liftReader ::
+    (ForallHFunctor es, Monad m) =>
+    Hef es (Fre es' m) ~> Hef (LocalS FilePath ': es) (Fre (AskI FilePath ': es') m)
+liftReader = raiseH . hoistHeftiaEffects raise
+{-# INLINE liftReader #-}
diff --git a/src/Control/Effect/Handler/Heftia/State.hs b/src/Control/Effect/Handler/Heftia/State.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Effect/Handler/Heftia/State.hs
@@ -0,0 +1,42 @@
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+{- |
+Copyright   :  (c) 2023 Yamada Ryo
+License     :  MPL-2.0 (see the file LICENSE)
+Maintainer  :  ymdfield@outlook.jp
+Stability   :  experimental
+Portability :  portable
+
+Interpreter for the t'Control.Effect.Class.State.State' effect class.
+-}
+module Control.Effect.Handler.Heftia.State where
+
+import Control.Effect.Class (type (~>))
+import Control.Effect.Class.State (StateI (Get, Put))
+import Control.Effect.Freer (Fre, interpretT)
+import Control.Monad.State (StateT)
+import Control.Monad.Trans.State (runStateT)
+import Control.Monad.Trans.State qualified as T
+import Data.Tuple (swap)
+
+-- | Interpret the 'Get'/'Put' effects using the 'StateT' monad transformer.
+interpretState :: forall s es m a. Monad m => s -> Fre (StateI s ': es) m a -> Fre es m (s, a)
+interpretState s a = swap <$> runStateT (interpretStateT a) s
+{-# INLINE interpretState #-}
+
+evalState :: forall s es m a. Monad m => s -> Fre (StateI s ': es) m a -> Fre es m a
+evalState s a = snd <$> interpretState s a
+{-# INLINE evalState #-}
+
+execState :: forall s es m a. Monad m => s -> Fre (StateI s ': es) m a -> Fre es m s
+execState s a = fst <$> interpretState s a
+{-# INLINE execState #-}
+
+-- | Interpret the 'Get'/'Put' effects using the 'StateT' monad transformer.
+interpretStateT :: forall s es m. Monad m => Fre (StateI s ': es) m ~> StateT s (Fre es m)
+interpretStateT = interpretT \case
+    Get -> T.get
+    Put s -> T.put s
+{-# INLINE interpretStateT #-}
diff --git a/src/Control/Effect/Handler/Heftia/Writer.hs b/src/Control/Effect/Handler/Heftia/Writer.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Effect/Handler/Heftia/Writer.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+{- |
+Copyright   :  (c) 2023 Yamada Ryo
+License     :  MPL-2.0 (see the file LICENSE)
+Maintainer  :  ymdfield@outlook.jp
+Stability   :  experimental
+Portability :  portable
+
+Interpreter and elaborator for the t'Control.Effect.Class.Writer.Writer' effect class.
+See [README.md](https://github.com/sayo-hs/heftia/blob/master/README.md).
+-}
+module Control.Effect.Handler.Heftia.Writer where
+
+import Control.Effect.Class (type (~>))
+import Control.Effect.Class.Writer (Tell (tell), TellI (Tell), WriterS (Censor, Listen))
+import Control.Effect.Freer (Fre, intercept, interposeT, interpretK, interpretT, type (<|))
+import Control.Monad.Trans.Writer.CPS (WriterT, runWriterT)
+import Control.Monad.Trans.Writer.CPS qualified as T
+import Data.Function ((&))
+import Data.Tuple (swap)
+
+elaborateWriterT ::
+    forall w m es.
+    (Monad m, Monoid w, TellI w <| es) =>
+    WriterS w (Fre es m) ~> Fre es m
+elaborateWriterT = \case
+    Listen m -> listenT m
+    Censor f m -> m & intercept @(TellI w) \(Tell w) -> Tell $ f w
+
+elaborateWriterTransactionalT ::
+    forall w m es.
+    (Monad m, Monoid w, TellI w <| es) =>
+    WriterS w (Fre es m) ~> Fre es m
+elaborateWriterTransactionalT = \case
+    Listen m -> listenT m
+    Censor f m -> do
+        (a, w) <- confiscateT m
+        tell $ f w
+        pure a
+
+listenT ::
+    (Monoid w, Monad m, TellI w <| es) =>
+    Fre es m a ->
+    Fre es m (a, w)
+listenT m = do
+    (a, w) <- confiscateT m
+    tell w
+    pure (a, w)
+{-# INLINE listenT #-}
+
+confiscateT ::
+    forall w m es a.
+    (Monoid w, Monad m, TellI w <| es) =>
+    Fre es m a ->
+    Fre es m (a, w)
+confiscateT = runWriterT . interposeT @(TellI w) \(Tell w) -> T.tell w
+{-# INLINE confiscateT #-}
+
+interpretTell :: (Monad m, Monoid w) => Fre (TellI w ': es) m a -> Fre es m (w, a)
+interpretTell = fmap swap . runWriterT . interpretTellT
+{-# INLINE interpretTell #-}
+
+interpretTellT :: (Monad m, Monoid w) => Fre (TellI w ': es) m a -> WriterT w (Fre es m) a
+interpretTellT = interpretT \(Tell w) -> T.tell w
+{-# INLINE interpretTellT #-}
+
+interpretTellK :: (Monad m, Monoid w) => Fre (TellI w ': es) m a -> Fre es m (w, a)
+interpretTellK =
+    interpretK (pure . (mempty,)) \k (Tell w) -> do
+        (w', r) <- k ()
+        pure (w <> w', r)
diff --git a/test/Driver.hs b/test/Driver.hs
new file mode 100644
--- /dev/null
+++ b/test/Driver.hs
@@ -0,0 +1,5 @@
+{-# OPTIONS_GHC -F -pgmF tasty-discover #-}
+
+-- This Source Code Form is subject to the terms of the Mozilla Public
+-- License, v. 2.0. If a copy of the MPL was not distributed with this
+-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
