diff --git a/benchmarks/aeson/template.hs b/benchmarks/aeson/template.hs
new file mode 100644
--- /dev/null
+++ b/benchmarks/aeson/template.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE OverloadedStrings #-}
+module NAME
+  ( fromValue
+  , valueToLazyByteString
+  ) where
+
+#ifndef LIB
+#define LIB Data.ByteString.FastBuilder
+#endif
+
+import Data.Aeson
+import qualified Data.ByteString.Lazy as L
+import Data.Monoid
+import qualified Data.Scientific as Sci
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as T
+import qualified Data.Vector as V
+
+import LIB
+import HashMapExts
+
+valueToLazyByteString :: Value -> L.ByteString
+valueToLazyByteString = toLazyByteString . fromValue
+
+fromValue :: Value -> Builder
+-- fromValue v = fromValue' v
+fromValue v = rebuild $ fromValue' v
+
+fromValue' :: Value -> Builder
+fromValue' (Object o) = fromObject o
+fromValue' (Array a) = fromArray a
+fromValue' (String s) = fromString s
+fromValue' (Number n) = fromNumber n
+fromValue' (Bool False) = "false"
+fromValue' (Bool True) = "true"
+fromValue' Null = "null"
+{-# INLINE fromValue' #-}
+
+fromArray :: Array -> Builder
+fromArray arr = V.foldr f (const $ char8 ']') arr True
+  where
+    f x r initial =
+      (if initial then char8 '[' else char8 ',')
+      <> fromValue x <> r False
+
+fromString :: T.Text -> Builder
+fromString str = byteString $ T.encodeUtf8 str
+
+fromNumber :: Sci.Scientific -> Builder
+fromNumber = either doubleDec integerDec . Sci.floatingOrInteger
+
+fromObject :: Object -> Builder
+fromObject obj = char8 '{' <> foldMapWithKey f obj <> char8 '}'
+  where
+      f k v =
+        fromString k <> char8 ':' <> fromValue v
+        <> char8 ','
diff --git a/fast-builder.cabal b/fast-builder.cabal
--- a/fast-builder.cabal
+++ b/fast-builder.cabal
@@ -1,5 +1,5 @@
 name:                fast-builder
-version:             0.0.0.3
+version:             0.0.0.4
 synopsis:            Fast ByteString Builder
 description:         An efficient implementation of ByteString builder. It should be faster than
                      the standard implementation in most cases.
@@ -10,10 +10,10 @@
 license-file:        LICENSE
 author:              Takano Akio
 maintainer:          aljee@hyper.cx
--- copyright:           
+-- copyright:
 category:            Data
 build-type:          Simple
--- extra-source-files:  
+extra-source-files:  benchmarks/aeson/*.hs
 cabal-version:       >=1.10
 tested-with:         GHC >= 7.10.1 && < 8
 
@@ -22,9 +22,9 @@
                        Data.ByteString.FastBuilder.Internal
   other-modules:       Data.ByteString.FastBuilder.Internal.Prim
 
-  -- other-extensions:    
+  -- other-extensions:
   build-depends:       base >= 4.8 && < 4.9, bytestring >= 0.10.6.0, ghc-prim
-  -- hs-source-dirs:      
+  -- hs-source-dirs:
   default-language:    Haskell2010
   ghc-options:         -Wall -g
 
@@ -33,6 +33,7 @@
   main-is:             main.hs
   hs-source-dirs:      benchmarks/aeson
   other-modules:       Fast, Bstr, HashMapExts
+  include-dirs:        benchmarks/aeson
   build-depends:       base, fast-builder, aeson, criterion, bytestring,
     scientific, text, vector, deepseq, unordered-containers, ghc-prim,
     template-haskell, true-name >= 0.1.0.0
