diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:               hakyll
-Version:            3.1.2.6
+Version:            3.1.2.7
 
 Synopsis:           A simple static site generator library.
 Description:        A simple static site generator library, mainly aimed at
@@ -17,8 +17,6 @@
                     templates/atom-item.xml
                     templates/rss.xml
                     templates/rss-item.xml
-extra-source-files: src-inotify/Hakyll/Web/Preview/Poll.hs
-                    src-interval/Hakyll/Web/Preview/Poll.hs
 
 build-type:         Simple
 
@@ -26,23 +24,9 @@
   type:             git
   location:         git://github.com/jaspervdj/hakyll.git
 
--- Disabled while inotify is broken with GHC 7. If you're interested in fixing,
--- contact me!
---
--- flag inotify
---   description:      Use the inotify bindings for the preview server. Better,
---                     but only works on Linux.
---   default:          False
-
 library
   ghc-options:        -Wall
   hs-source-dirs:     src
-
---  if flag(inotify)
---    hs-source-dirs:   src-inotify
---    build-depends:    hinotify >= 0.3
---  else
-  hs-source-dirs:   src-interval
 
   build-depends:      base >= 4 && < 5,
                       filepath == 1.*,
diff --git a/src-inotify/Hakyll/Web/Preview/Poll.hs b/src-inotify/Hakyll/Web/Preview/Poll.hs
deleted file mode 100644
--- a/src-inotify/Hakyll/Web/Preview/Poll.hs
+++ /dev/null
@@ -1,50 +0,0 @@
--- | Filesystem polling with an inotify backend. Works only on linux.
---
-module Hakyll.Web.Preview.Poll
-    ( previewPoll
-    ) where
-
-import Control.Monad (forM_, when)
-import Data.Set (Set)
-import qualified Data.Set as S
-import System.FilePath (takeDirectory, (</>))
-import Data.List (isPrefixOf)
-
-import System.INotify
-
-import Hakyll.Core.Configuration
-import Hakyll.Core.Resource
-
--- | Calls the given callback when the directory tree changes
---
-previewPoll :: HakyllConfiguration  -- ^ Configuration
-            -> Set Resource         -- ^ Resources to watch
-            -> IO ()                -- ^ Action called when something changes
-            -> IO ()                -- ^ Can block forever
-previewPoll _ resources callback = do
-    -- Initialize inotify
-    inotify <- initINotify
-
-    let -- A set of file paths
-        paths = S.map unResource resources
-
-        -- A list of directories. Run it through a set so we have every
-        -- directory only once.
-        directories = S.toList $ S.map (notEmpty . takeDirectory) paths
-
-        -- Problem: we can't add a watcher for "". So we make sure a directory
-        -- name is not empty
-        notEmpty "" = "."
-        notEmpty x  = x
-
-        -- Execute the callback when path is known
-        ifResource path =
-            let path' = if "./" `isPrefixOf` path then drop 2 path else path
-            in when (path' `S.member` paths) callback
-
-    -- Add a watcher for every directory
-    forM_ directories $ \directory -> do
-        _ <- addWatch inotify [Modify] directory $ \e -> case e of
-            (Modified _ (Just p)) -> ifResource $ directory </> p
-            _                     -> return ()
-        return ()
diff --git a/src-interval/Hakyll/Web/Preview/Poll.hs b/src-interval/Hakyll/Web/Preview/Poll.hs
deleted file mode 100644
--- a/src-interval/Hakyll/Web/Preview/Poll.hs
+++ /dev/null
@@ -1,35 +0,0 @@
--- | Interval-based implementation of preview polling, for the platforms which
--- are not supported by inotify.
---
-module Hakyll.Web.Preview.Poll
-    ( previewPoll
-    ) where
-
-import Control.Applicative ((<$>))
-import Control.Concurrent (threadDelay)
-import Control.Monad (filterM)
-import System.Time (getClockTime)
-import System.Directory (getModificationTime, doesFileExist)
-
-import Hakyll.Core.Configuration
-
--- | A preview thread that periodically recompiles the site.
---
-previewPoll :: HakyllConfiguration  -- ^ Configuration
-            -> IO [FilePath]        -- ^ Updating action
-            -> IO ()                -- ^ Can block forever
-previewPoll _ update = do
-    time <- getClockTime
-    loop time =<< update
-  where
-    delay = 1000000
-    loop time files = do
-        threadDelay delay
-        files' <- filterM doesFileExist files
-        filesTime <- case files' of
-            []  -> return time
-            _   -> maximum <$> mapM getModificationTime files'
-
-        if filesTime > time || files' /= files
-            then loop filesTime =<< update
-            else loop time files'
diff --git a/src/Hakyll/Web/Page.hs b/src/Hakyll/Web/Page.hs
--- a/src/Hakyll/Web/Page.hs
+++ b/src/Hakyll/Web/Page.hs
@@ -54,6 +54,7 @@
     , readPageCompiler
     , pageCompiler
     , pageCompilerWith
+    , pageCompilerWithPandoc
     , addDefaultFields
     , sortByBaseName
     ) where
@@ -66,7 +67,7 @@
 import Data.List (sortBy)
 import Data.Ord (comparing)
 
-import Text.Pandoc (ParserState, WriterOptions)
+import Text.Pandoc (Pandoc, ParserState, WriterOptions)
 
 import Hakyll.Core.Identifier
 import Hakyll.Core.Compiler
@@ -91,16 +92,26 @@
 -- | Read a page, add default fields, substitute fields and render using pandoc
 --
 pageCompiler :: Compiler Resource (Page String)
-pageCompiler = cached "Hakyll.Web.Page.pageCompiler" $
-    readPageCompiler >>> addDefaultFields >>> arr applySelf >>> pageRenderPandoc
+pageCompiler =
+    pageCompilerWith defaultHakyllParserState defaultHakyllWriterOptions
 
 -- | A version of 'pageCompiler' which allows you to specify your own pandoc
 -- options
 --
-pageCompilerWith :: ParserState -> WriterOptions -> Compiler Resource (Page String)
-pageCompilerWith state options = cached "pageCompilerWith" $
+pageCompilerWith :: ParserState -> WriterOptions
+                 -> Compiler Resource (Page String)
+pageCompilerWith state options = pageCompilerWithPandoc state options id
+
+-- | An extension of 'pageCompilerWith' which allows you to specify a custom
+-- pandoc transformer for the content
+--
+pageCompilerWithPandoc :: ParserState -> WriterOptions
+                       -> (Pandoc -> Pandoc)
+                       -> Compiler Resource (Page String)
+pageCompilerWithPandoc state options f = cached "pageCompilerWithPandoc" $
     readPageCompiler >>> addDefaultFields >>> arr applySelf
-                     >>> pageRenderPandocWith state options
+                     >>> pageReadPandocWith state
+                     >>> arr (fmap (writePandocWith options . f))
 
 -- | Add a number of default metadata fields to a page. These fields include:
 --
diff --git a/src/Hakyll/Web/Preview/Poll.hs b/src/Hakyll/Web/Preview/Poll.hs
new file mode 100644
--- /dev/null
+++ b/src/Hakyll/Web/Preview/Poll.hs
@@ -0,0 +1,34 @@
+-- | Interval-based implementation of preview polling
+--
+module Hakyll.Web.Preview.Poll
+    ( previewPoll
+    ) where
+
+import Control.Applicative ((<$>))
+import Control.Concurrent (threadDelay)
+import Control.Monad (filterM)
+import System.Time (getClockTime)
+import System.Directory (getModificationTime, doesFileExist)
+
+import Hakyll.Core.Configuration
+
+-- | A preview thread that periodically recompiles the site.
+--
+previewPoll :: HakyllConfiguration  -- ^ Configuration
+            -> IO [FilePath]        -- ^ Updating action
+            -> IO ()                -- ^ Can block forever
+previewPoll _ update = do
+    time <- getClockTime
+    loop time =<< update
+  where
+    delay = 1000000
+    loop time files = do
+        threadDelay delay
+        files' <- filterM doesFileExist files
+        filesTime <- case files' of
+            []  -> return time
+            _   -> maximum <$> mapM getModificationTime files'
+
+        if filesTime > time || files' /= files
+            then loop filesTime =<< update
+            else loop time files'
