diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # hw-packed-vector
-[![CircleCI](https://circleci.com/gh/haskell-works/hw-packed-vector/tree/0-branch.svg?style=svg)](https://circleci.com/gh/haskell-works/hw-packed-vector/tree/0-branch)
 
+[![CircleCI](https://circleci.com/gh/haskell-works/hw-packed-vector.svg?style=svg)](https://circleci.com/gh/haskell-works/hw-packed-vector)
+
 A vector that stores words of equal size between 1 to 64 inclusive in memory contiguously
 with efficient lookup.
-
diff --git a/hw-packed-vector.cabal b/hw-packed-vector.cabal
--- a/hw-packed-vector.cabal
+++ b/hw-packed-vector.cabal
@@ -1,53 +1,75 @@
-name:                   hw-packed-vector
-version:                0.0.0.1
-synopsis:               Packed Vector
-description:            Please see README.md
-homepage:               http://github.com/haskell-works/hw-packed-vector#readme
-license:                BSD3
-license-file:           LICENSE
-author:                 John Ky
-maintainer:             newhoggy@gmail.com
-copyright:              2016 John Ky
-category:               Data, Vector
-stability:              Experimental
-build-type:             Simple
-extra-source-files:     README.md
-cabal-version:          >= 1.22
-
-library
-  hs-source-dirs:       src
-  exposed-modules:      HaskellWorks.Data.PackedVector
-                      , HaskellWorks.Data.PackedVector.Internal
-                      , HaskellWorks.Data.PackedVector.PackedVector64
-  build-depends:        base                          >= 4          && < 5
-                      , bytestring
-                      , hw-bits                       >= 0.4.0.0
-                      , hw-int                        >= 0.0.0.1
-                      , hw-prim                       >= 0.4.0.0
-                      , hw-string-parse               >= 0.0.0.1
-                      , safe
-                      , vector
-
-  default-language:     Haskell2010
-  ghc-options:          -Wall -O2 -msse4.2
+cabal-version:      2.2
 
-test-suite hw-packed-vector-test
-  type:                 exitcode-stdio-1.0
-  hs-source-dirs:       test
-  main-is:              Spec.hs
-  other-modules:        HaskellWorks.Data.PackedVector.PackedVector64Spec
-                      , HaskellWorks.Data.PackedVector.InternalSpec
-  build-depends:        base                          >= 4          && < 5
-                      , bytestring
-                      , hspec
-                      , hw-bits                       >= 0.4.0.0
-                      , hw-packed-vector
-                      , hw-prim                       >= 0.4.0.0
-                      , QuickCheck
-                      , vector
-  ghc-options:          -threaded -rtsopts -with-rtsopts=-N -Wall
-  default-language:     Haskell2010
+name:               hw-packed-vector
+version:            0.0.0.2
+synopsis:           Packed Vector
+description:        Packed Vector. Please see README.md
+category:           Data, Vector
+stability:          Experimental
+homepage:           http://github.com/haskell-works/hw-packed-vector#readme
+bug-reports:        https://github.com/haskell-works/hw-packed-vector/issues
+author:             John Ky
+maintainer:         newhoggy@gmail.com
+copyright:          2016-2019 John Ky
+license:            BSD-3-Clause
+license-file:       LICENSE
+build-type:         Simple
+extra-source-files:
+  README.md
 
 source-repository head
-  type:     git
+  type: git
   location: https://github.com/haskell-works/hw-packed-vector
+
+common base                 { build-depends: base                 >= 4          && < 5      }
+
+common bytestring           { build-depends: bytestring           >= 0.10.8.2   && < 0.11   }
+common deepseq              { build-depends: deepseq              >= 1.4        && < 1.5    }
+common hedgehog             { build-depends: hedgehog             >= 0.6        && < 1.1    }
+common hspec                { build-depends: hspec                >= 2.7.1      && < 3      }
+common hw-bits              { build-depends: hw-bits              >= 0.7.0.6    && < 0.8    }
+common hw-hedgehog          { build-depends: hw-hedgehog          >= 0.1.0.3    && < 0.2    }
+common hw-hspec-hedgehog    { build-depends: hw-hspec-hedgehog    >= 0.1.0.7    && < 0.2    }
+common hw-prim              { build-depends: hw-prim              >= 0.6.2.25   && < 0.7    }
+common vector               { build-depends: vector               >= 0.12.0.3   && < 0.13   }
+
+common config
+  default-language: Haskell2010
+  ghc-options:      -Wall -O2 -msse4.2
+
+library
+  import:   base, config
+          , bytestring
+          , deepseq
+          , hw-bits
+          , hw-prim
+          , vector
+  exposed-modules:
+    HaskellWorks.Data.PackedVector
+    HaskellWorks.Data.PackedVector.Internal
+    HaskellWorks.Data.PackedVector.PackedVector64
+  other-modules:    Paths_hw_packed_vector
+  autogen-modules:  Paths_hw_packed_vector
+  hs-source-dirs:   src
+
+test-suite hw-packed-vector-test
+  import:   base, config
+          , bytestring
+          , hedgehog
+          , hspec
+          , hw-bits
+          , hw-hedgehog
+          , hw-hspec-hedgehog
+          , hw-prim
+          , vector
+  type:             exitcode-stdio-1.0
+  main-is:          Spec.hs
+  other-modules:
+      HaskellWorks.Data.PackedVector.InternalSpec
+      HaskellWorks.Data.PackedVector.PackedVector64Spec
+      HaskellWorks.Gen
+      Paths_hw_packed_vector
+  hs-source-dirs:   test
+  ghc-options:      -threaded -rtsopts -with-rtsopts=-N
+  build-depends:    hw-packed-vector
+  build-tools:      hspec-discover
diff --git a/src/HaskellWorks/Data/PackedVector.hs b/src/HaskellWorks/Data/PackedVector.hs
--- a/src/HaskellWorks/Data/PackedVector.hs
+++ b/src/HaskellWorks/Data/PackedVector.hs
@@ -1,8 +1,6 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
-
 module HaskellWorks.Data.PackedVector
     ( module X
     ) where
 
-import           HaskellWorks.Data.PackedVector.Internal       as X
-import           HaskellWorks.Data.PackedVector.PackedVector64 as X
+import HaskellWorks.Data.PackedVector.Internal       as X
+import HaskellWorks.Data.PackedVector.PackedVector64 as X
diff --git a/src/HaskellWorks/Data/PackedVector/PackedVector64.hs b/src/HaskellWorks/Data/PackedVector/PackedVector64.hs
--- a/src/HaskellWorks/Data/PackedVector/PackedVector64.hs
+++ b/src/HaskellWorks/Data/PackedVector/PackedVector64.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE TypeFamilies  #-}
 
 module HaskellWorks.Data.PackedVector.PackedVector64
   ( PackedVector64(..)
@@ -7,22 +8,27 @@
   , toList
   ) where
 
+import Control.DeepSeq
+import Data.Int
+import Data.Word
+import GHC.Generics
+import HaskellWorks.Data.AtIndex
+import HaskellWorks.Data.Bits.BitWise
+import HaskellWorks.Data.Bits.LoBitsSized
+import HaskellWorks.Data.PackedVector.Internal
+import HaskellWorks.Data.Positioning
+import HaskellWorks.Data.Unsign
+import Prelude                                 hiding (length)
+
 import qualified Data.Vector.Storable as DVS
-import           Data.Int
-import           Data.Word
-import           HaskellWorks.Data.AtIndex
-import           HaskellWorks.Data.Bits.BitWise
-import           HaskellWorks.Data.Bits.LoBitsSized
-import           HaskellWorks.Data.PackedVector.Internal
-import           HaskellWorks.Data.Positioning
-import           HaskellWorks.Data.Unsign
-import           Prelude hiding (length)
 
 data PackedVector64 = PackedVector64
-    { swBuffer      :: !(DVS.Vector Word64)
-    , swBitSize     :: !Word
-    , swBufferLen   :: !Int
-    } deriving (Eq, Show)
+  { swBuffer    :: !(DVS.Vector Word64)
+  , swBitSize   :: !Word
+  , swBufferLen :: !Int
+  } deriving (Eq, Show, Generic)
+
+instance NFData PackedVector64
 
 empty :: PackedVector64
 empty =
diff --git a/test/HaskellWorks/Data/PackedVector/InternalSpec.hs b/test/HaskellWorks/Data/PackedVector/InternalSpec.hs
--- a/test/HaskellWorks/Data/PackedVector/InternalSpec.hs
+++ b/test/HaskellWorks/Data/PackedVector/InternalSpec.hs
@@ -1,38 +1,25 @@
-{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
-{-# LANGUAGE    ScopedTypeVariables           #-}
-
 module HaskellWorks.Data.PackedVector.InternalSpec (spec) where
 
-import           Data.Word
-import           HaskellWorks.Data.Bits.BitWise
-import           HaskellWorks.Data.PackedVector.Internal
-import           HaskellWorks.Data.Positioning
-import           Test.Hspec
-import           Test.QuickCheck
-
-{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}
-
-subWordSize :: Count -> Gen Count
-subWordSize maxWordSize = choose (1, maxWordSize)
-
-word8OfSize :: Count -> Gen Word8
-word8OfSize sz = choose (0, 1 .<. fromIntegral sz - 1)
+import HaskellWorks.Data.PackedVector.Internal
+import HaskellWorks.Hspec.Hedgehog
+import Hedgehog
+import Test.Hspec
 
-word64OfSize :: Count -> Gen Word64
-word64OfSize sz = choose (0, 1 .<. fromIntegral sz - 1)
+import qualified HaskellWorks.Gen as G
+import qualified Hedgehog.Gen     as G
+import qualified Hedgehog.Range   as R
 
-listLen :: Gen Int
-listLen = choose (1, 128)
+{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.PackedVector.InternalSpec" $ do
-  it "PackedVector Word8" $
-    forAll (subWordSize 8) $ \wSize ->
-      forAll (choose (1, 3)) $ \len ->
-        forAll (vectorOf len (word8OfSize wSize)) $ \ws ->
-          unpackBits (length ws) wSize (packBits wSize ws) `shouldBe` ws
-  it "PackedVector Word64" $
-    forAll (subWordSize 64) $ \wSize ->
-      forAll listLen $ \len ->
-        forAll (vectorOf len (word64OfSize wSize)) $ \ws ->
-          unpackBits (length ws) wSize (packBits wSize ws) `shouldBe` ws
+  it "PackedVector Word8" $ require $ property $ do
+    wSize <- forAll $ G.subWordSize 8
+    len   <- forAll $ G.int   (R.linear 1 3)
+    ws    <- forAll $ G.list  (R.singleton len) (G.word8OfSize wSize)
+    unpackBits (length ws) wSize (packBits wSize ws) === ws
+  it "PackedVector Word64" $ require $ property $ do
+    wSize <- forAll $ G.subWordSize 64
+    len   <- forAll $ G.int   (R.linear 1 128)
+    ws    <- forAll $ G.list  (R.singleton len) (G.word64OfSize wSize)
+    unpackBits (length ws) wSize (packBits wSize ws) === ws
diff --git a/test/HaskellWorks/Data/PackedVector/PackedVector64Spec.hs b/test/HaskellWorks/Data/PackedVector/PackedVector64Spec.hs
--- a/test/HaskellWorks/Data/PackedVector/PackedVector64Spec.hs
+++ b/test/HaskellWorks/Data/PackedVector/PackedVector64Spec.hs
@@ -1,37 +1,28 @@
-{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
-{-# LANGUAGE    ScopedTypeVariables           #-}
-
 module HaskellWorks.Data.PackedVector.PackedVector64Spec (spec) where
 
-import           Data.Word
-import           HaskellWorks.Data.AtIndex
-import           HaskellWorks.Data.Bits.BitWise
-import           HaskellWorks.Data.PackedVector.PackedVector64
-import           HaskellWorks.Data.Positioning
-import           Test.Hspec
-import           Test.QuickCheck
-
-{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}
-
-subWordSize :: Count -> Gen Count
-subWordSize maxWordSize = choose (1, maxWordSize)
+import HaskellWorks.Data.AtIndex
+import HaskellWorks.Data.PackedVector.PackedVector64
+import Hedgehog
+import Test.Hspec
+-- import Test.QuickCheck
+import HaskellWorks.Hspec.Hedgehog
 
-word64OfSize :: Count -> Gen Word64
-word64OfSize sz = choose (0, 1 .<. fromIntegral sz - 1)
+import qualified HaskellWorks.Gen          as G
+import qualified Hedgehog.Gen              as G
+import qualified Hedgehog.Range            as R
 
-listLen :: Gen Int
-listLen = choose (1, 128)
+{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.PackedVector.PackedVector64Spec" $ do
-  it "Round trip from list" $
-    forAll (subWordSize 64) $ \wSize ->
-      forAll listLen $ \len ->
-        forAll (vectorOf len (word64OfSize wSize)) $ \ws ->
-          toList (fromList wSize ws) `shouldBe` ws
-  it "Round trip from list" $
-    forAll (subWordSize 64) $ \wSize ->
-      forAll (choose (1, 32 :: Int)) $ \len ->
-        forAll (vectorOf len (word64OfSize wSize)) $ \ws ->
-          forAll (choose (0, fromIntegral len - 1 :: Position)) $ \i ->
-            (fromList wSize ws !!! i) `shouldBe` (ws !!! i)
+  it "Round trip from list" $ require $ property $ do
+    wSize <- forAll $ G.subWordSize 64
+    len   <- forAll $ G.int   (R.linear 1 128)
+    ws    <- forAll $ G.list  (R.singleton len) (G.word64OfSize wSize)
+    toList (fromList wSize ws) === ws
+  it "Round trip from list" $ require $ property $ do
+    wSize <- forAll $ G.subWordSize 64
+    len   <- forAll $ G.int   (R.linear 1 32)
+    ws    <- forAll $ G.list  (R.singleton len) (G.word64OfSize wSize)
+    i     <- forAll $ G.int64 (R.linear 0 (fromIntegral len - 1))
+    (fromList wSize ws !!! i) === (ws !!! i)
diff --git a/test/HaskellWorks/Gen.hs b/test/HaskellWorks/Gen.hs
new file mode 100644
--- /dev/null
+++ b/test/HaskellWorks/Gen.hs
@@ -0,0 +1,18 @@
+module HaskellWorks.Gen where
+
+import Data.Word
+import HaskellWorks.Data.Bits.BitWise
+import HaskellWorks.Data.Positioning
+import Hedgehog
+
+import qualified Hedgehog.Gen   as G
+import qualified Hedgehog.Range as R
+
+subWordSize :: MonadGen m => Count -> m Count
+subWordSize maxWordSize = G.word64 (R.linear 1 maxWordSize)
+
+word8OfSize :: MonadGen m => Count -> m Word8
+word8OfSize sz = G.word8 (R.linear 0 (1 .<. fromIntegral sz - 1))
+
+word64OfSize :: MonadGen m => Count -> m Word64
+word64OfSize sz = G.word64 (R.linear 0 (1 .<. fromIntegral sz - 1))
