diff --git a/data/sample.lua b/data/sample.lua
index 486f300e3..f5c17839e 100644
--- a/data/sample.lua
+++ b/data/sample.lua
@@ -67,28 +67,15 @@ end
 
 -- This function is called once for the whole document. Parameters:
 -- body is a string, metadata is a table, variables is a table.
--- One could use some kind of templating
--- system here; this just gives you a simple standalone HTML file.
+-- This gives you a fragment.  You could use the metadata table to
+-- fill variables in a custom lua template.  Or, pass `--template=...`
+-- to pandoc, and pandoc will add do the template processing as
+-- usual.
 function Doc(body, metadata, variables)
   local buffer = {}
   local function add(s)
     table.insert(buffer, s)
   end
-  add('<!DOCTYPE html>')
-  add('<html>')
-  add('<head>')
-  add('<title>' .. (metadata['title'] or '') .. '</title>')
-  add('</head>')
-  add('<body>')
-  if metadata['title'] and metadata['title'] ~= "" then
-    add('<h1 class="title">' .. metadata['title'] .. '</h1>')
-  end
-  for _, author in pairs(metadata['author'] or {}) do
-    add('<h2 class="author">' .. author .. '</h2>')
-  end
-  if metadata['date'] and metadata['date'] ~= "" then
-    add('<h3 class="date">' .. metadata.date .. '</h3>')
-  end
   add(body)
   if #notes > 0 then
     add('<ol class="footnotes">')
@@ -97,8 +84,6 @@ function Doc(body, metadata, variables)
     end
     add('</ol>')
   end
-  add('</body>')
-  add('</html>')
   return table.concat(buffer,'\n')
 end
 
diff --git a/src/Text/Pandoc/Writers/Custom.hs b/src/Text/Pandoc/Writers/Custom.hs
index 97988237a..69c0d9dfe 100644
--- a/src/Text/Pandoc/Writers/Custom.hs
+++ b/src/Text/Pandoc/Writers/Custom.hs
@@ -36,12 +36,15 @@ import Text.Pandoc.Options
 import Data.List ( intersperse )
 import Data.Char ( toLower )
 import Scripting.Lua (LuaState, StackValue, callfunc)
+import Text.Pandoc.Writers.Shared
 import qualified Scripting.Lua as Lua
 import Text.Pandoc.UTF8 (fromString, toString)
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as C8
 import Data.Monoid
 import qualified Data.Map as M
+import Text.Pandoc.Templates
+import Data.IORef
 
 attrToMap :: Attr -> M.Map ByteString ByteString
 attrToMap (id',classes,keyvals) = M.fromList
@@ -145,7 +148,7 @@ instance StackValue Citation where
 
 -- | Convert Pandoc to custom markup.
 writeCustom :: FilePath -> WriterOptions -> Pandoc -> IO String
-writeCustom luaFile opts doc = do
+writeCustom luaFile opts doc@(Pandoc meta _) = do
   luaScript <- C8.unpack `fmap` C8.readFile luaFile
   lua <- Lua.newstate
   Lua.openlibs lua
@@ -153,8 +156,17 @@ writeCustom luaFile opts doc = do
   Lua.call lua 0 0
   -- TODO - call hierarchicalize, so we have that info
   rendered <- docToCustom lua opts doc
+  context <- metaToJSON opts
+             (fmap toString . blockListToCustom lua)
+             (fmap toString . inlineListToCustom lua)
+             meta
   Lua.close lua
-  return $ toString rendered
+  let body = toString rendered
+  if writerStandalone opts
+     then do
+       let context' = setField "body" body context
+       return $ renderTemplate' (writerTemplate opts) context'
+     else return body
 
 docToCustom :: LuaState -> WriterOptions -> Pandoc -> IO ByteString
 docToCustom lua opts (Pandoc (Meta metamap) blocks) = do