diff --git a/apiary-logger.cabal b/apiary-logger.cabal
--- a/apiary-logger.cabal
+++ b/apiary-logger.cabal
@@ -1,5 +1,5 @@
 name:                apiary-logger
-version:             0.8.0.0
+version:             0.9.0.0
 synopsis:            fast-logger support for apiary web framework.
 description:
   example: <https://github.com/philopon/apiary/blob/master/examples/persistent.hs>
@@ -20,13 +20,13 @@
   exposed-modules:     Web.Apiary.Logger
   other-modules:       Web.Apiary.Logger.Internal
   build-depends:       base               >=4.6   && <4.8
-                     , apiary             >=0.8   && <0.9
+                     , apiary             >=0.8   && <0.10
                      , fast-logger        >=2.1   && <2.2
                      , monad-logger       >=0.3   && <0.4
                      , reflection         >=1.4   && <1.5
                      , data-default-class >=0.0   && <0.1
                      , monad-control      >=0.3   && <0.4
-                     , mtl                >=2.1   && <2.2
+                     , mtl                >=2.1   && <2.3
                      , transformers-base  >=0.4   && <0.5
   hs-source-dirs:      src
   ghc-options:         -O2 -Wall
diff --git a/src/Web/Apiary/Logger.hs b/src/Web/Apiary/Logger.hs
--- a/src/Web/Apiary/Logger.hs
+++ b/src/Web/Apiary/Logger.hs
@@ -1,6 +1,15 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+
 module Web.Apiary.Logger (
     -- * configuration
-    LogDest(..), LogConfig(..), HasLogger
+    I.LogDest(..), I.LogConfig(..), HasLogger
     -- * initialize
     , withLogger
     , withLogger'
@@ -13,5 +22,55 @@
     , module Data.Default.Class
     ) where
 
-import Web.Apiary.Logger.Internal
+import qualified Web.Apiary.Logger.Internal as I
+import Web.Apiary
+
+import System.Log.FastLogger
+
+import Control.Applicative
+import Control.Monad
+import Control.Monad.Base
+import Control.Monad.Trans
+import Control.Monad.Trans.Control
+import Control.Monad.Logger
+
 import Data.Default.Class
+import Data.Reflection
+
+type HasLogger = Given I.Logger
+
+withLogger :: I.LogConfig -> (HasLogger => IO a) -> IO a
+withLogger c m = I.withLogger c (\l -> give l m)
+
+withLogger' :: I.LogConfig -> (((HasLogger => r) -> r) -> IO a) -> IO a
+withLogger' c m = I.withLogger c (\l -> m (give l))
+
+logging :: (MonadIO m, HasLogger) => LogStr -> ActionT m ()
+logging = I.logging given
+
+newtype GivenLoggerT m a = GivenLoggerT { runGivenLoggerT :: m a }
+    deriving(Functor, Applicative, Monad, MonadIO)
+
+instance MonadBase b m => MonadBase b (GivenLoggerT m) where
+    liftBase = GivenLoggerT . liftBase
+
+instance MonadTrans GivenLoggerT where
+    lift = GivenLoggerT
+
+instance MonadBaseControl b m => MonadBaseControl b (GivenLoggerT m) where
+    newtype StM (GivenLoggerT m) a = StMGivenLogger { unStMGivenLogger :: ComposeSt GivenLoggerT m a }
+    liftBaseWith = defaultLiftBaseWith StMGivenLogger
+    restoreM     = defaultRestoreM   unStMGivenLogger
+
+instance MonadTransControl GivenLoggerT where
+    newtype StT GivenLoggerT a = StGivenLogger { unStGivenLogger :: a }
+    liftWith f = GivenLoggerT $ f $ liftM StGivenLogger . runGivenLoggerT
+    restoreT   = GivenLoggerT . liftM unStGivenLogger
+
+instance (MonadIO m, HasLogger) => MonadLogger (GivenLoggerT m) where
+    monadLoggerLog loc src lv msg = GivenLoggerT . liftIO $
+        I.pushLog given (defaultLogStr loc src lv (toLogStr msg))
+
+instance (MonadIO m, HasLogger) => MonadLogger (ActionT m) where
+    monadLoggerLog loc src lv msg =
+        I.logging given $ defaultLogStr loc src lv (toLogStr msg)
diff --git a/src/Web/Apiary/Logger/Internal.hs b/src/Web/Apiary/Logger/Internal.hs
--- a/src/Web/Apiary/Logger/Internal.hs
+++ b/src/Web/Apiary/Logger/Internal.hs
@@ -10,16 +10,9 @@
 
 module Web.Apiary.Logger.Internal where
 
-import Control.Applicative
 import Web.Apiary hiding (Default(..))
 import System.Log.FastLogger
-import Control.Monad
-import Control.Monad.Base
-import Control.Monad.Trans
-import Control.Monad.Logger
-import Control.Monad.Trans.Control
 import Control.Exception
-import Data.Reflection
 import Data.Default.Class
 
 data LogDest
@@ -41,8 +34,6 @@
 instance Default LogConfig where
     def = LogConfig defaultBufSize Stderr
 
-type HasLogger = Given Logger
-
 newLogger :: BufSize -> LogDest -> IO Logger
 newLogger s (File p) = newFileLoggerSet s p >>= \l -> 
     return $ Logger (pushLogStr l) (flushLogStr l)
@@ -52,45 +43,12 @@
     return $ Logger (pushLogStr l) (flushLogStr l)
 newLogger _ Null = return $ Logger (\_ -> return ()) (return ())
 
-withLogger :: LogConfig -> (HasLogger => IO a) -> IO a
+withLogger :: LogConfig -> (Logger -> IO a) -> IO a
 withLogger LogConfig{..} m = bracket
     (newLogger bufferSize logDest)
     closeLog
-    (\l -> give l m)
-
-withLogger' :: LogConfig
-            -> ((forall r. (HasLogger => r) -> r) -> IO a) -> IO a
-withLogger' LogConfig{..} m = bracket
-    (newLogger bufferSize logDest)
-    closeLog
-    (\l -> m (give l))
-
-logging :: (MonadIO m, HasLogger) => LogStr -> ActionT m ()
-logging msg = liftIO $ pushLog given msg
-
-newtype GivenLoggerT m a = GivenLoggerT { runGivenLoggerT :: m a }
-    deriving(Functor, Applicative, Monad, MonadIO)
-
-instance MonadBase b m => MonadBase b (GivenLoggerT m) where
-    liftBase = GivenLoggerT . liftBase
-
-instance MonadTrans GivenLoggerT where
-    lift = GivenLoggerT
-
-instance MonadBaseControl b m => MonadBaseControl b (GivenLoggerT m) where
-    newtype StM (GivenLoggerT m) a = StMGivenLogger { unStMGivenLogger :: ComposeSt GivenLoggerT m a }
-    liftBaseWith = defaultLiftBaseWith StMGivenLogger
-    restoreM     = defaultRestoreM   unStMGivenLogger
-
-instance MonadTransControl GivenLoggerT where
-    newtype StT GivenLoggerT a = StGivenLogger { unStGivenLogger :: a }
-    liftWith f = GivenLoggerT $ f $ liftM StGivenLogger . runGivenLoggerT
-    restoreT   = GivenLoggerT . liftM unStGivenLogger
+    (\l -> m l)
 
-instance (MonadIO m, HasLogger) => MonadLogger (GivenLoggerT m) where
-    monadLoggerLog loc src lv msg = GivenLoggerT . liftIO $
-        pushLog given (defaultLogStr loc src lv (toLogStr msg))
+logging :: MonadIO m => Logger -> LogStr -> ActionT m ()
+logging logger msg = liftIO $ pushLog logger msg
 
-instance (MonadIO m, HasLogger) => MonadLogger (ActionT m) where
-    monadLoggerLog loc src lv msg =
-        logging $ defaultLogStr loc src lv (toLogStr msg)
