diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for free-listt
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2023 Manuel Bärenz
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/free-listt.cabal b/free-listt.cabal
new file mode 100644
--- /dev/null
+++ b/free-listt.cabal
@@ -0,0 +1,143 @@
+cabal-version:      3.0
+-- The cabal-version field refers to the version of the .cabal specification,
+-- and can be different from the cabal-install (the tool) version and the
+-- Cabal (the library) version you are using. As such, the Cabal (the library)
+-- version used must be equal or greater than the version stated in this field.
+-- Starting from the specification version 2.2, the cabal-version field must be
+-- the first thing in the cabal file.
+
+-- Initial package description 'free-listt' generated by
+-- 'cabal init'. For further documentation, see:
+--   http://haskell.org/cabal/users-guide/
+--
+-- The name of the package.
+name:               free-listt
+
+-- The package version.
+-- See the Haskell package versioning policy (PVP) for standards
+-- guiding when and how versions should be incremented.
+-- https://pvp.haskell.org
+-- PVP summary:     +-+------- breaking API changes
+--                  | | +----- non-breaking API additions
+--                  | | | +--- code changes with no API change
+version:            0.1.0.0
+
+-- A short (one-line) description of the package.
+synopsis: Lawful list and set monad transformers based on free monads
+
+-- A longer description of the package.
+description:
+    This package provides a lawful @ListT@ implementation based on free monads.
+    It also provides an _Applicative_ list transformer, which is a lawful @Applicative@,
+    and isomorphic to the old @ListT@.
+
+
+-- The license under which the package is released.
+license:            MIT
+
+-- The file containing the license text.
+license-file:       LICENSE
+
+-- The package author(s).
+author:             Manuel Bärenz
+
+-- An email address to which users can send suggestions, bug reports, and patches.
+maintainer:         programming@manuelbaerenz.de
+
+-- A copyright notice.
+-- copyright:
+category:           Control
+build-type:         Simple
+
+-- Extra doc files to be distributed with the package, such as a CHANGELOG or a README.
+extra-doc-files:    CHANGELOG.md
+
+-- Extra source files to be distributed with the package, such as examples, or a tutorial module.
+-- extra-source-files:
+
+tested-with:
+  GHC == 8.10.7
+  GHC == 9.0.2
+  GHC == 9.2.8
+  GHC == 9.4.8
+  GHC == 9.6.3
+  GHC == 9.8.1
+
+source-repository head
+  type:     git
+  location: https://github.com/turion/free-listt.git
+
+common warnings
+    ghc-options: -Wall
+
+library
+    -- Import common warning flags.
+    import:           warnings
+
+    -- Modules exported by the library.
+    exposed-modules:
+        Control.Applicative.Trans.List
+        Control.Monad.Trans.List
+
+    -- Modules included in this library but not exported.
+    other-modules:
+
+    default-extensions:
+        ApplicativeDo,
+        DeriveFunctor,
+        DerivingStrategies,
+        DerivingVia,
+        ImportQualifiedPost,
+        GeneralizedNewtypeDeriving,
+        TupleSections
+
+    -- Other library packages from which modules are imported.
+    build-depends:    base >=4.14.3.0 && < 4.20
+                    , free >=5.1.3 && < 5.3
+                    , transformers ^>= 0.6
+                    , mtl ^>= 2.3
+                    , exceptions ^>= 0.10
+
+    -- Directories containing source files.
+    hs-source-dirs:   src
+
+    -- Base language which the package is written in.
+    default-language: Haskell2010
+
+    ghc-options:  -W
+
+    if flag(dev)
+        ghc-options: -Werror
+
+
+test-suite free-listt-test
+    -- Import common warning flags.
+    import:           warnings
+
+    -- Base language which the package is written in.
+    default-language: Haskell2010
+
+    -- Modules included in this executable, other than Main.
+    -- other-modules:
+
+    -- LANGUAGE extensions used by modules in this package.
+    -- other-extensions:
+
+    -- The interface type and version of the test suite.
+    type:             exitcode-stdio-1.0
+
+    -- Directories containing source files.
+    hs-source-dirs:   test
+
+    -- The entrypoint to the test suite.
+    main-is:          Main.hs
+
+    -- Test dependencies.
+    build-depends:
+        base,
+        free-listt
+
+flag dev
+    description: Enable warnings as errors. Active on ci.
+    default: False
+    manual: True
diff --git a/src/Control/Applicative/Trans/List.hs b/src/Control/Applicative/Trans/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Applicative/Trans/List.hs
@@ -0,0 +1,17 @@
+-- | The applicative list transformer
+module Control.Applicative.Trans.List where
+
+-- base
+import Control.Applicative (Alternative)
+import Data.Functor.Compose
+
+{- | The 'Applicative' list transformer.
+
+This is isomorphic to the "old" @ListT@ transformer.
+It is not a monad, but a lawful 'Applicative'.
+-}
+newtype ListT f a = ListT {runListT :: f [a]}
+  deriving (Functor)
+  deriving
+    (Applicative, Alternative)
+    via (Compose f [])
diff --git a/src/Control/Monad/Trans/List.hs b/src/Control/Monad/Trans/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Trans/List.hs
@@ -0,0 +1,73 @@
+-- | Free list monad transformer
+module Control.Monad.Trans.List where
+
+-- base
+import Control.Applicative
+import Control.Monad
+import Control.Monad.IO.Class
+import Data.Functor.Classes
+
+-- transformers
+import Control.Monad.Trans.Class
+
+-- mtl
+import Control.Monad.Error.Class
+import Control.Monad.RWS (MonadRWS, MonadReader, MonadState)
+import Control.Monad.Writer
+
+-- exceptions
+import Control.Monad.Catch (MonadCatch, MonadThrow)
+
+-- free
+import Control.Monad.Trans.Free
+
+-- free-listt
+import Control.Applicative.Trans.List qualified as Applicative
+
+{- | The free list monad transformer.
+
+It is implemented as a rose tree (see https://en.wikipedia.org/wiki/Rose_tree)
+of computations in @m@.
+-}
+newtype ListT m a = ListT {getListT :: FreeT [] m a}
+  deriving
+    ( Functor
+    , Applicative
+    , Monad
+    , Alternative
+    , MonadPlus
+    , MonadIO
+    , MonadFail
+    , MonadTrans
+    , Eq1
+    , Ord1
+    , Read1
+    , Show1
+    , Eq
+    , Ord
+    , Read
+    , Show
+    , MonadError e
+    , MonadState s
+    , MonadReader r
+    , MonadRWS r w s
+    , MonadWriter w
+    , MonadCatch
+    , MonadThrow
+    )
+
+-- | Flatten all layers of computations to a single one.
+flatten :: (Monad m) => ListT m a -> Applicative.ListT m a
+flatten = Applicative.ListT . runListT
+
+-- | Like 'flatten', but remove the 'Applicative.ListT' wrapper.
+runListT :: (Monad m) => ListT m a -> m [a]
+runListT = iterT (fmap concat . sequence) . fmap pure . getListT
+
+-- | Construct a 'ListT' from an effectful list (a single layer).
+listT :: (Monad m) => m [a] -> ListT m a
+listT = ListT . FreeT . fmap (Free . fmap pure)
+
+-- | Construct a 'ListT' from a single effectful value.
+singleton :: (Functor m) => m a -> ListT m a
+singleton = ListT . FreeT . fmap Pure
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,6 @@
+module Main (main) where
+
+main :: IO ()
+main = putStrLn "Test suite not yet implemented."
+
+-- all laws, including some version of alternative
