diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:    hakyll
-Version: 4.3.3.0
+Version: 4.4.0.0
 
 Synopsis: A static website compiler library
 Description:
@@ -78,6 +78,10 @@
   Description: Include the preview server
   Default:     True
 
+Flag watchServer
+  Description: Include the watch server
+  Default:     True
+
 Flag checkExternal
   Description: Include external link checking
   Default:     True
@@ -137,33 +141,33 @@
     Paths_hakyll
 
   Build-Depends:
-    base         >= 4      && < 5,
-    binary       >= 0.5    && < 0.8,
-    blaze-html   >= 0.5    && < 0.7,
-    blaze-markup >= 0.5.1  && < 0.6,
-    bytestring   >= 0.9    && < 0.11,
-    citeproc-hs  >= 0.3.2  && < 0.4,
-    cmdargs      >= 0.10   && < 0.11,
-    containers   >= 0.3    && < 0.6,
-    cryptohash   >= 0.7    && < 0.10,
-    data-default >= 0.4    && < 0.6,
-    deepseq      >= 1.3    && < 1.4,
-    directory    >= 1.0    && < 1.3,
-    filepath     >= 1.0    && < 1.4,
-    lrucache     >= 1.1.1  && < 1.2,
-    mtl          >= 1      && < 2.2,
-    network      >= 2.4    && < 2.5,
-    old-locale   >= 1.0    && < 1.1,
-    old-time     >= 1.0    && < 1.2,
-    pandoc       >= 1.10   && < 1.12,
-    parsec       >= 3.0    && < 3.2,
-    process      >= 1.0    && < 1.2,
-    random       >= 1.0    && < 1.1,
-    regex-base   >= 0.93   && < 0.94,
-    regex-tdfa   >= 1.1    && < 1.2,
-    tagsoup      >= 0.12.6 && < 0.13,
-    text         >= 0.11   && < 1.12,
-    time         >= 1.1    && < 1.5
+    base            >= 4      && < 5,
+    binary          >= 0.5    && < 0.8,
+    blaze-html      >= 0.5    && < 0.7,
+    blaze-markup    >= 0.5.1  && < 0.6,
+    bytestring      >= 0.9    && < 0.11,
+    cmdargs         >= 0.10   && < 0.11,
+    containers      >= 0.3    && < 0.6,
+    cryptohash      >= 0.7    && < 0.11,
+    data-default    >= 0.4    && < 0.6,
+    deepseq         >= 1.3    && < 1.4,
+    directory       >= 1.0    && < 1.3,
+    filepath        >= 1.0    && < 1.4,
+    lrucache        >= 1.1.1  && < 1.2,
+    mtl             >= 1      && < 2.2,
+    network         >= 2.4    && < 2.5,
+    old-locale      >= 1.0    && < 1.1,
+    old-time        >= 1.0    && < 1.2,
+    pandoc          >= 1.12   && < 1.13,
+    pandoc-citeproc >= 0.1    && < 0.2,
+    parsec          >= 3.0    && < 3.2,
+    process         >= 1.0    && < 1.2,
+    random          >= 1.0    && < 1.1,
+    regex-base      >= 0.93   && < 0.94,
+    regex-tdfa      >= 1.1    && < 1.2,
+    tagsoup         >= 0.12.6 && < 0.13,
+    text            >= 0.11   && < 1.12,
+    time            >= 1.1    && < 1.5
 
   If flag(previewServer)
     Build-depends:
@@ -177,6 +181,15 @@
       Hakyll.Preview.Poll
       Hakyll.Preview.Server
 
+  If flag(watchServer)
+    Build-depends:
+      fsnotify        >= 0.0.6 && < 0.1,
+      system-filepath >= 0.4.6 && <= 0.5
+    Cpp-options:
+      -DWATCH_SERVER
+    Other-modules:
+      Hakyll.Preview.Poll
+
   If flag(checkExternal)
     Build-depends:
       http-conduit >= 1.8    && < 1.10,
@@ -209,38 +222,38 @@
 
   Build-Depends:
     HUnit                      >= 1.2 && < 1.3,
-    QuickCheck                 >= 2.4 && < 2.6,
+    QuickCheck                 >= 2.4 && < 2.7,
     test-framework             >= 0.4 && < 0.9,
-    test-framework-hunit       >= 0.2 && < 0.4,
-    test-framework-quickcheck2 >= 0.2 && < 0.4,
+    test-framework-hunit       >= 0.3 && < 0.4,
+    test-framework-quickcheck2 >= 0.3 && < 0.4,
     -- Copy pasted from hakyll dependencies:
-    base         >= 4      && < 5,
-    binary       >= 0.5    && < 0.8,
-    blaze-html   >= 0.5    && < 0.7,
-    blaze-markup >= 0.5.1  && < 0.6,
-    bytestring   >= 0.9    && < 0.11,
-    citeproc-hs  >= 0.3.2  && < 0.4,
-    cmdargs      >= 0.10   && < 0.11,
-    containers   >= 0.3    && < 0.6,
-    cryptohash   >= 0.7    && < 0.10,
-    data-default >= 0.4    && < 0.6,
-    deepseq      >= 1.3    && < 1.4,
-    directory    >= 1.0    && < 1.3,
-    filepath     >= 1.0    && < 1.4,
-    lrucache     >= 1.1.1  && < 1.2,
-    mtl          >= 1      && < 2.2,
-    network      >= 2.4    && < 2.5,
-    old-locale   >= 1.0    && < 1.1,
-    old-time     >= 1.0    && < 1.2,
-    pandoc       >= 1.10   && < 1.12,
-    parsec       >= 3.0    && < 3.2,
-    process      >= 1.0    && < 1.2,
-    random       >= 1.0    && < 1.1,
-    regex-base   >= 0.93   && < 0.94,
-    regex-tdfa   >= 1.1    && < 1.2,
-    tagsoup      >= 0.12.6 && < 0.13,
-    text         >= 0.11   && < 1.12,
-    time         >= 1.1    && < 1.5
+    base            >= 4      && < 5,
+    binary          >= 0.5    && < 0.8,
+    blaze-html      >= 0.5    && < 0.7,
+    blaze-markup    >= 0.5.1  && < 0.6,
+    bytestring      >= 0.9    && < 0.11,
+    cmdargs         >= 0.10   && < 0.11,
+    containers      >= 0.3    && < 0.6,
+    cryptohash      >= 0.7    && < 0.11,
+    data-default    >= 0.4    && < 0.6,
+    deepseq         >= 1.3    && < 1.4,
+    directory       >= 1.0    && < 1.3,
+    filepath        >= 1.0    && < 1.4,
+    lrucache        >= 1.1.1  && < 1.2,
+    mtl             >= 1      && < 2.2,
+    network         >= 2.4    && < 2.5,
+    old-locale      >= 1.0    && < 1.1,
+    old-time        >= 1.0    && < 1.2,
+    pandoc          >= 1.12   && < 1.13,
+    pandoc-citeproc >= 0.1    && < 0.2,
+    parsec          >= 3.0    && < 3.2,
+    process         >= 1.0    && < 1.2,
+    random          >= 1.0    && < 1.1,
+    regex-base      >= 0.93   && < 0.94,
+    regex-tdfa      >= 1.1    && < 1.2,
+    tagsoup         >= 0.12.6 && < 0.13,
+    text            >= 0.11   && < 1.12,
+    time            >= 1.1    && < 1.5
 
   If flag(previewServer)
     Build-depends:
@@ -253,6 +266,15 @@
     Other-modules:
       Hakyll.Preview.Poll
       Hakyll.Preview.Server
+
+  If flag(watchServer)
+    Build-depends:
+      fsnotify        >= 0.0.6 && < 0.1,
+      system-filepath >= 0.4.6 && <= 0.5
+    Cpp-options:
+      -DWATCH_SERVER
+    Other-modules:
+      Hakyll.Preview.Poll
 
   If flag(checkExternal)
     Build-depends:
diff --git a/src/Hakyll/Commands.hs b/src/Hakyll/Commands.hs
--- a/src/Hakyll/Commands.hs
+++ b/src/Hakyll/Commands.hs
@@ -1,4 +1,4 @@
---------------------------------------------------------------------------------
+ --------------------------------------------------------------------------------
 -- | Implementation of Hakyll commands: build, preview...
 {-# LANGUAGE CPP #-}
 module Hakyll.Commands
@@ -9,12 +9,14 @@
     , rebuild
     , server
     , deploy
+    , watch 
     ) where
 
 
 --------------------------------------------------------------------------------
 import           System.Exit                (exitWith, ExitCode)
 import           Control.Applicative
+import           Control.Concurrent
 
 --------------------------------------------------------------------------------
 import qualified Hakyll.Check               as Check
@@ -26,8 +28,11 @@
 import           Hakyll.Core.Util.File
 
 --------------------------------------------------------------------------------
+#ifdef WATCH_SERVER
+import           Hakyll.Preview.Poll (watchUpdates)
+#endif
+
 #ifdef PREVIEW_SERVER
-import           Hakyll.Preview.Poll
 import           Hakyll.Preview.Server
 #endif
 
@@ -60,18 +65,39 @@
 -- | Preview the site
 preview :: Configuration -> Verbosity -> Rules a -> Int -> IO ()
 #ifdef PREVIEW_SERVER
-preview conf verbosity rules port = do
+preview conf verbosity rules port  = do
+    deprecatedMessage
+    watch conf verbosity port True rules
+  where
+    deprecatedMessage = mapM_ putStrLn [ "The preview command has been deprecated."
+                                       , "Use the watch command for recompilation and serving."
+                                       ]
+#else
+preview _ _ _ _ = previewServerDisabled
+#endif
+
+
+--------------------------------------------------------------------------------
+-- | Watch and recompile for changes
+
+watch :: Configuration -> Verbosity -> Int -> Bool -> Rules a -> IO ()
+#ifdef WATCH_SERVER
+watch conf verbosity port runServer rules = do
     watchUpdates conf update
-    server conf port
+    _ <- forkIO (server')
+    loop
   where
     update = do
         (_, ruleSet) <- run conf verbosity rules
         return $ rulesPattern ruleSet
+
+    loop = threadDelay 100000 >> loop
+
+    server' = if runServer then server conf port else return ()
 #else
-preview _ _ _ _ = previewServerDisabled
+watch _ _ _ _ _ = watchServerDisabled
 #endif
 
-
 --------------------------------------------------------------------------------
 -- | Rebuild the site
 rebuild :: Configuration -> Verbosity -> Rules a -> IO ExitCode
@@ -111,3 +137,16 @@
         , "Alternatively, use an external tool to serve your site directory."
         ]
 #endif
+
+#ifndef WATCH_SERVER
+watchServerDisabled :: IO ()
+watchServerDisabled =
+    mapM_ putStrLn
+      [ "WATCH SERVER"
+      , ""
+      , "The watch server is not enabled in the version of Hakyll. To"
+      , "enable it, set the flag to True and recompile Hakyll."
+      , "Alternatively, use an external tool to serve your site directory."
+      ]
+#endif
+
diff --git a/src/Hakyll/Core/Configuration.hs b/src/Hakyll/Core/Configuration.hs
--- a/src/Hakyll/Core/Configuration.hs
+++ b/src/Hakyll/Core/Configuration.hs
@@ -69,6 +69,10 @@
     , -- | Use an in-memory cache for items. This is faster but uses more
       -- memory.
       inMemoryCache        :: Bool
+    , -- | Override default port for preview server. Default is 8000.
+      -- One can also override the port as a command line argument:
+      -- ./site preview -p 1234
+      previewPort          :: Int
     }
 
 --------------------------------------------------------------------------------
@@ -87,6 +91,7 @@
     , deployCommand        = "echo 'No deploy command specified' && exit 1"
     , deploySite           = system . deployCommand
     , inMemoryCache        = True
+    , previewPort          = 8000
     }
   where
     ignoreFile' path
diff --git a/src/Hakyll/Core/Provider/Internal.hs b/src/Hakyll/Core/Provider/Internal.hs
--- a/src/Hakyll/Core/Provider/Internal.hs
+++ b/src/Hakyll/Core/Provider/Internal.hs
@@ -98,7 +98,7 @@
       providerOldFiles  :: Map Identifier ResourceInfo
     , -- | Underlying persistent store for caching
       providerStore     :: Store
-    }
+    } deriving (Show)
 
 
 --------------------------------------------------------------------------------
diff --git a/src/Hakyll/Core/Provider/Metadata.hs b/src/Hakyll/Core/Provider/Metadata.hs
--- a/src/Hakyll/Core/Provider/Metadata.hs
+++ b/src/Hakyll/Core/Provider/Metadata.hs
@@ -44,8 +44,9 @@
 
     return (M.union md emd, body)
   where
-    fp  = resourceFilePath p identifier
-    mi  = M.lookup identifier (providerFiles p) >>= resourceInfoMetadata
+    normal = setVersion Nothing identifier
+    fp     = resourceFilePath p identifier
+    mi     = M.lookup normal (providerFiles p) >>= resourceInfoMetadata
 
 
 --------------------------------------------------------------------------------
diff --git a/src/Hakyll/Core/Store.hs b/src/Hakyll/Core/Store.hs
--- a/src/Hakyll/Core/Store.hs
+++ b/src/Hakyll/Core/Store.hs
@@ -50,6 +50,11 @@
 
 
 --------------------------------------------------------------------------------
+instance Show Store where
+    show _ = "<Store>"
+
+
+--------------------------------------------------------------------------------
 -- | Result of a store query
 data Result a
     = Found a                    -- ^ Found, result
diff --git a/src/Hakyll/Main.hs b/src/Hakyll/Main.hs
--- a/src/Hakyll/Main.hs
+++ b/src/Hakyll/Main.hs
@@ -34,27 +34,28 @@
 -- configuration
 hakyllWith :: Config.Configuration -> Rules a -> IO ()
 hakyllWith conf rules = do
-    args' <- cmdArgs hakyllArgs
+    args' <- cmdArgs (hakyllArgs conf)
 
     let verbosity' = if verbose args' then Logger.Debug else Logger.Message
         check'     =
             if internal_links args' then Check.InternalLinks else Check.All
 
     case args' of
-        Build   _   -> Commands.build conf verbosity' rules >>= exitWith
-        Check   _ _ -> Commands.check conf verbosity' check'
-        Clean   _   -> Commands.clean conf
-        Deploy  _   -> Commands.deploy conf >>= exitWith
-        Help    _   -> showHelp
-        Preview _ p -> Commands.preview conf verbosity' rules p
-        Rebuild _   -> Commands.rebuild conf verbosity' rules >>= exitWith
-        Server  _ _ -> Commands.server conf (port args')
+        Build   _     -> Commands.build conf verbosity' rules >>= exitWith
+        Check   _ _   -> Commands.check conf verbosity' check'
+        Clean   _     -> Commands.clean conf
+        Deploy  _     -> Commands.deploy conf >>= exitWith
+        Help    _     -> showHelp
+        Preview _ p   -> Commands.preview conf verbosity' rules p
+        Rebuild _     -> Commands.rebuild conf verbosity' rules >>= exitWith
+        Server  _ _   -> Commands.server conf (port args')
+        Watch   _ p s -> Commands.watch conf verbosity' p (not s) rules
 
 
 --------------------------------------------------------------------------------
 -- | Show usage information.
 showHelp :: IO ()
-showHelp = print $ CA.helpText [] CA.HelpFormatOne $ cmdArgsMode hakyllArgs
+showHelp = print $ CA.helpText [] CA.HelpFormatOne $ cmdArgsMode (hakyllArgs Config.defaultConfiguration)
 
 
 --------------------------------------------------------------------------------
@@ -67,24 +68,28 @@
     | Preview {verbose :: Bool, port :: Int}
     | Rebuild {verbose :: Bool}
     | Server  {verbose :: Bool, port :: Int}
+    | Watch   {verbose :: Bool, port :: Int, no_server :: Bool }
     deriving (Data, Typeable, Show)
 
 
 --------------------------------------------------------------------------------
-hakyllArgs :: HakyllArgs
-hakyllArgs = modes
+hakyllArgs :: Config.Configuration -> HakyllArgs
+hakyllArgs conf = modes
     [ (Build $ verboseFlag def) &= help "Generate the site"
     , (Check (verboseFlag def) (False &= help "Check internal links only")) &=
         help "Validate the site output"
     , (Clean $ verboseFlag def) &= help "Clean up and remove cache"
     , (Deploy $ verboseFlag def) &= help "Upload/deploy your site"
     , (Help $ verboseFlag def) &= help "Show this message" &= auto
-    , (Preview (verboseFlag def) (portFlag 8000)) &=
-        help "Start a preview server and autocompile on changes"
+    , (Preview (verboseFlag def) (portFlag defaultPort)) &=
+        help "[Deprecated] Please use the watch command"
     , (Rebuild $ verboseFlag def) &= help "Clean and build again"
-    , (Server (verboseFlag def) (portFlag 8000)) &=
+    , (Server (verboseFlag def) (portFlag defaultPort)) &=
         help "Start a preview server"
+    , (Watch (verboseFlag def) (portFlag defaultPort) (noServerFlag False) &=
+       help "Autocompile on changes and start a preview server.  You can watch and recompile without running a server with --no-server.")
     ] &= help "Hakyll static site compiler" &= program progName
+    where defaultPort = Config.previewPort conf
 
 
 --------------------------------------------------------------------------------
@@ -92,6 +97,11 @@
 verboseFlag x = x &= help "Run in verbose mode"
 {-# INLINE verboseFlag #-}
 
+
+--------------------------------------------------------------------------------
+noServerFlag :: Data a => a -> a
+noServerFlag x = x &= help "Disable the built-in web server"
+{-# INLINE noServerFlag #-}
 
 --------------------------------------------------------------------------------
 portFlag :: Data a => a -> a
diff --git a/src/Hakyll/Web/Html.hs b/src/Hakyll/Web/Html.hs
--- a/src/Hakyll/Web/Html.hs
+++ b/src/Hakyll/Web/Html.hs
@@ -25,7 +25,7 @@
                                                   isDigit, toLower)
 import           Data.List                       (isPrefixOf)
 import qualified Data.Set                        as S
-import           System.FilePath                 (joinPath, splitPath,
+import           System.FilePath.Posix           (joinPath, splitPath,
                                                   takeDirectory)
 import           Text.Blaze.Html                 (toHtml)
 import           Text.Blaze.Html.Renderer.String (renderHtml)
diff --git a/src/Hakyll/Web/Pandoc/Biblio.hs b/src/Hakyll/Web/Pandoc/Biblio.hs
--- a/src/Hakyll/Web/Pandoc/Biblio.hs
+++ b/src/Hakyll/Web/Pandoc/Biblio.hs
@@ -22,13 +22,11 @@
 --------------------------------------------------------------------------------
 import           Control.Applicative    ((<$>))
 import           Data.Binary            (Binary (..))
-import           Data.Traversable       (traverse)
 import           Data.Typeable          (Typeable)
 import qualified Text.CSL               as CSL
+import           Text.CSL.Pandoc        (processCites)
 import           Text.Pandoc            (Pandoc, ReaderOptions (..))
-import           Text.Pandoc.Biblio     (processBiblio)
 
-
 --------------------------------------------------------------------------------
 import           Hakyll.Core.Compiler
 import           Hakyll.Core.Identifier
@@ -86,21 +84,20 @@
 
 --------------------------------------------------------------------------------
 readPandocBiblio :: ReaderOptions
-                 -> Maybe (Item CSL)
+                 -> Item CSL
                  -> Item Biblio
                  -> (Item String)
                  -> Compiler (Item Pandoc)
 readPandocBiblio ropt csl biblio item = do
     -- Parse CSL file, if given
-    style <- unsafeCompiler $
-        traverse (CSL.readCSLFile . toFilePath . itemIdentifier) csl
+    style <- unsafeCompiler $ CSL.readCSLFile . toFilePath . itemIdentifier $ csl
 
     -- We need to know the citation keys, add then *before* actually parsing the
     -- actual page. If we don't do this, pandoc won't even consider them
     -- citations!
     let Biblio refs = itemBody biblio
-        ropt'       = ropt {readerReferences = readerReferences ropt ++ refs}
-        pandoc      = itemBody $ readPandocWith ropt' item
-        pandoc'     = processBiblio style refs pandoc
+        pandoc      = itemBody $ readPandocWith ropt item
+        pandoc'     = processCites style refs pandoc
 
     return $ fmap (const pandoc') item
+
diff --git a/src/Hakyll/Web/Template/Context.hs b/src/Hakyll/Web/Template/Context.hs
--- a/src/Hakyll/Web/Template/Context.hs
+++ b/src/Hakyll/Web/Template/Context.hs
@@ -100,9 +100,11 @@
 mapContext :: (String -> String) -> Context a -> Context a
 mapContext f (Context c) = Context $ \k i -> do
     fld <- c k i
-    return $ case fld of
-        StringField str  -> StringField (f str)
-        ListField ctx is -> ListField ctx is
+    case fld of
+        StringField str -> return $ StringField (f str)
+        ListField _ _   -> fail $
+            "Hakyll.Web.Template.Context.mapContext: " ++
+            "can't map over a ListField!"
 
 
 --------------------------------------------------------------------------------
@@ -128,7 +130,7 @@
 
 --------------------------------------------------------------------------------
 -- | Map any field to its metadata value, if present
-metadataField :: Context String
+metadataField :: Context a
 metadataField = Context $ \k i -> do
     value <- getMetadataField (itemIdentifier i) k
     maybe empty (return . StringField) value
