diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,12 +7,35 @@
 
 ## Usage
 
+```hs
+getPageR :: FilePath -> Handler RepHtml
+getPageR fp = do
+    content <- liftIO
+        $ fmap markdownToHtml
+        $ markdownFromFile fp
+
+    defaultLayout $ do
+        [shamlet|
+            <div class="content">
+                #{content}
+            |]
 ```
+
+The default extensions are minimal, you can specify you're preferred
+[extensions][] with `markdownToHtmlWithExtensions`:
+
+[extensions](http://hackage.haskell.org/package/pandoc/docs/Text-Pandoc-Extensions.html)
+
+```haskell
+import Text.Pandoc.Extensions (githubMarkdownExtensions)
+
 getPageR :: FilePath -> Handler RepHtml
 getPageR fp = do
-    content <- liftIO $ fmap markdownToHtml (markdownFromFile fp)
+    content <- liftIO
+        $ fmap (markdownToHtmlWithExtensions githubMarkdownExtensions)
+        $ markdownFromFile fp)
 
-    defaultLayout do
+    defaultLayout $ do
         [shamlet|
             <div class="content">
                 #{content}
diff --git a/src/Yesod/Markdown.hs b/src/Yesod/Markdown.hs
--- a/src/Yesod/Markdown.hs
+++ b/src/Yesod/Markdown.hs
@@ -12,6 +12,8 @@
   -- * Wrappers
   , markdownToHtml
   , markdownToHtmlTrusted
+  , markdownToHtmlWithExtensions
+  , markdownToHtmlWith
   , markdownFromFile
   -- * Conversions
   , parseMarkdown
@@ -25,6 +27,7 @@
   , markdownField
   ) where
 
+import Control.Monad ((<=<))
 import Data.String (IsString)
 import Data.Text (Text)
 import Data.Text.Encoding (decodeUtf8With)
@@ -65,17 +68,53 @@
     , fieldEnctype = UrlEncoded
     }
 
+-- | Process Markdown using our options and sanitization
 markdownToHtml :: Markdown -> Either PandocError Html
-markdownToHtml md = do
-    p <- parseMarkdown yesodDefaultReaderOptions md
-    writePandoc yesodDefaultWriterOptions p
+markdownToHtml = markdownToHtmlWith
+    yesodDefaultReaderOptions
+    yesodDefaultWriterOptions
 
 -- | No HTML sanitization
+--
+-- **NOTE**: Use only with /fully-trusted/ input.
+--
 markdownToHtmlTrusted :: Markdown -> Either PandocError Html
-markdownToHtmlTrusted md = do
-    p <- parseMarkdown yesodDefaultReaderOptions md
-    writePandocTrusted yesodDefaultWriterOptions p
+markdownToHtmlTrusted = markdownToHtmlWith' id
+    yesodDefaultReaderOptions
+    yesodDefaultWriterOptions
 
+-- | Process markdown with given extensions
+--
+-- Uses our options, and overrides extensions only.
+--
+-- > markdownToHtmlWithExtensions githubMarkdownExtensions
+--
+markdownToHtmlWithExtensions
+    :: Extensions
+    -> Markdown
+    -> Either PandocError Html
+markdownToHtmlWithExtensions exts = markdownToHtmlWith
+    yesodDefaultReaderOptions { readerExtensions = exts }
+    yesodDefaultWriterOptions { writerExtensions = exts }
+
+-- | Fully controllable Markdown processing
+markdownToHtmlWith
+    :: ReaderOptions
+    -> WriterOptions
+    -> Markdown
+    -> Either PandocError Html
+markdownToHtmlWith = markdownToHtmlWith' sanitizeBalance
+
+-- | Internal function, the only way to skip sanitization
+markdownToHtmlWith'
+    :: (Text -> Text)
+    -> ReaderOptions
+    -> WriterOptions
+    -> Markdown
+    -> Either PandocError Html
+markdownToHtmlWith' sanitize ropts wopts =
+    writePandocWith sanitize wopts <=< parseMarkdown ropts
+
 -- | Returns the empty string if the file does not exist
 markdownFromFile :: FilePath -> IO Markdown
 markdownFromFile f = do
@@ -89,16 +128,26 @@
     readFileUtf8 fp = decodeUtf8With lenientDecode <$> B.readFile fp
 
 writePandoc :: WriterOptions -> Pandoc -> Either PandocError Html
-writePandoc wo p = preEscapedToMarkup . sanitizeBalance <$> writeHTML wo p
+writePandoc = writePandocWith sanitizeBalance
+{-# DEPRECATED writePandoc "Don't use this directly" #-}
 
 writePandocTrusted :: WriterOptions -> Pandoc -> Either PandocError Html
-writePandocTrusted wo p = preEscapedToMarkup <$> writeHTML wo p
+writePandocTrusted = writePandocWith id
+{-# DEPRECATED writePandocTrusted "Don't use this directly" #-}
 
-writeHTML :: WriterOptions -> Pandoc -> Either PandocError Text
-writeHTML wo = runPure . writeHtml5String wo
+writePandocWith
+    :: (Text -> Text)
+    -> WriterOptions
+    -> Pandoc
+    -> Either PandocError Html
+writePandocWith f wo
+    = (preEscapedToMarkup . f <$>)
+    . runPure
+    . writeHtml5String wo
 
 parseMarkdown :: ReaderOptions -> Markdown -> Either PandocError Pandoc
 parseMarkdown ro = runPure . readMarkdown ro . unMarkdown
+{-# DEPRECATED parseMarkdown "Don't use this directly" #-}
 
 -- | Defaults minus WrapText, plus our extensions
 yesodDefaultWriterOptions :: WriterOptions
diff --git a/yesod-markdown.cabal b/yesod-markdown.cabal
--- a/yesod-markdown.cabal
+++ b/yesod-markdown.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: dc5e40c81025510f684eb2401cfe1a60cfe62cd7fc7e4d1264560d95e0c72d59
+-- hash: b7e83808360b85c8c862b1daa225c4a7fa6509a8084cbab7a2933e66ee33be18
 
 name:           yesod-markdown
-version:        0.12.2
+version:        0.12.3
 synopsis:       Tools for using markdown in a yesod application
 description:    A subset of Pandoc functionality useful for markdown processing in yesod applications
 category:       Web, Yesod
