diff --git a/Yst/Render.hs b/Yst/Render.hs
--- a/Yst/Render.hs
+++ b/Yst/Render.hs
@@ -29,8 +29,8 @@
 import Data.List (intercalate)
 import Data.List.Split (wordsBy)
 import Text.StringTemplate
-import Data.Text.Lazy (unpack)
-import Data.Text (pack)
+import qualified Data.Text.Lazy as TL
+import qualified Data.Text as T
 import Data.Maybe (fromMaybe)
 import System.FilePath
 -- Note: ghc >= 6.12 (base >=4.2) supports unicode through iconv
@@ -42,12 +42,7 @@
 #endif
 import Data.Time
 import Control.Monad
-#if MIN_VERSION_pandoc(1,14,0)
 import Text.Pandoc.Error (handleError)
-#else
-handleError :: Pandoc -> Pandoc
-handleError = id
-#endif
 
 -- | @relUrl a b@ returns a URL for @b@ relative to @a@.  So, for
 -- example, @relUrl "a" "a/b.html" = "b.html"@,
@@ -74,14 +69,14 @@
 dropCommon xs ys = (xs,ys)
 
 renderNav :: String -> [NavNode] -> String
-renderNav targeturl nodes = unpack $ renderText $
+renderNav targeturl nodes = TL.unpack $ renderText $
   ul_ [class_ "nav navbar-nav"] $ mapM_ (renderNavNode targeturl) nodes
 
 renderNavNode :: String -> NavNode -> Html ()
 renderNavNode targeturl (NavPage tit pageurl) =
   li_ [class_ "active" | pageurl == targeturl] (a_ [href_ pageurl'] (toHtml tit))
     where targetdir = takeUrlDir targeturl
-          pageurl' = pack $ relUrl targetdir pageurl
+          pageurl' = T.pack $ relUrl targetdir pageurl
 renderNavNode targeturl (NavMenu tit nodes) = li_ [] $
     do a_ [class_ "dropdown-toggle", data_ "toggle" "dropdown"] (toHtml tit)
        ul_ [class_ "dropdown-menu"] (mapM_ (renderNavNode targeturl) nodes)
@@ -110,7 +105,7 @@
   gs <- mapM directoryGroupRecursive srcDirs
   let g = foldl1 mergeSTGroups gs
   attrs <- forM (pageData page) $ \(k, v) -> getData site v >>= \n -> return (k,n)
-  todaysDate <- liftM utctDay getCurrentTime
+  todaysDate <- liftM utctDay Data.Time.getCurrentTime
   let root' = case length (filter (=='/') $ pageUrl page) of
                     0  -> []
                     n  -> concat $ replicate n ("../" :: String)
@@ -126,30 +121,33 @@
                     $ templ
   layoutTempl <- getTemplate layout g
   let format = formatFromExtension (stripStExt layout)
-  let contents = converterForFormat format rawContents
+  contents <- converterForFormat format (T.pack rawContents)
   return $ render
          . setManyAttrib attrs
          . setAttribute "sitetitle" (siteTitle site)
          . setAttribute "pagetitle" (pageTitle page)
-         . setAttribute "gendate" todaysDate 
-         . setAttribute "contents" contents
+         . setAttribute "gendate" todaysDate
+         . setAttribute "contents" (T.unpack contents)
          . setAttribute "root" root'
          . setAttribute "nav" menuHtml
          $ layoutTempl
 
-converterForFormat :: Format -> String -> String
-converterForFormat f =
-  let reader = handleError . readMarkdown def{readerSmart = True}
-  in  case f of
-       HtmlFormat          -> writeHtmlString def{ writerHtml5 = True } . reader
-       LaTeXFormat         -> writeLaTeX def . reader
-       PlainFormat         -> id
-       ConTeXtFormat       -> writeConTeXt def . reader
-       ManFormat           -> writeMan def . reader
-       RTFFormat           -> writeRTF def . reader
-       DocBookFormat       -> writeDocbook def . reader
-       TexinfoFormat       -> writeTexinfo def . reader
-       OpenDocumentFormat  -> writeOpenDocument def . reader
+converterForFormat :: Format -> T.Text -> IO T.Text
+converterForFormat PlainFormat s = return s
+converterForFormat f s = handleError =<< runIO (reader s >>= writer)
+  where wopts name = def{ writerExtensions = getDefaultExtensions name }
+        reader = readMarkdown def{ readerExtensions =
+                           getDefaultExtensions "markdown" }
+        writer = case f of
+                   HtmlFormat          -> writeHtml5String (wopts "html5")
+                   LaTeXFormat         -> writeLaTeX (wopts "latex")
+                   ConTeXtFormat       -> writeConTeXt (wopts "context")
+                   ManFormat           -> writeMan (wopts "man")
+                   RTFFormat           -> writeRTF (wopts "rtf")
+                   DocBookFormat       -> writeDocbook5 (wopts "docbook5")
+                   TexinfoFormat       -> writeTexinfo (wopts "texinfo")
+                   OpenDocumentFormat  -> writeOpenDocument (wopts "opendocument")
+                   PlainFormat         -> error "should not happen"
 
 getTemplate :: Stringable a => String -> STGroup a -> IO (StringTemplate a)
 getTemplate templateName templateGroup = do
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+yst 0.6 (released 29 Oct 2017)
+
+  * Update to work with (and require) pandoc 2.0.
+
 yst 0.5.1.2 (released 19 Sep 2017)
 
   * Update demo style to use Bootstrap's navbar instead of tree
diff --git a/yst.cabal b/yst.cabal
--- a/yst.cabal
+++ b/yst.cabal
@@ -1,5 +1,5 @@
 name:                yst
-version:             0.5.1.2
+version:             0.6
 Tested-With:         GHC == 7.8.3
 Cabal-version:       >= 1.8
 build-type:          Simple
@@ -52,12 +52,12 @@
                      Yst.Render, Yst.Build, Yst.CSV, Yst.Sqlite3, Paths_yst
   build-depends:     base >=3 && < 5, unordered-containers,
                      HStringTemplate >= 0.6.1 && < 0.6.9 || > 0.6.11 && < 0.9,
-                     yaml, csv, aeson >= 0.7 && < 1.1, text,
+                     yaml, csv, aeson >= 0.7 && < 1.3, text,
                      scientific >= 0.2 && < 0.4,
                      filepath, containers, directory, time,
                      old-locale, old-time, parsec,
                      lucid >= 2.9 && < 2.10,
-                     pandoc >= 1.10 && < 1.20,
+                     pandoc >= 2.0 && < 2.1,
                      split, HDBC, HDBC-sqlite3
   extensions:        CPP
   if impl(ghc >= 6.12)
