diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,6 +1,11 @@
+## 1.4.6
+
+Added the `Yesod.Core.Unsafe` module.
+
 ## 1.4.5
 
 * `envClientSessionBackend`
+* Add `MonadLoggerIO` instances (conditional on monad-logger 0.3.10 being used).
 
 ## 1.4.4.5
 
diff --git a/Yesod/Core.hs b/Yesod/Core.hs
--- a/Yesod/Core.hs
+++ b/Yesod/Core.hs
@@ -61,7 +61,7 @@
       -- * Misc
     , yesodVersion
     , yesodRender
-    , runFakeHandler
+    , Yesod.Core.runFakeHandler
       -- * LiteApp
     , module Yesod.Core.Internal.LiteApp
       -- * Low-level
@@ -121,7 +121,8 @@
 import Yesod.Core.Class.Yesod
 import Yesod.Core.Class.Dispatch
 import Yesod.Core.Class.Breadcrumbs
-import Yesod.Core.Internal.Run (yesodRender, runFakeHandler)
+import Yesod.Core.Internal.Run (yesodRender)
+import qualified Yesod.Core.Internal.Run
 import qualified Paths_yesod_core
 import Data.Version (showVersion)
 import Yesod.Routes.Class
@@ -136,6 +137,15 @@
 import Text.Lucius
 import Text.Julius
 import Network.Wai (Application)
+
+runFakeHandler :: (Yesod site, MonadIO m) =>
+                  SessionMap
+               -> (site -> Logger)
+               -> site
+               -> HandlerT site IO a
+               -> m (Either ErrorResponse a)
+runFakeHandler = Yesod.Core.Internal.Run.runFakeHandler
+{-# DEPRECATED runFakeHandler "import runFakeHandler from Yesod.Core.Unsafe" #-}
 
 -- | Return an 'Unauthorized' value, with the given i18n message.
 unauthorizedI :: (MonadHandler m, RenderMessage (HandlerSite m) msg) => msg -> m AuthResult
diff --git a/Yesod/Core/Internal/Run.hs b/Yesod/Core/Internal/Run.hs
--- a/Yesod/Core/Internal/Run.hs
+++ b/Yesod/Core/Internal/Run.hs
@@ -247,7 +247,6 @@
           }
   _ <- runResourceT $ yapp fakeRequest
   I.readIORef ret
-{-# WARNING runFakeHandler "Usually you should *not* use runFakeHandler unless you really understand how it works and why you need it." #-}
 
 yesodRunner :: (ToTypedContent res, Yesod site)
             => HandlerT site IO res
diff --git a/Yesod/Core/Unsafe.hs b/Yesod/Core/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/Yesod/Core/Unsafe.hs
@@ -0,0 +1,23 @@
+-- | This is designed to be used as
+--
+-- > qualified import Yesod.Core.Unsafe as Unsafe
+--
+-- This serves as a reminder that the functions are unsafe to use in many situations.
+module Yesod.Core.Unsafe (runFakeHandler, fakeHandlerGetLogger) where
+
+import Yesod.Core.Internal.Run (runFakeHandler)
+
+import Yesod.Core.Types
+import Yesod.Core.Class.Yesod
+import Data.Monoid            (mempty, mappend)
+import Control.Monad.IO.Class (MonadIO)
+
+-- | designed to be used as
+--
+-- > unsafeHandler = Unsafe.fakeHandlerGetLogger appLogger
+fakeHandlerGetLogger :: (Yesod site, MonadIO m)
+                     => (site -> Logger) -> site -> HandlerT site IO a -> m a
+fakeHandlerGetLogger getLogger app f =
+     runFakeHandler mempty getLogger app f
+ >>= either (error . ("runFakeHandler issue: " `mappend`) . show)
+            return
diff --git a/yesod-core.cabal b/yesod-core.cabal
--- a/yesod-core.cabal
+++ b/yesod-core.cabal
@@ -1,5 +1,5 @@
 name:            yesod-core
-version:         1.4.5
+version:         1.4.6
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -77,6 +77,7 @@
                      Yesod.Core.Widget
                      Yesod.Core.Internal
                      Yesod.Core.Types
+                     Yesod.Core.Unsafe
                      Yesod.Routes.TH.Types
     other-modules:   Yesod.Core.Internal.Session
                      Yesod.Core.Internal.Request
