diff --git a/Text/HTML/TagStream/Stream.hs b/Text/HTML/TagStream/Stream.hs
--- a/Text/HTML/TagStream/Stream.hs
+++ b/Text/HTML/TagStream/Stream.hs
@@ -9,7 +9,7 @@
 import Text.HTML.TagStream.Types
 
 -- | html parser conduit.
-tokenStream :: Resource m => Conduit ByteString m Token
+tokenStream :: Monad m => Conduit ByteString m Token
 tokenStream = conduitState S.empty push close
   where
     push accum input =
diff --git a/tagstream-conduit.cabal b/tagstream-conduit.cabal
--- a/tagstream-conduit.cabal
+++ b/tagstream-conduit.cabal
@@ -1,10 +1,10 @@
 Name:                tagstream-conduit
-Version:             0.2.2
+Version:             0.3.0
 Synopsis:            streamlined html tag parser
 Description:
     Tag-stream is a library for parsing HTML//XML to a token stream.
     It can parse unstructured and malformed HTML from the web.
-    It provides a Conduit to parse html streamlined, which consumes constant memory.
+    It also provides an Enumeratee which can parse streamline html, which means it consumes constant memory.
 
     You can start from the `tests/Tests.hs` module to see what it can do.
 Homepage:            http://github.com/yihuang/tagstream-conduit
@@ -32,10 +32,10 @@
                      , Text.HTML.TagStream.Utils
   Build-depends:       base >= 4 && < 5
                      , bytestring
-                     , conduit >= 0.2.0
+                     , conduit >= 0.4 && < 0.5
                      , attoparsec
                      , blaze-builder
-                     , blaze-builder-conduit >= 0.2.0
+                     , blaze-builder-conduit >= 0.4 && < 0.5
 
 test-suite test
     hs-source-dirs: tests
@@ -43,11 +43,9 @@
     type: exitcode-stdio-1.0
     build-depends:     base >= 4 && < 5
                      , bytestring
-                     , conduit >= 0.2.0
+                     , conduit >= 0.0.2
                      , QuickCheck
                      , HUnit
-                     , test-framework
-                     , test-framework-quickcheck2
-                     , test-framework-hunit
+                     , hspec
                      , tagstream-conduit
     ghc-options:     -Wall
diff --git a/tests/Tests.hs b/tests/Tests.hs
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -1,10 +1,11 @@
 {-# LANGUAGE FlexibleInstances, OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 module Main where
 
 import Control.Applicative
-import Test.Framework (defaultMain, testGroup, Test)
-import Test.Framework.Providers.HUnit
-import Test.Framework.Providers.QuickCheck2
+import Test.Hspec.Monadic
+import Test.Hspec.HUnit ()
+import Test.Hspec.QuickCheck (prop)
 import Test.HUnit hiding (Test)
 import Test.QuickCheck
 import Data.ByteString (ByteString)
@@ -14,14 +15,12 @@
 import Text.HTML.TagStream
 
 main :: IO ()
-main = defaultMain
-         [ testGroup "Property"
-             [ testProperty "Text nodes can't be empty" propTextNotEmpty
-             , testProperty "Parse results can't empty" propResultNotEmpty
-             ]
-         , testGroup "One pass parse" onePassTests
-         , testGroup "Streamline parse" streamlineTests
-         ]
+main = hspecX $ do
+    describe "Property" $ do
+         prop "Text nodes can't be empty" propTextNotEmpty
+         prop "Parse results can't empty" propResultNotEmpty
+    describe "One pass parse" onePassTests
+    describe "Streamline parse" streamlineTests
 
 propTextNotEmpty :: ByteString -> Bool
 propTextNotEmpty = either (const False) text_not_empty . decode
@@ -34,19 +33,19 @@
   where not_empty tokens = (S.null s && null tokens)
                         || (not (S.null s) && not (null tokens))
 
-onePassTests :: [Test]
-onePassTests = map one testcases
+onePassTests :: Specs
+onePassTests = mapM_ one testcases
   where
-    one (str, tokens) = testCase (S.unpack str) $ do
+    one (str, tokens) = it (S.unpack str) $ do
         result <- combineText <$> assertDecode str
         assertEqual "one-pass parse result incorrect" tokens result
 
-streamlineTests :: [Test]
-streamlineTests = map one testcases
+streamlineTests :: Specs
+streamlineTests = mapM_ one testcases
   where
     isIncomplete (Incomplete _) = True
     isIncomplete _ = False
-    one (str, tokens) = testCase (S.unpack str) $ do
+    one (str, tokens) = it (S.unpack str) $ do
         -- streamline parse result don't contain the trailing Incomplete token.
         let tokens' = reverse . dropWhile isIncomplete  . reverse $ tokens
         result <- combineText <$> C.runResourceT (
