diff --git a/pandoc-include-code.cabal b/pandoc-include-code.cabal
--- a/pandoc-include-code.cabal
+++ b/pandoc-include-code.cabal
@@ -8,7 +8,7 @@
 author:              Oskar Wickström
 maintainer:          Oskar Wickström
 homepage:	           https://github.com/owickstrom/pandoc-include-code
-version:             1.0.1.0
+version:             1.1.0.0
 cabal-version:       >= 1.8
 build-type:          Simple
 category:            Documentation
@@ -27,6 +27,7 @@
                    , unordered-containers >= 0.2      && < 0.3
                    , process
                    , filepath
+                   , text                 >= 1.2      && < 1.3
                    , mtl                  >= 2.2      && < 3
                    , pandoc-types         >= 1.12     && < 1.18
 
diff --git a/src/Text/Pandoc/Filter/IncludeCode.hs b/src/Text/Pandoc/Filter/IncludeCode.hs
--- a/src/Text/Pandoc/Filter/IncludeCode.hs
+++ b/src/Text/Pandoc/Filter/IncludeCode.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE LambdaCase                 #-}
 {-# LANGUAGE NamedFieldPuns             #-}
+{-# LANGUAGE OverloadedStrings          #-}
 {-# LANGUAGE RecordWildCards            #-}
 
 module Text.Pandoc.Filter.IncludeCode
@@ -13,21 +14,20 @@
 import           Control.Applicative
 import           Data.Monoid
 #endif
-import           Control.Exception
+
 import           Control.Monad.Except
 import           Control.Monad.Reader
 import           Data.Char            (isSpace)
 import           Data.HashMap.Strict  (HashMap)
 import qualified Data.HashMap.Strict  as HM
 import           Data.List            (isInfixOf)
-import           Data.Maybe           (fromMaybe)
+import           Data.Text            (Text)
+import qualified Data.Text            as Text
+import qualified Data.Text.IO         as Text
 import           Text.Pandoc.JSON
 import           Text.Read            (readMaybe)
 
-data Range = Range
-  { startLine :: Int
-  , endLine   :: Int
-  }
+data Range = Range Int Int
 
 mkRange :: Int -> Int -> Maybe Range
 mkRange s e
@@ -36,7 +36,7 @@
 
 data InclusionSpec = InclusionSpec
   { include :: FilePath
-  , snippet :: Maybe String
+  , snippet :: Maybe Text
   , range   :: Maybe Range
   , dedent  :: Maybe Int
   }
@@ -75,7 +75,7 @@
     Nothing -> return Nothing
   where
     lookupInt name = HM.lookup name attrs >>= readMaybe
-    snippet = HM.lookup "snippet" attrs
+    snippet = Text.pack <$> HM.lookup "snippet" attrs
     dedent = lookupInt "dedent"
     getRange =
       case (lookupInt "startLine", lookupInt "endLine") of
@@ -88,10 +88,10 @@
         (Just _, Nothing) -> throwError (IncompleteRange End)
         (Nothing, Nothing) -> return Nothing
 
-type Lines = [String]
+type Lines = [Text]
 
-readIncluded :: Inclusion String
-readIncluded = liftIO . readFile =<< asks include
+readIncluded :: Inclusion Text
+readIncluded = liftIO . Text.readFile =<< asks include
 
 filterLineRange :: Lines -> Inclusion Lines
 filterLineRange ls =
@@ -101,6 +101,14 @@
       where startIndex = pred start
     Nothing -> return ls
 
+isSnippetTag :: Text -> Text -> Text -> Bool
+isSnippetTag tag name line =
+  mconcat [tag, " snippet ", name] `Text.isSuffixOf` Text.strip line
+
+isSnippetStart, isSnippetEnd :: Text -> Text -> Bool
+isSnippetStart = isSnippetTag "start"
+isSnippetEnd = isSnippetTag "end"
+
 onlySnippet :: Lines -> Inclusion Lines
 onlySnippet ls = do
   s <- asks snippet
@@ -108,11 +116,7 @@
     Just name ->
       return $
       drop 1 $
-      takeWhile (not . isSnippetEnd) $ dropWhile (not . isSnippetStart) ls
-      where isSnippetTag tag line =
-              (tag ++ " snippet " ++ name) `isInfixOf` line
-            isSnippetStart = isSnippetTag "start"
-            isSnippetEnd = isSnippetTag "end"
+      takeWhile (not . isSnippetEnd name) $ dropWhile (not . isSnippetStart name) ls
     Nothing -> return ls
 
 dedentLines :: Lines -> Inclusion Lines
@@ -123,10 +127,12 @@
     Nothing -> return ls
   where
     dedentLine 0 line = line
-    dedentLine _ "" = ""
-    dedentLine n (c:cs)
-      | isSpace c = dedentLine (pred n) cs
-      | otherwise = c : cs
+    dedentLine n line =
+      case Text.uncons line of
+        Just (c, cs)
+          | isSpace c -> dedentLine (pred n) cs
+          | otherwise -> Text.cons c cs
+        Nothing -> ""
 
 filterAttributes :: [(String, String)] -> [(String, String)]
 filterAttributes = filter nonFilterAttribute
@@ -144,25 +150,30 @@
         IncompleteRange Start -> "Incomplete range: \"startLine\" is missing"
         IncompleteRange End -> "Incomplete range: \"endLine\" is missing"
 
-splitLines :: String -> Inclusion Lines
-splitLines = return . lines
+splitLines :: Text -> Inclusion Lines
+splitLines = return . Text.lines
 
-joinLines :: Lines -> Inclusion String
-joinLines = return . unlines
+joinLines :: Lines -> Inclusion Text
+joinLines = return . Text.unlines
 
+allSteps :: Inclusion Text
+allSteps =
+  readIncluded
+  >>= splitLines
+  >>= filterLineRange
+  >>= onlySnippet
+  >>= dedentLines
+  >>= joinLines
+
 -- | A Pandoc filter that includes code snippets from external files.
 includeCode :: Maybe Format -> Block -> IO Block
 includeCode _ cb@(CodeBlock (id', classes, attrs) _) =
   case parseInclusion (HM.fromList attrs) of
     Right (Just spec) ->
-      runInclusion'
-        spec
-        (readIncluded >>= splitLines >>= filterLineRange >>= onlySnippet >>=
-         dedentLines >>=
-         joinLines) >>= \case
+      runInclusion' spec allSteps >>= \case
         Left err -> printAndFail err
         Right contents ->
-          return (CodeBlock (id', classes, filterAttributes attrs) contents)
+          return (CodeBlock (id', classes, filterAttributes attrs) (Text.unpack contents))
     Right Nothing -> return cb
     Left err -> printAndFail err
 includeCode _ x = return x
