diff --git a/Bench.hs b/Bench.hs
new file mode 100644
--- /dev/null
+++ b/Bench.hs
@@ -0,0 +1,42 @@
+import Criterion.Main
+import qualified Data.ByteString as B
+import qualified Crypto.Hash.MD2 as MD2
+import qualified Crypto.Hash.MD4 as MD4
+import qualified Crypto.Hash.MD5 as MD5
+import qualified Crypto.Hash.SHA1 as SHA1
+import qualified Crypto.Hash.SHA224 as SHA224
+import qualified Crypto.Hash.SHA256 as SHA256
+import qualified Crypto.Hash.SHA384 as SHA384
+import qualified Crypto.Hash.SHA512 as SHA512
+import qualified Crypto.Hash.SHA512t as SHA512t
+import qualified Crypto.Hash.RIPEMD160 as RIPEMD160
+import qualified Crypto.Hash.Tiger as Tiger
+import qualified Crypto.Hash.Skein256 as Skein256
+import qualified Crypto.Hash.Skein512 as Skein512
+
+allHashs =
+	[ ("MD2",MD2.hash)
+	, ("MD4",MD4.hash)
+	, ("MD5",MD5.hash)
+	, ("SHA1",SHA1.hash)
+	, ("SHA224",SHA224.hash)
+	, ("SHA256",SHA256.hash)
+	, ("SHA384",SHA384.hash)
+	, ("SHA512",SHA512.hash)
+	, ("SHA512t-512",(SHA512t.hash 512))
+	, ("RIPEMD160",RIPEMD160.hash)
+	, ("Tiger",Tiger.hash)
+	, ("Skein256-256",Skein256.hash 256)
+	, ("Skein512-512",Skein512.hash 512)
+	]
+
+benchHash :: Int -> (B.ByteString -> B.ByteString) -> Pure
+benchHash sz f = whnf f (B.replicate sz 0)
+
+withHashes f = map f allHashs
+
+main = defaultMain
+	[ bgroup "hash-256b" (withHashes (\(name, f) -> bench name $ benchHash 256 f))
+	, bgroup "hash-4Kb" (withHashes (\(name, f) -> bench name $ benchHash 4096 f))
+	, bgroup "hash-1Mb" (withHashes (\(name, f) -> bench name $ benchHash (1*1024*1024) f))
+	]
diff --git a/Crypto/Hash/MD2.hs b/Crypto/Hash/MD2.hs
--- a/Crypto/Hash/MD2.hs
+++ b/Crypto/Hash/MD2.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/MD4.hs b/Crypto/Hash/MD4.hs
--- a/Crypto/Hash/MD4.hs
+++ b/Crypto/Hash/MD4.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/MD5.hs b/Crypto/Hash/MD5.hs
--- a/Crypto/Hash/MD5.hs
+++ b/Crypto/Hash/MD5.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/RIPEMD160.hs b/Crypto/Hash/RIPEMD160.hs
--- a/Crypto/Hash/RIPEMD160.hs
+++ b/Crypto/Hash/RIPEMD160.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/SHA1.hs b/Crypto/Hash/SHA1.hs
--- a/Crypto/Hash/SHA1.hs
+++ b/Crypto/Hash/SHA1.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/SHA224.hs b/Crypto/Hash/SHA224.hs
--- a/Crypto/Hash/SHA224.hs
+++ b/Crypto/Hash/SHA224.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/SHA256.hs b/Crypto/Hash/SHA256.hs
--- a/Crypto/Hash/SHA256.hs
+++ b/Crypto/Hash/SHA256.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/SHA384.hs b/Crypto/Hash/SHA384.hs
--- a/Crypto/Hash/SHA384.hs
+++ b/Crypto/Hash/SHA384.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/SHA512.hs b/Crypto/Hash/SHA512.hs
--- a/Crypto/Hash/SHA512.hs
+++ b/Crypto/Hash/SHA512.hs
@@ -25,13 +25,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/Skein256.hs b/Crypto/Hash/Skein256.hs
--- a/Crypto/Hash/Skein256.hs
+++ b/Crypto/Hash/Skein256.hs
@@ -24,14 +24,19 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
 import Foreign.C.Types
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
+import Data.Bits
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/Skein512.hs b/Crypto/Hash/Skein512.hs
--- a/Crypto/Hash/Skein512.hs
+++ b/Crypto/Hash/Skein512.hs
@@ -24,14 +24,19 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
 import Foreign.C.Types
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
+import Data.Bits
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/Crypto/Hash/Tiger.hs b/Crypto/Hash/Tiger.hs
--- a/Crypto/Hash/Tiger.hs
+++ b/Crypto/Hash/Tiger.hs
@@ -24,13 +24,17 @@
 	) where
 
 import Prelude hiding (init)
-import Foreign
+import System.IO.Unsafe (unsafePerformIO)
 import Foreign.C.String
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString (ByteString)
 import Data.ByteString.Unsafe (unsafeUseAsCString, unsafeUseAsCStringLen)
 import Data.ByteString.Internal (create, memcpy)
+import Data.Word
 
 #ifdef HAVE_CRYPTOAPI
 
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010 Vincent Hanquez <vincent@snarc.org>
+Copyright (c) 2010-2012 Vincent Hanquez <vincent@snarc.org>
 
 All rights reserved.
 
diff --git a/cryptohash.cabal b/cryptohash.cabal
--- a/cryptohash.cabal
+++ b/cryptohash.cabal
@@ -1,5 +1,5 @@
 Name:                cryptohash
-Version:             0.7.4
+Version:             0.7.5
 Description:
     A collection of crypto hashes, with a practical incremental and one-pass, pure APIs,
     with performance close to the fastest implementations available in others languages.
@@ -28,6 +28,10 @@
   Description:       Build unit test
   Default:           False
 
+Flag benchmark
+  Description:       Build benchmark test
+  Default:           False
+
 Flag cryptoapi
   Description:       Defines crypto-api instances
   Default:           True
@@ -81,6 +85,28 @@
   if flag(test)
     Buildable:       True
     Build-depends:   base >= 4, HUnit, bytestring
+  else
+    Buildable:       False
+  if flag(cryptoapi)
+    Build-depends:   crypto-api >= 0.5, tagged >= 0.1, cereal >= 0.2
+    cpp-options:     -DHAVE_CRYPTOAPI
+
+Executable           Bench
+  Main-Is:           Bench.hs
+  Extensions:        ForeignFunctionInterface
+  C-sources:         cbits/sha1.c
+                     cbits/sha256.c
+                     cbits/sha512.c
+                     cbits/md2.c
+                     cbits/md4.c
+                     cbits/md5.c
+                     cbits/ripemd.c
+                     cbits/skein256.c
+                     cbits/skein512.c
+                     cbits/tiger.c
+  if flag(benchmark)
+    Buildable:       True
+    Build-depends:   base >= 4, bytestring, criterion
   else
     Buildable:       False
   if flag(cryptoapi)
