diff --git a/ChangeLog b/ChangeLog
new file mode 100644
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,32 @@
+2013-12-08  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.4.1.0: Expose parser and builder so it is possible to use
+	parser incrementally.
+
+2013-10-01  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.4.0.2: Minor fixes.
+
+2013-10-01  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.4.0.1: Nothing changed.
+
+2013-10-01  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.4.0.0: Faster dictionary conversion.
+
+2013-09-28  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.3.0.0: Rename BEncode to BValue and BEncodable to BEncode.
+
+2013-09-28  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.2.2.0: Arbitrary length integers. (by specification)
+
+2013-08-26  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.2.0.0: Added default decoders/encoders using GHC Generics.
+
+2013-06-09  Sam Truzjan  <pxqr.sta@gmail.com>
+
+	* 0.1.0.0: Initial version.
diff --git a/bencoding.cabal b/bencoding.cabal
--- a/bencoding.cabal
+++ b/bencoding.cabal
@@ -1,5 +1,5 @@
 name:                  bencoding
-version:               0.4.0.2
+version:               0.4.1.0
 license:               BSD3
 license-file:          LICENSE
 author:                Sam Truzjan
@@ -18,7 +18,7 @@
   A library for fast and easy encoding and decoding of BEncode data.
 
 extra-source-files:    README.md
-                     , changelog
+                     , ChangeLog
 
 source-repository head
   type:                git
@@ -29,7 +29,7 @@
   type:                git
   location:            git://github.com/cobit/bencoding.git
   branch:              master
-  tag:                 v0.4.0.2
+  tag:                 v0.4.1.0
 
 library
   default-language:    Haskell2010
@@ -63,10 +63,10 @@
                      , bytestring >= 0.10.0.2
                      , attoparsec >= 0.10
 
-                     , test-framework
-                     , test-framework-quickcheck2
-                     , QuickCheck
                      , bencoding
+                     , hspec
+                     , QuickCheck
+
   ghc-options:         -Wall -fno-warn-orphans
 
 
diff --git a/changelog b/changelog
deleted file mode 100644
--- a/changelog
+++ /dev/null
@@ -1,7 +0,0 @@
-* 0.1.0.0: Initial version.
-* 0.2.0.0: Added default decoders/encoders using GHC Generics.
-* 0.2.2.0: Arbitrary length integers. (by specification)
-* 0.3.0.0: Rename BEncode to BValue and BEncodable to BEncode.
-* 0.4.0.0: Faster dictionary conversion.
-* 0.4.0.1: Nothing changed.
-* 0.4.0.2: Minor fixes.
diff --git a/src/Data/BEncode.hs b/src/Data/BEncode.hs
--- a/src/Data/BEncode.hs
+++ b/src/Data/BEncode.hs
@@ -21,7 +21,7 @@
 --
 --    To serialize any other types we need to make conversion.  To
 --    make conversion more convenient there is type class for it:
---    'BEncodable'. Any textual strings are considered as UTF8 encoded
+--    'BEncode'. Any textual strings are considered as UTF8 encoded
 --    'Text'.
 --
 --    The complete Augmented BNF syntax for bencoding format is:
diff --git a/src/Data/BEncode/BDict.hs b/src/Data/BEncode/BDict.hs
--- a/src/Data/BEncode/BDict.hs
+++ b/src/Data/BEncode/BDict.hs
@@ -5,8 +5,9 @@
 --   Stability   :  stable
 --   Portability :  portable
 --
---   This module defines a simple key\/value list which both faster
---   and more suitable for bencode dictionaries then just [(k,v)].
+--   This module defines a simple key\/value list ordered by keys
+--   which both faster and more suitable for bencode dictionaries than
+--   just [(k,v)].
 --
 module Data.BEncode.BDict
        ( BKey
diff --git a/src/Data/BEncode/Internal.hs b/src/Data/BEncode/Internal.hs
--- a/src/Data/BEncode/Internal.hs
+++ b/src/Data/BEncode/Internal.hs
@@ -6,10 +6,15 @@
 --   Portability :  portable
 --
 --   This module provides bencode values serialization. Normally, you
---   don't need to import this module.
+--   don't need to import this module, use 'Data.BEncode' instead.
 --
 module Data.BEncode.Internal
-       ( parse
+       ( -- * Parsing
+         parser
+       , parse
+
+         -- * Rendering
+       , builder
        , build
        , ppBEncode
        ) where
diff --git a/tests/properties.hs b/tests/properties.hs
--- a/tests/properties.hs
+++ b/tests/properties.hs
@@ -3,31 +3,33 @@
 module Main (main) where
 
 import Control.Applicative
-import qualified Data.ByteString as B
-import qualified Data.ByteString.Lazy as L
-import Test.Framework (defaultMain)
-import Test.Framework.Providers.QuickCheck2 (testProperty)
-import Test.QuickCheck
+import Data.ByteString as BS
+import Data.ByteString.Lazy as BL
+import Data.List as L
 import GHC.Generics
+import Test.QuickCheck
+import Test.Hspec
 
 import Data.BEncode
+import qualified Data.BEncode.BDict as BE
 
 
-instance Arbitrary B.ByteString where
-    arbitrary = fmap B.pack arbitrary
-
-instance Arbitrary BValue where
-    arbitrary = frequency
-                [ (50, BInteger <$> arbitrary)
-                , (40, BString  <$> arbitrary)
-                , (5,  BList    <$> (arbitrary `suchThat` ((10 >) . length)))
-                ]
+instance Arbitrary BS.ByteString where
+  arbitrary = BS.pack <$> arbitrary
 
+instance Arbitrary a => Arbitrary (BE.BDictMap a) where
+  arbitrary = frequency
+    [ (90, pure BE.Nil)
+    , (10, BE.Cons <$> arbitrary <*> arbitrary <*> arbitrary)
+    ]
 
-prop_EncDec :: BValue -> Bool
-prop_EncDec x = case decode (L.toStrict (encode x)) of
-                  Left _   -> False
-                  Right x' -> x == x'
+instance Arbitrary BValue where
+  arbitrary = frequency
+    [ (30, BInteger <$> arbitrary)
+    , (30, BString  <$> arbitrary)
+    , (20, BList    <$> (arbitrary `suchThat` ((10 >) . L.length)))
+    , (20, BDict    <$> arbitrary)
+    ]
 
 data List a = Cons a (List a) | Nil
               deriving (Show, Eq, Generic)
@@ -42,8 +44,8 @@
 
 data FileInfo = FileInfo
   { fiLength :: !Integer
-  , fiPath   :: [B.ByteString]
-  , fiMD5Sum :: B.ByteString
+  , fiPath   :: [BS.ByteString]
+  , fiMD5Sum :: BS.ByteString
   } deriving (Show, Eq, Generic)
 
 instance BEncode FileInfo
@@ -54,16 +56,17 @@
 data T a = T
 
 prop_bencodable :: Eq a => BEncode a => T a -> a -> Bool
-prop_bencodable _ x = decode (L.toStrict (encode x)) == Right x
+prop_bencodable _ x = decode (BL.toStrict (encode x)) == Right x
 
--- All tests are (encode >>> decode = id)
 main :: IO ()
-main = defaultMain
-       [ testProperty "BEncode" prop_EncDec
+main = hspec $ do
+  describe "BValue" $ do
+    it "properly encoded" $ property $
+       prop_bencodable (T :: T BValue)
 
-       , testProperty "generic recordless" $
-            prop_bencodable (T :: T (List Int))
+  describe "BEncode" $ do
+    it "generic recordless" $ property $
+      prop_bencodable (T :: T (List Int))
 
-       , testProperty "generic records" $
-            prop_bencodable (T :: T FileInfo)
-       ]
+    it "generic records" $ property $
+      prop_bencodable (T :: T FileInfo)
