diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2013-2014, Omari Norman
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Omari Norman nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,45 @@
+# rainbow
+
+rainbow helps you build colorful output for both 8- and 256-color
+terminals.  It works only on Unix-like operating systems.
+
+rainbow is on Github:
+
+http://www.github.com/massysett/rainbow
+
+and Hackage:
+
+http://hackage.haskell.org/package/rainbow
+
+rainbow is licensed under the BSD license; see the LICENSE file.
+
+## Versioning
+
+rainbow releases are numbered in accordance with the Haskell
+Package Versioning Policy.
+
+rainbow does not set its dependencies in accordance with the
+Package Versioning Policy, as I do not set upper bounds.  rainbow
+is guaranteed to build with the *minimum* versions specified in the
+cabal file.  I also include a dependencies.txt file that
+documents more recent dependencies that are also known to work.
+
+If you find that rainbow does not build due to dependency problems:
+1) please let me know at omari@smileystation.com; 2) feel free to
+add appropriate upper bounds or patches to the package as
+appropriate; and 3) feel free to add command-line contraints to your
+cabal command to get it to build.
+
+## Building
+
+If you get the package from Hackage, it is ready to build with
+`cabal install` like any other Haskell package.
+
+If you get it from Github, first you will need to create the cabal
+file.  It's built using m4 to avoid redundancies in the file.  To
+build the cabal file, simply invoke `make`.
+
+## Generators package
+
+The source tree also includes a package `rainbow-tests` which
+includes several generators that other packages might find useful.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/changelog b/changelog
new file mode 100644
--- /dev/null
+++ b/changelog
@@ -0,0 +1,8 @@
+0.14.0.2
+  * Change dependency bounds
+  * Change cabal generator to cartel
+
+0.14.0.0
+
+  * Change Chunk to hold a list of strict Text rather
+  than just a single Text.
diff --git a/current-versions.txt b/current-versions.txt
new file mode 100644
--- /dev/null
+++ b/current-versions.txt
@@ -0,0 +1,45 @@
+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-07-13 15:21:37.859452 UTC
+Path to compiler: ghc-7.8.2
+Compiler description: 7.8.2
+
+/opt/ghc/7.8.2/lib/ghc-7.8.2/package.conf.d:
+    Cabal-1.18.1.3
+    array-0.5.0.0
+    base-4.7.0.0
+    bin-package-db-0.0.0.0
+    binary-0.7.1.0
+    rts-1.0
+    bytestring-0.10.4.0
+    containers-0.5.5.1
+    deepseq-1.3.0.2
+    directory-1.2.1.0
+    filepath-1.3.0.2
+    (ghc-7.8.2)
+    ghc-prim-0.3.1.0
+    (haskell2010-1.1.2.0)
+    (haskell98-2.0.0.3)
+    hoopl-3.10.0.1
+    hpc-0.6.0.1
+    integer-gmp-0.5.1.0
+    old-locale-1.0.0.6
+    old-time-1.1.0.2
+    pretty-1.1.1.1
+    process-1.2.0.0
+    template-haskell-2.9.0.0
+    time-1.4.2
+    transformers-0.3.0.0
+    unix-2.7.0.1
+
+/home/massysett/rainbow/tests/sunlight-5537/db:
+    QuickCheck-2.7.5
+    primitive-0.5.3.0
+    rainbow-0.14.0.2
+    rainbow-tests-0.14.0.2
+    random-1.0.1.1
+    terminfo-0.4.0.0
+    text-1.1.1.3
+    tf-random-0.5
+
diff --git a/genCabal.hs b/genCabal.hs
new file mode 100644
--- /dev/null
+++ b/genCabal.hs
@@ -0,0 +1,64 @@
+-- Generates a Cabal file for rainbow-tests using the Cartel package.
+--
+-- Written for Cartel version 0.10.0.2.
+
+import qualified Cartel as A
+import CabalCommon
+
+rainbow :: A.Package
+rainbow = A.exactly "rainbow" versionInts
+
+quickcheck :: A.Package
+quickcheck = A.closedOpen "QuickCheck" [2,7,5] [2,8]
+
+properties :: A.Properties
+properties = sharedProperties
+  { A.prName = "rainbow-tests"
+  , A.prSynopsis = "Tests and QuickCheck generators to accompany rainbow."
+  , A.prDescription =
+    [ "These are packaged separately so other packages may depend"
+    , "on them."
+    ]
+
+  , A.prExtraSourceFiles =
+    [ "README.md"
+    , "changelog"
+    , "current-versions.txt"
+    , "minimum-versions.txt"
+    , "genCabal.hs"
+    , "sunlight-test.hs"
+    ]
+  }
+
+library
+  :: [String]
+  -- ^ Library modules
+  -> A.Library
+library ms = A.Library
+  [ A.LibExposedModules ms
+  , A.defaultLanguage A.Haskell2010
+  , A.ghcOptions ["-Wall"]
+  , A.hsSourceDirs ["lib"]
+  , A.buildDepends
+    [ base
+    , terminfo
+    , text
+    , rainbow
+    , quickcheck
+    ]
+  ]
+
+cabal
+  :: [String]
+  -- ^ Library modules
+  -> A.Cabal
+cabal ms = A.empty
+  { A.cProperties = properties
+  , A.cRepositories = [repo]
+  , A.cLibrary = Just $ library ms
+  }
+
+main :: IO ()
+main = do
+  ms <- A.modules "lib"
+  A.render "genCabal.hs" $ cabal ms
diff --git a/lib/Data/Monoid/Coarbitrary.hs b/lib/Data/Monoid/Coarbitrary.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Monoid/Coarbitrary.hs
@@ -0,0 +1,9 @@
+module Data.Monoid.Coarbitrary where
+
+import Test.QuickCheck
+import qualified Data.Monoid as O
+
+last :: (a -> Gen b -> Gen b) -> O.Last a -> Gen b -> Gen b
+last f (O.Last m) = case m of
+  Nothing -> variant (0 :: Int)
+  Just a -> variant (1 :: Int) . f a
diff --git a/lib/Data/Monoid/Generators.hs b/lib/Data/Monoid/Generators.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Monoid/Generators.hs
@@ -0,0 +1,8 @@
+module Data.Monoid.Generators where
+
+import qualified Data.Monoid as O
+import Test.QuickCheck
+
+last :: Gen a -> Gen (O.Last a)
+last g = fmap O.Last $ frequency
+  [ (3, fmap Just g), (1, return Nothing) ]
diff --git a/lib/Data/Monoid/Shrinkers.hs b/lib/Data/Monoid/Shrinkers.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Monoid/Shrinkers.hs
@@ -0,0 +1,8 @@
+module Data.Monoid.Shrinkers where
+
+import qualified Data.Monoid as O
+
+last :: (a -> [a]) -> O.Last a -> [O.Last a]
+last f (O.Last l) = case l of
+  Nothing -> []
+  Just a -> map O.Last $ Nothing : [Just x | x <- f a]
diff --git a/lib/Data/Text/Coarbitrary.hs b/lib/Data/Text/Coarbitrary.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Text/Coarbitrary.hs
@@ -0,0 +1,8 @@
+module Data.Text.Coarbitrary where
+
+import Test.QuickCheck
+import Data.Text (Text)
+import qualified Data.Text as X
+
+text :: Text -> Gen b -> Gen b
+text = coarbitrary . X.unpack
diff --git a/lib/Data/Text/Generators.hs b/lib/Data/Text/Generators.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Text/Generators.hs
@@ -0,0 +1,9 @@
+module Data.Text.Generators where
+
+import Test.QuickCheck
+import qualified Data.Text as X
+import Data.Text (Text)
+
+text :: Gen Char -> Gen Text
+text = fmap X.pack . listOf
+
diff --git a/lib/Data/Text/Shrinkers.hs b/lib/Data/Text/Shrinkers.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Text/Shrinkers.hs
@@ -0,0 +1,8 @@
+module Data.Text.Shrinkers where
+
+import Data.Text (Text)
+import qualified Data.Text as X
+import Test.QuickCheck
+
+text :: (Char -> [Char]) -> Text -> [Text]
+text f = map X.pack . shrinkList f . X.unpack
diff --git a/lib/Rainbow/Tests/Util.hs b/lib/Rainbow/Tests/Util.hs
new file mode 100644
--- /dev/null
+++ b/lib/Rainbow/Tests/Util.hs
@@ -0,0 +1,52 @@
+module Rainbow.Tests.Util where
+
+import Test.QuickCheck
+
+shrink2 :: (a -> [a]) -> (b -> [b]) -> (a, b) -> [(a, b)]
+shrink2 fa fb (a, b) =
+     [ (a', b) | a' <- fa a ]
+  ++ [ (a, b') | b' <- fb b ]
+
+shrink3
+  :: (a -> [a])
+  -> (b -> [b])
+  -> (c -> [c])
+  -> (a, b, c)
+  -> [(a, b, c)]
+shrink3 fa fb fc (a, b, c) =
+  [ (a', b', c') | (a', (b', c'))
+    <- shrink2 fa (shrink2 fb fc) (a, (b, c)) ]
+
+shrink4
+  :: (a -> [a])
+  -> (b -> [b])
+  -> (c -> [c])
+  -> (d -> [d])
+  -> (a, b, c, d)
+  -> [(a, b, c, d)]
+shrink4 fa fb fc fd (a, b, c, d) =
+  [ (a', b', c', d') | (a', (b', (c', d')))
+    <- shrink2 fa (shrink2 fb (shrink2 fc fd)) (a, (b, (c, d))) ]
+
+shrink5
+  :: (a -> [a])
+  -> (b -> [b])
+  -> (c -> [c])
+  -> (d -> [d])
+  -> (e -> [e])
+  -> (a, b, c, d, e)
+  -> [(a, b, c, d, e)]
+shrink5 fa fb fc fd fe (a, b, c, d, e) =
+  [ (a', b', c', d', e') | (a', (b', (c', (d', e'))))
+    <- shrink2 fa (shrink2 fb (shrink2 fc (shrink2 fd fe)))
+                  (a, (b, (c, (d, e)))) ]
+
+coarbitraryList
+  :: (a -> Gen b -> Gen b)
+  -> [a]
+  -> Gen b
+  -> Gen b
+coarbitraryList f xs = case xs of
+  [] -> variant (0 :: Int)
+  a:as -> variant (1 :: Int) . f a . coarbitraryList f as
+
diff --git a/lib/System/Console/Rainbow/Coarbitrary.hs b/lib/System/Console/Rainbow/Coarbitrary.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Coarbitrary.hs
@@ -0,0 +1,7 @@
+module System.Console.Rainbow.Coarbitrary
+  ( module System.Console.Rainbow.Types.Coarbitrary
+  , module System.Console.Rainbow.Colors.Coarbitrary
+  ) where
+
+import System.Console.Rainbow.Types.Coarbitrary
+import System.Console.Rainbow.Colors.Coarbitrary
diff --git a/lib/System/Console/Rainbow/Colors/Coarbitrary.hs b/lib/System/Console/Rainbow/Colors/Coarbitrary.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Colors/Coarbitrary.hs
@@ -0,0 +1,15 @@
+module System.Console.Rainbow.Colors.Coarbitrary where
+
+import Test.QuickCheck
+import System.Console.Terminfo.Color.Coarbitrary
+import System.Console.Rainbow.Colors
+
+color8 :: Color8 -> Gen b -> Gen b
+color8 c = case unColor8 c of
+  Nothing -> variant (0 :: Int)
+  Just x -> variant (1 :: Int) . color x
+
+color256 :: Color256 -> Gen b -> Gen b
+color256 c = case unColor256 c of
+  Nothing -> variant (0 :: Int)
+  Just x -> variant (1 :: Int) . color x
diff --git a/lib/System/Console/Rainbow/Colors/Generators.hs b/lib/System/Console/Rainbow/Colors/Generators.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Colors/Generators.hs
@@ -0,0 +1,10 @@
+module System.Console.Rainbow.Colors.Generators where
+
+import qualified System.Console.Rainbow.Colors as C
+import Test.QuickCheck
+
+color8 :: Gen C.Color8
+color8 = elements $ C.c8_default : map snd C.c8_all
+
+color256 :: Gen C.Color256
+color256 = elements $ C.c256_default : map snd C.c256_all
diff --git a/lib/System/Console/Rainbow/Colors/Shrinkers.hs b/lib/System/Console/Rainbow/Colors/Shrinkers.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Colors/Shrinkers.hs
@@ -0,0 +1,54 @@
+module System.Console.Rainbow.Colors.Shrinkers where
+
+import Test.QuickCheck
+import qualified System.Console.Rainbow.Colors as C
+import qualified System.Console.Terminfo.Color as TC
+
+color8Named :: [C.Color8]
+color8Named =
+  [ C.c8_black
+  , C.c8_red
+  , C.c8_green
+  , C.c8_yellow
+  , C.c8_blue
+  , C.c8_magenta
+  , C.c8_cyan
+  , C.c8_white
+  ]
+
+color256Named :: [C.Color256]
+color256Named =
+  [ C.c256_black
+  , C.c256_red
+  , C.c256_green
+  , C.c256_yellow
+  , C.c256_blue
+  , C.c256_magenta
+  , C.c256_cyan
+  , C.c256_white
+  ]
+
+color8 :: C.Color8 -> [C.Color8]
+color8 c = case C.unColor8 c of
+  Nothing -> []
+  Just t -> case t of
+    TC.ColorNumber n -> C.c8_default : color8Named ++ rest
+      where
+        rest = map get . shrinkIntegral $ n
+        get i = case lookup i C.c8_all of
+          Nothing -> error "color8 shrink failed"
+          Just x -> x
+    _ -> [C.c8_default]
+
+color256 :: C.Color256 -> [C.Color256]
+color256 c = case C.unColor256 c of
+  Nothing -> []
+  Just t -> case t of
+    TC.ColorNumber n -> C.c256_default : color256Named ++ rest
+      where
+        rest = map get . shrinkIntegral $ n
+        get i = case lookup i C.c256_all of
+          Nothing -> error "color256 shrink failed"
+          Just x -> x
+    _ -> [C.c256_default]
+
diff --git a/lib/System/Console/Rainbow/Generators.hs b/lib/System/Console/Rainbow/Generators.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Generators.hs
@@ -0,0 +1,7 @@
+module System.Console.Rainbow.Generators
+  ( module System.Console.Rainbow.Types.Generators
+  , module System.Console.Rainbow.Colors.Generators
+  ) where
+
+import System.Console.Rainbow.Types.Generators
+import System.Console.Rainbow.Colors.Generators
diff --git a/lib/System/Console/Rainbow/Shrinkers.hs b/lib/System/Console/Rainbow/Shrinkers.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Shrinkers.hs
@@ -0,0 +1,7 @@
+module System.Console.Rainbow.Shrinkers
+  ( module System.Console.Rainbow.Types.Shrinkers
+  , module System.Console.Rainbow.Colors.Shrinkers
+  ) where
+
+import System.Console.Rainbow.Types.Shrinkers
+import System.Console.Rainbow.Colors.Shrinkers
diff --git a/lib/System/Console/Rainbow/Types/Coarbitrary.hs b/lib/System/Console/Rainbow/Types/Coarbitrary.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Types/Coarbitrary.hs
@@ -0,0 +1,38 @@
+module System.Console.Rainbow.Types.Coarbitrary where
+
+import Test.QuickCheck
+import Data.Monoid.Coarbitrary
+import Data.Text.Coarbitrary
+import System.Console.Rainbow.Colors.Coarbitrary
+import qualified System.Console.Rainbow.Types as T
+import Rainbow.Tests.Util
+import Prelude hiding (last)
+
+styleCommon :: T.StyleCommon -> Gen b -> Gen b
+styleCommon c
+  = last coarbitrary (T.scBold c)
+  . last coarbitrary (T.scUnderline c)
+  . last coarbitrary (T.scFlash c)
+  . last coarbitrary (T.scInverse c)
+
+style8 :: T.Style8 -> Gen b -> Gen b
+style8 c
+  = last color8 (T.foreground8 c)
+  . last color8 (T.background8 c)
+  . styleCommon (T.common8 c)
+
+style256 :: T.Style256 -> Gen b -> Gen b
+style256 c
+  = last color256 (T.foreground256 c)
+  . last color256 (T.background256 c)
+  . styleCommon (T.common256 c)
+
+textSpec :: T.TextSpec -> Gen b -> Gen b
+textSpec c
+  = style8 (T.style8 c)
+  . style256 (T.style256 c)
+
+chunk :: T.Chunk -> Gen b -> Gen b
+chunk c
+  = textSpec (T.textSpec c)
+  . coarbitraryList text (T.text c)
diff --git a/lib/System/Console/Rainbow/Types/Generators.hs b/lib/System/Console/Rainbow/Types/Generators.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Types/Generators.hs
@@ -0,0 +1,30 @@
+module System.Console.Rainbow.Types.Generators where
+
+import Data.Monoid.Generators
+import qualified System.Console.Rainbow.Types as T
+import System.Console.Rainbow.Colors.Generators
+import Test.QuickCheck
+import Control.Monad
+import Data.Text.Generators
+import Prelude ()
+
+styleCommon :: Gen T.StyleCommon
+styleCommon = liftM4 T.StyleCommon g g g g
+  where
+    g = last arbitrary
+
+style8 :: Gen T.Style8
+style8 = liftM3 T.Style8 g g styleCommon
+  where
+    g = last color8
+
+style256 :: Gen T.Style256
+style256 = liftM3 T.Style256 g g styleCommon
+  where
+    g = last color256
+
+textSpec :: Gen T.TextSpec
+textSpec = liftM2 T.TextSpec style8 style256
+
+chunk :: Gen T.Chunk
+chunk = liftM2 T.Chunk textSpec (listOf (text arbitrary))
diff --git a/lib/System/Console/Rainbow/Types/Shrinkers.hs b/lib/System/Console/Rainbow/Types/Shrinkers.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Rainbow/Types/Shrinkers.hs
@@ -0,0 +1,39 @@
+module System.Console.Rainbow.Types.Shrinkers where
+
+import Data.Text.Shrinkers
+import Rainbow.Tests.Util
+import Data.Monoid.Shrinkers
+import System.Console.Rainbow.Colors.Shrinkers
+import Test.QuickCheck
+import qualified System.Console.Rainbow.Types as T
+import Prelude ()
+
+styleCommon :: T.StyleCommon -> [T.StyleCommon]
+styleCommon (T.StyleCommon a b c d) =
+  [ T.StyleCommon a' b' c' d'
+    | (a', b', c', d') <- shrink4 s s s s (a, b, c, d) ]
+  where
+    s = last shrink
+
+style8 :: T.Style8 -> [T.Style8]
+style8 (T.Style8 f8 b8 c) =
+  [ T.Style8 f8' b8' c'
+  | (f8', b8', c') <- shrink3 sc sc styleCommon (f8, b8, c) ]
+  where
+    sc = last color8
+
+style256 :: T.Style256 -> [T.Style256]
+style256 (T.Style256 f256 b256 c) =
+  [ T.Style256 f256' b256' c'
+  | (f256', b256', c') <- shrink3 sc sc styleCommon (f256, b256, c) ]
+  where
+    sc = last color256
+
+textSpec :: T.TextSpec -> [T.TextSpec]
+textSpec (T.TextSpec s8 s256) =
+  [ T.TextSpec s8' s256'
+  | (s8', s256') <- shrink2 style8 style256 (s8, s256) ]
+
+chunk :: T.Chunk -> [T.Chunk]
+chunk (T.Chunk t xs) = [T.Chunk t' xs'
+  | (t', xs') <- shrink2 textSpec (shrinkList (text shrink)) (t, xs) ]
diff --git a/lib/System/Console/Terminfo/Color/Coarbitrary.hs b/lib/System/Console/Terminfo/Color/Coarbitrary.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Terminfo/Color/Coarbitrary.hs
@@ -0,0 +1,18 @@
+module System.Console.Terminfo.Color.Coarbitrary where
+
+import Test.QuickCheck
+import System.Console.Terminfo.Color
+
+color :: Color -> Gen b -> Gen b
+color c = case c of
+  Black -> var 0
+  Red -> var 1
+  Green -> var 2
+  Yellow -> var 3
+  Blue -> var 4
+  Magenta -> var 5
+  Cyan -> var 6
+  White -> var 7
+  ColorNumber i -> var 8 . var i
+  where
+    var = variant
diff --git a/lib/System/Console/Terminfo/Color/Generators.hs b/lib/System/Console/Terminfo/Color/Generators.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Terminfo/Color/Generators.hs
@@ -0,0 +1,22 @@
+module System.Console.Terminfo.Color.Generators where
+
+import Test.QuickCheck
+import qualified System.Console.Terminfo.Color as C
+
+basicColors :: [C.Color]
+basicColors =
+  [ C.Black
+  , C.Red
+  , C.Green
+  , C.Yellow
+  , C.Blue
+  , C.Magenta
+  , C.Cyan
+  , C.White
+  ]
+
+allColors :: [C.Color]
+allColors = basicColors ++ map C.ColorNumber [0..255]
+
+color :: Gen C.Color
+color = elements allColors
diff --git a/lib/System/Console/Terminfo/Color/Shrinkers.hs b/lib/System/Console/Terminfo/Color/Shrinkers.hs
new file mode 100644
--- /dev/null
+++ b/lib/System/Console/Terminfo/Color/Shrinkers.hs
@@ -0,0 +1,11 @@
+module System.Console.Terminfo.Color.Shrinkers where
+
+import qualified System.Console.Terminfo.Color.Generators as GC
+import qualified System.Console.Terminfo.Color as C
+import Test.QuickCheck
+
+color :: C.Color -> [C.Color]
+color c = case c of
+  C.ColorNumber n -> GC.basicColors ++
+    map C.ColorNumber (shrinkIntegral n)
+  _ -> []
diff --git a/minimum-versions.txt b/minimum-versions.txt
new file mode 100644
--- /dev/null
+++ b/minimum-versions.txt
@@ -0,0 +1,46 @@
+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-07-13 15:21:37.859452 UTC
+Path to compiler: ghc-7.4.1
+Compiler description: 7.4.1
+
+/opt/ghc/7.4.1/lib/ghc-7.4.1/package.conf.d:
+    Cabal-1.14.0
+    array-0.4.0.0
+    base-4.5.0.0
+    bin-package-db-0.0.0.0
+    binary-0.5.1.0
+    bytestring-0.9.2.1
+    containers-0.4.2.1
+    deepseq-1.3.0.0
+    directory-1.1.0.2
+    extensible-exceptions-0.1.1.4
+    filepath-1.3.0.0
+    (ghc-7.4.1)
+    ghc-prim-0.2.0.0
+    (haskell2010-1.1.0.1)
+    (haskell98-2.0.0.1)
+    hoopl-3.8.7.3
+    hpc-0.5.1.1
+    integer-gmp-0.4.0.0
+    old-locale-1.0.0.4
+    old-time-1.1.0.0
+    pretty-1.1.1.0
+    process-1.1.0.1
+    rts-1.0
+    template-haskell-2.7.0.0
+    time-1.4
+    unix-2.5.1.0
+
+/home/massysett/rainbow/tests/sunlight-5537/db:
+    QuickCheck-2.7.5
+    primitive-0.5.3.0
+    rainbow-0.14.0.2
+    rainbow-tests-0.14.0.2
+    random-1.0.1.1
+    terminfo-0.3.2
+    text-0.11.2.0
+    tf-random-0.5
+    transformers-0.4.1.0
+
diff --git a/rainbow-tests.cabal b/rainbow-tests.cabal
new file mode 100644
--- /dev/null
+++ b/rainbow-tests.cabal
@@ -0,0 +1,69 @@
+-- This Cabal file generated using the Cartel library.
+-- Cartel is available at:
+-- http://www.github.com/massysett/cartel
+--
+-- Script name used to generate: genCabal.hs
+-- Generated on: 2014-07-13 11:29:54.334637 EDT
+-- Cartel library version: 0.10.0.2
+name: rainbow-tests
+version: 0.14.0.2
+cabal-version: >= 1.14
+build-type: Simple
+license: BSD3
+license-file: LICENSE
+copyright: Copyright 2013 - 2014 Omari Norman
+author: Omari Norman
+maintainer: omari@smileystation.com
+stability: Experimental
+homepage: http://www.github.com/massysett/rainbow
+bug-reports: http://www.github.com/massyett/rainbow/issues
+synopsis: Tests and QuickCheck generators to accompany rainbow.
+description:
+  These are packaged separately so other packages may depend
+  on them.
+category: System
+extra-source-files:
+    README.md
+  , changelog
+  , current-versions.txt
+  , minimum-versions.txt
+  , genCabal.hs
+  , sunlight-test.hs
+
+source-repository head
+  type: git
+  location: git://github.com/massysett/rainbow.git
+  branch: master
+
+Library
+  exposed-modules:
+      Data.Monoid.Coarbitrary
+    , Data.Monoid.Generators
+    , Data.Monoid.Shrinkers
+    , Data.Text.Coarbitrary
+    , Data.Text.Generators
+    , Data.Text.Shrinkers
+    , Rainbow.Tests.Util
+    , System.Console.Rainbow.Coarbitrary
+    , System.Console.Rainbow.Colors.Coarbitrary
+    , System.Console.Rainbow.Colors.Generators
+    , System.Console.Rainbow.Colors.Shrinkers
+    , System.Console.Rainbow.Generators
+    , System.Console.Rainbow.Shrinkers
+    , System.Console.Rainbow.Types.Coarbitrary
+    , System.Console.Rainbow.Types.Generators
+    , System.Console.Rainbow.Types.Shrinkers
+    , System.Console.Terminfo.Color.Coarbitrary
+    , System.Console.Terminfo.Color.Generators
+    , System.Console.Terminfo.Color.Shrinkers
+  default-language: Haskell2010
+  ghc-options:
+      -Wall
+  hs-source-dirs:
+      lib
+  build-depends:
+      base ((> 4.5.0.0 || == 4.5.0.0) && < 4.8.0.0)
+    , terminfo ((> 0.3.2 || == 0.3.2) && < 0.5.0.0)
+    , text ((> 0.11.2.0 || == 0.11.2.0) && < 1.2.0.0)
+    , rainbow == 0.14.0.2
+    , QuickCheck ((> 2.7.5 || == 2.7.5) && < 2.8)
diff --git a/sunlight-test.hs b/sunlight-test.hs
new file mode 100644
--- /dev/null
+++ b/sunlight-test.hs
@@ -0,0 +1,15 @@
+module Main where
+
+import Test.Sunlight
+
+inputs = TestInputs
+  { tiDescription = Nothing
+  , tiCabal = "cabal"
+  , tiLowest = ("7.4.1", "ghc-7.4.1", "ghc-pkg-7.4.1")
+  , tiDefault = [ ("7.4.1", "ghc-7.4.1", "ghc-pkg-7.4.1")
+                , ("7.6.3", "ghc-7.6.3", "ghc-pkg-7.6.3")
+                , ("7.8.2", "ghc-7.8.2", "ghc-pkg-7.8.2") ]
+  , tiTest = []
+  }
+
+main = runTests inputs
