diff --git a/compdata.cabal b/compdata.cabal
--- a/compdata.cabal
+++ b/compdata.cabal
@@ -1,5 +1,5 @@
 Name:			compdata
-Version:		0.6.1
+Version:		0.6.1.1
 Synopsis:            	Compositional Data Types
 Description:
 
@@ -152,11 +152,6 @@
   examples/Examples/MultiParam/Lambda.hs
   examples/Examples/MultiParam/FOL.hs
 
-flag benchmark
-  description: Build benchmark executable.
-  default:     False
-
-
 library
   Exposed-Modules:      Data.Comp,
                         Data.Comp.Annotation,
@@ -283,8 +278,6 @@
   Build-Depends:	base == 4.*, template-haskell, containers, mtl, QuickCheck >= 2, derive, deepseq, th-expand-syns, transformers
   hs-source-dirs:	src
   ghc-options:          -W
-  if flag(benchmark)
-    buildable:     False
 
 
 Test-Suite test
@@ -301,6 +294,7 @@
   -- Disable short-cut fusion rules in order to compare optimised and unoptimised code.
   cpp-options:          -DNO_RULES
   Build-Depends:        base == 4.*, template-haskell, containers, mtl, QuickCheck >= 2, derive, deepseq, criterion, random, uniplate, th-expand-syns, transformers
+
 
 source-repository head
   type:     hg
diff --git a/src/Data/Comp/Automata.hs b/src/Data/Comp/Automata.hs
--- a/src/Data/Comp/Automata.hs
+++ b/src/Data/Comp/Automata.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE Rank2Types, FlexibleContexts, ImplicitParams, GADTs, TypeOperators #-}
+{-# LANGUAGE Rank2Types, FlexibleContexts, ImplicitParams, GADTs, TypeOperators, DeriveFunctor #-}
 
 --------------------------------------------------------------------------------
 -- |
@@ -275,6 +275,40 @@
 -- to an extended state space.
 
 type DUpState f p q = forall a . (?below :: a -> p, ?above :: p, q :< p) => f a -> q
+
+
+-- type QHom f q g = forall a . (?below :: a -> q, ?above :: q) => f a -> Context g a
+
+homToState :: Functor g => QHom f p g -> DUpState f (Term g, p) (Term g)
+homToState hom = appCxt . fmap below . hom'
+    where hom' = explicit hom (snd ?above) (snd . ?below)
+
+-- runQHom :: (Traversable f, Functor g) =>
+--            DUpState f (u,d) u -> DDownState f (u,d) d -> 
+--            QHom f (u,d) g ->
+--            d -> Term f -> (u, Term g)
+-- runDState :: DUpState f (u, d) u -> DDownState f (u, d) d -> d -> Term f -> uSource
+
+data Sig a
+      = X
+      | Const Integer
+      | Add a a
+        deriving Functor
+
+isConst :: UpState Sig (Maybe Integer)
+isConst (Const a) = Just a
+isConst (Add (Just a) (Just b)) = Just (a + b)
+isConst _         = Nothing
+
+trans :: QHom Sig (Maybe Integer) Sig
+trans a | Just c <- above = simpCxt $ Const c
+        | otherwise       = simpCxt a
+
+runIt :: Term Sig -> Term Sig
+runIt = runUpHom isConst trans
+
+
+
 
 -- | This combinator turns an arbitrary DUTA into a GDUTA.
 
diff --git a/src/Data/Comp/Desugar.hs b/src/Data/Comp/Desugar.hs
--- a/src/Data/Comp/Desugar.hs
+++ b/src/Data/Comp/Desugar.hs
@@ -16,7 +16,7 @@
 module Data.Comp.Desugar where
 
 import Data.Comp
-import Data.Comp.Derive
+import Data.Comp.Ops
 
 -- |The desugaring term homomorphism.
 class (Functor f, Functor g) => Desugar f g where
@@ -25,7 +25,11 @@
     desugHom' :: Alg f (Context g a)
     desugHom' x = appCxt (desugHom x)
 
-$(derive [liftSum] [''Desugar])
+
+instance (Desugar f h, Desugar g h) => Desugar (f :+: g) h where
+    desugHom (Inl x) = desugHom x
+    desugHom (Inr x) = desugHom x
+
 
 -- |Desugar a term.
 desugar :: Desugar f g => Term f -> Term g
