diff --git a/Data/Hash/Murmur.hs b/Data/Hash/Murmur.hs
new file mode 100644
--- /dev/null
+++ b/Data/Hash/Murmur.hs
@@ -0,0 +1,73 @@
+module Data.Hash.Murmur (murmur3) where
+
+import Control.Monad (replicateM )
+import Data.Binary 
+    ( Binary
+    , Word32 
+    )
+import Data.Binary.Get 
+    ( Get
+    , runGet
+    , getWord32le
+    )
+import Data.Bits 
+    ( shiftR
+    , rotateL
+    , xor
+    )
+import qualified Data.ByteString as BS 
+    ( ByteString 
+    , length 
+    , drop
+    , append
+    , replicate
+    )
+import qualified Data.ByteString.Lazy as BL
+    ( fromStrict )
+
+-- | MurmurHash3 (x86_32). For more details, see
+-- <http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp>
+murmur3 :: Word32         -- ^ Seed value
+        -> BS.ByteString  -- ^ Strict bytestring data to hash
+        -> Word32         -- ^ MurmurHash3 result
+murmur3 nHashSeed bs = 
+    h8
+  where
+    -- Block and tail sizes
+    nBlocks = BS.length bs `div` 4
+    nTail   = BS.length bs `mod` 4
+    -- Data objects
+    blocks  = runGet' (replicateM nBlocks getWord32le) bs
+    bsTail  = BS.drop (nBlocks*4) bs `BS.append` BS.replicate (4-nTail) 0
+    -- Body
+    h1   = foldl mix nHashSeed blocks
+    -- Tail
+    t1   = runGet' getWord32le bsTail
+    t2   = t1 * c1
+    t3   = t2 `rotateL` 15
+    t4   = t3 * c2
+    h2   = h1 `xor` t4
+    -- Finalization
+    h3   = h2 `xor` (fromIntegral $ BS.length bs)
+    h4   = h3 `xor` (h3 `shiftR` 16) 
+    h5   = h4 * 0x85ebca6b
+    h6   = h5 `xor` (h5 `shiftR` 13)
+    h7   = h6 * 0xc2b2ae35
+    h8   = h7 `xor` (h7 `shiftR` 16)
+    -- Mix function
+    mix r1 k1 = r4
+      where
+        k2 = k1 * c1
+        k3 = k2 `rotateL` 15
+        k4 = k3 * c2
+        r2 = r1 `xor` k4
+        r3 = r2 `rotateL` 13
+        r4 = r3*5 + 0xe6546b64
+    -- Constants
+    c1 = 0xcc9e2d51 
+    c2 = 0x1b873593 
+
+-- Strict version of @Data.Binary.runGet@
+runGet' :: Binary a => Get a -> BS.ByteString -> a
+runGet' m = (runGet m) . BL.fromStrict
+
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/UNLICENSE b/UNLICENSE
new file mode 100644
--- /dev/null
+++ b/UNLICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/murmur3.cabal b/murmur3.cabal
new file mode 100644
--- /dev/null
+++ b/murmur3.cabal
@@ -0,0 +1,52 @@
+name:                  murmur3
+version:               1.0.0
+synopsis:              
+    Pure Haskell implementation of the MurmurHash3 x86_32 algorithm.
+description:
+    MurmurHash3 is a non-cryptogrpahic hash function suitable for general
+    hash-based lookup. We provide the x86_32 version which closely follows 
+    the following implementation:
+    <https://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp>
+homepage:              http://github.com/plaprade/murmur3
+bug-reports:           http://github.com/plaprade/murmur3/issues
+stability:             stable
+license:               PublicDomain
+license-file:          UNLICENSE
+author:                Philippe Laprade
+maintainer:            plaprade+hackage@gmail.com
+category:              Data, Hash, Murmur
+build-type:            Simple
+cabal-version:         >= 1.9.2
+
+source-repository head
+    type:     git
+    location: git://github.com/haskoin/murmur3.git
+
+library
+    exposed-modules:   Data.Hash.Murmur
+
+    build-depends: base                     >= 4.6          && < 5 
+                 , bytestring                     >= 0.10       && < 0.11 
+                 , binary                   >= 0.7          && < 0.8 
+
+    ghc-options:       -Wall 
+
+test-suite test-murmur3
+    type:              exitcode-stdio-1.0
+    main-is:           Main.hs
+
+    other-modules: Data.Hash.Murmur.Units
+
+    build-depends: base                           >= 4.6        && < 5 
+                 , base16-bytestring              >= 0.1        && < 1.2
+                 , bytestring                     >= 0.10       && < 0.11 
+                 , murmur3
+                 , HUnit                          >= 1.2        && < 1.3
+                 , QuickCheck                     >= 2.6        && < 2.9
+                 , test-framework                 >= 0.8        && < 0.9 
+                 , test-framework-quickcheck2     >= 0.3        && < 0.4 
+                 , test-framework-hunit           >= 0.3        && < 0.4 
+
+    ghc-options: -Wall 
+    hs-source-dirs: tests
+
diff --git a/tests/Data/Hash/Murmur/Units.hs b/tests/Data/Hash/Murmur/Units.hs
new file mode 100644
--- /dev/null
+++ b/tests/Data/Hash/Murmur/Units.hs
@@ -0,0 +1,48 @@
+module Data.Hash.Murmur.Units (tests) where
+
+import Test.HUnit (assertBool, Assertion)
+import Test.Framework (Test, testGroup)
+import Test.Framework.Providers.HUnit (testCase)
+
+import Data.Word (Word32)
+import qualified Data.ByteString.Base16 as B16 (decode)
+import qualified Data.ByteString.Char8 as C (pack)
+
+import Data.Hash.Murmur (murmur3)
+
+type TestVector = (Word32, Word32, String)
+
+tests :: [Test]
+tests =
+    [ testGroup "MurmurHash3" 
+        (map buildTest $ zip testVectors [0..])
+    ]
+
+buildTest :: (TestVector, Int) -> Test.Framework.Test
+buildTest (v, i) =
+    testCase ("MurmurHash3 test vector " ++ show i) $ assertTestVector v
+
+assertTestVector :: TestVector -> Assertion
+assertTestVector (expected, seed, str) =
+    assertBool "    > MurmurHash3 " $ result == expected
+  where
+    result = murmur3 seed (fst $ B16.decode $ C.pack str)
+
+testVectors :: [TestVector]
+testVectors =
+    [ (0x00000000, 0x00000000, "")
+    , (0x6a396f08, 0xFBA4C795, "")
+    , (0x81f16f39, 0xffffffff, "")
+    , (0x514e28b7, 0x00000000, "00")
+    , (0xea3f0b17, 0xFBA4C795, "00")
+    , (0xfd6cf10d, 0x00000000, "ff")
+    , (0x16c6b7ab, 0x00000000, "0011")
+    , (0x8eb51c3d, 0x00000000, "001122")
+    , (0xb4471bf8, 0x00000000, "00112233")
+    , (0xe2301fa8, 0x00000000, "0011223344")
+    , (0xfc2e4a15, 0x00000000, "001122334455")
+    , (0xb074502c, 0x00000000, "00112233445566")
+    , (0x8034d2a0, 0x00000000, "0011223344556677")
+    , (0xb4698def, 0x00000000, "001122334455667788")
+    ]
+
diff --git a/tests/Main.hs b/tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/tests/Main.hs
@@ -0,0 +1,9 @@
+module Main where
+
+import Test.Framework (defaultMain)
+
+import qualified Data.Hash.Murmur.Units (tests)
+
+main :: IO ()
+main = defaultMain (Data.Hash.Murmur.Units.tests)
+
