diff --git a/Control/Monad/Free.hs b/Control/Monad/Free.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Free.hs
@@ -0,0 +1,26 @@
+module Control.Monad.Free (FreeT(..)) where
+
+import Control.Applicative
+import Control.Monad (liftM)
+import Control.Monad.Trans
+
+{- | @FreeT f@ is a monad transformer for free monads over a functor @f@. 
+-}
+newtype FreeT f m a = FreeT { runFreeT :: m (Either a (f (FreeT f m a))) }
+
+editEither l r = either (Left . l) (Right . r)
+conj f = FreeT . f . runFreeT
+
+instance (Functor f, Functor m) => Functor (FreeT f m) where
+    fmap f = conj $ fmap (editEither f ((fmap.fmap) f))
+
+instance (Functor f, Monad m) => Monad (FreeT f m) where
+    return = FreeT . return . Left
+    m >>= f = FreeT $ do
+        r <- runFreeT m
+        case r of
+             Left x   -> runFreeT $ f x
+             Right xc -> return . Right $ fmap (>>= f) xc
+
+instance (Functor f) => MonadTrans (FreeT f) where
+    lift = FreeT . liftM Left
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/control-monad-free.cabal b/control-monad-free.cabal
new file mode 100644
--- /dev/null
+++ b/control-monad-free.cabal
@@ -0,0 +1,13 @@
+Name: control-monad-free
+Description:
+    A monad transformer for free monads.
+Version: 0.1
+Stability: experimental
+Synopsis: A monad transformer for free monads.
+License: PublicDomain
+Category: Control
+Author: Luke Palmer
+Maintainer: lrpalmer@gmail.com
+Build-Type: Simple
+Build-Depends: base, mtl
+Exposed-Modules: Control.Monad.Free
