diff --git a/Text/HTML/TagSoup/Fast.hs b/Text/HTML/TagSoup/Fast.hs
--- a/Text/HTML/TagSoup/Fast.hs
+++ b/Text/HTML/TagSoup/Fast.hs
@@ -25,6 +25,7 @@
 
 import Text.HTML.TagSoup (Tag(..))
 import Text.HTML.TagSoup.Entity
+import Text.HTML.TagSoup.HtmlEntities
 import Text.StringLike (StringLike(..))
 
 import qualified Data.ByteString.Char8 as B
@@ -44,6 +45,7 @@
 import qualified Data.Text.Encoding as T
 import qualified Data.Text.ICU.Convert as ICU
 import qualified Control.Exception as E
+import Control.Monad (mplus)
 
 instance IsString Word8 where
     fromString [c] = B.c2w c
@@ -51,10 +53,10 @@
 
 type P = Ptr Word8
 r :: P -> Word8
-r ptr = B.inlinePerformIO (peek ptr)
+r ptr = unsafePerformIO (peek ptr)
 {-# INLINE r #-}
 ri :: P -> Int -> Word8
-ri ptr i = B.inlinePerformIO (peek (ptr `plusPtr` i))
+ri ptr i = unsafePerformIO (peek (ptr `plusPtr` i))
 {-# INLINE ri #-}
 
 pp :: Ptr Word8 -> Ptr Word8
@@ -71,7 +73,7 @@
 -- toLower is inplace
 toLowerBS :: B.ByteString -> B.ByteString
 toLowerBS bs@(B.PS fp offs len) =
-    B.inlinePerformIO $ withForeignPtr fp $ \ p -> do
+    unsafePerformIO $ withForeignPtr fp $ \ p -> do
         let go !_ 0 = return bs
             go !o l = do
                 w <- peekByteOff p o
@@ -85,7 +87,7 @@
 -- >   [TagOpen "div" [],TagText "&",TagOpen "script" [],TagText "x<y",TagClose "script"]
 --
 parseTags :: B.ByteString -> [Tag B.ByteString]
-parseTags s = B.inlinePerformIO $ withForeignPtr fp $ \ p ->
+parseTags s = unsafePerformIO $ withForeignPtr fp $ \ p ->
           return $
                  map fixTag $ filter (/= TagText "") $
                  dat (p `plusPtr` offset) len 0
@@ -269,41 +271,43 @@
 
 -- | Convert escaped HTML to raw.
 unescapeHtml :: B.ByteString -> B.ByteString
-unescapeHtml s
-    | not (B8.elem "&" s) = s
-    | B.length s' == 0   = s -- ignore newly created string when there is no changes
-    | otherwise          = s'
-    where s' = B.inlinePerformIO $ withForeignPtr fp $ \ src ->
+unescapeHtml src
+    | not (B8.elem "&" src) = src
+    | B.length s' == 0      = src
+      -- ignore newly created string when there is no changes
+    | otherwise             = s'
+    where s' = unsafePerformIO $ withForeignPtr fp $ \ s ->
                B.createAndTrim (len*2) $ \ dst -> do
-                     (ch, dst') <- go (src `plusPtr` offset) dst len False
+                     (ch, dst') <- go (s `plusPtr` offset) dst len False
                      return $ if ch then dst' `minusPtr` dst else 0
-          (fp, offset, len) = B.toForeignPtr s
+          (fp, offset, len) = B.toForeignPtr src
           go :: P -> P -> Int -> Bool -> IO (Bool, P)
           go !_ !d !0 !c = return (c, d)
           go !s !d !l !c
 --              | r s .&. (0x8 + 0x4) == 0x8
               | r s /= "&" =
                   poke d (r s) >> go (pp s) (pp d) (mm l) c
-              | otherwise = entity (pp s) d (mm l) 9 [] c
+              | otherwise = entity (pp s) d (mm l) maxHtmlEntityLength [] c
 --           add !c !s !d !n !l =
 --               poke d c >> go (s `plusPtr` n) (pp d) (l - n) True
           entity !s !d !l !n !acc !c
               | n == 0 || l == 0 =
-                  poke d "&" >> go (s `plusPtr` (n-9)) (pp d) (l+9-n) c
+                  poke d "&" >>
+                  go (s `plusPtr` (n-maxHtmlEntityLength))
+                     (pp d) (l+maxHtmlEntityLength-n) c
               | r s /= ";" =
                   entity (pp s) d (mm l) (mm n) (B.w2c (r s) : acc) c
-              | otherwise = case lookupEntity $ reverse acc of
-                  Just [i] -> do
-                      -- there are strange two character entities, some of them
-                      -- are actually single character
-                      -- (&Bfr; = '\x1D505', but returned as "\xD835\xDD05")
-                      -- ignore them.
+              | otherwise = case lookupHtmlEntity (reverse acc) `mplus`
+                                 lookupEntity (reverse acc) of
+                  Just e -> do
                       let put !d [] = go (pp s) d (mm l) True
                           put !d (x:xs) =
                               poke d x >> put (pp d) xs
-                      put d $ encodeChar i
+                      put d $ concatMap encodeChar e
                   _ ->
-                      poke d "&" >> go (s `plusPtr` (n-9)) (pp d) (l+9-n) c
+                      poke d "&" >>
+                      go (s `plusPtr` (n-maxHtmlEntityLength))
+                         (pp d) (l+maxHtmlEntityLength-n) c
 
 encodeChar :: Char -> [Word8]
 encodeChar = map fromIntegral . go . ord
@@ -350,7 +354,7 @@
     | Nothing <- B8.find (\ c -> c=="&"||c=="<"||c==">"||c=="'"||c=="\"") s = s
     | B.length s' == 0 = s
     | otherwise        = s'
-    where s' = B.inlinePerformIO $ withForeignPtr fp $ \ src ->
+    where s' = unsafePerformIO $ withForeignPtr fp $ \ src ->
                B.createAndTrim (len*6) $ \ dst -> do
                      (ch, dst') <- go (src `plusPtr` offset) dst len False
                      return $ if ch then dst' `minusPtr` dst else 0
@@ -372,8 +376,11 @@
               add s (pp d) l xs
 
 -- | Show a list of tags, as they might have been parsed.
+renderTags :: [Tag B.ByteString] -> B.ByteString
 renderTags = renderTags' escapeHtml B.concat
+
 -- | Alternative to 'renderTags' working with 'Text'
+renderTagsT :: [Tag T.Text] -> T.Text
 renderTagsT = renderTags' escapeHtmlT T.concat
 
 renderTags' escape concat = go []
diff --git a/fast-tagsoup.cabal b/fast-tagsoup.cabal
--- a/fast-tagsoup.cabal
+++ b/fast-tagsoup.cabal
@@ -1,7 +1,7 @@
 cabal-version:  >= 1.6
 name:           fast-tagsoup
-version:        1.0.7
-copyright:      Vladimir Shabanov 2011-2015
+version:        1.0.8
+copyright:      Vladimir Shabanov 2011-2016
 author:         Vladimir Shabanov <vshabanoff@gmail.com>
 maintainer:     Vladimir Shabanov <vshabanoff@gmail.com>
 homepage:       https://github.com/vshabanov/fast-tagsoup
@@ -34,7 +34,7 @@
 --     description: Build with Encoding module
 
 library
-    build-depends: base == 4.*, bytestring, text, text-icu, tagsoup
+    build-depends: base == 4.*, bytestring, text, text-icu, tagsoup, containers
 
 --     if flag(download)
 --         build-depends: network
