diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,3 @@
+# Changelog for assert4hs-hspec
+
+## Unreleased changes
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Pawel Nosal
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+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 OR COPYRIGHT HOLDERS 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.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# assert4hs-hspec
+
+This library allows using assert4hs-core assertions with [hspec](https://hackage.haskell.org/package/hspec)
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/assert4hs-hspec.cabal b/assert4hs-hspec.cabal
new file mode 100644
--- /dev/null
+++ b/assert4hs-hspec.cabal
@@ -0,0 +1,56 @@
+cabal-version:      1.22
+name:               assert4hs-hspec
+version:            0.1.0
+license:            MIT
+license-file:       LICENSE.md
+copyright:          2021 Pawel Nosal
+maintainer:         p.nosal1986@gmail.com
+author:             Pawel Nosal
+homepage:           https://github.com/paweln1986/assert4hs-hspec#readme
+bug-reports:        https://github.com/paweln1986/assert4hs-hspec/issues
+synopsis:           integration point of assert4hs and hspec
+description:
+    Please see the README on GitHub at <https://github.com/githubuser/assert4hs-hspec#readme>
+
+category:           Testing
+build-type:         Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+
+source-repository head
+    type:     git
+    location: https://github.com/paweln1986/assert4hs-hspec
+
+library
+    exposed-modules:    Test.Fluent.Hspec
+    reexported-modules:
+        Test.Fluent.Assertions,
+        Test.Fluent.Assertions.Maybe,
+        Test.Fluent.Assertions.List,
+        Test.Fluent.Assertions.Exceptions,
+        Test.Fluent.Assertions.Either,
+        Test.Fluent.Diff
+
+    hs-source-dirs:     src
+    other-modules:      Paths_assert4hs_hspec
+    default-language:   Haskell2010
+    build-depends:
+        HUnit >=1.6.1.0,
+        assert4hs-core >=0.1.0,
+        base >=4.7 && <5,
+        hspec >=2.7.8
+
+test-suite assert4hs-hspec-test
+    type:             exitcode-stdio-1.0
+    main-is:          Spec.hs
+    hs-source-dirs:   test
+    other-modules:    Paths_assert4hs_hspec
+    default-language: Haskell2010
+    ghc-options:      -threaded -rtsopts -with-rtsopts=-N
+    build-depends:
+        HUnit >=1.6.1.0,
+        assert4hs-core >=0.1.0,
+        assert4hs-hspec -any,
+        base >=4.7 && <5,
+        hspec >=2.7.8
diff --git a/src/Test/Fluent/Hspec.hs b/src/Test/Fluent/Hspec.hs
new file mode 100644
--- /dev/null
+++ b/src/Test/Fluent/Hspec.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-- |
+-- Module      : Test.Fluent.Assertions.Core
+-- Description : Set util function for HSpec to execute assertions against given value.
+-- Copyright   : (c) Pawel Nosal, 2021
+-- License     : MIT
+-- Maintainer  : p.nosal1986@gmail.com
+-- Stability   : experimental
+module Test.Fluent.Hspec
+  ( -- ** Assertion util functions for HSpec
+    assertThat,
+    assertThat',
+    assertThatIO,
+    assertThatIO',
+    assertThrown,
+    assertThrown',
+    assertThrows,
+    assertThrows',
+  )
+where
+
+import Control.Exception (Exception, throwIO, try)
+import Data.List (intercalate)
+import GHC.Exception (prettySrcLoc)
+import GHC.Stack (HasCallStack)
+import Test.Fluent.Assertions (Assertion', AssertionConfig, FluentTestFailure)
+import qualified Test.Fluent.Assertions.Core as FC
+import Test.Fluent.Assertions.Exceptions (ExceptionSelector)
+import Test.Fluent.Internal.Assertions (FluentTestFailure (FluentTestFailure))
+import Test.HUnit.Lang
+  ( FailureReason (Reason),
+    HUnitFailure (HUnitFailure),
+  )
+
+-- | Verify if given `IO` action throws expected exception.
+assertThrows :: (HasCallStack, Exception e) => IO a -> ExceptionSelector e -> IO ()
+assertThrows given selector = toHspecError $ FC.assertThrows given selector
+
+assertThrows' :: (HasCallStack, Exception e) => AssertionConfig -> IO a -> ExceptionSelector e -> IO ()
+assertThrows' config given selector = toHspecError $ FC.assertThrows' config given selector
+
+assertThrown' :: (HasCallStack, Exception e) => AssertionConfig -> IO a -> ExceptionSelector e -> Assertion' e b -> IO ()
+assertThrown' config given selector assertions = toHspecError $ FC.assertThrown' config given selector assertions
+
+-- | Execute assertions against selected exception
+assertThrown :: (HasCallStack, Exception e) => IO a -> ExceptionSelector e -> Assertion' e b -> IO ()
+assertThrown given selector assertions = toHspecError $ FC.assertThrown given selector assertions
+
+-- | Execute assertions against given subject under test extracted from IO action.
+assertThatIO :: HasCallStack => IO a -> Assertion' a b -> IO ()
+assertThatIO given assertions = toHspecError $ FC.assertThatIO given assertions
+
+-- | A variant of `assertThatIO` which allow to pass additional configuration.
+assertThatIO' :: HasCallStack => AssertionConfig -> IO a -> Assertion' a b -> IO ()
+assertThatIO' config given assertions = toHspecError $ FC.assertThatIO' config given assertions
+
+-- | A variant of `assertThat` which allow to pass additional configuration.
+assertThat' :: HasCallStack => AssertionConfig -> a -> Assertion' a b -> IO ()
+assertThat' config given assertions = toHspecError $ FC.assertThat' config given assertions
+
+-- | Execute assertions against given subject under test.
+assertThat :: HasCallStack => a -> Assertion' a b -> IO ()
+assertThat given assertions = toHspecError $ FC.assertThat given assertions
+
+toHspecError :: HasCallStack => IO () -> IO ()
+toHspecError a = do
+  res :: Either FluentTestFailure () <- try a
+  case res of
+    Left (FluentTestFailure srcLoc msg _ _) -> do
+      let assertionMessages = intercalate "\n" (fmap formatMsg msg)
+      throwIO $ HUnitFailure srcLoc (Reason assertionMessages)
+    Right () -> pure ()
+  where
+    formatMsg (message, Just srcLoc) = prettySrcLoc srcLoc <> "\n" <> message
+    formatMsg (message, Nothing) = message
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+import Control.Exception (throwIO, try)
+import Data.List (intercalate)
+import GHC.Exception (SrcLoc, prettySrcLoc)
+import Test.Fluent.Assertions
+  ( Assertion',
+    FluentTestFailure (FluentTestFailure),
+    focus,
+    isEqualTo,
+  )
+  
+import Test.HUnit.Lang
+  ( FailureReason (Reason),
+    HUnitFailure (HUnitFailure),
+  )
+import Test.Hspec (HasCallStack, describe, hspec, it)
+
+main :: IO ()
+main = hspec $
+  describe "Prelude.head" $ do
+    it "returns the first element of a list" $ do
+      assertThatHspec [23 ..] $ 
+        focus head 
+        . isEqualTo 21
+        . isEqualTo 21
+        . isEqualTo 21
+        . isEqualTo 21
