diff --git a/haskus-utils-variant.cabal b/haskus-utils-variant.cabal
--- a/haskus-utils-variant.cabal
+++ b/haskus-utils-variant.cabal
@@ -1,16 +1,16 @@
 cabal-version: >=1.20
 name: haskus-utils-variant
-version: 2.0
+version: 2.0.1
 license: BSD3
 license-file: LICENSE
 copyright: Sylvain Henry 2018
 maintainer: sylvain@haskus.fr
 author: Sylvain Henry
 homepage: http://www.haskus.org
-synopsis: Haskus utility modules
+synopsis: Variant and EADT
 description:
     Variant (extensible sum type) and EADT (extensible recursive sum type)
-    datatypes.
+    datatypes. Documentation can be found at https://docs.haskus.org
 category: System
 build-type: Simple
 
diff --git a/src/lib/Haskus/Utils/EADT.hs b/src/lib/Haskus/Utils/EADT.hs
--- a/src/lib/Haskus/Utils/EADT.hs
+++ b/src/lib/Haskus/Utils/EADT.hs
@@ -72,7 +72,10 @@
 newtype VariantF (xs :: [* -> *]) e
    = VariantF (V (ApplyAll e xs))
 
--- | `ApplyAll e '[f,g,h] ==> '[f e, g e, h e]`
+-- | Apply its first argument to every element of the 2nd arg list
+--
+-- > ApplyAll e '[f,g,h] ==> '[f e, g e, h e]
+--
 type family ApplyAll e (xs :: [* -> *]) :: [*] where
    ApplyAll e '[]       = '[]
    ApplyAll e (f ': fs) = f e ': ApplyAll e fs
@@ -173,14 +176,14 @@
 -- modifying function.
 --
 -- Usage:
---    alterVariantF @NoConstraint id         v
---    alterVariantF @Resizable    (resize 4) v
 --
---
---    -- Multiple constraints:
---    class (Ord a, Num a) => OrdNum a
---    instance (Ord a, Num a) => OrdNum a
---    alterVariantF @OrdNum foo v
+-- >   alterVariantF @NoConstraint id         v
+-- >   alterVariantF @Resizable    (resize 4) v
+-- >
+-- >   -- Multiple constraints:
+-- >   class (Ord a, Num a) => OrdNum a
+-- >   instance (Ord a, Num a) => OrdNum a
+-- >   alterVariantF @OrdNum foo v
 --
 alterVariantF :: forall c e (xs :: [* -> *]).
    ( AlterVariantF c e xs
@@ -212,8 +215,10 @@
 -- required by the modifying function.
 --
 -- Usage:
---    algVariantF @NoConstraint id         v
---    algVariantF @Resizable    (resize 4) v
+--
+-- >  algVariantF @NoConstraint id         v
+-- >  algVariantF @Resizable    (resize 4) v
+--
 algVariantF :: forall c e (xs :: [* -> *]).
    ( AlgVariantF c e xs
    ) => (forall (f :: * -> *). c f => f e -> e) -> VariantF xs e -> e
diff --git a/src/lib/Haskus/Utils/EADT/TH.hs b/src/lib/Haskus/Utils/EADT/TH.hs
--- a/src/lib/Haskus/Utils/EADT/TH.hs
+++ b/src/lib/Haskus/Utils/EADT/TH.hs
@@ -50,9 +50,9 @@
 -- > ====>
 -- >
 -- > pattern ConsList ::
---    ( List a ~ EADT xs
---    , ConsF a :<: xs
---    ) => a -> List a -> List a
+-- >  ( List a ~ EADT xs
+-- >  , ConsF a :<: xs
+-- >  ) => a -> List a -> List a
 -- > pattern ConsList a l = VF (ConsF a l)
 --
 -- Note that you have to quantify free variables explicitly with 'forall'
@@ -106,6 +106,10 @@
             -- [* -> *]
             tyToTyList = AppT ListT (AppT (AppT ArrowT StarT) StarT)
 
+            -- retreive functor var in "e"
+            KindedTV e StarT = last tvs
+
+
          -- make pattern type
          (newTvs,eadtTy,ctx) <- do
             xsName <- newName "xs"
@@ -115,21 +119,22 @@
             eadtXs <- [t| EADT $(return xs) |]
 
             prd <-  [t| $(return conTyp) :<: $(return xs) |]
+            prd2 <-  [t| $(return (VarT e)) ~ $(return eadtXs) |]
             case mEadtTy of
-               Nothing -> return ([xsTy],eadtXs,[prd])
+               Nothing -> return ([xsTy],eadtXs,[prd,prd2])
                Just ty -> do
                   ty' <- ty
                   let (tvs',ty'',ctx') = case ty' of
+                        -- put freevars of the user specified type with the
+                        -- other ones
                         ForallT tvs'' ctx'' t -> (tvs'',t,ctx'')
                         _                     -> ([],ty',[])
-                  prd2 <- [t| $(return ty'') ~ EADT $(return xs) |]
-                  return (xsTy:tvs',ty'',prd:prd2:ctx')
+                  prd3 <- [t| $(return ty'') ~ $(return eadtXs) |]
+                  return (xsTy:tvs',ty'',prd:prd2:prd3:ctx')
 
          let
             -- remove functor var; add new type var
-            tvs'       = init tvs ++ newTvs
-            -- retreive functor var in "e"
-            KindedTV e StarT = last tvs
+            tvs'       = tvs ++ newTvs
 
             -- replace functor variable with EADT type
             go (VarT x :->: b)
