diff --git a/cartel.cabal b/cartel.cabal
--- a/cartel.cabal
+++ b/cartel.cabal
@@ -3,10 +3,10 @@
 -- http://www.github.com/massysett/cartel
 --
 -- Script name used to generate: genCabal.hs
--- Generated on: 2014-05-29 21:17:51.6472 EDT
--- Cartel library version: 0.6.0.0
+-- Generated on: 2014-05-30 10:21:35.348429 EDT
+-- Cartel library version: Version {versionBranch = [0,1,0,0], versionTags = []}
 name: cartel
-version: 0.8.0.0
+version: 0.10.0.0
 cabal-version: >= 1.14
 build-type: Simple
 license: BSD3
@@ -36,7 +36,7 @@
   exposed-modules:
       Cartel
     , Cartel.Ast
-    , Cartel.Defaults
+    , Cartel.Empty
     , Cartel.Render
     , Cartel.Tools
   exposed: True
diff --git a/current-versions.txt b/current-versions.txt
--- a/current-versions.txt
+++ b/current-versions.txt
@@ -1,7 +1,7 @@
 This package was tested to work with these dependency
 versions and compiler version.
 These are the default versions fetched by cabal install.
-Tested as of: 2014-05-28 23:55:01.837807 UTC
+Tested as of: 2014-05-30 16:15:53.772569 UTC
 Path to compiler: ghc-7.8.2
 Compiler description: 7.8.2
 
@@ -33,6 +33,6 @@
     transformers-0.3.0.0
     unix-2.7.0.1
 
-/home/massysett/cartel/sunlight-24643/db:
-    cartel-0.4.0.0
+/home/massysett/cartel/sunlight-11214/db:
+    cartel-0.10.0.0
 
diff --git a/genCabal.hs b/genCabal.hs
--- a/genCabal.hs
+++ b/genCabal.hs
@@ -49,7 +49,7 @@
 properties :: A.Properties
 properties = A.properties
   { A.prName = "cartel"
-  , A.prVersion = A.Version [0,8,0,0]
+  , A.prVersion = A.Version [0,10,0,0]
   , A.prCabalVersion = (1, 14)
   , A.prBuildType = A.Simple
   , A.prLicense = A.BSD3
diff --git a/lib/Cartel.hs b/lib/Cartel.hs
--- a/lib/Cartel.hs
+++ b/lib/Cartel.hs
@@ -48,10 +48,10 @@
 
 module Cartel
   ( module Cartel.Ast
-  , module Cartel.Defaults
+  , module Cartel.Empty
   , module Cartel.Tools
   ) where
 
 import Cartel.Ast
-import Cartel.Defaults
+import Cartel.Empty
 import Cartel.Tools
diff --git a/lib/Cartel/Ast.hs b/lib/Cartel/Ast.hs
--- a/lib/Cartel/Ast.hs
+++ b/lib/Cartel/Ast.hs
@@ -44,9 +44,6 @@
   , CondTree(..)
   , CondBlock(..)
 
-  -- * Field class
-  , Field(..)
-
   -- * Libraries
   , LibraryField(..)
   , Library(..)
@@ -145,7 +142,7 @@
 
 -- | Global package properties.  Most of the 'String' fields are
 -- optional; to leave them blank, use the empty string.  To future
--- proof your code, use 'Cartel.Defaults.properties', which provides
+-- proof your code, use 'Cartel.Empty.empty', which provides
 -- this record already filled in with default values (which are
 -- typically blank.)  Then you only alter the fields you wish to
 -- fill in.
@@ -241,17 +238,6 @@
 
   } deriving (Eq, Ord, Show)
 
--- | Things that can be an item in a field in a Cabal file.
-
-class Field a where
-
-  -- | Takes a conditional block and wraps it in the field type.
-  conditional :: CondBlock a -> a
-
-  -- | Takes a build information field and wraps it in the field
-  -- type.
-  buildInfo :: BuildInfoField -> a
-
 -- | A field in the @Library@ section of the Cabal file.  A
 -- @Library@ section can have multiple fields.
 data LibraryField
@@ -269,10 +255,6 @@
   -- ^ The @Library@ section can contain build information.
   deriving (Eq, Ord, Show)
 
-instance Field LibraryField where
-  conditional = LibConditional
-  buildInfo = LibInfo
-
 -- | The entire @Library@ section.
 newtype Library = Library
   { libFields :: [LibraryField]
@@ -294,10 +276,6 @@
 
   deriving (Eq, Ord, Show)
 
-instance Field ExecutableField where
-  conditional = ExeConditional
-  buildInfo = ExeInfo
-
 -- | An entire @Executable@ section.
 data Executable = Executable
   { exeName :: String
@@ -345,10 +323,6 @@
 
   deriving (Eq, Ord, Show)
 
-instance Field TestSuiteField where
-  conditional = TestConditional
-  buildInfo = TestInfo
-
 -- | An entire test suite section.
 data TestSuite = TestSuite
   { tsName :: String
@@ -367,10 +341,6 @@
   | BenchmarkInfo BuildInfoField
   -- ^ A benchmark can have build information fields.
   deriving (Eq, Ord, Show)
-
-instance Field BenchmarkField where
-  conditional = BenchmarkConditional
-  buildInfo = BenchmarkInfo
 
 data Benchmark = Benchmark
   { bmName :: String
diff --git a/lib/Cartel/Defaults.hs b/lib/Cartel/Defaults.hs
deleted file mode 100644
--- a/lib/Cartel/Defaults.hs
+++ /dev/null
@@ -1,86 +0,0 @@
--- | Default values for the data types in "Cartel.Ast".  These
--- defaults are genrally filled in with blank values.  Use these
--- default values where you can; by doing so you help future-proof
--- your code.  Use the default as a starting point and fill in the
--- values that you need.
-module Cartel.Defaults where
-
-import qualified Cartel.Ast as A
-
--- | A default 'A.Properties'.  'A.prCabalVersion' is @(1, 14)@ to
--- specify Cabal version 1.14; 'A.prBuildType' is 'A.Simple', and
--- 'A.prLicense' is 'A.BSD3'.  All other items are either the empty
--- 'String' or the empty list, including the 'A.prVersion', which is
--- left empty.
-properties :: A.Properties
-properties = A.Properties
-  { A.prName = ""
-  , A.prVersion = A.Version []
-  , A.prCabalVersion = (1, 14)
-  , A.prBuildType = A.Simple
-  , A.prLicense = A.BSD3
-  , A.prLicenseFile = ""
-  , A.prLicenseFiles = []
-  , A.prCopyright = ""
-  , A.prAuthor = ""
-  , A.prMaintainer = ""
-  , A.prStability = ""
-  , A.prHomepage = ""
-  , A.prBugReports = ""
-  , A.prPackageUrl = ""
-  , A.prSynopsis = ""
-  , A.prDescription = []
-  , A.prCategory = ""
-  , A.prTestedWith = []
-  , A.prDataFiles = []
-  , A.prDataDir = ""
-  , A.prExtraSourceFiles = []
-  , A.prExtraDocFiles = []
-  , A.prExtraTmpFiles = []
-  }
-
--- | A default 'A.Cabal'.  'properties' is used for 'A.cProperties',
--- and 'A.cLibrary' is 'Nothing'; all other lists are empty.
-cabal :: A.Cabal
-cabal = A.Cabal
-  { A.cProperties = properties
-  , A.cRepositories = []
-  , A.cFlags = []
-  , A.cLibrary = Nothing
-  , A.cExecutables = []
-  , A.cTestSuites = []
-  , A.cBenchmarks = []
-  }
-
--- | A default 'A.Repository'.  You must supply the VCS type,
--- information about the kind of repository ('A.Head' or 'A.This'),
--- and the repository location.  'A.repoBranch' and 'A.repoSubdir'
--- are empty.
-repository
-  :: A.Vcs
-  -- ^ Type of VCS in use
-  -> Maybe String
-  -- ^ To use the @this@ repo kind, use Just String, where the
-  -- String is the tag corresponding to the current branch.  To use
-  -- the @head@ repository kind, use Nothing.
-  -> String
-  -- ^ Repo location
-  -> A.Repository
-repository v ms l = A.Repository
-  { A.repoVcs = v
-  , A.repoKind = maybe A.Head (const A.This) ms
-  , A.repoLocation = l
-  , A.repoBranch = ""
-  , A.repoTag = maybe "" id ms
-  , A.repoSubdir = ""
-  }
-
--- | A default 'A.Flag'.  'A.flName' and 'A.flDescription' are
--- empty; 'A.flDefault' is 'True', and 'A.flManual' is 'False'.
-flag :: A.Flag
-flag = A.Flag
-  { A.flName = ""
-  , A.flDescription = ""
-  , A.flDefault = True
-  , A.flManual = False
-  }
diff --git a/lib/Cartel/Empty.hs b/lib/Cartel/Empty.hs
new file mode 100644
--- /dev/null
+++ b/lib/Cartel/Empty.hs
@@ -0,0 +1,79 @@
+-- | Default values for the data types in "Cartel.Ast".  These
+-- defaults are genrally filled in with blank values.  Use these
+-- default values where you can; by doing so you help future-proof
+-- your code.  Use the empty value as a starting point and fill in
+-- the components of the record that you need.
+module Cartel.Empty where
+
+import qualified Cartel.Ast as A
+
+class Empty a where
+  empty :: a
+
+-- | A default 'A.Properties'.  'A.prCabalVersion' is @(1, 14)@ to
+-- specify Cabal version 1.14; 'A.prBuildType' is 'A.Simple', and
+-- 'A.prLicense' is 'A.BSD3'.  All other items are either the empty
+-- 'String' or the empty list, including the 'A.prVersion', which is
+-- left empty.
+instance Empty A.Properties where
+  empty = A.Properties
+    { A.prName = ""
+    , A.prVersion = A.Version []
+    , A.prCabalVersion = (1, 14)
+    , A.prBuildType = A.Simple
+    , A.prLicense = A.BSD3
+    , A.prLicenseFile = ""
+    , A.prLicenseFiles = []
+    , A.prCopyright = ""
+    , A.prAuthor = ""
+    , A.prMaintainer = ""
+    , A.prStability = ""
+    , A.prHomepage = ""
+    , A.prBugReports = ""
+    , A.prPackageUrl = ""
+    , A.prSynopsis = ""
+    , A.prDescription = []
+    , A.prCategory = ""
+    , A.prTestedWith = []
+    , A.prDataFiles = []
+    , A.prDataDir = ""
+    , A.prExtraSourceFiles = []
+    , A.prExtraDocFiles = []
+    , A.prExtraTmpFiles = []
+    }
+
+-- | A default 'A.Cabal'.  'empty' is used for 'A.cProperties',
+-- and 'A.cLibrary' is 'Nothing'; all other lists are empty.
+instance Empty A.Cabal where
+  empty = A.Cabal
+    { A.cProperties = empty
+    , A.cRepositories = []
+    , A.cFlags = []
+    , A.cLibrary = Nothing
+    , A.cExecutables = []
+    , A.cTestSuites = []
+    , A.cBenchmarks = []
+    }
+
+-- | A default 'A.Repository'.  The VCS type is 'A.Git' and the
+-- repository kind is 'A.Head'.  All other values are the empty
+-- string.
+instance Empty A.Repository where
+  empty = A.Repository
+    { A.repoVcs = A.Git
+    , A.repoKind = A.Head
+    , A.repoLocation = ""
+    , A.repoBranch = ""
+    , A.repoTag = ""
+    , A.repoSubdir = ""
+    }
+
+-- | A default 'A.Flag'.  'A.flName' and 'A.flDescription' are
+-- empty; 'A.flDefault' is 'True', and 'A.flManual' is 'False'.
+instance Empty A.Flag where
+  empty = A.Flag
+    { A.flName = ""
+    , A.flDescription = ""
+    , A.flDefault = True
+    , A.flManual = False
+    }
diff --git a/lib/Cartel/Tools.hs b/lib/Cartel/Tools.hs
--- a/lib/Cartel/Tools.hs
+++ b/lib/Cartel/Tools.hs
@@ -1,11 +1,12 @@
 module Cartel.Tools
-  ( -- * Building constraints
+  ( -- * Logic trees
+    LogicTree(..)
+  
+    -- * Building constraints
 
     -- | Helpers to build many common version constraints.
 
     -- ** Building constraint trees
-    (&&&)
-  , (|||)
   , lt
   , gt
   , eq
@@ -19,6 +20,43 @@
   , nextMajor
   , exactly
 
+  -- * Field class
+  , Field(..)
+
+  -- ** Conditionals
+  , cif
+  , system
+  , arch
+  , impl
+  , flag
+  , true
+  , false
+
+  -- ** Build info builders
+  , buildDepends
+  , otherModules
+  , hsSourceDirs
+  , extensions
+  , buildTools
+  , buildable
+  , ghcOptions
+  , ghcProfOptions
+  , ghcSharedOptions
+  , hugsOptions
+  , nhc98Options
+  , includes
+  , installIncludes
+  , includeDirs
+  , cSources
+  , extraLibraries
+  , extraLibDirs
+  , ccOptions
+  , cppOptions
+  , ldOptions
+  , pkgConfigDepends
+  , frameworks
+  , defaultLanguage
+
   -- * Rendering a cabal file
   , render
   , renderString
@@ -42,16 +80,22 @@
 import qualified Paths_cartel
 import qualified System.IO as IO
 
-(&&&) :: A.ConstrTree -> A.ConstrTree -> A.ConstrTree
-l &&& r = A.Branch A.And l r
+class LogicTree a where
+  (&&&) :: a -> a -> a
+  (|||) :: a -> a -> a
 
 infixr 3 &&&
+infixr 2 |||
 
-(|||) :: A.ConstrTree -> A.ConstrTree -> A.ConstrTree
-l ||| r = A.Branch A.Or l r
+instance LogicTree A.ConstrTree where
+  l &&& r = A.Branch A.And l r
+  l ||| r = A.Branch A.Or l r
 
-infixr 2 |||
+instance LogicTree A.CondTree where
+  l &&& r = A.CBranch A.And l r
+  l ||| r = A.CBranch A.Or l r
 
+
 lt :: [Int] -> A.ConstrTree
 lt = A.Leaf . A.Constraint LT . A.Version
 
@@ -274,6 +318,153 @@
     else return $ if interestingFile exts this
           then [(P.dropExtension this : dirs)]
           else []
+
+-- | Things that can be an item in a field in a Cabal file.
+class Field a where
+
+  -- | Takes a conditional block and wraps it in the field type.
+  conditional :: A.CondBlock a -> a
+
+  -- | Takes a build information field and wraps it in the field
+  -- type.
+  buildInfo :: A.BuildInfoField -> a
+
+instance Field A.LibraryField where
+  conditional = A.LibConditional
+  buildInfo = A.LibInfo
+
+instance Field A.ExecutableField where
+  conditional = A.ExeConditional
+  buildInfo = A.ExeInfo
+
+instance Field A.TestSuiteField where
+  conditional = A.TestConditional
+  buildInfo = A.TestInfo
+
+instance Field A.BenchmarkField where
+  conditional = A.BenchmarkConditional
+  buildInfo = A.BenchmarkInfo
+
+-- # Build info helpers
+buildDepends :: Field a => [A.Package] -> a
+buildDepends = buildInfo . A.BuildDepends
+
+otherModules :: Field a => [String] -> a
+otherModules = buildInfo . A.OtherModules
+
+hsSourceDirs :: Field a => [String] -> a
+hsSourceDirs = buildInfo . A.HsSourceDirs
+
+extensions :: Field a => [String] -> a
+extensions = buildInfo . A.Extensions
+
+buildTools :: Field a => [A.Package] -> a
+buildTools = buildInfo . A.BuildTools
+
+buildable :: Field a => Bool -> a
+buildable = buildInfo . A.Buildable
+
+ghcOptions :: Field a => [String] -> a
+ghcOptions = buildInfo . A.GHCOptions
+
+ghcProfOptions :: Field a => [String] -> a
+ghcProfOptions = buildInfo . A.GHCProfOptions
+
+ghcSharedOptions :: Field a => [String] -> a
+ghcSharedOptions = buildInfo . A.GHCSharedOptions
+
+hugsOptions :: Field a => [String] -> a
+hugsOptions = buildInfo . A.HugsOptions
+
+nhc98Options :: Field a => [String] -> a
+nhc98Options = buildInfo . A.Nhc98Options
+
+includes :: Field a => [String] -> a
+includes = buildInfo . A.Includes
+
+installIncludes :: Field a => [String] -> a
+installIncludes = buildInfo . A.InstallIncludes
+
+includeDirs :: Field a => [String] -> a
+includeDirs = buildInfo . A.IncludeDirs
+
+cSources :: Field a => [String] -> a
+cSources = buildInfo . A.CSources
+
+extraLibraries :: Field a => [String] -> a
+extraLibraries = buildInfo . A.ExtraLibraries
+
+extraLibDirs :: Field a => [String] -> a
+extraLibDirs = buildInfo . A.ExtraLibDirs
+
+ccOptions :: Field a => [String] -> a
+ccOptions = buildInfo . A.CCOptions
+
+cppOptions :: Field a => [String] -> a
+cppOptions = buildInfo . A.CPPOptions
+
+ldOptions :: Field a => [String] -> a
+ldOptions = buildInfo . A.LDOptions
+
+pkgConfigDepends :: Field a => [A.Package] -> a
+pkgConfigDepends = buildInfo . A.PkgConfigDepends
+
+frameworks :: Field a => [String] -> a
+frameworks = buildInfo . A.Frameworks
+
+defaultLanguage :: Field a => A.Language -> a
+defaultLanguage = buildInfo . A.DefaultLanguage
+
+-- | Builds @if@ statements.  Use with the following functions, such
+-- as 'flag', to make it easy to build conditional blocks.  For
+-- example:
+--
+-- > cif (flag "buildExe") [buildable True] [buildable False]
+--
+-- A little more complicated:
+--
+-- > cif (flag "buildExe" &&& system "windows")
+-- >   [buildable True] [buildable False]
+cif
+  :: Field a
+  => A.CondTree
+  -- ^ Condition to satisfy
+  -> [a]
+  -- ^ Use these results if condition is true
+  -> [a]
+  -- ^ Use these results if condition if false
+  -> a
+cif tree ifTrue ifFalse =
+  conditional $ A.CondBlock tree ifTrue ifFalse
+
+-- | Operating system; tested against @System.Info.os@ on the
+-- target system.
+system :: String -> A.CondTree
+system = A.CLeaf . A.OS
+
+-- | Argument is matched against @System.Info.arch@ on the target
+-- system.
+arch :: String -> A.CondTree
+arch = A.CLeaf . A.Arch
+
+-- | Tests for the configured Haskell implementation.
+impl :: A.Compiler -> Maybe A.ConstrTree -> A.CondTree
+impl cm cn = A.CLeaf $ A.Impl (cm, cn)
+
+-- | Evaluates to the current assignment of the flag of the given
+-- name.  Flag names are case insensitive.  Testing for flags that
+-- have not been introduced with a flag section is an error.
+flag :: String -> A.CondTree
+flag = A.CLeaf . A.CFlag
+
+-- | Always true.
+true :: A.CondTree
+true = A.CLeaf A.CTrue
+
+-- | Always false.
+false :: A.CondTree
+false = A.CLeaf A.CFalse
+
 
 -- | Renders a 'A.Cabal' data type as a string.
 renderString
diff --git a/minimum-versions.txt b/minimum-versions.txt
--- a/minimum-versions.txt
+++ b/minimum-versions.txt
@@ -1,7 +1,7 @@
 This package was tested to work with these dependency
 versions and compiler version.
 These are the minimum versions given in the .cabal file.
-Tested as of: 2014-05-28 23:55:01.837807 UTC
+Tested as of: 2014-05-30 16:15:53.772569 UTC
 Path to compiler: ghc-7.4.1
 Compiler description: 7.4.1
 
@@ -33,6 +33,6 @@
     time-1.4
     unix-2.5.1.0
 
-/home/massysett/cartel/sunlight-24643/db:
-    cartel-0.4.0.0
+/home/massysett/cartel/sunlight-11214/db:
+    cartel-0.10.0.0
 
