diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+##  0.3.5.0
+
+-   Updates for pandoc 2.8
+
+-   Pandoc < 2.8 no longer supported
+
+-   Check pandoc version when running through pandoc and issue a warning
+    when it doesn't match the one pandoc-crossref was built with.
+
+-   Running pandoc-crossref as a UNIX pipe implicitly, i.e.
+    `pandoc -t json text.md | pandoc-crossref | pandoc -f json`
+    is no longer supported. Use the `--pipe` (short `-p` is also supported) option, e.g.
+    `pandoc -t json text.md | pandoc-crossref --pipe | pandoc -f json`
+
+-   Running pandoc-crossref as a UNIX pipe with specified output format, i.e.
+    `pandoc -t json text.md | pandoc-crossref html | pandoc -f json`
+    is deprecated. Please use the `--pipe` (short `-p` is also supported) option, e.g.
+    `pandoc -t json text.md | pandoc-crossref --pipe html | pandoc -f json`
+
 ## 0.3.4.2
 
 -   Fix eqLabels in documentation and default meta
diff --git a/lib/Text/Pandoc/CrossRef.hs b/lib/Text/Pandoc/CrossRef.hs
--- a/lib/Text/Pandoc/CrossRef.hs
+++ b/lib/Text/Pandoc/CrossRef.hs
@@ -142,7 +142,7 @@
 runCrossRef :: forall a b. Meta -> Maybe Format -> (a -> CrossRefM b) -> a -> b
 runCrossRef meta fmt action arg = R.runReader (action arg) env
   where
-    settings = meta <> defaultMeta
+    settings = defaultMeta <> meta
     env = CrossRefEnv {
             creSettings = settings
           , creOptions = getOptions settings fmt
diff --git a/lib/Text/Pandoc/CrossRef/References/Blocks.hs b/lib/Text/Pandoc/CrossRef/References/Blocks.hs
--- a/lib/Text/Pandoc/CrossRef/References/Blocks.hs
+++ b/lib/Text/Pandoc/CrossRef/References/Blocks.hs
@@ -18,7 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE Rank2Types, MultiWayIf #-}
+{-# LANGUAGE Rank2Types, MultiWayIf, OverloadedStrings #-}
 module Text.Pandoc.CrossRef.References.Blocks
   ( replaceAll
   ) where
@@ -31,6 +31,8 @@
 import Data.Maybe
 import Data.Monoid
 import qualified Data.Map as M
+import qualified Data.Text as T
+import qualified Data.Text.Read as T
 
 import Data.Accessor
 import Data.Accessor.Monad.Trans.State
@@ -56,19 +58,19 @@
 replaceBlock :: Options -> Block -> WS (ReplacedResult Block)
 replaceBlock opts (Header n (label, cls, attrs) text')
   = do
-    let label' = if autoSectionLabels opts && not ("sec:" `isPrefixOf` label)
-                 then "sec:"++label
+    let label' = if autoSectionLabels opts && not ("sec:" `T.isPrefixOf` label)
+                 then "sec:"<>label
                  else label
     unless ("unnumbered" `elem` cls) $ do
       modify curChap $ \cc ->
         let ln = length cc
             cl = lookup "label" attrs
-            inc l = init l ++ [(fst (last l) + 1, cl)]
+            inc l = init l <> [(fst (last l) + 1, cl)]
             cc' | ln > n = inc $ take n cc
                 | ln == n = inc cc
-                | otherwise = cc ++ take (n-ln-1) (zip [1,1..] $ repeat Nothing) ++ [(1,cl)]
+                | otherwise = cc <> take (n-ln-1) (zip [1,1..] $ repeat Nothing) <> [(1,cl)]
         in cc'
-      when ("sec:" `isPrefixOf` label') $ do
+      when ("sec:" `T.isPrefixOf` label') $ do
         index  <- get curChap
         modify secRefs $ M.insert label' RefRec {
           refIndex=index
@@ -81,17 +83,17 @@
                || n <= if sectionsDepth opts == 0 then chaptersDepth opts else sectionsDepth opts
                , "unnumbered" `notElem` cls
                = applyTemplate' (M.fromDistinctAscList [
-                    ("i", [Str (intercalate "." $ map show' cc)])
-                  , ("n", [Str $ show $ n - 1])
+                    ("i", [Str (T.intercalate "." $ map show' cc)])
+                  , ("n", [Str $ T.pack $ show $ n - 1])
                   , ("t", text')
                   ]) $ secHeaderTemplate opts
                | otherwise = text'
         show' (_, Just s) = s
-        show' (i, Nothing) = show i
+        show' (i, Nothing) = T.pack $ show i
     replaceNoRecurse $ Header n (label', cls, attrs) textCC
 -- subfigures
 replaceBlock opts (Div (label,cls,attrs) images)
-  | "fig:" `isPrefixOf` label
+  | "fig:" `T.isPrefixOf` label
   , Para caption <- last images
   = do
     idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) caption imgRefs
@@ -124,7 +126,7 @@
           f | isLatexFormat f ->
             replaceNoRecurse $ Div nullAttr $
               [ RawBlock (Format "latex") "\\begin{figure}\n\\centering" ]
-              ++ cont ++
+              <> cont <>
               [ Para [RawInline (Format "latex") "\\caption"
                        , Span nullAttr caption]
               , RawBlock (Format "latex") $ mkLaTeXLabel label
@@ -133,12 +135,12 @@
   where
     opts' = opts
               { figureTemplate = subfigureChildTemplate opts
-              , customLabel = \r i -> customLabel opts ("sub"++r) i
+              , customLabel = \r i -> customLabel opts ("sub"<>r) i
               }
     toTable :: [Block] -> [Inline] -> [Block]
     toTable blks capt
       | subfigGrid opts = [Table [] align widths [] $ map blkToRow blks, mkCaption opts "Image Caption" capt]
-      | otherwise = blks ++ [mkCaption opts "Image Caption" capt]
+      | otherwise = blks <> [mkCaption opts "Image Caption" capt]
       where
         align | Para ils:_ <- blks = replicate (length $ mapMaybe getWidth ils) AlignCenter
               | otherwise = error "Misformatted subfigures block"
@@ -155,10 +157,9 @@
             in if nz>0
                then map (\x -> if x == 0 then rzw else x) ws
                else ws
-        percToDouble :: String -> Double
+        percToDouble :: T.Text -> Double
         percToDouble percs
-          | '%' <- last percs
-          , perc <- read $ init percs
+          | Right (perc, "%") <- T.double percs
           = perc/100.0
           | otherwise = error "Only percent allowed in subfigure width!"
         blkToRow :: Block -> [[Block]]
@@ -170,7 +171,7 @@
         setW as = ("width", "100%"):filter ((/="width") . fst) as
 replaceBlock opts (Div divOps@(label,_,attrs) [Table title align widths header cells])
   | not $ null title
-  , "tbl:" `isPrefixOf` label
+  , "tbl:" `T.isPrefixOf` label
   = do
     idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) title tblRefs
     let title' =
@@ -180,8 +181,8 @@
               _  -> applyTemplate idxStr title $ tableTemplate opts
     replaceNoRecurse $ Div divOps [Table title' align widths header cells]
 replaceBlock opts cb@(CodeBlock (label, classes, attrs) code)
-  | not $ null label
-  , "lst:" `isPrefixOf` label
+  | not $ T.null label
+  , "lst:" `T.isPrefixOf` label
   , Just caption <- lookup "caption" attrs
   = case outFormat opts of
       f
@@ -205,13 +206,13 @@
         let caption' = applyTemplate idxStr cap $ listingTemplate opts
         replaceNoRecurse $ Div (label, "listing":classes, []) [
             mkCaption opts "Caption" caption'
-          , CodeBlock ([], classes, attrs \\ [("caption", caption)]) code
+          , CodeBlock ("", classes, attrs \\ [("caption", caption)]) code
           ]
 replaceBlock opts
   (Div (label,"listing":_, [])
-    [Para caption, CodeBlock ([],classes,attrs) code])
-  | not $ null label
-  , "lst:" `isPrefixOf` label
+    [Para caption, CodeBlock ("",classes,attrs) code])
+  | not $ T.null label
+  , "lst:" `T.isPrefixOf` label
   = case outFormat opts of
       f
         --if used with listings package, return code block with caption
@@ -233,37 +234,38 @@
         let caption' = applyTemplate idxStr caption $ listingTemplate opts
         replaceNoRecurse $ Div (label, "listing":classes, []) [
             mkCaption opts "Caption" caption'
-          , CodeBlock ([], classes, attrs) code
+          , CodeBlock ("", classes, attrs) code
           ]
 replaceBlock opts (Para [Span attrs [Math DisplayMath eq]])
   | not $ isLatexFormat (outFormat opts)
   , tableEqns opts
   = do
     (eq', idx) <- replaceEqn opts attrs eq
-    replaceNoRecurse $ Div attrs [Table [] [AlignCenter, AlignRight] [0.9, 0.09] [] [[[Plain [Math DisplayMath eq']], [Plain [Math DisplayMath $ "(" ++ idx ++ ")"]]]]]
+    replaceNoRecurse $ Div attrs [Table [] [AlignCenter, AlignRight] [0.9, 0.09] [] [[[Plain [Math DisplayMath eq']], [Plain [Math DisplayMath $ "(" <> idx <> ")"]]]]]
 replaceBlock _ _ = noReplaceRecurse
 
-replaceEqn :: Options -> Attr -> String -> WS (String, String)
+replaceEqn :: Options -> Attr -> T.Text -> WS (T.Text, T.Text)
 replaceEqn opts (label, _, attrs) eq = do
-  let label' | null label = Left "eq"
+  let label' | T.null label = Left "eq"
              | otherwise = Right label
   idxStr <- replaceAttr opts label' (lookup "label" attrs) [] eqnRefs
   let eq' | tableEqns opts = eq
-          | otherwise = eq++"\\qquad("++stringify idxStr++")"
-  return (eq', stringify idxStr)
+          | otherwise = eq<>"\\qquad("<>idxTxt<>")"
+      idxTxt = stringify idxStr
+  return (eq', idxTxt)
 
 replaceInline :: Options -> Inline -> WS (ReplacedResult Inline)
 replaceInline opts (Span attrs@(label,_,_) [Math DisplayMath eq])
-  | "eq:" `isPrefixOf` label || null label && autoEqnLabels opts
+  | "eq:" `T.isPrefixOf` label || T.null label && autoEqnLabels opts
   = case outFormat opts of
       f | isLatexFormat f ->
-        let eqn = "\\begin{equation}"++eq++mkLaTeXLabel label++"\\end{equation}"
+        let eqn = "\\begin{equation}"<>eq<>mkLaTeXLabel label<>"\\end{equation}"
         in replaceNoRecurse $ RawInline (Format "latex") eqn
       _ -> do
         (eq', _) <- replaceEqn opts attrs eq
         replaceNoRecurse $ Span attrs [Math DisplayMath eq']
 replaceInline opts (Image attr@(label,_,attrs) alt img@(_, tit))
-  | "fig:" `isPrefixOf` label && "fig:" `isPrefixOf` tit
+  | "fig:" `T.isPrefixOf` label && "fig:" `T.isPrefixOf` tit
   = do
     idxStr <- replaceAttr opts (Right label) (lookup "label" attrs) alt imgRefs
     let alt' = case outFormat opts of
@@ -278,18 +280,18 @@
 replaceSubfig :: Options -> Inline -> WS [Inline]
 replaceSubfig opts x@(Image (label,cls,attrs) alt (src, tit))
   = do
-      let label' | "fig:" `isPrefixOf` label = Right label
-                 | null label = Left "fig"
-                 | otherwise  = Right $ "fig:" ++ label
+      let label' | "fig:" `T.isPrefixOf` label = Right label
+                 | T.null label = Left "fig"
+                 | otherwise  = Right $ "fig:" <> label
       idxStr <- replaceAttr opts label' (lookup "label" attrs) alt imgRefs
       case outFormat opts of
         f | isLatexFormat f ->
           return $ latexSubFigure x label
         _  ->
           let alt' = applyTemplate idxStr alt $ figureTemplate opts
-              tit' | "nocaption" `elem` cls = fromMaybe tit $ stripPrefix "fig:" tit
-                   | "fig:" `isPrefixOf` tit = tit
-                   | otherwise = "fig:" ++ tit
+              tit' | "nocaption" `elem` cls = fromMaybe tit $ T.stripPrefix "fig:" tit
+                   | "fig:" `T.isPrefixOf` tit = tit
+                   | otherwise = "fig:" <> tit
           in return [Image (label, cls, attrs) alt' (src, tit')]
 replaceSubfig _ x = return [x]
 
@@ -302,7 +304,7 @@
 
 splitMath :: [Block] -> [Block]
 splitMath (Para ils:xs)
-  | length ils > 1 = map Para (split [] [] ils) ++ xs
+  | length ils > 1 = map Para (split [] [] ils) <> xs
   where
     split res acc [] = reverse (reverse acc : res)
     split res acc (x@(Span _ [Math DisplayMath _]):ys) =
@@ -321,16 +323,17 @@
   = Span nullAttr [math]:ils
 spanInlines _ x = x
 
-replaceAttr :: Options -> Either String String -> Maybe String -> [Inline] -> Accessor References RefMap -> WS [Inline]
+replaceAttr :: Options -> Either T.Text T.Text -> Maybe T.Text -> [Inline] -> Accessor References RefMap -> WS [Inline]
 replaceAttr o label refLabel title prop
   = do
     chap  <- take (chaptersDepth o) `fmap` get curChap
-    i     <- (1+) `fmap` (M.size . M.filter (\x -> (chap == init (refIndex x)) && isNothing (refSubfigure x)) <$> get prop)
-    let index = chap ++ [(i, refLabel <> customLabel o label' i)]
-        label' = either (++ ':':show index) id label
-    hasLabel <- M.member label' <$> get prop
-    when hasLabel $
-      error $ "Duplicate label: " ++ label'
+    prop' <- get prop
+    let i = 1+ (M.size . M.filter (\x -> (chap == init (refIndex x)) && isNothing (refSubfigure x)) $ prop')
+        index = chap <> [(i, refLabel <> customLabel o ref i)]
+        ref = either id (T.takeWhile (/=':')) label
+        label' = either (<> T.pack (':' : show index)) id label
+    when (M.member label' prop') $
+      error . T.unpack $ "Duplicate label: " <> label'
     modify prop $ M.insert label' RefRec {
       refIndex= index
     , refTitle= title
@@ -338,11 +341,11 @@
     }
     return $ chapPrefix (chapDelim o) index
 
-latexSubFigure :: Inline -> String -> [Inline]
+latexSubFigure :: Inline -> T.Text -> [Inline]
 latexSubFigure (Image (_, cls, attrs) alt (src, title)) label =
   let
-    title' = fromMaybe title $ stripPrefix "fig:" title
-    texlabel | null label = []
+    title' = fromMaybe title $ T.stripPrefix "fig:" title
+    texlabel | T.null label = []
              | otherwise = [RawInline (Format "latex") $ mkLaTeXLabel label]
     texalt | "nocaption" `elem` cls  = []
            | otherwise = concat
@@ -358,7 +361,7 @@
       ]
 latexSubFigure x _ = [x]
 
-mkCaption :: Options -> String -> [Inline] -> Block
+mkCaption :: Options -> T.Text -> [Inline] -> Block
 mkCaption opts style
-  | outFormat opts == Just (Format "docx") = Div ([], [], [("custom-style", style)]) . return . Para
+  | outFormat opts == Just (Format "docx") = Div ("", [], [("custom-style", style)]) . return . Para
   | otherwise = Para
diff --git a/lib/Text/Pandoc/CrossRef/References/List.hs b/lib/Text/Pandoc/CrossRef/References/List.hs
--- a/lib/Text/Pandoc/CrossRef/References/List.hs
+++ b/lib/Text/Pandoc/CrossRef/References/List.hs
@@ -18,6 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Pandoc.CrossRef.References.List (listOf) where
 
 import Text.Pandoc.Definition
@@ -25,6 +26,7 @@
 import Control.Arrow
 import Data.List
 import qualified Data.Map as M
+import qualified Data.Text as T
 
 import Text.Pandoc.CrossRef.References.Types
 import Text.Pandoc.CrossRef.Util.Util
@@ -43,7 +45,7 @@
   = get lstRefs >>= makeList opts lolTitle xs
 listOf _ x = return x
 
-makeList :: Options -> (Options -> [Block]) -> [Block] -> M.Map String RefRec -> WS [Block]
+makeList :: Options -> (Options -> [Block]) -> [Block] -> M.Map T.Text RefRec -> WS [Block]
 makeList opts titlef xs refs
   = return $
       titlef opts ++
diff --git a/lib/Text/Pandoc/CrossRef/References/Refs.hs b/lib/Text/Pandoc/CrossRef/References/Refs.hs
--- a/lib/Text/Pandoc/CrossRef/References/Refs.hs
+++ b/lib/Text/Pandoc/CrossRef/References/Refs.hs
@@ -18,6 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Pandoc.CrossRef.References.Refs (replaceRefs) where
 
 import Text.Pandoc.Definition
@@ -25,6 +26,7 @@
 import Control.Monad.State hiding (get, modify)
 import Data.List
 import qualified Data.List.HT as HT
+import qualified Data.Text as T
 import Data.Maybe
 import Data.Function
 import qualified Data.Map as M
@@ -57,7 +59,7 @@
             <> intercalate' (text "; ") (map citationToInlines cits')
             <> str "]"
           citationToInlines c =
-            fromList (citationPrefix c) <> text ("@" ++ citationId c)
+            fromList (citationPrefix c) <> text ("@" <> citationId c)
               <> fromList (citationSuffix c)
     replaceRefs'' = case outFormat opts of
                     f | isLatexFormat f -> replaceRefsLatex
@@ -65,7 +67,7 @@
 replaceRefs _ x = return x
 
 -- accessors to state variables
-accMap :: M.Map String (Accessor References RefMap)
+accMap :: M.Map T.Text (Accessor References RefMap)
 accMap = M.fromList [("fig:",imgRefs)
                     ,("eq:" ,eqnRefs)
                     ,("tbl:",tblRefs)
@@ -74,7 +76,7 @@
                     ]
 
 -- accessors to options
-prefMap :: M.Map String (Options -> Bool -> Int -> [Inline], Options -> Template)
+prefMap :: M.Map T.Text (Options -> Bool -> Int -> [Inline], Options -> Template)
 prefMap = M.fromList [("fig:",(figPrefix, figPrefixTemplate))
                      ,("eq:" ,(eqnPrefix, eqnPrefixTemplate))
                      ,("tbl:",(tblPrefix, tblPrefixTemplate))
@@ -82,10 +84,10 @@
                      ,("sec:",(secPrefix, secPrefixTemplate))
                      ]
 
-prefixes :: [String]
+prefixes :: [T.Text]
 prefixes = M.keys accMap
 
-getRefPrefix :: Options -> String -> Bool -> Int -> [Inline] -> [Inline]
+getRefPrefix :: Options -> T.Text -> Bool -> Int -> [Inline] -> [Inline]
 getRefPrefix opts prefix capitalize num cit =
   applyTemplate' (M.fromDistinctAscList [("i", cit), ("p", refprefix)])
         $ reftempl opts
@@ -96,13 +98,13 @@
 lookupUnsafe :: Ord k => k -> M.Map k v -> v
 lookupUnsafe = (fromJust .) . M.lookup
 
-allCitsPrefix :: [Citation] -> Maybe String
+allCitsPrefix :: [Citation] -> Maybe T.Text
 allCitsPrefix cits = find isCitationPrefix prefixes
   where
   isCitationPrefix p =
-    all (p `isPrefixOf`) $ map (uncapitalizeFirst . citationId) cits
+    all (p `T.isPrefixOf`) $ map (uncapitalizeFirst . citationId) cits
 
-replaceRefsLatex :: String -> Options -> [Citation] -> WS [Inline]
+replaceRefsLatex :: T.Text -> Options -> [Citation] -> WS [Inline]
 replaceRefsLatex prefix opts cits
   | cref opts
   = replaceRefsLatex' prefix opts cits
@@ -110,14 +112,14 @@
   = toList . intercalate' (text ", ") . map fromList <$>
       mapM (replaceRefsLatex' prefix opts) (groupBy citationGroupPred cits)
 
-replaceRefsLatex' :: String -> Options -> [Citation] -> WS [Inline]
+replaceRefsLatex' :: T.Text -> Options -> [Citation] -> WS [Inline]
 replaceRefsLatex' prefix opts cits =
   return $ p [texcit]
   where
     texcit =
       RawInline (Format "tex") $
       if cref opts then
-        cref'++"{"++listLabels prefix "" "," "" cits++"}"
+        cref'<>"{"<>listLabels prefix "" "," "" cits<>"}"
         else
           listLabels prefix "\\ref{" ", " "}" cits
     suppressAuthor = all (==SuppressAuthor) $ map citationMode cits
@@ -127,33 +129,33 @@
       = id
       | noPrefix
       = getRefPrefix opts prefix cap (length cits - 1)
-      | otherwise = ((citationPrefix (head cits) ++ [Space]) ++)
+      | otherwise = ((citationPrefix (head cits) <> [Space]) <>)
     cap = maybe False isFirstUpper $ getLabelPrefix . citationId . head $ cits
     cref' | suppressAuthor = "\\labelcref"
           | cap = "\\Cref"
           | otherwise = "\\cref"
 
-listLabels :: String -> String -> String -> String -> [Citation] -> String
+listLabels :: T.Text -> T.Text -> T.Text -> T.Text -> [Citation] -> T.Text
 listLabels prefix p sep s =
-  intercalate sep . map ((p ++) . (++ s) . mkLaTeXLabel' . (prefix++) . getLabelWithoutPrefix . citationId)
+  T.intercalate sep . map ((p <>) . (<> s) . mkLaTeXLabel' . (prefix<>) . getLabelWithoutPrefix . citationId)
 
-getLabelWithoutPrefix :: String -> String
-getLabelWithoutPrefix = drop 1 . dropWhile (/=':')
+getLabelWithoutPrefix :: T.Text -> T.Text
+getLabelWithoutPrefix = T.drop 1 . T.dropWhile (/=':')
 
-getLabelPrefix :: String -> Maybe String
+getLabelPrefix :: T.Text -> Maybe T.Text
 getLabelPrefix lab
   | uncapitalizeFirst p `elem` prefixes = Just p
   | otherwise = Nothing
-  where p = (++ ":") . takeWhile (/=':') $ lab
+  where p = flip T.snoc ':' . T.takeWhile (/=':') $ lab
 
-replaceRefsOther :: String -> Options -> [Citation] -> WS [Inline]
+replaceRefsOther :: T.Text -> Options -> [Citation] -> WS [Inline]
 replaceRefsOther prefix opts cits = toList . intercalate' (text ", ") . map fromList <$>
     mapM (replaceRefsOther' prefix opts) (groupBy citationGroupPred cits)
 
 citationGroupPred :: Citation -> Citation -> Bool
 citationGroupPred = (==) `on` liftM2 (,) citationPrefix citationMode
 
-replaceRefsOther' :: String -> Options -> [Citation] -> WS [Inline]
+replaceRefsOther' :: T.Text -> Options -> [Citation] -> WS [Inline]
 replaceRefsOther' prefix opts cits = do
   indices <- mapM (getRefIndex prefix opts) cits
   let
@@ -169,7 +171,7 @@
     cmap f x = f x
   return $ writePrefix (makeIndices opts indices)
 
-data RefData = RefData { rdLabel :: String
+data RefData = RefData { rdLabel :: T.Text
                        , rdIdx :: Maybe Index
                        , rdSubfig :: Maybe Index
                        , rdSuffix :: [Inline]
@@ -178,7 +180,7 @@
 instance Ord RefData where
   (<=) = (<=) `on` rdIdx
 
-getRefIndex :: String -> Options -> Citation -> WS RefData
+getRefIndex :: T.Text -> Options -> Citation -> WS RefData
 getRefIndex prefix _opts Citation{citationId=cid,citationSuffix=suf}
   = do
     ref <- M.lookup lab <$> get prop
@@ -192,7 +194,7 @@
       }
   where
   prop = lookupUnsafe prefix accMap
-  lab = prefix ++ getLabelWithoutPrefix cid
+  lab = prefix <> getLabelWithoutPrefix cid
 
 data RefItem = RefRange RefData RefData | RefSingle RefData
 
@@ -231,7 +233,7 @@
   show'' (RefRange x y) = show' x <> fromList (rangeDelim o) <> show' y
   show' :: RefData -> Inlines
   show' RefData{rdLabel=l, rdIdx=Just i, rdSubfig = sub, rdSuffix = suf}
-    | linkReferences o = link ('#':l) "" (fromList txt)
+    | linkReferences o = link ('#' `T.cons` l) "" (fromList txt)
     | otherwise = fromList txt
     where
       txt
@@ -249,5 +251,5 @@
                       ]
           in applyTemplate' vars $ refIndexTemplate o
   show' RefData{rdLabel=l, rdIdx=Nothing, rdSuffix = suf} =
-    trace ("Undefined cross-reference: " ++ l)
-          (strong (text $ "¿" ++ l ++ "?") <> fromList suf)
+    trace (T.unpack $ "Undefined cross-reference: " <> l)
+          (strong (text $ "¿" <> l <> "?") <> fromList suf)
diff --git a/lib/Text/Pandoc/CrossRef/References/Types.hs b/lib/Text/Pandoc/CrossRef/References/Types.hs
--- a/lib/Text/Pandoc/CrossRef/References/Types.hs
+++ b/lib/Text/Pandoc/CrossRef/References/Types.hs
@@ -26,15 +26,16 @@
 import Control.Monad.State
 import Data.Default
 import Data.Accessor.Template
+import Data.Text (Text)
 
-type Index = [(Int, Maybe String)]
+type Index = [(Int, Maybe Text)]
 
 data RefRec = RefRec { refIndex :: Index
                      , refTitle :: [Inline]
                      , refSubfigure :: Maybe Index
                      } deriving (Show, Eq)
 
-type RefMap = M.Map String RefRec
+type RefMap = M.Map Text RefRec
 
 -- state data type
 data References = References { imgRefs_ :: RefMap
diff --git a/lib/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs b/lib/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs
--- a/lib/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs
@@ -18,17 +18,19 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Pandoc.CrossRef.Util.CodeBlockCaptions
     (
     mkCodeBlockCaptions
     ) where
 
 import Text.Pandoc.Definition
-import Data.List (isPrefixOf, stripPrefix)
+import Data.List (stripPrefix)
 import Data.Maybe (fromMaybe)
 import Text.Pandoc.CrossRef.References.Types
 import Text.Pandoc.CrossRef.Util.Options
 import Text.Pandoc.CrossRef.Util.Util
+import qualified Data.Text as T
 
 mkCodeBlockCaptions :: Options -> [Block] -> WS [Block]
 mkCodeBlockCaptions opts x@(cb@(CodeBlock _ _):p@(Para _):xs)
@@ -41,16 +43,16 @@
 orderAgnostic opts (Para ils:CodeBlock (label,classes,attrs) code:xs)
   | codeBlockCaptions opts
   , Just caption <- getCodeBlockCaption ils
-  , not $ null label
-  , "lst" `isPrefixOf` label
+  , not $ T.null label
+  , "lst" `T.isPrefixOf` label
   = return $ Div (label,"listing":classes, [])
-      [Para caption, CodeBlock ([],classes,attrs) code] : xs
+      [Para caption, CodeBlock ("",classes,attrs) code] : xs
 orderAgnostic opts (Para ils:CodeBlock (_,classes,attrs) code:xs)
   | codeBlockCaptions opts
   , Just (caption, labinl) <- splitLast <$> getCodeBlockCaption ils
   , Just label <- getRefLabel "lst" labinl
   = return $ Div (label,"listing":classes, [])
-      [Para $ init caption, CodeBlock ([],classes,attrs) code] : xs
+      [Para $ init caption, CodeBlock ("",classes,attrs) code] : xs
   where
     splitLast xs' = splitAt (length xs' - 1) xs'
 orderAgnostic _ _ = Nothing
diff --git a/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs b/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs
--- a/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/CustomLabels.hs
@@ -18,21 +18,22 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Pandoc.CrossRef.Util.CustomLabels (customLabel) where
 
 import Text.Pandoc.Definition
 import Text.Pandoc.CrossRef.Util.Meta
-import Data.List
 import Text.Numeral.Roman
+import qualified Data.Text as T
 
-customLabel :: Meta -> String -> Int -> Maybe String
+customLabel :: Meta -> T.Text -> Int -> Maybe T.Text
 customLabel meta ref i
-  | refLabel <- takeWhile (/=':') ref
-  , Just cl <- lookupMeta (refLabel++"Labels") meta
-  = mkLabel i (refLabel++"Labels") cl
+  | refLabel <- T.takeWhile (/=':') ref
+  , Just cl <- lookupMeta (refLabel <> "Labels") meta
+  = mkLabel i (refLabel <> "Labels") cl
   | otherwise = Nothing
 
-mkLabel :: Int -> String -> MetaValue -> Maybe String
+mkLabel :: Int -> T.Text -> MetaValue -> Maybe T.Text
 mkLabel i n lt
   | MetaList _ <- lt
   , Just val <- toString n <$> getList (i-1) lt
@@ -41,6 +42,6 @@
   = Nothing
   | toString n lt == "roman"
   = Just $ toRoman i
-  | Just (startWith:_) <- stripPrefix "alpha " $ toString n lt
-  = Just [[startWith..] !! (i-1)]
+  | Just (startWith, _) <- T.uncons =<< T.stripPrefix "alpha " (toString n lt)
+  = Just . T.singleton $ [startWith..] !! (i-1)
   | otherwise = error $ "Unknown numeration type: " ++ show lt
diff --git a/lib/Text/Pandoc/CrossRef/Util/Meta.hs b/lib/Text/Pandoc/CrossRef/Util/Meta.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Meta.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Meta.hs
@@ -37,23 +37,24 @@
 import Data.Default
 import Text.Pandoc.Walk
 import Text.Pandoc.Shared hiding (capitalize, toString)
+import qualified Data.Text as T
 
-getMetaList :: (Default a) => (MetaValue -> a) -> String -> Meta -> Int -> a
+getMetaList :: (Default a) => (MetaValue -> a) -> T.Text -> Meta -> Int -> a
 getMetaList f name meta i = maybe def f $ lookupMeta name meta >>= getList i
 
-getMetaBool :: String -> Meta -> Bool
+getMetaBool :: T.Text -> Meta -> Bool
 getMetaBool = getScalar toBool
 
-getMetaInlines :: String -> Meta -> [Inline]
+getMetaInlines :: T.Text -> Meta -> [Inline]
 getMetaInlines = getScalar toInlines
 
-getMetaBlock :: String -> Meta -> [Block]
+getMetaBlock :: T.Text -> Meta -> [Block]
 getMetaBlock = getScalar toBlocks
 
-getMetaString :: String -> Meta -> String
+getMetaString :: T.Text -> Meta -> T.Text
 getMetaString = getScalar toString
 
-getScalar :: Def b => (String -> MetaValue -> b) -> String -> Meta -> b
+getScalar :: Def b => (T.Text -> MetaValue -> b) -> T.Text -> Meta -> b
 getScalar conv name meta = maybe def' (conv name) $ lookupMeta name meta
 
 class Def a where
@@ -65,8 +66,11 @@
 instance Def [a] where
   def' = []
 
-unexpectedError :: forall a. String -> String -> MetaValue -> a
-unexpectedError e n x = error $ "Expected " <> e <> " in metadata field " <> n <> " but got " <> g x
+instance Def T.Text where
+  def' = T.empty
+
+unexpectedError :: forall a. String -> T.Text -> MetaValue -> a
+unexpectedError e n x = error $ "Expected " <> e <> " in metadata field " <> T.unpack n <> " but got " <> g x
   where
     g (MetaBlocks _) = "blocks"
     g (MetaString _) = "string"
@@ -75,23 +79,23 @@
     g (MetaMap _) = "map"
     g (MetaList _) = "list"
 
-toInlines :: String -> MetaValue -> [Inline]
+toInlines :: T.Text -> MetaValue -> [Inline]
 toInlines _ (MetaBlocks s) = blocksToInlines s
 toInlines _ (MetaInlines s) = s
 toInlines _ (MetaString s) = toList $ text s
 toInlines n x = unexpectedError "inlines" n x
 
-toBool :: String -> MetaValue -> Bool
+toBool :: T.Text -> MetaValue -> Bool
 toBool _ (MetaBool b) = b
 toBool n x = unexpectedError "bool" n x
 
-toBlocks :: String -> MetaValue -> [Block]
+toBlocks :: T.Text -> MetaValue -> [Block]
 toBlocks _ (MetaBlocks bs) = bs
 toBlocks _ (MetaInlines ils) = [Plain ils]
 toBlocks _ (MetaString s) = toList $ plain $ text s
 toBlocks n x = unexpectedError "blocks" n x
 
-toString :: String -> MetaValue -> String
+toString :: T.Text -> MetaValue -> T.Text
 toString _ (MetaString s) = s
 toString _ (MetaBlocks b) = stringify b
 toString _ (MetaInlines i) = stringify i
@@ -106,7 +110,7 @@
 getList _ x = Just x
 
 tryCapitalizeM :: (Functor m, Monad m, Walkable Inline a, Default a, Eq a) =>
-        (String -> m a) -> String -> Bool -> m a
+        (T.Text -> m a) -> T.Text -> Bool -> m a
 tryCapitalizeM f varname capitalize
   | capitalize = do
     res <- f (capitalizeFirst varname)
diff --git a/lib/Text/Pandoc/CrossRef/Util/ModifyMeta.hs b/lib/Text/Pandoc/CrossRef/Util/ModifyMeta.hs
--- a/lib/Text/Pandoc/CrossRef/Util/ModifyMeta.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/ModifyMeta.hs
@@ -18,12 +18,12 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Pandoc.CrossRef.Util.ModifyMeta
     (
     modifyMeta
     ) where
 
-import Data.List (intercalate)
 import Text.Pandoc
 import Text.Pandoc.Builder hiding ((<>))
 import Text.Pandoc.CrossRef.Util.Options
@@ -42,9 +42,9 @@
   where
     headerInc :: Maybe MetaValue -> MetaValue
     headerInc Nothing = incList
-    headerInc (Just (MetaList x)) = MetaList $ x ++ [incList]
+    headerInc (Just (MetaList x)) = MetaList $ x <> [incList]
     headerInc (Just x) = MetaList [x, incList]
-    incList = MetaBlocks $ return $ RawBlock (Format "latex") $ unlines $ execWriter $ do
+    incList = MetaBlocks $ return $ RawBlock (Format "latex") $ T.unlines $ execWriter $ do
         tell [ "\\makeatletter" ]
         tell subfig
         tell floatnames
@@ -65,30 +65,30 @@
           ]
         floatnames = [
             "\\AtBeginDocument{%"
-          , "\\renewcommand*\\figurename{"++metaString "figureTitle"++"}"
-          , "\\renewcommand*\\tablename{"++metaString "tableTitle"++"}"
+          , "\\renewcommand*\\figurename{" <> metaString "figureTitle" <> "}"
+          , "\\renewcommand*\\tablename{" <> metaString "tableTitle" <> "}"
           , "}"
           ]
         listnames = [
             "\\AtBeginDocument{%"
-          , "\\renewcommand*\\listfigurename{"++metaString' "lofTitle"++"}"
-          , "\\renewcommand*\\listtablename{"++metaString' "lotTitle"++"}"
+          , "\\renewcommand*\\listfigurename{" <> metaString' "lofTitle" <> "}"
+          , "\\renewcommand*\\listtablename{" <> metaString' "lotTitle" <> "}"
           , "}"
           ]
         codelisting = [
             usepackage [] "float"
           , "\\floatstyle{ruled}"
           , "\\@ifundefined{c@chapter}{\\newfloat{codelisting}{h}{lop}}{\\newfloat{codelisting}{h}{lop}[chapter]}"
-          , "\\floatname{codelisting}{"++metaString "listingTitle"++"}"
+          , "\\floatname{codelisting}{" <> metaString "listingTitle" <> "}"
           ]
         lolcommand
           | listings opts = [
               "\\newcommand*\\listoflistings\\lstlistoflistings"
             , "\\AtBeginDocument{%"
-            , "\\renewcommand*{\\lstlistlistingname}{"++metaString' "lolTitle"++"}"
+            , "\\renewcommand*{\\lstlistlistingname}{" <> metaString' "lolTitle" <> "}"
             , "}"
             ]
-          | otherwise = ["\\newcommand*\\listoflistings{\\listof{codelisting}{"++metaString' "lolTitle"++"}}"]
+          | otherwise = ["\\newcommand*\\listoflistings{\\listof{codelisting}{" <> metaString' "lolTitle" <> "}}"]
         cleveref = [ usepackage cleverefOpts "cleveref" ]
           <> crefname "figure" figPrefix
           <> crefname "table" tblPrefix
@@ -102,14 +102,14 @@
         cleverefOpts | nameInLink opts = [ "nameinlink" ]
                      | otherwise = []
         crefname n f = [
-            "\\crefname{" ++ n ++ "}" ++ prefix f False
-          , "\\Crefname{" ++ n ++ "}" ++ prefix f True
+            "\\crefname{" <> n <> "}" <> prefix f False
+          , "\\Crefname{" <> n <> "}" <> prefix f True
           ]
-        usepackage [] p = "\\@ifpackageloaded{"++p++"}{}{\\usepackage{"++p++"}}"
-        usepackage xs p = "\\@ifpackageloaded{"++p++"}{}{\\usepackage"++o++"{"++p++"}}"
-          where o = "[" ++ intercalate "," xs ++ "]"
-        toLatex = either (error . show) T.unpack . runPure . writeLaTeX def . Pandoc nullMeta . return . Plain
+        usepackage [] p = "\\@ifpackageloaded{" <> p <> "}{}{\\usepackage{" <> p <> "}}"
+        usepackage xs p = "\\@ifpackageloaded{" <> p <> "}{}{\\usepackage" <> o <> "{" <> p <> "}}"
+          where o = "[" <> T.intercalate "," xs <> "]"
+        toLatex = either (error . show) id . runPure . writeLaTeX def . Pandoc nullMeta . return . Plain
         metaString s = toLatex $ getMetaInlines s meta
         metaString' s = toLatex [Str $ getMetaString s meta]
-        prefix f uc = "{" ++ toLatex (f opts uc 0) ++ "}" ++
-                      "{" ++ toLatex (f opts uc 1) ++ "}"
+        prefix f uc = "{" <> toLatex (f opts uc 0) <> "}"  <>
+                      "{" <> toLatex (f opts uc 1) <> "}"
diff --git a/lib/Text/Pandoc/CrossRef/Util/Options.hs b/lib/Text/Pandoc/CrossRef/Util/Options.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Options.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Options.hs
@@ -21,6 +21,7 @@
 module Text.Pandoc.CrossRef.Util.Options (Options(..)) where
 import Text.Pandoc.Definition
 import Text.Pandoc.CrossRef.Util.Template
+import Data.Text (Text)
 
 data Options = Options { cref :: Bool
                        , chaptersDepth   :: Int
@@ -57,7 +58,7 @@
                        , ccsTemplate :: Template
                        , tableTemplate  :: Template
                        , listingTemplate :: Template
-                       , customLabel :: String -> Int -> Maybe String
+                       , customLabel :: Text -> Int -> Maybe Text
                        , ccsDelim :: [Inline]
                        , ccsLabelSep :: [Inline]
                        , tableEqns :: Bool
diff --git a/lib/Text/Pandoc/CrossRef/Util/Settings.hs b/lib/Text/Pandoc/CrossRef/Util/Settings.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Settings.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Settings.hs
@@ -19,6 +19,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Pandoc.CrossRef.Util.Settings (getSettings, defaultMeta) where
 
 import Text.Pandoc
@@ -34,11 +35,11 @@
 
 getSettings :: Maybe Format -> Meta -> IO Meta
 getSettings fmt meta = do
-  dirConfig <- readConfig (getMetaString "crossrefYaml" (meta <> defaultMeta))
+  dirConfig <- readConfig (T.unpack $ getMetaString "crossrefYaml" (meta <> defaultMeta))
   home <- getHomeDirectory
   globalConfig <- readConfig (home </> ".pandoc-crossref" </> "config.yaml")
   formatConfig <- maybe (return nullMeta) (readFmtConfig home) fmt
-  return $ meta <> dirConfig <> formatConfig <> globalConfig <> defaultMeta
+  return $ defaultMeta <> globalConfig <> formatConfig <> dirConfig <> meta
   where
     readConfig path =
       handle handler $ do
@@ -51,7 +52,7 @@
     readFmtConfig home fmt' = readConfig (home </> ".pandoc-crossref" </> "config-" ++ fmtStr fmt' ++ ".yaml")
     handler :: IOException -> IO Meta
     handler _ = return nullMeta
-    fmtStr (Format fmtstr) = fmtstr
+    fmtStr (Format fmtstr) = T.unpack fmtstr
 
 
 defaultMeta :: Meta
diff --git a/lib/Text/Pandoc/CrossRef/Util/Settings/Gen.hs b/lib/Text/Pandoc/CrossRef/Util/Settings/Gen.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Settings/Gen.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Settings/Gen.hs
@@ -18,7 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}
 -- {-# OPTIONS_GHC -ddump-splices #-}
 module Text.Pandoc.CrossRef.Util.Settings.Gen where
 
diff --git a/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs b/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Settings/Template.hs
@@ -30,6 +30,8 @@
 import Data.List
 import Text.Pandoc.CrossRef.Util.Template
 import Text.Pandoc.CrossRef.Util.CustomLabels (customLabel)
+import Data.Text (Text)
+import qualified Data.Text as T
 
 namedFields :: Con -> [VarStrictType]
 namedFields (RecC _ fs) = fs
@@ -77,13 +79,13 @@
     boolT <- [t|$(conT t) -> Bool|]
     intT <- [t|$(conT t) -> Int|]
     tmplT <- [t|$(conT t) -> Template|]
-    clT <- [t|$(conT t) -> String -> Int -> Maybe String|]
+    clT <- [t|$(conT t) -> Text -> Int -> Maybe Text|]
     let varName | Name (OccName n) _ <- accName = liftString n
     let dtv = return $ VarE $ mkName "dtv"
     body <-
       if
       | t' == boolT -> [|getMetaBool $(varName) $(dtv)|]
-      | t' == intT -> [|read $ getMetaString $(varName) $(dtv)|]
+      | t' == intT -> [|read $ T.unpack $ getMetaString $(varName) $(dtv)|]
       | t' == funT -> [|tryCapitalizeM (flip (getMetaList (toInlines $(varName))) $(dtv)) $(varName)|]
       | t' == inlT -> [|getMetaInlines $(varName) $(dtv)|]
       | t' == blkT -> [|getMetaBlock $(varName) $(dtv)|]
diff --git a/lib/Text/Pandoc/CrossRef/Util/Template.hs b/lib/Text/Pandoc/CrossRef/Util/Template.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Template.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Template.hs
@@ -18,6 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Pandoc.CrossRef.Util.Template
   ( Template
   , makeTemplate
@@ -32,8 +33,9 @@
 import Text.Pandoc.CrossRef.Util.Meta
 import Control.Applicative
 import Text.Read
+import qualified Data.Text as T
 
-type VarFunc = String -> Maybe MetaValue
+type VarFunc = T.Text -> Maybe MetaValue
 newtype Template = Template (VarFunc -> [Inline])
 
 makeTemplate :: Meta -> [Inline] -> Template
@@ -41,10 +43,11 @@
   where
   scan = bottomUp . go
   go vf (x@(Math DisplayMath var):xs)
-    | '[' `elem` var  && ']' == last var =
-      let (vn, idxBr) = span (/='[') var
-          idxVar = drop 1 $ takeWhile (/=']') idxBr
-          idx = readMaybe . toString ("index variable " ++ idxVar) =<< vf idxVar
+    | (vn, idxBr) <- T.span (/='[') var
+    , not (T.null idxBr)
+    , T.last idxBr == ']'
+    = let idxVar = T.drop 1 $ T.takeWhile (/=']') idxBr
+          idx = readMaybe . T.unpack . toString ("index variable " <> idxVar) =<< vf idxVar
           arr = do
             i <- idx
             v <- lookupMeta vn dtv
@@ -53,9 +56,9 @@
     | otherwise = toList $ fromList (replaceVar var (vf var) [x]) <> fromList xs
   go _ (x:xs) = toList $ singleton x <> fromList xs
   go _ [] = []
-  replaceVar var val def' = maybe def' (toInlines ("variable " ++ var)) val
+  replaceVar var val def' = maybe def' (toInlines ("variable " <> var)) val
 
-applyTemplate' :: M.Map String [Inline] -> Template -> [Inline]
+applyTemplate' :: M.Map T.Text [Inline] -> Template -> [Inline]
 applyTemplate' vars (Template g) = g internalVars
   where
   internalVars x | Just v <- M.lookup x vars = Just $ MetaInlines v
diff --git a/lib/Text/Pandoc/CrossRef/Util/Util.hs b/lib/Text/Pandoc/CrossRef/Util/Util.hs
--- a/lib/Text/Pandoc/CrossRef/Util/Util.hs
+++ b/lib/Text/Pandoc/CrossRef/Util/Util.hs
@@ -18,7 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RankNTypes, OverloadedStrings #-}
 module Text.Pandoc.CrossRef.Util.Util
   ( module Text.Pandoc.CrossRef.Util.Util
   , module Data.Generics
@@ -29,7 +29,6 @@
 import Text.Pandoc.Builder hiding ((<>))
 import Text.Pandoc.Class
 import Data.Char (toUpper, toLower, isUpper)
-import Data.List (isSuffixOf, isPrefixOf, stripPrefix)
 import Data.Maybe (fromMaybe)
 import Data.Generics
 import Text.Pandoc.Writers.LaTeX
@@ -38,30 +37,35 @@
 import qualified Data.Text as T
 
 intercalate' :: (Eq a, Monoid a, Foldable f) => a -> f a -> a
-intercalate' s = foldr (\x acc -> if acc == mempty then x else x <> s <> acc) mempty
+intercalate' s xs
+  | null xs = mempty
+  | otherwise = foldr1 (\x acc -> x <> s <> acc) xs
 
-isFormat :: String -> Maybe Format -> Bool
-isFormat fmt (Just (Format f)) = takeWhile (`notElem` "+-") f == fmt
+isFormat :: T.Text -> Maybe Format -> Bool
+isFormat fmt (Just (Format f)) = T.takeWhile (`notElem` ("+-" :: String)) f == fmt
 isFormat _ Nothing = False
 
 isLatexFormat :: Maybe Format -> Bool
 isLatexFormat = isFormat "latex" `or'` isFormat "beamer"
   where a `or'` b = (||) <$> a <*> b
 
-capitalizeFirst :: String -> String
-capitalizeFirst (x:xs) = toUpper x : xs
-capitalizeFirst [] = []
+capitalizeFirst :: T.Text -> T.Text
+capitalizeFirst t
+  | Just (x, xs) <- T.uncons t = toUpper x `T.cons` xs
+  | otherwise = T.empty
 
-uncapitalizeFirst :: String -> String
-uncapitalizeFirst (x:xs) = toLower x : xs
-uncapitalizeFirst [] = []
+uncapitalizeFirst :: T.Text -> T.Text
+uncapitalizeFirst t
+  | Just (x, xs) <- T.uncons t = toLower x `T.cons` xs
+  | otherwise = T.empty
 
-isFirstUpper :: String -> Bool
-isFirstUpper (x:_) = isUpper x
-isFirstUpper [] = False
+isFirstUpper :: T.Text -> Bool
+isFirstUpper xs
+  | Just (x, _) <- T.uncons xs  = isUpper x
+  | otherwise = False
 
 chapPrefix :: [Inline] -> Index -> [Inline]
-chapPrefix delim index = toList $ intercalate' (fromList delim) (map (str . uncurry (fromMaybe . show)) index)
+chapPrefix delim index = toList $ intercalate' (fromList delim) (map (str . uncurry (fromMaybe . T.pack . show)) index)
 
 data ReplacedResult a = Replaced Bool a | NotReplaced Bool
 type GenRR m = forall a. Data a => (a -> m (ReplacedResult a))
@@ -102,25 +106,25 @@
 noReplaceNoRecurse :: Monad m => m (ReplacedResult a)
 noReplaceNoRecurse = noReplace False
 
-mkLaTeXLabel :: String -> String
+mkLaTeXLabel :: T.Text -> T.Text
 mkLaTeXLabel l
- | null l = []
- | otherwise = "\\label{" ++ mkLaTeXLabel' l ++ "}"
+ | T.null l = ""
+ | otherwise = "\\label{" <> mkLaTeXLabel' l <> "}"
 
-mkLaTeXLabel' :: String -> String
+mkLaTeXLabel' :: T.Text -> T.Text
 mkLaTeXLabel' l =
-  let ll = either (error . show) T.unpack $
+  let ll = either (error . show) id $
             runPure (writeLaTeX def $ Pandoc nullMeta [Div (l, [], []) []])
-  in takeWhile (/='}') . drop 1 . dropWhile (/='{') $ ll
+  in T.takeWhile (/='}') . T.drop 1 . T.dropWhile (/='{') $ ll
 
-getRefLabel :: String -> [Inline] -> Maybe String
+getRefLabel :: T.Text -> [Inline] -> Maybe T.Text
 getRefLabel _ [] = Nothing
 getRefLabel tag ils
   | Str attr <- last ils
   , all (==Space) (init ils)
-  , "}" `isSuffixOf` attr
-  , ("{#"++tag++":") `isPrefixOf` attr
-  = init `fmap` stripPrefix "{#" attr
+  , "}" `T.isSuffixOf` attr
+  , ("{#"<>tag<>":") `T.isPrefixOf` attr
+  = T.init `fmap` T.stripPrefix "{#" attr
 getRefLabel _ _ = Nothing
 
 isSpace :: Inline -> Bool
diff --git a/pandoc-crossref.cabal b/pandoc-crossref.cabal
--- a/pandoc-crossref.cabal
+++ b/pandoc-crossref.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: edd11ea020cd9236b745c8aa8d2a9728ac41f337c5648fc1d98b28e62e7f4584
+-- hash: 687fe16beac2bf05405a0f58a865e76f50971758d90614f06a51116717839e64
 
 name:           pandoc-crossref
-version:        0.3.4.2
+version:        0.3.5.0
 synopsis:       Pandoc filter for cross-references
 description:    pandoc-crossref is a pandoc filter for numbering figures, equations, tables and cross-references to them.
 category:       Text
@@ -104,8 +104,8 @@
     , directory >=1 && <1.4
     , filepath >=1.1 && <1.5
     , mtl >=1.1 && <2.3
-    , pandoc >=2.3 && <2.8
-    , pandoc-types >=1.17.5.1 && <1.18
+    , pandoc >=2.8 && <2.9
+    , pandoc-types >=1.20 && <1.21
     , roman-numerals ==0.5.*
     , syb >=0.4 && <0.8
     , template-haskell >=2.7.0.0 && <3.0.0.0
@@ -135,9 +135,9 @@
     , mtl >=1.1 && <2.3
     , open-browser >=0.2 && <0.3
     , optparse-applicative >=0.13 && <0.16
-    , pandoc >=2.3 && <2.8
+    , pandoc >=2.8 && <2.9
     , pandoc-crossref
-    , pandoc-types >=1.17.5.1 && <1.18
+    , pandoc-types >=1.20 && <1.21
     , roman-numerals ==0.5.*
     , syb >=0.4 && <0.8
     , template-haskell >=2.7.0.0 && <3.0.0.0
@@ -163,9 +163,9 @@
     , filepath >=1.1 && <1.5
     , hspec >=2.4.4 && <3
     , mtl >=1.1 && <2.3
-    , pandoc >=2.3 && <2.8
+    , pandoc >=2.8 && <2.9
     , pandoc-crossref
-    , pandoc-types >=1.17.5.1 && <1.18
+    , pandoc-types >=1.20 && <1.21
     , roman-numerals ==0.5.*
     , syb >=0.4 && <0.8
     , template-haskell >=2.7.0.0 && <3.0.0.0
@@ -212,8 +212,8 @@
     , filepath >=1.1 && <1.5
     , hspec >=2.4.4 && <3
     , mtl >=1.1 && <2.3
-    , pandoc >=2.3 && <2.8
-    , pandoc-types >=1.17.5.1 && <1.18
+    , pandoc >=2.8 && <2.9
+    , pandoc-types >=1.20 && <1.21
     , roman-numerals ==0.5.*
     , syb >=0.4 && <0.8
     , template-haskell >=2.7.0.0 && <3.0.0.0
diff --git a/src/ManData.hs b/src/ManData.hs
--- a/src/ManData.hs
+++ b/src/ManData.hs
@@ -18,13 +18,14 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE TemplateHaskellQuotes #-}
+{-# LANGUAGE TemplateHaskellQuotes, OverloadedStrings #-}
 module ManData where
 
 import Language.Haskell.TH.Syntax
 import qualified Data.Text as T
 import System.IO
 import qualified Text.Pandoc as P
+import qualified Text.Pandoc.Templates as PT
 import Control.DeepSeq
 import Data.String
 import Text.Pandoc.Highlighting (pygments)
@@ -58,9 +59,11 @@
 
 embedManualHtml :: Q Exp
 embedManualHtml = do
-  t <- runIO $ fmap (either (error . show) id) $ P.runIO $ P.getDefaultTemplate "html5"
+  tt <- fmap (either (error . show) id) . runIO . P.runIO
+          $   P.getDefaultTemplate "html5"
+          >>= fmap (either (error . show) id) . PT.compileTemplate ""
   embedManual $ P.writeHtml5String P.def{
-    P.writerTemplate = Just t
+    P.writerTemplate = Just tt
   , P.writerHighlightStyle = Just pygments
   }
 
diff --git a/src/pandoc-crossref.hs b/src/pandoc-crossref.hs
--- a/src/pandoc-crossref.hs
+++ b/src/pandoc-crossref.hs
@@ -18,7 +18,8 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE ApplicativeDo, TemplateHaskell, CPP, OverloadedStrings #-}
+{-# LANGUAGE ApplicativeDo, TemplateHaskell, CPP, OverloadedStrings,
+  LambdaCase #-}
 import Text.Pandoc
 import Text.Pandoc.JSON
 
@@ -26,6 +27,7 @@
 import Options.Applicative
 import qualified Options.Applicative as O
 import Control.Monad
+import System.Environment as Env
 import Web.Browser
 import System.IO.Temp
 import System.IO hiding (putStrLn)
@@ -41,7 +43,7 @@
 man = T.pack $(embedManualText)
 manHtml = T.pack $(embedManualHtml)
 
-data Flag = NumericVersion | Version | Man | HtmlMan
+data Flag = NumericVersion | Version | Man | HtmlMan | Pipe
 
 run :: Parser (IO ())
 run = do
@@ -49,8 +51,9 @@
   vers <- flag Nothing (Just Version) (long "version" <> short 'v' <> help "Print version")
   man' <- flag Nothing (Just Man) (long "man" <> help "Show manpage")
   hman <- flag Nothing (Just HtmlMan) (long "man-html" <> help "Show html manpage")
+  pipe <- flag Nothing (Just Pipe) (short 'p' <> long "pipe" <> help "Run in \"pipe mode\", i.e. read pandoc JSON from stdin and output it to stdout")
   fmt <- optional $ strArgument (metavar "FORMAT")
-  return $ go (numVers <|> vers <|> man' <|> hman) fmt
+  return $ go (numVers <|> vers <|> man' <|> hman <|> pipe) fmt
   where
     go :: Maybe Flag -> Maybe String -> IO ()
     go (Just Version) _ = T.putStrLn $
@@ -69,9 +72,27 @@
       void $ openBrowser $ "file:///" <> fp
       threadDelay 5000000
       return ()
-    go Nothing _ = toJSONFilter f
-    f fmt p@(Pandoc meta _) =
-      runCrossRefIO meta fmt defaultCrossRefAction p
+    go (Just Pipe) _ = toJSONFilter f
+    go Nothing Nothing = hPutStr stderr $ unlines
+      [ "Running pandoc-crossref without arguments is not supported. Try"
+      , "\tpandoc-crossref --help"
+      , "If you want to run in \"pipe mode\", run with"
+      , "\tpandoc-crossref --pipe [FORMAT]"
+      ]
+    go Nothing _ = do
+      Env.lookupEnv "PANDOC_VERSION" >>= \case
+        Just runv ->
+          when (VERSION_pandoc /= runv) $ hPutStrLn stderr $
+            "WARNING: pandoc-crossref was compiled with pandoc " <> VERSION_pandoc <>
+            " but is being run through " <> runv <> ". This is not supported. " <>
+            "Strange things may (and likely will) happen silently."
+        Nothing -> hPutStr stderr $ unlines
+          [ "WARNING: Running pandoc-crossref in \"pipe mode\" implicitly is deprecated. Please use"
+          , "\tpandoc-crossref --pipe [FORMAT]"
+          , "instead."
+          ]
+      toJSONFilter f
+    f fmt p@(Pandoc meta _) = runCrossRefIO meta fmt defaultCrossRefAction p
 
 main :: IO ()
 main = join $ execParser opts
diff --git a/test/Native.hs b/test/Native.hs
--- a/test/Native.hs
+++ b/test/Native.hs
@@ -18,7 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, OverloadedStrings #-}
 module Native where
 
 import Text.Pandoc.Definition
diff --git a/test/m2m/listing-captions-ids/expect.tex b/test/m2m/listing-captions-ids/expect.tex
--- a/test/m2m/listing-captions-ids/expect.tex
+++ b/test/m2m/listing-captions-ids/expect.tex
@@ -140,7 +140,7 @@
 
 \end{codelisting}
 
-\begin{center}\rule{0.5\linewidth}{\linethickness}\end{center}
+\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}
 
 : Listing caption 15 (invalid)
 
@@ -159,4 +159,3 @@
 \NormalTok{main }\OtherTok{=} \FunctionTok{putStrLn} \StringTok{"Hello World!"}
 \end{Highlighting}
 \end{Shaded}
-
diff --git a/test/m2m/subfigures-grid/expect.md b/test/m2m/subfigures-grid/expect.md
--- a/test/m2m/subfigures-grid/expect.md
+++ b/test/m2m/subfigures-grid/expect.md
@@ -2,16 +2,16 @@
 
 ::: {#fig:subfigures .subfigures}
 +:------------------:+:------------------:+:------------------:+
-| ![a](fig1.png){#fi | ![b](fig2.png){#fi | ![c](fig3.png){wid |
-| g:subfig1          | g:subfig2          | th="100%"}         |
+| ![a](fig1          | ![b](fig2          | ![c](fig3.         |
+| .png){#fig:subfig1 | .png){#fig:subfig2 | png){width="100%"} |
 | width="100%"}      | width="100%"}      |                    |
 +--------------------+--------------------+--------------------+
-| ![d](fig4.png){#fi | ![e](fig5.png){wid | ![f](fig6.png){#fi |
-| g:subfig4          | th="100%"}         | g:subfig6          |
+| ![d](fig4          | ![e](fig5.         | ![f](fig6          |
+| .png){#fig:subfig4 | png){width="100%"} | .png){#fig:subfig6 |
 | width="100%"}      |                    | width="100%"}      |
 +--------------------+--------------------+--------------------+
-| ![g](fig7.png){#fi | ![h](fig8.png){wid | ![i](fig9.png){#fi |
-| g:subfig7          | th="100%"}         | g:subfig9          |
+| ![g](fig7          | ![h](fig8.         | ![i](fig9          |
+| .png){#fig:subfig7 | png){width="100%"} | .png){#fig:subfig9 |
 | width="100%"}      |                    | width="100%"}      |
 +--------------------+--------------------+--------------------+
 
diff --git a/test/test-integrative.hs b/test/test-integrative.hs
--- a/test/test-integrative.hs
+++ b/test/test-integrative.hs
@@ -18,7 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE CPP #-}
+{-# LANGUAGE CPP, OverloadedStrings #-}
 import Test.Hspec
 import Text.Pandoc hiding (runIO)
 import qualified Text.Pandoc as P (runIO)
diff --git a/test/test-pandoc-crossref.hs b/test/test-pandoc-crossref.hs
--- a/test/test-pandoc-crossref.hs
+++ b/test/test-pandoc-crossref.hs
@@ -18,7 +18,7 @@
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 -}
 
-{-# LANGUAGE FlexibleContexts, CPP #-}
+{-# LANGUAGE FlexibleContexts, CPP, OverloadedStrings #-}
 import Test.Hspec
 import Text.Pandoc hiding (getDataFileName)
 import Text.Pandoc.Builder
@@ -50,7 +50,7 @@
     describe "References.Blocks.replaceInlines" $ do
       it "Labels equations" $
         testAll (equation' "a^2+b^2=c^2" "equation")
-        (spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" []),
+        (spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" ""),
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
       it "Labels equations in the middle of text" $
         testAll (
@@ -59,7 +59,7 @@
              <> text " it should be labeled")
         (
            text "This is an equation: "
-        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" [])
+        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" "")
         <> text " it should be labeled",
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
       it "Labels equations in the beginning of text" $
@@ -67,7 +67,7 @@
                 equation' "a^2+b^2=c^2" "equation"
              <> text " it should be labeled")
         (
-           spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" [])
+           spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" "")
         <> text " it should be labeled",
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
       it "Labels equations in the end of text" $
@@ -76,7 +76,7 @@
              <> equation' "a^2+b^2=c^2" "equation")
         (
            text "This is an equation: "
-        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" []),
+        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" ""),
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
 
     -- TODO:
@@ -85,31 +85,31 @@
 
     describe "References.Blocks.replaceBlocks" $ do
       it "Labels images" $
-        testAll (figure "test.jpg" [] "Test figure" "figure")
-        (figure "test.jpg" [] "Figure 1: Test figure" "figure",
+        testAll (figure "test.jpg" "" "Test figure" "figure")
+        (figure "test.jpg" "" "Figure 1: Test figure" "figure",
           imgRefs =: M.fromList $ refRec' "fig:figure" 1 "Test figure")
       it "Labels subfigures" $
         testAll (
           divWith ("fig:subfigure",[],[]) (
-            para (figure' "fig:" "test1.jpg" [] "Test figure 1" "figure1")
-          <>para (figure' "fig:" "test2.jpg" [] "Test figure 2" "figure2")
+            para (figure' "fig:" "test1.jpg" "" "Test figure 1" "figure1")
+          <>para (figure' "fig:" "test2.jpg" "" "Test figure 2" "figure2")
           <>para (text "figure caption")
             ) <>
           divWith ("fig:subfigure2",[],[]) (
-            para (figure' "fig:" "test21.jpg" [] "Test figure 21" "figure21")
-          <>para (figure' "fig:" "test22.jpg" [] "Test figure 22" "figure22")
+            para (figure' "fig:" "test21.jpg" "" "Test figure 21" "figure21")
+          <>para (figure' "fig:" "test22.jpg" "" "Test figure 22" "figure22")
           <>para (text "figure caption 2")
             )
           )
         (
           divWith ("fig:subfigure",["subfigures"],[]) (
-               para (figure' "fig:" "test1.jpg" [] "a" "figure1")
-            <> para (figure' "fig:" "test2.jpg" [] "b" "figure2")
+               para (figure' "fig:" "test1.jpg" "" "a" "figure1")
+            <> para (figure' "fig:" "test2.jpg" "" "b" "figure2")
             <> para (text "Figure 1: figure caption. a — Test figure 1, b — Test figure 2")
             ) <>
           divWith ("fig:subfigure2",["subfigures"],[]) (
-               para (figure' "fig:" "test21.jpg" [] "a" "figure21")
-            <> para (figure' "fig:" "test22.jpg" [] "b" "figure22")
+               para (figure' "fig:" "test21.jpg" "" "a" "figure21")
+            <> para (figure' "fig:" "test22.jpg" "" "b" "figure22")
             <> para (text "Figure 2: figure caption 2. a — Test figure 21, b — Test figure 22")
             )
         , imgRefs =: M.fromList [("fig:figure1",RefRec {
@@ -140,7 +140,7 @@
             )
       it "Labels equations" $
         testAll (equation "a^2+b^2=c^2" "equation")
-        (para $ spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" []),
+        (para $ spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" ""),
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
       it "Labels equations in the middle of text" $
         testAll (para $
@@ -149,7 +149,7 @@
              <> text " it should be labeled")
         (para $
            text "This is an equation: "
-        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" [])
+        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" "")
         <> text " it should be labeled",
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
       it "Labels equations in the beginning of text" $
@@ -157,7 +157,7 @@
                 equation' "a^2+b^2=c^2" "equation"
              <> text " it should be labeled")
         (para $
-           spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" [])
+           spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" "")
         <> text " it should be labeled",
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
       it "Labels equations in the end of text" $
@@ -166,11 +166,11 @@
              <> equation' "a^2+b^2=c^2" "equation")
         (para $
            text "This is an equation: "
-        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" []),
+        <> spanWith ("eq:equation", [], []) (equation' "a^2+b^2=c^2\\qquad(1)" ""),
           eqnRefs =: M.fromList $ refRec'' "eq:equation" 1)
       it "Labels tables" $
         testAll (table' "Test table" "table")
-        (divWith ("tbl:table", [], []) $ table' "Table 1: Test table" [],
+        (divWith ("tbl:table", [], []) $ table' "Table 1: Test table" "",
           tblRefs =: M.fromList $ refRec' "tbl:table" 1 "Test table")
       it "Labels code blocks" $
         testAll (codeBlock' "Test code block" "codeblock")
@@ -208,7 +208,7 @@
       it "References multiple sections" $
         testRefs' "sec:" [1..3] [4..6] secRefs "secs.\160\&4-6"
       it "Separates references to different chapter items by a comma" $
-        testRefs'' "lst:" [1..6] (zip [1,1..] [4..6] ++ zip [2,2..] [7..9]) lstRefs "lsts.\160\&1.4-1.6, 2.7-2.9"
+        testRefs'' "lst:" [1..6] (zip [1,1..] [4..6] <> zip [2,2..] [7..9]) lstRefs "lsts.\160\&1.4-1.6, 2.7-2.9"
 
     describe "References.Refs.replaceRefs capitalization" $ do
       it "References one image" $
@@ -236,11 +236,11 @@
       it "Generates list of tables" $
         testList (rawBlock "latex" "\\listoftables")
                  (tblRefs =: M.fromList $ refRec' "tbl:1" 4 "4" <> refRec' "tbl:2" 5 "5" <> refRec' "tbl:3" 6 "6")
-                 (header 1 (text "List of Tables") <> orderedList ((plain . str . show) `map` [4..6 :: Int]))
+                 (header 1 (text "List of Tables") <> orderedList ((plain . str . T.pack . show) `map` [4..6 :: Int]))
       it "Generates list of figures" $
         testList (rawBlock "latex" "\\listoffigures")
                  (imgRefs =: M.fromList $ refRec' "fig:1" 4 "4" <> refRec' "fig:2" 5 "5" <> refRec' "fig:3" 6 "6")
-                 (header 1 (text "List of Figures") <> orderedList ((plain . str . show) `map` [4..6 :: Int]))
+                 (header 1 (text "List of Figures") <> orderedList ((plain . str . T.pack . show) `map` [4..6 :: Int]))
 
     describe "Util.CodeBlockCaptions" $
       it "Transforms table-style codeBlock captions to codeblock divs" $ do
@@ -266,8 +266,8 @@
         testRefs cits def cits
 
       it "Should not separate citation groups with different unknown prefixes" $ do
-        let cits = para $ cite (mconcat $ map (cit . uncurry (++) . second show) l) $ text $
-              "[" ++ intercalate "; " (map (("@"++) . uncurry (++) . second show) l) ++ "]"
+        let cits = para $ cite (mconcat $ map (cit . uncurry (<>) . second (T.pack . show)) l) $ text $
+              "[" <> T.intercalate "; " (map (("@" <>) . uncurry (<>) . second (T.pack . show)) l) <> "]"
             l = zip ["unk1:", "unk2:"] [1,2::Int]
         testRefs cits def cits
 
@@ -300,7 +300,7 @@
             `test` "\\hypertarget{sec:section_label1}{%\n\\section{Section}\\label{sec:section_label1}}\n\nsec.~\\ref{sec:section_label1}"
 
         it "Image labels" $
-          figure "img.png" [] "Title" "figure_label1"
+          figure "img.png" "" "Title" "figure_label1"
             <> para (citeGen "fig:figure_label" [1])
             `test` "\\begin{figure}\n\\hypertarget{fig:figure_label1}{%\n\\centering\n\\includegraphics{img.png}\n\\caption{Title}\\label{fig:figure_label1}\n}\n\\end{figure}\n\nfig.~\\ref{fig:figure_label1}"
 
@@ -329,29 +329,29 @@
             <> para (citeGen "lst:some_codeblock" [1])
             `test1` "\\begin{codelisting}\n\n\\caption{A code block}\n\n\\hypertarget{lst:some_codeblock1}{%\n\\label{lst:some_codeblock1}}%\n\\begin{Shaded}\n\\begin{Highlighting}[]\n\\OtherTok{main ::} \\DataTypeTok{IO}\\NormalTok{ ()}\n\\end{Highlighting}\n\\end{Shaded}\n\n\\end{codelisting}\n\nlst.~\\ref{lst:some_codeblock1}"
 
-citeGen :: String -> [Int] -> Inlines
-citeGen p l = cite (mconcat $ map (cit . (p++) . show) l) $ text $
-  "[" ++ intercalate "; " (map (("@"++) . (p++) . show) l) ++ "]"
+citeGen :: T.Text -> [Int] -> Inlines
+citeGen p l = cite (mconcat $ map (cit . (p<>) . T.pack . show) l) $ text $
+  "[" <> T.intercalate "; " (map (("@"<>) . (p<>) . T.pack . show) l) <> "]"
 
-refGen :: String -> [Int] -> [Int] -> M.Map String RefRec
-refGen p l1 l2 = M.fromList $ mconcat $ zipWith refRec'' (((uncapitalizeFirst p++) . show) `map` l1) l2
+refGen :: T.Text -> [Int] -> [Int] -> M.Map T.Text RefRec
+refGen p l1 l2 = M.fromList $ mconcat $ zipWith refRec'' (((uncapitalizeFirst p<>) . T.pack . show) `map` l1) l2
 
-refGen' :: String -> [Int] -> [(Int, Int)] -> M.Map String RefRec
-refGen' p l1 l2 = M.fromList $ mconcat $ zipWith refRec''' (((uncapitalizeFirst p++) . show) `map` l1) l2
+refGen' :: T.Text -> [Int] -> [(Int, Int)] -> M.Map T.Text RefRec
+refGen' p l1 l2 = M.fromList $ mconcat $ zipWith refRec''' (((uncapitalizeFirst p<>) . T.pack . show) `map` l1) l2
 
-refRec' :: String -> Int -> String -> [(String, RefRec)]
+refRec' :: T.Text -> Int -> T.Text -> [(T.Text, RefRec)]
 refRec' ref i tit = [(ref, RefRec{refIndex=[(i,Nothing)],refTitle=toList $ text tit,refSubfigure=Nothing})]
 
-refRec'' :: String -> Int -> [(String, RefRec)]
-refRec'' ref i = refRec' ref i []
+refRec'' :: T.Text -> Int -> [(T.Text, RefRec)]
+refRec'' ref i = refRec' ref i ""
 
-refRec''' :: String -> (Int, Int) -> [(String, RefRec)]
-refRec''' ref (c,i) = [(ref, RefRec{refIndex=[(c,Nothing), (i,Nothing)],refTitle=toList $ text [],refSubfigure=Nothing})]
+refRec''' :: T.Text -> (Int, Int) -> [(T.Text, RefRec)]
+refRec''' ref (c,i) = [(ref, RefRec{refIndex=[(c,Nothing), (i,Nothing)],refTitle=toList $ text "",refSubfigure=Nothing})]
 
-testRefs' :: String -> [Int] -> [Int] -> Accessor References (M.Map String RefRec) -> String -> Expectation
+testRefs' :: T.Text -> [Int] -> [Int] -> Accessor References (M.Map T.Text RefRec) -> T.Text -> Expectation
 testRefs' p l1 l2 prop res = testRefs (para $ citeGen p l1) (setVal prop (refGen p l1 l2) def) (para $ text res)
 
-testRefs'' :: String -> [Int] -> [(Int, Int)] -> Accessor References (M.Map String RefRec) -> String -> Expectation
+testRefs'' :: T.Text -> [Int] -> [(Int, Int)] -> Accessor References (M.Map T.Text RefRec) -> T.Text -> Expectation
 testRefs'' p l1 l2 prop res = testRefs (para $ citeGen p l1) (setVal prop (refGen' p l1 l2) def) (para $ text res)
 
 testAll :: (Eq a, Data a, Show a) => Many a -> (Many a, References) -> Expectation
@@ -371,46 +371,46 @@
 testList :: Blocks -> References -> Blocks -> Expectation
 testList bs st res = runState (bottomUpM (References.List.listOf defaultOptions) (toList bs)) st `shouldBe` (toList res,st)
 
-figure :: String -> String -> String -> String -> Blocks
+figure :: T.Text -> T.Text -> T.Text -> T.Text -> Blocks
 figure = (((para .) .) .) . figure' "fig:"
 
-figure' :: String -> String -> String -> String -> String -> Inlines
-figure' p src title alt ref = imageWith ("fig:" ++ ref, [], []) src (p ++ title) (text alt)
+figure' :: T.Text -> T.Text -> T.Text -> T.Text -> T.Text -> Inlines
+figure' p src title alt ref = imageWith ("fig:" <> ref, [], []) src (p <> title) (text alt)
 
-section :: String -> Int -> String -> Blocks
-section text' level label = headerWith ("sec:" ++ label,[],[]) level (text text')
+section :: T.Text -> Int -> T.Text -> Blocks
+section text' level label = headerWith ("sec:" <> label,[],[]) level (text text')
 
-equation :: String -> String -> Blocks
+equation :: T.Text -> T.Text -> Blocks
 equation = (para .) . equation'
 
-equation' :: String -> String -> Inlines
+equation' :: T.Text -> T.Text -> Inlines
 equation' eq ref = displayMath eq <> ref' "eq" ref
 
-table' :: String -> String -> Blocks
+table' :: T.Text -> T.Text -> Blocks
 table' title ref = table (text title <> ref' "tbl" ref) []
    [para $ str "H1", para $ str "H2"]
   [[para $ str "C1", para $ str "C2"]]
 
-codeBlock' :: String -> String -> Blocks
+codeBlock' :: T.Text -> T.Text -> Blocks
 codeBlock' title ref = codeBlockWith
-  ("lst:"++ref,["haskell"],[("caption",title)]) "main :: IO ()"
+  ("lst:"<>ref,["haskell"],[("caption",title)]) "main :: IO ()"
 
-codeBlockForTable :: String -> Blocks
+codeBlockForTable :: T.Text -> Blocks
 codeBlockForTable ref = codeBlockWith
-     ("lst:"++ref,["haskell"],[]) "main :: IO ()"
+     ("lst:"<>ref,["haskell"],[]) "main :: IO ()"
 
-paraText :: String -> Blocks
+paraText :: T.Text -> Blocks
 paraText s = para $ text s
 
-codeBlockDiv :: String -> String -> Blocks
-codeBlockDiv title ref = divWith ("lst:"++ref, ["listing","haskell"],[]) $
+codeBlockDiv :: T.Text -> T.Text -> Blocks
+codeBlockDiv title ref = divWith ("lst:"<>ref, ["listing","haskell"],[]) $
   para (text title) <>
   codeBlockWith
     ("",["haskell"],[]) "main :: IO ()"
 
-ref' :: String -> String -> Inlines
-ref' p n | null n  = mempty
-         | otherwise = space <> str ("{#"++p++":"++n++"}")
+ref' :: T.Text -> T.Text -> Inlines
+ref' p n | T.null n  = mempty
+         | otherwise = space <> str ("{#"<>p<>":"<>n<>"}")
 
 defaultOptions :: Options
 defaultOptions = getOptions defaultMeta Nothing
@@ -424,7 +424,7 @@
                  ,citationMode = NormalCitation
                  }
 
-cit :: String -> [Citation]
+cit :: T.Text -> [Citation]
 cit r = [defCit{citationId=r}]
 
 infixr 0 =:
