diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:    hakyll
-Version: 3.2.0.10
+Version: 3.2.1.0
 
 Synopsis: A static website compiler library
 Description:
@@ -63,6 +63,7 @@
     binary      >= 0.5    && < 1.0,
     blaze-html  >= 0.4    && < 0.6,
     bytestring  >= 0.9    && < 1.0,
+    citeproc-hs >= 0.3.2  && < 0.4,
     containers  >= 0.3    && < 1.0,
     cryptohash  >= 0.7    && < 0.8,
     directory   >= 1.0    && < 1.3,
@@ -114,6 +115,7 @@
     Hakyll.Web.Page.Metadata
     Hakyll.Web.Page.Read
     Hakyll.Web.Pandoc
+    Hakyll.Web.Pandoc.Biblio
     Hakyll.Web.Pandoc.FileType
     Hakyll.Web.Tags
     Hakyll.Web.Template
diff --git a/src/Hakyll.hs b/src/Hakyll.hs
--- a/src/Hakyll.hs
+++ b/src/Hakyll.hs
@@ -25,6 +25,7 @@
     , module Hakyll.Web.Page.Metadata
     , module Hakyll.Web.Page.Read
     , module Hakyll.Web.Pandoc
+    , module Hakyll.Web.Pandoc.Biblio
     , module Hakyll.Web.Pandoc.FileType
     , module Hakyll.Web.Urls
     , module Hakyll.Web.Urls.Relativize
@@ -57,6 +58,7 @@
 import Hakyll.Web.Page.Metadata
 import Hakyll.Web.Page.Read
 import Hakyll.Web.Pandoc
+import Hakyll.Web.Pandoc.Biblio
 import Hakyll.Web.Pandoc.FileType
 import Hakyll.Web.Urls
 import Hakyll.Web.Urls.Relativize
diff --git a/src/Hakyll/Web/Pandoc.hs b/src/Hakyll/Web/Pandoc.hs
--- a/src/Hakyll/Web/Pandoc.hs
+++ b/src/Hakyll/Web/Pandoc.hs
@@ -10,6 +10,7 @@
       -- * Functions working on pages/compilers
     , pageReadPandoc
     , pageReadPandocWith
+    , pageReadPandocWithA
     , pageRenderPandoc
     , pageRenderPandocWith
 
@@ -20,7 +21,7 @@
 
 import Prelude hiding (id)
 import Control.Applicative ((<$>))
-import Control.Arrow ((>>^), (&&&))
+import Control.Arrow ((>>>), (>>^), (&&&), (***))
 import Control.Category (id)
 import Data.Maybe (fromMaybe)
 
@@ -28,6 +29,7 @@
 
 import Hakyll.Core.Compiler
 import Hakyll.Core.Identifier
+import Hakyll.Core.Util.Arrow
 import Hakyll.Web.Pandoc.FileType
 import Hakyll.Web.Page.Internal
 
@@ -78,10 +80,16 @@
 -- | Read the resource using pandoc
 --
 pageReadPandocWith :: ParserState -> Compiler (Page String) (Page Pandoc)
-pageReadPandocWith state =
-    id &&& getIdentifier &&& getFileType >>^ pageReadPandocWith'
+pageReadPandocWith state = constA state &&& id >>> pageReadPandocWithA
+
+-- | Read the resource using pandoc. This is a (rarely needed) variant, which
+-- comes in very useful when the parser state is the result of some arrow.
+--
+pageReadPandocWithA :: Compiler (ParserState, Page String) (Page Pandoc)
+pageReadPandocWithA =
+    id *** id &&& getIdentifier &&& getFileType >>^ pageReadPandocWithA'
   where
-    pageReadPandocWith' (p, (i, t)) = readPandocWith state t (Just i) <$> p
+    pageReadPandocWithA' (s, (p, (i, t))) = readPandocWith s t (Just i) <$> p
 
 -- | Render the resource using pandoc
 --
diff --git a/src/Hakyll/Web/Pandoc/Biblio.hs b/src/Hakyll/Web/Pandoc/Biblio.hs
new file mode 100644
--- /dev/null
+++ b/src/Hakyll/Web/Pandoc/Biblio.hs
@@ -0,0 +1,73 @@
+-- | Wraps pandocs bibiliography handling
+--
+-- In order to add a bibliography, you will need a bibliography file (e.g.
+-- @.bib@) and a CSL file (@.csl@). Both need to be compiled with their
+-- respective compilers ('biblioCompiler' and 'cslCompiler'). Then, you can
+-- refer to these files when you use 'pageReadPandocBiblio'. This function also
+-- takes a parser state for completeness -- you can use
+-- 'defaultHakyllParserState' if you're unsure.
+--
+{-# LANGUAGE Arrows, DeriveDataTypeable, GeneralizedNewtypeDeriving #-}
+module Hakyll.Web.Pandoc.Biblio
+    ( CSL
+    , cslCompiler
+    , Biblio (..)
+    , biblioCompiler
+    , pageReadPandocBiblio
+    ) where
+
+import Control.Applicative ((<$>))
+import Control.Arrow (arr, returnA)
+import Data.Typeable (Typeable)
+
+import Data.Binary (Binary (..))
+import Text.Pandoc (Pandoc, ParserState (..))
+import Text.Pandoc.Biblio (processBiblio)
+import qualified Text.CSL as CSL
+
+import Hakyll.Core.Compiler
+import Hakyll.Core.Identifier
+import Hakyll.Core.Resource
+import Hakyll.Core.Writable
+import Hakyll.Web.Page
+import Hakyll.Web.Pandoc
+
+newtype CSL = CSL FilePath
+    deriving (Binary, Show, Typeable, Writable)
+
+cslCompiler :: Compiler Resource CSL
+cslCompiler = arr (CSL . unResource)
+
+newtype Biblio = Biblio [CSL.Reference]
+    deriving (Show, Typeable)
+
+instance Binary Biblio where
+    -- Ugly.
+    get             = Biblio . read <$> get
+    put (Biblio rs) = put $ show rs
+
+instance Writable Biblio where
+    write _ _ = return ()
+
+biblioCompiler :: Compiler Resource Biblio
+biblioCompiler = unsafeCompiler $
+    fmap Biblio . CSL.readBiblioFile . unResource
+
+pageReadPandocBiblio :: ParserState
+                     -> Identifier CSL
+                     -> Identifier Biblio
+                     -> Compiler (Page String) (Page Pandoc)
+pageReadPandocBiblio state csl refs = proc page -> do
+    CSL csl' <- require_ csl -< ()
+    Biblio refs' <- require_ refs -< ()
+    -- 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 cits   = map CSL.refId refs'
+        state' = state {stateCitations = stateCitations state ++ cits}
+    pandocPage <- pageReadPandocWithA -< (state', page)
+    let pandoc = pageBody pandocPage
+    pandoc' <- unsafeCompiler (tuc processBiblio) -< (csl', refs', pandoc)
+    returnA -< pandocPage {pageBody = pandoc'}
+  where
+    tuc f (x, y, z) = f x y z
