diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,4 +1,4 @@
-import           Distribution.Simple
+import Distribution.Simple
 
 main :: IO ()
 main = defaultMain
diff --git a/registry-hedgehog.cabal b/registry-hedgehog.cabal
--- a/registry-hedgehog.cabal
+++ b/registry-hedgehog.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 5172e9a2dee2ae8064a8ddd51dbad2923b92ace8e8141381ba7b40be413c7bdb
+-- hash: 036db94cca530b2d314b5b42f37b5843436c26f4be294c28f33f663be555e541
 
 name:           registry-hedgehog
-version:        0.3.0.0
+version:        0.4.0.0
 synopsis:       utilities to work with Hedgehog generators and `registry`
 description:    This library provides some functions to extract generators from a "Registry" and make stateful modifications of that Registry to precisely control the generation of data
 category:       Control
@@ -40,8 +40,8 @@
     , hedgehog >=1.0 && <2
     , mmorph >=1 && <2
     , multimap >=1 && <2
-    , protolude >=0.2 && <0.3
-    , registry >=0.1.4 && <2
+    , protolude >=0.3 && <0.4
+    , registry >=0.2 && <0.3
     , tasty >=1 && <2
     , tasty-discover >=2 && <5
     , tasty-hedgehog >=1.0 && <2.0
@@ -80,7 +80,7 @@
     , hedgehog >=1.0 && <2
     , mmorph
     , multimap >=1 && <2
-    , protolude >=0.2 && <0.3
+    , protolude >=0.3 && <0.4
     , registry
     , registry-hedgehog
     , tasty
diff --git a/src/Data/Registry/Hedgehog.hs b/src/Data/Registry/Hedgehog.hs
--- a/src/Data/Registry/Hedgehog.hs
+++ b/src/Data/Registry/Hedgehog.hs
@@ -82,11 +82,11 @@
 -- | Extract a generator from a registry
 --   We use makeUnsafe assuming that the registry has been checked before
 genWith :: forall a ins out. (Typeable a) => Registry ins out -> GenIO a
-genWith = makeUnsafe @(GenIO a)
+genWith = make @(GenIO a)
 
 -- | Modify the value of a generator in a given registry
 tweakGen :: forall a ins out. (Typeable a) => (a -> a) -> Registry ins out -> Registry ins out
-tweakGen f = tweakUnsafe @(GenIO a) (\genA -> f <$> genA)
+tweakGen f = tweak @(GenIO a) (f <$>)
 
 -- | Modify the registry for a given generator in a State monad
 tweakGenS :: forall a m ins out. (Typeable a, MonadState (Registry ins out) m) => (a -> a) -> m ()
@@ -97,7 +97,7 @@
 setGen = setGenIO . liftGen
 
 setGenIO :: forall a ins out. (Typeable a) => GenIO a -> Registry ins out -> Registry ins out
-setGenIO genA = tweakUnsafe @(GenIO a) (const genA)
+setGenIO genA = tweak @(GenIO a) (const genA)
 
 -- | Set a specific generator on the registry the value of a generator in a given registry in a State monad
 setGenS :: forall a m ins out. (Typeable a, MonadState (Registry ins out) m) => Gen a -> m ()
@@ -117,7 +117,7 @@
 
 -- | Modify a generator
 modifyGenS :: forall a ins out. (Typeable a) => (GenIO a -> GenIO a) -> PropertyT (StateT (Registry ins out) IO) ()
-modifyGenS f = modify (tweakUnsafe @(GenIO a) f)
+modifyGenS f = modify (tweak @(GenIO a) f)
 
 -- | Filter a generator
 filterGenS :: forall a ins out. (Typeable a) => (a -> Bool) -> PropertyT (StateT (Registry ins out) IO) ()
@@ -136,7 +136,7 @@
   -- extract a generator for one element only
   let genA = genWith @a r
    in -- add that element in front of a list of generated elements
-      tweakUnsafe @(GenIO [a]) (\genAs -> (:) <$> genA <*> genAs) r
+      tweak @(GenIO [a]) (\genAs -> (:) <$> genA <*> genAs) r
 
 -- | Make sure there is always one element of a given type in a list of elements in a State monad
 makeNonEmptyS :: forall a m ins out. (Typeable a, MonadState (Registry ins out) m) => m ()
@@ -220,7 +220,7 @@
 setDistinct = setDistinctWithRef @a (unsafePerformIO $ newIORef [])
 
 setDistinctWithRef :: forall a ins out. (Eq a, Typeable a, Contains (GenIO a) out) => IORef [a] -> Registry ins out -> Registry ins out
-setDistinctWithRef ref r = setGenIO (distinctWith ref (makeFast @(GenIO a) r)) r
+setDistinctWithRef ref r = setGenIO (distinctWith ref (make @(GenIO a) r)) r
 
 -- | Generate distinct values for a specific data type
 {-# NOINLINE setDistinctS #-}
@@ -235,7 +235,7 @@
 setDistinctFor = setDistinctForWithRef @a @b (unsafePerformIO $ newIORef [])
 
 setDistinctForWithRef :: forall a b ins out. (Typeable a, Contains (GenIO a) out, Eq b, Typeable b, Contains (GenIO b) out) => IORef [b] -> Registry ins out -> Registry ins out
-setDistinctForWithRef ref r = specializeGenIO @a (distinctWith ref (makeFast @(GenIO b) r)) r
+setDistinctForWithRef ref r = specializeGenIO @a (distinctWith ref (make @(GenIO b) r)) r
 
 -- | Generate distinct values for a specific data type, when used inside another data type
 {-# NOINLINE setDistinctForS #-}
diff --git a/src/Data/Registry/Hedgehog/TH.hs b/src/Data/Registry/Hedgehog/TH.hs
--- a/src/Data/Registry/Hedgehog/TH.hs
+++ b/src/Data/Registry/Hedgehog/TH.hs
@@ -1,10 +1,9 @@
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE TemplateHaskell #-}
 
 module Data.Registry.Hedgehog.TH where
 
 import Control.Monad.Fail (fail)
+import Data.Registry
 import Data.Registry.Internal.TH
 import Language.Haskell.TH
 import Language.Haskell.TH.Syntax
@@ -18,7 +17,7 @@
 --    <: genFun (tag @"temporary" Temporary)
 --
 -- genEmployeeStatus :: GenIO Chooser -> GenIO (Tag "permanent" EmployeeStatus) -> GenIO (Tag "temporary" EmployeeStatus) -> GenIO EmployeeStatus
--- genEmployeeStatus chooser g1 g2 = chooseOne chooser [fmap unTagg1, fmap unTag g2]
+-- genEmployeeStatus chooser g1 g2 = chooseOne chooser [fmap unTag1, fmap unTag g2]
 makeGenerators :: Name -> ExpQ
 makeGenerators genType = do
   info <- reify genType
@@ -30,3 +29,6 @@
     other -> do
       qReport True ("can only create generators for an ADT, got: " <> show other)
       fail "generators creation failed"
+
+emptyRegistry :: Registry '[] '[]
+emptyRegistry = mempty
diff --git a/src/Data/Registry/Internal/Hedgehog.hs b/src/Data/Registry/Internal/Hedgehog.hs
--- a/src/Data/Registry/Internal/Hedgehog.hs
+++ b/src/Data/Registry/Internal/Hedgehog.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE DataKinds #-}
 {-# LANGUAGE PartialTypeSignatures #-}
 
 module Data.Registry.Internal.Hedgehog
diff --git a/src/Data/Registry/Internal/TH.hs b/src/Data/Registry/Internal/TH.hs
--- a/src/Data/Registry/Internal/TH.hs
+++ b/src/Data/Registry/Internal/TH.hs
@@ -6,7 +6,7 @@
 
 import Control.Monad.Fail (fail)
 import Data.Registry.Internal.Hedgehog
-import Data.Text (splitOn, toLower)
+import Data.Text (splitOn)
 import Language.Haskell.TH
 import Language.Haskell.TH.Syntax
 import Protolude hiding (Type)
@@ -54,7 +54,7 @@
 constructorParameterName :: Con -> Q Name
 constructorParameterName constructor = do
   name <- constructorName constructor
-  pure $ mkName (toS $ toLower name)
+  pure $ mkName (toLower <$> toS name)
 
 -- | Extract the last name of a constructor
 constructorName :: Con -> Q Text
@@ -78,21 +78,23 @@
   qReport True ("we can only create generators for normal constructors and records, got: " <> show other)
   fail "generators creation failed"
 
--- | runQ [| fun g <: genFun e <: genFun f|]
---   InfixE (Just (AppE (VarE Data.Registry.Registry.fun) (UnboundVarE g))) (VarE <:) (Just (InfixE (Just (AppE (VarE Data.Registry.Hedgehog.genFun) (UnboundVarE e)))
---  (VarE Data.Registry.Registry.<:) (Just (AppE (VarE Data.Registry.Hedgehog.genFun) (UnboundVarE f)))))
+-- | runQ [| fun g +: genFun e +: genFun f|]
+--   InfixE (Just (AppE (VarE Data.Registry.Registry.fun) (UnboundVarE g))) (VarE +:) (Just (InfixE (Just (AppE (VarE Data.Registry.Hedgehog.genFun) (UnboundVarE e)))
+--  (VarE Data.Registry.Registry.+:) (Just (AppE (VarE Data.Registry.Hedgehog.genFun) (UnboundVarE f)))))
 assembleGeneratorsToRegistry :: Exp -> [Exp] -> ExpQ
 assembleGeneratorsToRegistry _ [] =
   fail "generators creation failed"
 assembleGeneratorsToRegistry selectorGenerator [g] =
-  let r = appendExpressions (genFunOf (pure g)) (funOf (pure selectorGenerator))
-   in appendExpressions r (genFunOf (varE (mkName "choiceChooser")))
+  app (genFunOf (pure g)) $
+    app (funOf (pure selectorGenerator)) $
+      app (genFunOf (varE (mkName "choiceChooser"))) (varE (mkName "emptyRegistry"))
+--
 assembleGeneratorsToRegistry selectorGenerator (g : gs) =
-  appendExpressions (genFunOf (pure g)) (assembleGeneratorsToRegistry selectorGenerator gs)
+  app (genFunOf (pure g)) (assembleGeneratorsToRegistry selectorGenerator gs)
 
-appendExpressions :: ExpQ -> ExpQ -> ExpQ
-appendExpressions e1 e2 =
-  infixE (Just e1) (varE (mkName "<:")) (Just e2)
+app :: ExpQ -> ExpQ -> ExpQ
+app e1 e2 =
+  infixE (Just e1) (varE (mkName "+:")) (Just e2)
 
 genFunOf :: ExpQ -> ExpQ
 genFunOf = appE (varE (mkName "genFun"))
diff --git a/src/Test/Tasty/Hedgehogx.hs b/src/Test/Tasty/Hedgehogx.hs
--- a/src/Test/Tasty/Hedgehogx.hs
+++ b/src/Test/Tasty/Hedgehogx.hs
@@ -14,18 +14,23 @@
   ( module Hedgehog,
     module Tasty,
     module Test.Tasty.HedgehogTest,
+
     -- * Tests definition
     prop,
     test,
+
     -- * Tests settings
     minTestsOk,
     noShrink,
     withSeed,
+
     -- * Running tests
     run,
     runOnly,
+
     -- * Assertions
     gotException,
+
     -- * Display
     printDifference,
     display,
diff --git a/test/Test/Data/Registry/Generators.hs b/test/Test/Data/Registry/Generators.hs
--- a/test/Test/Data/Registry/Generators.hs
+++ b/test/Test/Data/Registry/Generators.hs
@@ -10,7 +10,6 @@
 import Data.Registry
 import Data.Registry.Hedgehog
 import Data.Registry.Hedgehog.TH
-import Data.Registry.TH
 import Hedgehog.Gen as Gen hiding (print)
 import Hedgehog.Internal.Gen hiding (print)
 import Hedgehog.Range
@@ -20,14 +19,14 @@
 
 registry =
   genFun Company
+    <: fun (listOf @Department)
     <: genFun Department
+    <: fun (listOf @Employee)
     <: genFun Employee
     -- we can generate data for different constructors in an ADT with some Template Haskell
     <: $(makeGenerators ''EmployeeStatus)
-    -- we can generate Lists or Maybe of elements
-    <: fun (listOf @Department)
-    <: fun (listOf @Employee)
     <: fun (maybeOf @Int)
+    -- we can generate Lists or Maybe of elements
     <: genVal genInt
     <: genVal genText
 
@@ -41,10 +40,6 @@
 -- See the gory details of why this is necessary: https://gitlab.haskell.org/ghc/ghc/issues/9813
 $(return [])
 
--- | Check that the registry is complete. This speeds up compilation when there are lots of generators
-generators :: Registry _ _
-generators = $(checkRegistry 'registry)
-
 -- | We create a forall function using all the generators
 forall :: forall a. _ => PropertyT IO a
-forall = withFrozenCallStack $ forAllT (genWith @a generators)
+forall = withFrozenCallStack $ forAllT (genWith @a registry)
diff --git a/test/Test/Data/Registry/HedgehogSpec.hs b/test/Test/Data/Registry/HedgehogSpec.hs
--- a/test/Test/Data/Registry/HedgehogSpec.hs
+++ b/test/Test/Data/Registry/HedgehogSpec.hs
@@ -83,7 +83,7 @@
     n <- forAll (integral (linear 1 3))
     (n >= 1) === True
 
--- * USING GENERATORS
+-- * USING registry
 
 test_company_1 =
   prop "a company can be used for testing" $ do
@@ -100,14 +100,14 @@
 
 test_small_company =
   prop "a small company has just one department and one employee" $
-    runS generators $ do
+    runS registry $ do
       setSmallCompany
       company <- forallS @Company
       length (departments company) === 1
       let Just d = head $ departments company
       length (employees d) === 1
 
--- * We can also specialize some generators in a given context
+-- * We can also specialize some registry in a given context
 
 --   For example we might want to generate shorter department names even
 --   if Department is using Text values. To do this we specialize the Text
@@ -119,7 +119,7 @@
 
 test_with_better_department_name = noShrink $
   prop "a department must have a short capitalized name" $
-    runS generators $ do
+    runS registry $ do
       setSmallCompany
       setDepartmentName
       company <- forallS @Company
@@ -135,7 +135,7 @@
 
 test_cycle_constructors =
   prop "we can cycle deterministically across all the constructors of a data type" $
-    runS generators $ do
+    runS registry $ do
       setCycleChooserS @EmployeeStatus
       -- uncomment to check
       -- collect =<< forallS @EmployeeStatus
@@ -144,7 +144,7 @@
 -- We can also make sure we generate distinct values for a given type
 test_distinct_values =
   prop "we can generate distinct values for a given data type when used in a specific context" $
-    runS generators $ do
+    runS registry $ do
       setDistinctForS @Department @Text
       -- uncomment to check
       -- collect =<< departmentName <$> forallS @Department
diff --git a/test/Test/Tutorial/Exercise1.hs b/test/Test/Tutorial/Exercise1.hs
--- a/test/Test/Tutorial/Exercise1.hs
+++ b/test/Test/Tutorial/Exercise1.hs
@@ -16,11 +16,12 @@
 registry :: Registry _ _
 registry =
   genFun Company
-    <: genFun Department
-    <: genFun Employee
-    <: genVal genEmployeeStatus
-    <: genVal genInt
-    <: genVal genText
+    +: genFun Department
+    +: genFun Employee
+    +: genVal genEmployeeStatus
+    +: genVal genInt
+    +: genVal genText
+    +: mempty
 
 genInt :: Gen Int
 genInt = integral (linear 1 3)
diff --git a/test/Test/Tutorial/Exercise2.hs b/test/Test/Tutorial/Exercise2.hs
--- a/test/Test/Tutorial/Exercise2.hs
+++ b/test/Test/Tutorial/Exercise2.hs
@@ -17,12 +17,12 @@
 registry :: Registry _ _
 registry =
   genFun Company
+    <: fun (listOf @Department)
     <: genFun Department
-    <: genFun Employee
     <: fun (listOf @Employee)
-    <: fun (listOf @Department)
-    <: fun (maybeOf @Int)
+    <: genFun Employee
     <: genVal genEmployeeStatus
+    <: fun (maybeOf @Int)
     <: genVal genInt
     <: genVal genText
 
