diff --git a/buffer-builder-aeson.cabal b/buffer-builder-aeson.cabal
--- a/buffer-builder-aeson.cabal
+++ b/buffer-builder-aeson.cabal
@@ -2,7 +2,7 @@
 --  documentation, see http://haskell.org/cabal/users-guide/
 
 name:                buffer-builder-aeson
-version:             0.2.0.0
+version:             0.2.0.3
 synopsis:            Serialize Aeson values with Data.BufferBuilder
 description:
 
@@ -40,11 +40,12 @@
 build-type:          Simple
 -- extra-source-files:  
 cabal-version:       >=1.10
+extra-source-files:  test/*.hs bench/*.hs
 
 source-repository this
   type:     git
   location: https://github.com/andyfriesen/buffer-builder-aeson
-  tag:      0.2.0.0
+  tag:      0.2.0.3
 
 library
   exposed-modules:     Data.BufferBuilder.Aeson
@@ -57,7 +58,7 @@
   build-depends:       base >=4.6 && <4.8
                      , aeson
                      , integer-gmp
-                     , buffer-builder >=0.2.0.0
+                     , buffer-builder >=0.2.0.3
                      , unordered-containers
                      , vector
                      , scientific
diff --git a/test/AesonQuickCheck.hs b/test/AesonQuickCheck.hs
new file mode 100644
--- /dev/null
+++ b/test/AesonQuickCheck.hs
@@ -0,0 +1,66 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module AesonQuickCheck where
+
+import Data.Aeson
+import Test.QuickCheck
+import           Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Vector as V
+import           Data.HashMap.Strict (HashMap)
+import qualified Data.HashMap.Strict as HashMap
+import Data.Scientific
+import Data.Hashable (Hashable)
+import Control.Applicative
+
+
+newtype ArbObject = ArbObject { unArbObject :: Object }
+
+-- bleh hack
+instance Arbitrary Text where
+    arbitrary = fmap T.pack $ arbitrary
+    shrink txt = fmap T.pack $ shrink $ T.unpack txt
+
+arbitraryArray :: (Arbitrary a) => Gen [a]
+arbitraryArray = sized $ \s -> do
+    (Positive len) <- arbitrary
+    vector $ min s (len `mod` 10)
+
+arbitraryObject :: (Hashable k, Eq k, Arbitrary k, Arbitrary v) => Gen (HashMap k v)
+arbitraryObject = fmap HashMap.fromList arbitraryArray
+
+shrinkHashMap hashMap = fmap HashMap.fromList (shrink (HashMap.toList hashMap))
+
+instance Arbitrary ArbObject where
+    arbitrary = sized $ \s -> let s' = max 1 (s `div` 10) in
+        ArbObject <$> resize s' arbitraryObject
+
+instance Arbitrary Value where
+    arbitrary = sized $ \s -> let s' = max 1 (s - 1) in seq s' $ resize s' $ oneof
+        [ Object . unArbObject <$> arbitrary
+        , Array . V.fromList <$> arbitraryArray
+        , String <$> arbitrary
+        , Number <$> arbitrary
+        , Bool   <$> arbitrary
+        , return Null
+        ]
+
+    shrink e = case e of
+        Object x -> Object <$> shrinkHashMap x
+        Array x  -> Array <$> shrink x
+        String _ -> []
+        Number _ -> []
+        Bool _   -> []
+        Null     -> []
+
+instance Arbitrary Scientific where
+    arbitrary = do
+        val <- arbitrary :: Gen Int
+        return $ scientific (fromIntegral val) 1
+    shrink val = do
+        val' <- shrink (floor val)
+        return $ scientific val' 0
+
+instance Arbitrary a => Arbitrary (V.Vector a) where
+    arbitrary = V.fromList <$> arbitrary
+    shrink = fmap V.fromList . shrink . V.toList
