diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,428 @@
+---
+title: Releases
+---
+
+# Releases
+
+## Hakyll 4.9.4.0
+
+- Make `./site check` concurrent
+- Bump directory dependency to 1.3
+- Bump time dependency to 1.7
+- Bump vector dependency to 0.12
+
+## Hakyll 4.9.3.0
+
+- Add a `Hakyll.Web.Redirect` module (contribution by gwern)
+- Expose `Hakyll.Commands`
+- Fix the exit code behaviour of `./site check`
+
+## Hakyll 4.9.2.0
+
+- Fix integer fields in YAML metadata (Fix by Nikolaos S. Papaspyrou)
+- Bump pandoc dependency to 1.19
+
+## Hakyll 4.9.1.0
+
+- Allow optparse-applicative 0.13, QuickCheck 2.9, and pandoc 1.18
+  (contributions by Chris Wong and Felix Yan)
+- Fix extra test files for packaging source files (contribution by Julien
+  Langlois)
+
+## Hakyll 4.9.0.0
+
+This release switches over some dependencies to alternatives, in order to clean
+up some stuff and build on a wider variety of setups (stack/cabal).
+
+- Move from `test-framework` to `tasty`
+- Fix feed generator when item contains CDATA (contribution by Yann Esposito)
+- Fix CompressCSS to not modify string constants (contribution by Nicole Rauch)
+- Fix YAML dependency issue (contribution by Jens Peterson)
+- Move from `cmdargs` to `optparse-applicative` (contribution by sk3r)
+- Allow for trimming whitespace in templates (contribution by Sam Davis)
+- Improve error messages for template parsing (contribution by Lorenzo
+  Tabacchini)
+- Improvements to the installation instructions (contribution by Thomas Koch)
+- Move from `snap` to `warp` for preview servier (contribution by Arguggi)
+- Fix error in CompressCSS (contribution by Luca Molteni)
+- Move example from XHTML to HTML5 (contribution by Peter Doherty)
+- Make errors in check less verbose (contribution by Jan Tojnar)
+- Work on building with GHC 8.0.1 (contribution by Rohan Jain)
+
+## Hakyll 4.8.3.2
+
+This release is compatible with GHC 8.0.1, although `previewServer` might not
+work yet on some setups.
+
+- Allow data-default 0.7, pandoc-citeproc 0.10, and tagsoup 0.14 (contributions
+  by Paul van der Walt and Felix Yan)
+- Allow binary 0.8, process 1.4, time 1.6 (contribution by Sergei Trofimovich)
+- Fix issue with `.metadata` file reading
+
+## Hakyll 4.8.3.1
+
+- Bump scientific dependency to 0.3.4
+
+## Hakyll 4.8.3.0
+
+- Fix another compilation issue wrt. orphan `Show` instance from regex-tdfa
+  (contribution by Sergei Trofimovich)
+
+## Hakyll 4.8.2.0
+
+- Fix compilation issue wrt. orphan `Show` instance from regex-tdfa
+
+## Hakyll 4.8.1.0
+
+- Fix compilation on windows
+
+## Hakyll 4.8.0.1
+
+- Fix issue with test suite
+
+## Hakyll 4.8.0.0
+
+- Support full YAML in page metadata
+- Bump data-default dependency to 0.6
+- Add snippet field for literal includes in templates (contribution by Nicolas
+  Mattia)
+
+## Hakyll 4.7.5.2
+
+- Bump pandoc dependency to 1.17 (contribution by Felix Yan)
+- Fix `unixFilter` documentation (contribution by Richard Cook)
+- Bump example posts (contribution by Andrew Barchuk)
+- Add a template compiler that only uses the template body (contribution by
+  Bergi)
+
+## Hakyll 4.7.5.1
+
+- Bump pandoc and pandoc-citeproc dependencies to 1.16 and 0.9 respectively
+
+## Hakyll 4.7.5.0
+
+- Expose templating engine
+- Fix bug in feed context precedence (contribution by Yuriy Syrovetskiy)
+- Bump http-types dependency to 0.9
+
+## Hakyll 4.7.4.0
+
+- Expose `getItemModificationTime`
+
+## Hakyll 4.7.3.1
+
+- Bump pandoc-citeproc dependency to 0.8
+
+## Hakyll 4.7.3.0
+
+- Bump HUnit dependency to 1.3
+- Add `poster` as an URL attribute (contribution by vtduncan)
+- Prevent `hakyll-init` from generating directories with leading hyphen
+  (contribution by Javran Cheng)
+
+## Hakyll 4.7.2.3
+
+- Fix time dependency in tests
+
+## Hakyll 4.7.2.2
+
+- Relax time dependency
+
+## Hakyll 4.7.2.1
+
+- Bump fsnotify dependency to 0.2
+
+## Hakyll 4.7.2.0
+
+- Improve documentation of `getResourceXXX` functions (contribution by Matthias
+  C. M. Troffaes)
+- Allow for empty templates
+- Bump pandoc dependency to 1.15
+
+## Hakyll 4.7.1.0
+
+- Drop old-time, old-locale, time-locale-compat dependencies
+- Add convenicence `pandocBiblioCompiler` (contribution by
+  Matthias C. M. Troffaes)
+- Add support for mediawiki (contribution by Chen Lei)
+
+## Hakyll 4.7.0.0
+
+- Bump pandoc to 1.14. This will break a lot of sites: since the pandoc parser
+  might now return an error message, it is ran inside the `Compiler` monad where
+  we can nicely handle the error.
+
+## Hakyll 4.6.9.0
+
+- Let caller decide exit (fix by Erik Dominikus)
+- Bump pandoc-citeproc dependency
+
+## Hakyll 4.6.8.1
+
+- Fix test suite dependencies
+
+## Hakyll 4.6.8.0
+
+- Fix building on GHC 7.10 (fix by Charles Strahan)
+- Add support for a custom teaser separator (contribution by Tom Sydney
+  Kerckhove)
+- Let Pandoc handle DocBook files (contribution by Joshua SImmons)
+
+## Hakyll 4.6.7.1
+
+- Bump dependencies
+
+## Hakyll 4.6.7.0
+
+- Bump dependencies
+- Fix bug where hakyll-init would create a file called `name.cabal.cabal` (fix
+  by Hans-Peter Deifel)
+
+## Hakyll 4.6.6.0
+
+- Fix compilation error when preview server is disabled (fix by Magnus Therning)
+- Add author name by default to RSS feeds (contribution by Calen Pennington)
+
+## Hakyll 4.6.5.0
+
+- Bump dependencies
+- Fix garbled "Listening on 0.0.0.0:8000" message
+- Add `boolField` (contribution by Ferenc Wágner)
+
+## Hakyll 4.6.4.0
+
+- Fix another dependency handling bug when using snapshots
+- Add `matchMetadata` for examining metadata when defining rules
+
+## Hakyll 4.6.3.0
+
+- Fix dependency handling bug
+
+## Hakyll 4.6.2.0
+
+- Loosen `binary` dependency
+- Make dependency handling more granular so you can depend on specific snapshots
+  of an item
+
+## Hakyll 4.6.1.0
+
+- Bump `fsnotify` and `pandoc-citeproc` dependencies
+- Rewrite polling code a bit
+
+## Hakyll 4.6.0.0
+
+- Added `listFieldWith` function
+- Improved `rulesExtraDependencies` behaviour
+- Changed function syntax in templates from `$foo arg1 arg2$` to
+  `$foo("arg1", "arg2")$`
+- Support parsing date from directory names in addition to file names
+
+## Hakyll 4.5.5.0
+
+- Fix Binary instances for `pandoc` and `pandoc-citeproc`
+- Fix `network-uri` dependency issue
+
+## Hakyll 4.5.4.0
+
+- Fix issue with HTML entities when running `withUrls` and `demoteHeaders`.
+- Generate a cabal file for the initialised site.
+- Add pagination support.
+
+## Hakyll 4.5.3.0
+
+- Bump Pandoc to 1.12.4 to include the org-mode reader.
+
+## Hakyll 4.5.2.0
+
+- Fix rebuilding everything issue with latest directory (contribution by Jorge
+  Israel Peña)
+- Fix issue with `toSiteRoot` (contribution by Izzy Cecil)
+- Fix issue with tag dependencies, slightly improve caching
+
+## Hakyll 4.5.0.0
+
+- Fix issue with syntax highlighting and line numbers (contribution by Adelbert
+  Chang)
+- Improve documentation for `Context` (contribution by Daniil Frumin)
+- Added `IsString` instance for `Template`
+- Added the `pandocCompilerWithTransformM` function (contribution by Daniil
+  Frumin)
+- Make `./site check` return the right exit code (contribution by Andres Loeh)
+- Use OS threads to make `./site watch` work nicely on Windows (contribution by
+  Simonas Kazlauskas)
+- Make the `unixFilter` function work better on windows by calling `shell`
+  (contribution by Collin J. Doering)
+- Add a command-line flag to bind on a user-specified host (contribution by
+  chrisdotcode)
+
+## Hakyll 4.4.3.0
+
+- Fix issue when using `metadataRoute` after other custom routes
+
+## Hakyll 4.4.2.0
+
+- Fix issue where Hakyll would not detect a change if a `.metadata` file was
+  deleted
+
+## Hakyll 4.4.1.0
+
+- Use Pandoc 1.12 highlighting by default
+
+## Hakyll 4.4.0.0
+
+- Update to work with Pandoc 1.12. This changes the type of `readPandocBibilio`:
+  the `CSL` argument is no longer optional (contribution by Jorge Israel Peña)
+
+- Fix incorrect output of `toSiteRoot` on windows (contribution by Saeid
+  Al-Wazzan)
+
+- Add a preview port option to `Configuration` (contribution by Jorge Israel
+  Peña)
+
+- Add `watch` command that polls for changes but does not necessarily launch a
+  server (contribution by Eric Stolten)
+
+- Generalise type of `metadataField`
+
+- Fix issue where metadata was not correctly loaded when using versions
+
+## Hakyll 4.3.3.0
+
+- Re-add the `functionField` function
+
+## Hakyll 4.3.2.0
+
+- Re-add the `mapContext` function
+
+- Unescape internal URLs when using `./site check` (contribution by Marc-Antoine
+  Perennou)
+
+## Hakyll 4.3.1.0
+
+- Make teasers undefined if no `<!--more-->` comment is found
+
+- Sanitize tag URLs (contribution by Simonas Kazlauskas)
+
+## Hakyll 4.3.0.0
+
+- Add conditionals, partials and for loops to the template system (includes a
+  contribution by Ivan N. Veselov)
+
+- Improvements to the preview functionality on windows (contribution by Jorge
+  Israel Peña)
+
+- Add pagination support (contribution by Anton Dubovik)
+
+- Slight speedup for the Hakyll cache (contribution by justnoxx)
+
+- Add teaser functionality (contribution by Ivan N. Veselov)
+
+- Make `./site check` work with scheme-relative URLs (contribution by Simonas
+  Kazlauskas)
+
+- The `./site deploy` command can now be customized with Haskell code
+  (contribution by Samuel Tardieu)
+
+- Use `hsnotify` for proper polling instead of sleep loop on all platforms
+  (contribution by Simonas Kazlauskas)
+
+- More useful debug info available
+
+## Hakyll 4.2.2.0
+
+- Fix issue with `Alternative` instance of `Compiler`
+
+## Hakyll 4.2.1.1
+
+*March 9, 2013*
+
+- Make `http-conduit` dependency optional by adding a `checkExternal` cabal flag
+
+## Hakyll 4.2.1.0
+
+*March 7, 2013*
+
+- Fix issue where `copyFileCompiler` ignored `providerDirectory`
+
+## Hakyll 4.2.0.0
+
+*March 7, 2013*
+
+- Read second extension for `.lhs`, e.g. `.md.lhs` or `.tex.lhs` (contribution
+  by Alexander Vershilov)
+
+- Speedup initialization by using modification times instead of hashing files
+
+- Speedup initialization with a rewritten resource provider
+
+- Fix `./site check` not working with sites that require a user agent (e.g.
+  <http://www.wikipedia.org/>)
+
+- Change `chronological` and `recentFirst` to actually look at the dates of
+  items. This changes their types from:
+
+        chronological, recentFirst :: [Item a] -> [Item a]
+
+    to:
+
+        chronological, recentFirst
+            :: MonadMetadata m => [Item a] -> m [Item a]
+
+    (contribution by Simonas Kazlauskas)
+
+- Add `metadataRoute`, so it is now possible to use metadata when determining
+  routes
+
+- Improve metadata parser for multiline metadata fields (contribution by Peter
+  Jones)
+
+- Add the `getMetadataField` utility
+
+## Hakyll 4.1.4.0
+
+*January 26, 2013*
+
+- Export the flexible `renderTags` function
+
+## Hakyll 4.1.3.0
+
+*January 26, 2013*
+
+- Export the constructor of the `Tags` datatype
+
+## Hakyll 4.1.2.0
+
+*January 20, 2013*
+
+- Fix an issue where a dependency cycle would lead to infinite recursion/stack
+  overflow
+
+## Hakyll 4.1.1.0
+
+*January 20, 2013*
+
+- Fix an issue regarding `relativizeUrls` expanding `<meta />` to
+  `<meta></meta>`
+
+## Hakyll 4.1.0.0
+
+*January 20, 2013*
+
+Update to use Pandoc 1.10, this requires changes to your `site.hs` if you're
+using custom Pandoc options or the `Hakyll.Web.Pandoc.Biblio` module.
+
+- `defaultHakyllParserState` renamed to `defaultHakyllReaderOptions`
+
+- The type of `readPandocBiblio` changed
+
+Because of the many changes, this release is no longer compatible with Pandoc
+1.9.
+
+## Hakyll 4.0.0.0
+
+*January 16, 2013*
+
+The Initial release of Hakyll 4, see
+[this blogpost](http://jaspervdj.be/posts/2013-01-16-hakyll-4.0.html) and
+[the migration guide](/tutorials/hakyll-3-to-hakyll4-migration-guide.html) for
+an overview of changes.
diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:    hakyll
-Version: 4.9.3.0
+Version: 4.9.4.0
 
 Synopsis: A static website compiler library
 Description:
@@ -62,6 +62,7 @@
   templates/rss.xml
 
 Extra-source-files:
+  CHANGELOG.md
   tests/data/example.md
   tests/data/example.md.metadata
   tests/data/images/favicon.ico
@@ -161,7 +162,7 @@
     cryptohash           >= 0.7    && < 0.12,
     data-default         >= 0.4    && < 0.8,
     deepseq              >= 1.3    && < 1.5,
-    directory            >= 1.0    && < 1.3,
+    directory            >= 1.0    && < 1.4,
     filepath             >= 1.0    && < 1.5,
     lrucache             >= 1.1.1  && < 1.3,
     mtl                  >= 1      && < 2.3,
@@ -178,10 +179,10 @@
     scientific           >= 0.3.4  && < 0.4,
     tagsoup              >= 0.13.1 && < 0.15,
     text                 >= 0.11   && < 1.3,
-    time                 >= 1.4    && < 1.7,
+    time                 >= 1.4    && < 1.8,
     time-locale-compat   >= 0.1    && < 0.2,
     unordered-containers >= 0.2    && < 0.3,
-    vector               >= 0.11   && < 0.12,
+    vector               >= 0.11   && < 0.13,
     yaml                 >= 0.8.11 && < 0.9,
     optparse-applicative >= 0.12   && < 0.14
 
@@ -254,7 +255,7 @@
     cryptohash           >= 0.7    && < 0.12,
     data-default         >= 0.4    && < 0.8,
     deepseq              >= 1.3    && < 1.5,
-    directory            >= 1.0    && < 1.3,
+    directory            >= 1.0    && < 1.4,
     filepath             >= 1.0    && < 1.5,
     lrucache             >= 1.1.1  && < 1.3,
     mtl                  >= 1      && < 2.3,
@@ -271,10 +272,10 @@
     scientific           >= 0.3.4  && < 0.4,
     tagsoup              >= 0.13.1 && < 0.15,
     text                 >= 0.11   && < 1.3,
-    time                 >= 1.4    && < 1.7,
+    time                 >= 1.4    && < 1.8,
     time-locale-compat   >= 0.1    && < 0.2,
     unordered-containers >= 0.2    && < 0.3,
-    vector               >= 0.11   && < 0.12,
+    vector               >= 0.11   && < 0.13,
     yaml                 >= 0.8.11 && < 0.9,
     optparse-applicative >= 0.12   && < 0.14
 
@@ -315,7 +316,7 @@
 
   Build-depends:
     base      >= 4   && < 5,
-    directory >= 1.0 && < 1.3,
+    directory >= 1.0 && < 1.4,
     filepath  >= 1.0 && < 1.5
 
   Other-modules:
diff --git a/src/Hakyll/Check.hs b/src/Hakyll/Check.hs
--- a/src/Hakyll/Check.hs
+++ b/src/Hakyll/Check.hs
@@ -8,22 +8,21 @@
 
 
 --------------------------------------------------------------------------------
-import           Control.Monad                (forM_)
-import           Control.Monad.Reader         (ask)
-import           Control.Monad.RWS            (RWST, runRWST)
+import           Control.Monad                (forM_, foldM)
+import           Control.Monad.Reader         (ask, ReaderT, runReaderT)
 import           Control.Monad.Trans          (liftIO)
 import           Control.Monad.Trans.Resource (runResourceT)
-import           Control.Monad.Writer         (tell)
 import           Data.ByteString.Char8        (unpack)
 import           Data.List                    (isPrefixOf)
-import           Data.Set                     (Set)
-import qualified Data.Set                     as S
+import qualified Data.Map.Lazy                as Map
 import           Network.URI                  (unEscapeString)
 import           System.Directory             (doesDirectoryExist,
                                                doesFileExist)
 import           System.Exit                  (ExitCode (..))
 import           System.FilePath              (takeDirectory, takeExtension,
                                                (</>))
+import           Control.Concurrent.MVar      (MVar, newEmptyMVar, putMVar,
+                                               readMVar)
 import qualified Text.HTML.TagSoup            as TS
 
 
@@ -31,7 +30,7 @@
 #ifdef CHECK_EXTERNAL
 import           Control.Exception            (SomeAsyncException (..),
                                                SomeException (..), try, throw)
-import           Control.Monad.State          (get, modify)
+import           Control.Monad.State          (get, modify, StateT, runStateT)
 import           Data.List                    (intercalate)
 import           Data.Typeable                (cast)
 import           Data.Version                 (versionBranch)
@@ -58,11 +57,20 @@
 --------------------------------------------------------------------------------
 check :: Configuration -> Logger -> Check -> IO ExitCode
 check config logger check' = do
-    ((), write) <- runChecker checkDestination config logger check'
-    return $ if checkerFaulty write > 0 then ExitFailure 1 else ExitSuccess
+    ((), state) <- runChecker checkDestination config logger check'
+    failed <- countFailedLinks state
+    return $ if failed > 0 then ExitFailure 1 else ExitSuccess
 
 
 --------------------------------------------------------------------------------
+countFailedLinks :: CheckerState -> IO Int
+countFailedLinks state = foldM addIfFailure 0 (Map.elems state)
+    where addIfFailure failures mvar = do
+              checkerWrite <- readMVar mvar
+              return $ failures + checkerFaulty checkerWrite
+
+
+--------------------------------------------------------------------------------
 data CheckerRead = CheckerRead
     { checkerConfig :: Configuration
     , checkerLogger :: Logger
@@ -85,26 +93,28 @@
 
 
 --------------------------------------------------------------------------------
-type CheckerState = Set String
+type CheckerState = Map.Map URL (MVar CheckerWrite)
 
 
 --------------------------------------------------------------------------------
-type Checker a = RWST CheckerRead CheckerWrite CheckerState IO a
+type Checker a = ReaderT CheckerRead (StateT CheckerState IO) a
 
 
 --------------------------------------------------------------------------------
+type URL = String
+
+
+--------------------------------------------------------------------------------
 runChecker :: Checker a -> Configuration -> Logger -> Check
-           -> IO (a, CheckerWrite)
+           -> IO (a, CheckerState)
 runChecker checker config logger check' = do
     let read' = CheckerRead
                     { checkerConfig = config
                     , checkerLogger = logger
                     , checkerCheck  = check'
                     }
-
-    (x, _, write) <- runRWST checker read' S.empty
     Logger.flush logger
-    return (x, write)
+    runStateT (runReaderT checker read') Map.empty
 
 
 --------------------------------------------------------------------------------
@@ -133,14 +143,31 @@
     let urls = getUrls $ TS.parseTags contents
     forM_ urls $ \url -> do
         Logger.debug logger $ "Checking link " ++ url
-        checkUrl filePath url
+        m <- liftIO newEmptyMVar
+        checkUrlIfNeeded filePath (canonicalizeUrl url) m
+    where
+        -- Check scheme-relative links
+        canonicalizeUrl url = if schemeRelative url then "http:" ++ url else url
+        schemeRelative = isPrefixOf "//"
 
 
 --------------------------------------------------------------------------------
-checkUrl :: FilePath -> String -> Checker ()
+checkUrlIfNeeded :: FilePath -> URL -> MVar CheckerWrite -> Checker ()
+checkUrlIfNeeded filepath url m = do
+    logger     <- checkerLogger           <$> ask
+    needsCheck <- (== All) . checkerCheck <$> ask
+    checked    <- (url `Map.member`)      <$> get
+    if not needsCheck || checked
+        then Logger.debug logger "Already checked, skipping"
+        else do modify $ Map.insert url m
+                checkUrl filepath url
+
+
+--------------------------------------------------------------------------------
+checkUrl :: FilePath -> URL -> Checker ()
 checkUrl filePath url
     | isExternal url  = checkExternalUrl url
-    | hasProtocol url = skip "Unknown protocol, skipping"
+    | hasProtocol url = skip url $ Just "Unknown protocol, skipping"
     | otherwise       = checkInternalUrl filePath url
   where
     validProtoChars = ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'] ++ "+-."
@@ -150,30 +177,45 @@
 
 
 --------------------------------------------------------------------------------
-ok :: String -> Checker ()
-ok _ = tell $ mempty {checkerOk = 1}
+ok :: URL -> Checker ()
+ok url = putCheckResult url mempty {checkerOk = 1}
 
 
 --------------------------------------------------------------------------------
-skip :: String -> Checker ()
-skip reason = do
+skip :: URL -> Maybe String -> Checker ()
+skip url maybeReason = do
     logger <- checkerLogger <$> ask
-    Logger.debug logger $ reason
-    tell $ mempty {checkerOk = 1}
+    case maybeReason of
+        Nothing -> return ()
+        Just reason -> Logger.debug logger reason
+    putCheckResult url mempty {checkerOk = 1}
 
+
 --------------------------------------------------------------------------------
-faulty :: String -> Maybe String -> Checker ()
+faulty :: URL -> Maybe String -> Checker ()
 faulty url reason = do
     logger <- checkerLogger <$> ask
     Logger.error logger $ "Broken link to " ++ show url ++ explanation
-    tell $ mempty {checkerFaulty = 1}
+    putCheckResult url mempty {checkerFaulty = 1}
   where
     formatExplanation = (" (" ++) . (++ ")")
     explanation = maybe "" formatExplanation reason
 
 
 --------------------------------------------------------------------------------
-checkInternalUrl :: FilePath -> String -> Checker ()
+putCheckResult :: URL -> CheckerWrite -> Checker ()
+putCheckResult url result = do
+    state <- get
+    let maybeMVar = Map.lookup url state
+    case maybeMVar of
+        Just m -> liftIO $ putMVar m result
+        Nothing -> do
+            logger <- checkerLogger <$> ask
+            Logger.debug logger "Failed to find existing entry for checked URL"
+
+
+--------------------------------------------------------------------------------
+checkInternalUrl :: FilePath -> URL -> Checker ()
 checkInternalUrl base url = case url' of
     "" -> ok url
     _  -> do
@@ -191,57 +233,46 @@
 
 
 --------------------------------------------------------------------------------
-checkExternalUrl :: String -> Checker ()
+checkExternalUrl :: URL -> Checker ()
 #ifdef CHECK_EXTERNAL
 checkExternalUrl url = do
-    logger     <- checkerLogger           <$> ask
-    needsCheck <- (== All) . checkerCheck <$> ask
-    checked    <- (url `S.member`)        <$> get
-
-    if not needsCheck || checked
-        then Logger.debug logger "Already checked, skipping"
-        else do
-            result <- liftIO $ try $ do
-                mgr <- Http.newManager Http.tlsManagerSettings
-                runResourceT $ do
-                    request  <- Http.parseRequest urlToCheck
-                    response <- Http.http (settings request) mgr
-                    let code = Http.statusCode (Http.responseStatus response)
-                    return $ code >= 200 && code < 300
-
-            modify $ if schemeRelative url
-                         then S.insert urlToCheck . S.insert url
-                         else S.insert url
-            case result of
-                Left (SomeException e) ->
-                    case (cast e :: Maybe SomeAsyncException) of
-                        Just ae -> throw ae
-                        _ -> faulty url (Just $ showException e)
-                Right _ -> ok url
-  where
-    -- Add additional request info
-    settings r = r
-        { Http.method         = "HEAD"
-        , Http.redirectCount  = 10
-        , Http.requestHeaders = ("User-Agent", ua) : Http.requestHeaders r
-        }
-
-    -- Nice user agent info
-    ua = fromString $ "hakyll-check/" ++
-        (intercalate "." $ map show $ versionBranch $ Paths_hakyll.version)
-
-    -- Check scheme-relative links
-    schemeRelative = isPrefixOf "//"
-    urlToCheck     = if schemeRelative url then "http:" ++ url else url
-
-    -- Convert exception to a concise form
-    showException e = case cast e of
-        Just (Http.HttpExceptionRequest _ e') -> show e'
-        _ -> head $ words $ show e
+    result <- requestExternalUrl url
+    case result of
+        Left (SomeException e) ->
+            case (cast e :: Maybe SomeAsyncException) of
+                Just ae -> throw ae
+                _ -> faulty url (Just $ showException e)
+        Right _ -> ok url
+    where
+        -- Convert exception to a concise form
+        showException e = case cast e of
+            Just (Http.HttpExceptionRequest _ e') -> show e'
+            _ -> head $ words $ show e
 #else
-checkExternalUrl _ = return ()
+checkExternalUrl url = skip url Nothing
 #endif
 
+
+--------------------------------------------------------------------------------
+requestExternalUrl :: URL -> Checker (Either SomeException Bool)
+requestExternalUrl url = liftIO $ try $ do
+    mgr <- Http.newManager Http.tlsManagerSettings
+    runResourceT $ do
+        request  <- Http.parseRequest url
+        response <- Http.http (settings request) mgr
+        let code = Http.statusCode (Http.responseStatus response)
+        return $ code >= 200 && code < 300
+    where
+        -- Add additional request info
+        settings r = r
+            { Http.method         = "HEAD"
+            , Http.redirectCount  = 10
+            , Http.requestHeaders = ("User-Agent", ua) : Http.requestHeaders r
+            }
+
+        -- Nice user agent info
+        ua = fromString $ "hakyll-check/" ++
+             (intercalate "." $ map show $ versionBranch Paths_hakyll.version)
 
 
 --------------------------------------------------------------------------------
