diff --git a/Control/Comonad/Env.hs b/Control/Comonad/Env.hs
new file mode 100644
--- /dev/null
+++ b/Control/Comonad/Env.hs
@@ -0,0 +1,37 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Comonad.Env
+-- Copyright   :  (C) 2008-2011 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  experimental
+-- Portability :  non-portable (fundeps, MPTCs)
+--
+-- The Env comonad (aka the Coreader, Environment, or Product comonad)
+-- 
+-- A co-Kleisli arrow in the Env comonad is isomorphic to a Kleisli arrow
+-- in the reader monad.
+--
+-- (a -> e -> m) ~ (a, e) -> m ~ Env e a -> m
+----------------------------------------------------------------------------
+module Control.Comonad.Env ( 
+  -- * ComonadEnv class
+    ComonadEnv(..)
+  , asks
+  -- * The Env comonad
+  , Env
+  , env
+  , runEnv
+  -- * The EnvT comonad transformer
+  , EnvT(..)
+  , runEnvT
+  -- * Re-exported modules
+  , module Control.Comonad
+  , module Control.Comonad.Trans.Class
+  ) where
+
+import Control.Comonad
+import Control.Comonad.Env.Class (ComonadEnv(..), asks)
+import Control.Comonad.Trans.Class
+import Control.Comonad.Trans.Env (Env, env, runEnv, EnvT(..), runEnvT)
diff --git a/Control/Comonad/Env/Class.hs b/Control/Comonad/Env/Class.hs
new file mode 100644
--- /dev/null
+++ b/Control/Comonad/Env/Class.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Comonad.Env.Class
+-- Copyright   :  (C) 2008-2011 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  experimental
+-- Portability :  non-portable (fundeps, MPTCs)
+----------------------------------------------------------------------------
+module Control.Comonad.Env.Class 
+  ( ComonadEnv(..)
+  , asks
+  ) where
+
+import Control.Comonad
+import Control.Comonad.Trans.Class
+import qualified Control.Comonad.Trans.Env as T
+-- import qualified Control.Comonad.Trans.Pointer as P
+import Control.Comonad.Trans.Store
+import Control.Comonad.Trans.Discont
+import Control.Comonad.Trans.Identity 
+-- import Data.Ix
+
+class Comonad w => ComonadEnv e w | w -> e where
+  ask :: w a -> e
+
+asks :: ComonadEnv e w => (e -> e') -> w a -> e'
+asks f wa = f (ask wa)
+{-# INLINE asks #-}
+
+instance Comonad w => ComonadEnv e (T.EnvT e w) where
+  ask = T.ask
+
+instance ComonadEnv e ((,)e) where
+  ask = fst
+
+lowerAsk :: (ComonadEnv e w, ComonadTrans t) => t w a -> e
+lowerAsk = ask . lower
+{-# INLINE lowerAsk #-}
+
+-- All of these require UndecidableInstances because they do not satisfy the coverage condition
+
+-- instance (ComonadEnv e w, Ix i) => ComonadEnv e (PointerT i w) where
+--   ask = lowerAsk
+
+instance ComonadEnv e w => ComonadEnv e (StoreT t w) where
+  ask = lowerAsk
+
+instance ComonadEnv e w => ComonadEnv e (DiscontT t w) where
+  ask = lowerAsk
+
+instance ComonadEnv e w => ComonadEnv e (IdentityT w) where
+  ask = lowerAsk
diff --git a/Control/Comonad/Store.hs b/Control/Comonad/Store.hs
new file mode 100644
--- /dev/null
+++ b/Control/Comonad/Store.hs
@@ -0,0 +1,31 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Comonad.Store
+-- Copyright   :  (C) 2008-2011 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  experimental
+-- Portability :  non-portable (fundeps, MPTCs)
+----------------------------------------------------------------------------
+module Control.Comonad.Store ( 
+  -- * ComonadStore class
+    ComonadStore(..)
+  , gets
+  , experiment
+  -- * The Store comonad
+  , Store
+  , store
+  , runStore
+  -- * The StoreT comonad transformer
+  , StoreT(..)
+  , runStoreT
+  -- * Re-exported modules
+  , module Control.Comonad
+  , module Control.Comonad.Trans.Class
+  ) where
+
+import Control.Comonad
+import Control.Comonad.Store.Class (ComonadStore(..), gets, experiment)
+import Control.Comonad.Trans.Class
+import Control.Comonad.Trans.Store (Store, store, runStore, StoreT(..), runStoreT)
diff --git a/Control/Comonad/Store/Class.hs b/Control/Comonad/Store/Class.hs
new file mode 100644
--- /dev/null
+++ b/Control/Comonad/Store/Class.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Comonad.Store.Class
+-- Copyright   :  (C) 2008-2011 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  experimental
+-- Portability :  non-portable (fundeps, MPTCs)
+----------------------------------------------------------------------------
+module Control.Comonad.Store.Class 
+  ( ComonadStore(..)
+  , gets
+  , experiment
+  ) where
+
+import Control.Comonad
+import Control.Comonad.Trans.Class
+import qualified Control.Comonad.Trans.Store as T
+import Control.Comonad.Trans.Discont
+import Control.Comonad.Trans.Env
+import Control.Comonad.Trans.Identity 
+import Control.Comonad.Trans.Traced
+import Data.Monoid
+-- import qualified Control.Comonad.Trans.Pointer as P
+-- import Data.Ix
+
+class Comonad w => ComonadStore s w | w -> s where
+  get :: w a -> s
+  put :: s -> w a -> a
+  modify :: (s -> s) -> w a -> a
+
+  modify f wa = put (f (get wa)) wa
+
+gets :: ComonadStore s w => (s -> t) -> w a -> t
+gets f wa = f (get wa)
+{-# INLINE gets #-}
+
+experiment :: (ComonadStore s w, Functor f) => f (s -> s) -> w a -> f a
+experiment ff wa = fmap (`modify` wa) ff
+{-# INLINE experiment #-}
+
+instance Comonad w => ComonadStore s (T.StoreT s w) where
+  get = T.get
+  put = T.put
+  modify = T.modify
+
+{-
+instance (Comonad w, Ix i) => ComonadStore i (P.PointerT i w) where
+  get = P.get
+  put = P.put
+  modify = P.modify
+-}
+
+-- All of these require UndecidableInstances because they do not satisfy the coverage condition
+
+lowerGet :: (ComonadTrans t, ComonadStore s w) => t w a -> s
+lowerGet = get . lower
+{-# INLINE lowerGet #-}
+
+lowerPut :: (ComonadTrans t, ComonadStore s w) => s -> t w a -> a
+lowerPut s = put s . lower
+{-# INLINE lowerPut #-}
+
+lowerModify :: (ComonadTrans t, ComonadStore s w) => (s -> s) -> t w a -> a
+lowerModify f = modify f . lower
+{-# INLINE lowerModify #-}
+
+instance ComonadStore s w => ComonadStore s (DiscontT k w) where
+  get = lowerGet
+  put = lowerPut
+  modify = lowerModify
+
+instance ComonadStore s w => ComonadStore s (IdentityT w) where
+  get = lowerGet
+  put = lowerPut
+  modify = lowerModify
+
+instance ComonadStore s w => ComonadStore s (EnvT e w) where
+  get = lowerGet
+  put = lowerPut
+  modify = lowerModify
+
+instance (ComonadStore s w, Monoid m) => ComonadStore s (TracedT m w) where
+  get = lowerGet
+  put = lowerPut
+  modify = lowerModify
diff --git a/Control/Comonad/Traced.hs b/Control/Comonad/Traced.hs
new file mode 100644
--- /dev/null
+++ b/Control/Comonad/Traced.hs
@@ -0,0 +1,29 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Comonad.Traced
+-- Copyright   :  (C) 2008-2011 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  experimental
+-- Portability :  non-portable (fundeps, MPTCs)
+----------------------------------------------------------------------------
+module Control.Comonad.Traced ( 
+  -- * ComonadTraced class
+    ComonadTraced(..)
+  , traces
+  -- * The Traced comonad
+  , Traced
+  , traced
+  , runTraced
+  -- * The TracedT comonad transformer
+  , TracedT(..)
+  -- * Re-exported modules
+  , module Control.Comonad
+  , module Control.Comonad.Trans.Class
+  ) where
+
+import Control.Comonad
+import Control.Comonad.Traced.Class (ComonadTraced(..), traces)
+import Control.Comonad.Trans.Class
+import Control.Comonad.Trans.Traced (Traced, traced, runTraced, TracedT(..), runTracedT)
diff --git a/Control/Comonad/Traced/Class.hs b/Control/Comonad/Traced/Class.hs
new file mode 100644
--- /dev/null
+++ b/Control/Comonad/Traced/Class.hs
@@ -0,0 +1,52 @@
+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Control.Comonad.Traced.Class
+-- Copyright   :  (C) 2008-2011 Edward Kmett
+-- License     :  BSD-style (see the file LICENSE)
+--
+-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
+-- Stability   :  experimental
+-- Portability :  non-portable (fundeps, MPTCs)
+----------------------------------------------------------------------------
+module Control.Comonad.Traced.Class 
+  ( ComonadTraced(..)
+  , traces
+  ) where
+
+import Control.Comonad
+import Control.Comonad.Trans.Class
+import qualified Control.Comonad.Trans.Traced as T
+import Control.Comonad.Trans.Discont
+import Control.Comonad.Trans.Env
+import Control.Comonad.Trans.Store
+import Control.Comonad.Trans.Identity 
+import Data.Monoid
+
+class Comonad w => ComonadTraced m w | w -> m where
+  trace :: m -> w a -> a
+
+traces :: ComonadTraced m w => (a -> m) -> w a -> a
+traces f wa = trace (f (extract wa)) wa
+{-# INLINE traces #-}
+
+instance (Comonad w, Monoid m) => ComonadTraced m (T.TracedT m w) where
+  trace = T.trace
+
+lowerTrace :: (ComonadTrans t, ComonadTraced m w) => m -> t w a -> a
+lowerTrace m = trace m . lower
+{-# INLINE lowerTrace #-}
+
+-- All of these require UndecidableInstances because they do not satisfy the coverage condition
+
+instance ComonadTraced m w => ComonadTraced m (DiscontT k w) where
+  trace = lowerTrace
+
+instance ComonadTraced m w => ComonadTraced m (IdentityT w) where
+  trace = lowerTrace
+
+instance ComonadTraced m w => ComonadTraced m (EnvT e w) where
+  trace = lowerTrace
+
+instance ComonadTraced m w => ComonadTraced m (StoreT s w) where
+  trace = lowerTrace
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright 2008-2011 Edward Kmett
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,7 @@
+#!/usr/bin/runhaskell
+> module Main (main) where
+
+> import Distribution.Simple
+
+> main :: IO ()
+> main = defaultMain
diff --git a/comonads-fd.cabal b/comonads-fd.cabal
new file mode 100644
--- /dev/null
+++ b/comonads-fd.cabal
@@ -0,0 +1,31 @@
+name:          comonads-fd
+category:      Control, Comonads
+version:       0.1.0
+license:       BSD3
+cabal-version: >= 1.2
+license-file:  LICENSE
+author:        Edward A. Kmett
+maintainer:    Edward A. Kmett <ekmett@gmail.com>
+stability:     experimental
+homepage:      http://comonad.com/reader/
+copyright:     Copyright (C) 2008-2011 Edward A. Kmett
+synopsis:      Comonad transformers using functional dependencies.
+description:   Comonad transformers using functional dependencies.
+build-type:    Simple
+
+library
+  build-depends: 
+    base > 4 && < 5,
+    transformers >= 0.2.0 && < 0.3,
+    comonad >= 0.1 && < 0.2,
+    comonad-transformers >= 0.1 && < 0.2
+
+  exposed-modules:
+    Control.Comonad.Env
+    Control.Comonad.Env.Class
+    Control.Comonad.Store
+    Control.Comonad.Store.Class
+    Control.Comonad.Traced
+    Control.Comonad.Traced.Class
+
+  ghc-options:      -Wall 
