diff --git a/free-theorems.cabal b/free-theorems.cabal
--- a/free-theorems.cabal
+++ b/free-theorems.cabal
@@ -1,5 +1,5 @@
 name:           free-theorems
-version:        0.2
+version:        0.2.1
 license:        PublicDomain
 license-file:   LICENSE
 author:         Sascha Boehme
@@ -23,7 +23,7 @@
     base >= 1.0
   , mtl >= 1.0
   , haskell-src >= 1.0
-  , haskell-src-exts >= 0.2.1
+  , haskell-src-exts >= 0.3.9
   , pretty >= 1.0.0.0
   , containers >= 0.1.0.1
 exposed-modules:
@@ -49,3 +49,15 @@
     Language.Haskell.FreeTheorems.PrettyTheorems
 hs-source-dirs: src
 extensions:     Generics, DeriveDataTypeable, Rank2Types, PatternSignatures
+extra-source-files:
+    src/Arbitraries.hs
+    src/FrontendCheckGlobalTests.hs
+    src/FrontendCheckLocalTests.hs
+    src/FrontendOtherTests.hs
+    src/FrontendTypeExpressionsTests.hs
+    src/InterpretationTests.hs
+    src/ParserPrettyPrinterTests.hs
+    src/Runtests.hs
+    src/Tests.hs
+    README
+    runtests
diff --git a/src/Language/Haskell/FreeTheorems/Parser/Hsx.hs b/src/Language/Haskell/FreeTheorems/Parser/Hsx.hs
--- a/src/Language/Haskell/FreeTheorems/Parser/Hsx.hs
+++ b/src/Language/Haskell/FreeTheorems/Parser/Hsx.hs
@@ -12,8 +12,8 @@
 import Data.Generics (everywhere, mkT)
 import Data.Maybe (fromMaybe)
 import Data.List (nub, (\\), intersect)
-import Language.Haskell.Hsx.Parser (parseModule, ParseResult(..))
-import Language.Haskell.Hsx.Syntax
+import Language.Haskell.Exts.Parser (parseModule, ParseResult(..))
+import Language.Haskell.Exts.Syntax
 import Text.PrettyPrint
 
 import qualified Language.Haskell.FreeTheorems.Syntax as S
@@ -98,8 +98,7 @@
   where
     isAcceptedDeclaration decl = case decl of
       HsTypeDecl _ _ _ _        -> True
-      HsDataDecl _ _ _ _ _ _    -> True
-      HsNewTypeDecl _ _ _ _ _ _ -> True
+      HsDataDecl _ _  _ _ _ _ _ -> True
       HsClassDecl _ _ _ _ _ _   -> True
       HsTypeSig _ _ _           -> True
       otherwise                 -> False
@@ -126,18 +125,30 @@
 ------- Transform declarations ------------------------------------------------
 
 
+-- | Transforms a class declaration.
+
+clsDeclToDecl :: HsClassDecl -> ErrorOr HsDecl
+clsDeclToDecl decl = case decl of
+  HsClsDecl decl         -> return decl
+  HsClsDataFam _ _ _ _ _ -> throwError noDataFam
+  HsClsTyFam _ _ _ _     -> throwError noTypeFam
+  HsClsTyDef _ _ _       -> throwError noTypeFam
+
+noDataFam   = pp "Data Families are not allowed"
+noTypeFam   = pp "Type Families are not allowed"
+
 -- | Transforms a declaration.
 
 mkDeclaration :: HsDecl -> ErrorOr S.Declaration
 mkDeclaration decl = case decl of
-  HsTypeDecl l n vs t           -> addErr l n (mkType n vs t)
-  HsDataDecl l _ n vs cs _      -> addErr l n (mkData n vs cs)
-  HsNewTypeDecl l _ n vs c _    -> addErr l n (mkNewtype n vs c)
-  HsClassDecl l scs n [v] _ ds  -> addErr l n (mkClass scs n v ds)
-  HsTypeSig l [n] t             -> addErr l n (mkSignature n t)
+  HsTypeDecl l n vs t                -> addErr l n (mkType n vs t)
+  HsDataDecl l DataType _ n vs cs _  -> addErr l n (mkData n vs cs)
+  HsDataDecl l NewType  _ n vs [c] _ -> addErr l n (mkNewtype n vs c)
+  HsClassDecl l scs n [v] _ ds       -> addErr l n (mkClass scs n v ds)
+  HsTypeSig l [n] t                  -> addErr l n (mkSignature n t)
 
-  HsClassDecl l _ n [] _ _      -> addErr l n (throwError missingVar)
-  HsClassDecl l _ n (_:_:_) _ _ -> addErr l n (throwError noMultiParam)
+  HsClassDecl l _ n [] _ _           -> addErr l n (throwError missingVar)
+  HsClassDecl l _ n (_:_:_) _ _      -> addErr l n (throwError noMultiParam)
 
   -- no other case con occur, see above function 'filterDeclarations'. 
 
@@ -242,11 +253,12 @@
 -- | Transforms the components of a Haskell class declaration.
 --   Every declaration in the class body is ignored except of type signatures.
 
-mkClass :: HsContext -> HsName -> HsName -> [HsDecl] -> ErrorOr S.Declaration
-mkClass ctx name var decls = do
+mkClass :: HsContext -> HsName -> HsName -> [HsClassDecl] -> ErrorOr S.Declaration
+mkClass ctx name var clsDecls = do
   ident   <- mkIdentifier name
   tv      <- mkTypeVariable var
   superCs <- mkContext ctx >>= check tv
+  decls   <- mapM clsDeclToDecl clsDecls 
   sigs    <- liftM (map toSig) (mapM mkDeclaration (filter isSig decls))
     -- mapping 'isSig' is safe because after applying 'filter' no other
     -- declarations are left except of type signatures
@@ -354,7 +366,9 @@
   return (S.TypeCon (S.ConTuple (length ts)) ts)
 
 mkTypeExpressionT (HsTyForall maybeVars ctx ty) =
-  mkForallTyEx (fromMaybe [] maybeVars) ctx ty
+  mkForallTyEx (maybe [] (map unKind) maybeVars) ctx ty
+  where unKind (HsKindedVar n _) = n
+        unKind (HsUnkindedVar n) = n
 
 mkTypeExpressionT (HsTyPred _) = 
   throwError (pp "Implicit parameters are not allowed.")
