diff --git a/cartel.cabal b/cartel.cabal
--- a/cartel.cabal
+++ b/cartel.cabal
@@ -3,11 +3,11 @@
 -- http://www.github.com/massysett/cartel
 --
 -- Script name used to generate: GenCartelCabal.hs
--- Generated on: 2015-03-20 00:04:34.646237 EDT
--- Cartel library version: 0.14.2.2
+-- Generated on: 2015-03-22 10:19:15.62876 EDT
+-- Cartel library version: 0.14.2.4
 
 name: cartel
-version: 0.14.2.2
+version: 0.14.2.4
 cabal-version: >= 1.16
 license: BSD3
 license-file: LICENSE
@@ -64,15 +64,15 @@
     buildable: True
     other-modules:
       Cartel.Generators
-      Cartel.Properties
-      Decrees
     hs-source-dirs:
       tests
     build-depends:
         multiarg >= 0.30.0.0 && < 0.31
       , QuickCheck >= 2.7 && < 2.9
       , random >= 1.0.1.1 && < 1.2
-      , quickpull >= 0.4.0.0 && < 0.5
+      , tasty >= 0.10 && < 0.11
+      , tasty-th >= 0.1 && < 0.2
+      , tasty-quickcheck >= 0.8 && < 0.9
     ghc-options:
       -Wall
     hs-source-dirs:
@@ -92,15 +92,17 @@
   default-language: Haskell2010
   other-modules:
     Cartel.Generators
-    Cartel.Properties
-    Decrees
+  other-extensions:
+    TemplateHaskell
   hs-source-dirs:
     tests
   build-depends:
       multiarg >= 0.30.0.0 && < 0.31
     , QuickCheck >= 2.7 && < 2.9
     , random >= 1.0.1.1 && < 1.2
-    , quickpull >= 0.4.0.0 && < 0.5
+    , tasty >= 0.10 && < 0.11
+    , tasty-th >= 0.1 && < 0.2
+    , tasty-quickcheck >= 0.8 && < 0.9
   ghc-options:
     -Wall
   hs-source-dirs:
diff --git a/lib/Cartel/GenCartelCabal.hs b/lib/Cartel/GenCartelCabal.hs
--- a/lib/Cartel/GenCartelCabal.hs
+++ b/lib/Cartel/GenCartelCabal.hs
@@ -25,6 +25,15 @@
 quickcheck :: Package
 quickcheck = closedOpen "QuickCheck" [2,7] [2,9]
 
+tasty :: Package
+tasty = nextBreaking "tasty" [0,10]
+
+tastyQuickcheck :: Package
+tastyQuickcheck = nextBreaking "tasty-quickcheck" [0,8]
+
+tastyTh :: Package
+tastyTh = nextBreaking "tasty-th" [0,1]
+
 random :: Package
 random = closedOpen "random" [1,0,1,1] [1,2]
 
@@ -34,15 +43,13 @@
 multiarg :: Package
 multiarg = nextBreaking "multiarg" [0,30,0,0]
 
-quickpull :: Package
-quickpull = nextBreaking "quickpull" [0,4,0,0]
-
 libDepends :: [Package]
 libDepends =
   [ base, directory, filepath, time, transformers ]
 
 testDepends :: [Package]
-testDepends = [ multiarg, quickcheck, random, quickpull ]
+testDepends
+  = [ multiarg, quickcheck, random, tasty, tastyTh, tastyQuickcheck ]
 
 commonOptions :: HasBuildInfo a => [a]
 commonOptions =
@@ -110,6 +117,7 @@
       , testSuite "cartel-properties"
         $ haskell2010 
         : otherModules testMods 
+        : otherExtensions ["TemplateHaskell"]
         : testOptions
         ++ exitcodeFields "cartel-properties.hs"
         
diff --git a/lib/Cartel/Version.hs b/lib/Cartel/Version.hs
--- a/lib/Cartel/Version.hs
+++ b/lib/Cartel/Version.hs
@@ -11,4 +11,4 @@
 import Data.Word
 
 version :: [Word]
-version = [0,14,2,2]
+version = [0,14,2,4]
diff --git a/tests/Cartel/Properties.hs b/tests/Cartel/Properties.hs
deleted file mode 100644
--- a/tests/Cartel/Properties.hs
+++ /dev/null
@@ -1,84 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
-
--- | Cartel properties.  For the time being, most (maybe all) of these
--- properties test the generators, rather than Cartel itself.  I had
--- to debug generators that were stuck in an infinite loop.
-module Cartel.Properties where
-
-import Cartel
-import Cartel.Ast
-import Control.Monad
-import Test.QuickCheck
-import qualified Cartel.Generators as G
-
-seconds :: Int -> Int
-seconds = (* 10 ^ (6 :: Int))
-
-newtype Little = Little Word
-  deriving (Eq, Ord, Show)
-
-instance Arbitrary Little where
-  arbitrary = sized f
-    where
-      f sz = fmap Little (choose (0, min (fromIntegral sz) 10))
-
-completesInSecs
-  :: Show a
-  => Int
-  -- ^ How many seconds
-  -> G.Gen a
-  -> Little
-  -- ^ How many flags
-  -> Little
-  -- ^ Size
-  -> Int
-  -- ^ Seed
-  -> Property
-completesInSecs time gen (Little nFlags) (Little sz) sd
-  = within (seconds time) $
-  length (show (G.genResult gen nFlags sz sd)) >= 0
-
-prop_vcsCompletesInSecs = completesInSecs 10 (G.arbitrary :: G.Gen Vcs)
-
-prop_constraintCompletesInSecs = completesInSecs 10
-  (G.arbitrary :: G.Gen Constraint)
-
-mainIsCompletesInSecs a = completesInSecs 10 (G.genMainIs `asTypeOf` a)
-
-prop_conditionCompletesInSecs = completesInSecs 10
-  (G.arbitrary :: G.Gen Condition)
-
-buildInfoCompletesInSecs a = completesInSecs 10 (G.genBuildInfo `asTypeOf` a)
-
--- ExecutableField contents
-
-prop_buildInfoExeCompletesInSecs = buildInfoCompletesInSecs
-  (undefined :: G.Gen ExecutableField)
-
-prop_condBlockExeCompletesInSecs = completesInSecs 10
-  (G.genCondBlock :: G.Gen ExecutableField)
-
-prop_exeMainIsCompletesInSecs = mainIsCompletesInSecs
-  (undefined :: G.Gen ExecutableField)
-
-prop_cabalCompletesInSecs = completesInSecs 10
-  (G.arbitrary :: G.Gen Cabal)
-
-prop_propertiesCompletesInSecs = completesInSecs 10
-  (G.arbitrary :: G.Gen Properties)
-
-prop_repositoryCompletesInSecs = completesInSecs 10
-  (G.arbitrary :: G.Gen Repository)
-
-prop_sectionCompletesInSecs = completesInSecs 10
-  (G.arbitrary :: G.Gen Section)
-
-prop_executableCompletesInSecs = completesInSecs 10
-  (liftM2 executable G.genNonEmptyString G.arbitrary)
-
-prop_benchmarkCompletesInSecs = completesInSecs 10
-  (liftM2 benchmark G.genNonEmptyString G.arbitrary)
-
-prop_testSuiteCompletesInSecs = completesInSecs 10
-  (liftM2 testSuite G.genNonEmptyString G.arbitrary)
-
diff --git a/tests/Decrees.hs b/tests/Decrees.hs
deleted file mode 100644
--- a/tests/Decrees.hs
+++ /dev/null
@@ -1,26 +0,0 @@
--- | This module generated by the Quickpull package.
--- Quickpull is available at:
--- <http://www.github.com/massysett/quickpull>
-
-module Decrees where
-
-import Quickpull
-import qualified Cartel.Properties
-
-decrees :: [Decree]
-decrees =
-
-  [ Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 41, qName = "prop_vcsCompletesInSecs"} ) ( Single Cartel.Properties.prop_vcsCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 43, qName = "prop_constraintCompletesInSecs"} ) ( Single Cartel.Properties.prop_constraintCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 48, qName = "prop_conditionCompletesInSecs"} ) ( Single Cartel.Properties.prop_conditionCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 55, qName = "prop_buildInfoExeCompletesInSecs"} ) ( Single Cartel.Properties.prop_buildInfoExeCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 58, qName = "prop_condBlockExeCompletesInSecs"} ) ( Single Cartel.Properties.prop_condBlockExeCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 61, qName = "prop_exeMainIsCompletesInSecs"} ) ( Single Cartel.Properties.prop_exeMainIsCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 64, qName = "prop_cabalCompletesInSecs"} ) ( Single Cartel.Properties.prop_cabalCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 67, qName = "prop_propertiesCompletesInSecs"} ) ( Single Cartel.Properties.prop_propertiesCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 70, qName = "prop_repositoryCompletesInSecs"} ) ( Single Cartel.Properties.prop_repositoryCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 73, qName = "prop_sectionCompletesInSecs"} ) ( Single Cartel.Properties.prop_sectionCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 76, qName = "prop_executableCompletesInSecs"} ) ( Single Cartel.Properties.prop_executableCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 79, qName = "prop_benchmarkCompletesInSecs"} ) ( Single Cartel.Properties.prop_benchmarkCompletesInSecs )
-  , Decree ( Meta {modDesc = ModDesc {modPath = "tests/Cartel/Properties.hs", modName = ["Cartel","Properties"]}, linenum = 82, qName = "prop_testSuiteCompletesInSecs"} ) ( Single Cartel.Properties.prop_testSuiteCompletesInSecs )
-  ]
diff --git a/tests/cartel-properties.hs b/tests/cartel-properties.hs
--- a/tests/cartel-properties.hs
+++ b/tests/cartel-properties.hs
@@ -1,7 +1,90 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+-- | Cartel properties.  For the time being, most (maybe all) of these
+-- properties test the generators, rather than Cartel itself.  I had
+-- to debug generators that were stuck in an infinite loop.
 module Main where
 
-import Quickpull
-import Decrees
+import Cartel
+import Cartel.Ast
+import Control.Monad
+import Test.QuickCheck
+import qualified Cartel.Generators as G
+import Test.Tasty.QuickCheck
+import Test.Tasty.TH
 
 main :: IO ()
-main = defaultMain decrees
+main = $(defaultMainGenerator)
+
+seconds :: Int -> Int
+seconds = (* 10 ^ (6 :: Int))
+
+newtype Little = Little Word
+  deriving (Eq, Ord, Show)
+
+instance Arbitrary Little where
+  arbitrary = sized f
+    where
+      f sz = fmap Little (choose (0, min (fromIntegral sz) 10))
+
+completesInSecs
+  :: Show a
+  => Int
+  -- ^ How many seconds
+  -> G.Gen a
+  -> Little
+  -- ^ How many flags
+  -> Little
+  -- ^ Size
+  -> Int
+  -- ^ Seed
+  -> Property
+completesInSecs time gen (Little nFlags) (Little sz) sd
+  = within (seconds time) $
+  length (show (G.genResult gen nFlags sz sd)) >= 0
+
+prop_vcsCompletesInSecs = completesInSecs 10 (G.arbitrary :: G.Gen Vcs)
+
+prop_constraintCompletesInSecs = completesInSecs 10
+  (G.arbitrary :: G.Gen Constraint)
+
+mainIsCompletesInSecs a = completesInSecs 10 (G.genMainIs `asTypeOf` a)
+
+prop_conditionCompletesInSecs = completesInSecs 10
+  (G.arbitrary :: G.Gen Condition)
+
+buildInfoCompletesInSecs a = completesInSecs 10 (G.genBuildInfo `asTypeOf` a)
+
+-- ExecutableField contents
+
+prop_buildInfoExeCompletesInSecs = buildInfoCompletesInSecs
+  (undefined :: G.Gen ExecutableField)
+
+prop_condBlockExeCompletesInSecs = completesInSecs 10
+  (G.genCondBlock :: G.Gen ExecutableField)
+
+prop_exeMainIsCompletesInSecs = mainIsCompletesInSecs
+  (undefined :: G.Gen ExecutableField)
+
+prop_cabalCompletesInSecs = completesInSecs 10
+  (G.arbitrary :: G.Gen Cabal)
+
+prop_propertiesCompletesInSecs = completesInSecs 10
+  (G.arbitrary :: G.Gen Properties)
+
+prop_repositoryCompletesInSecs = completesInSecs 10
+  (G.arbitrary :: G.Gen Repository)
+
+prop_sectionCompletesInSecs = completesInSecs 10
+  (G.arbitrary :: G.Gen Section)
+
+prop_executableCompletesInSecs = completesInSecs 10
+  (liftM2 executable G.genNonEmptyString G.arbitrary)
+
+prop_benchmarkCompletesInSecs = completesInSecs 10
+  (liftM2 benchmark G.genNonEmptyString G.arbitrary)
+
+prop_testSuiteCompletesInSecs = completesInSecs 10
+  (liftM2 testSuite G.genNonEmptyString G.arbitrary)
+
