diff --git a/apiary-persistent.cabal b/apiary-persistent.cabal
--- a/apiary-persistent.cabal
+++ b/apiary-persistent.cabal
@@ -1,5 +1,5 @@
 name:                apiary-persistent
-version:             0.16.0
+version:             0.17.0
 synopsis:            persistent support for apiary web framework.
 description:
   example: <https://github.com/philopon/apiary/blob/master/examples/persistent.hs>
@@ -21,8 +21,8 @@
   build-depends:       base               >=4.6  && <4.8
                      , persistent         >=2.0  && <2.1
 
-                     , apiary             >=0.16 && <0.17
-                     , apiary-logger      >=0.16 && <0.17
+                     , apiary             >=0.17 && <0.18
+                     , apiary-logger      >=0.17 && <0.18
 
                      , resourcet          >=1.1  && <1.2
                      , resource-pool      >=0.2  && <0.3
@@ -31,6 +31,7 @@
                      , transformers       >=0.2  && <0.5
                      , transformers-base  >=0.4  && <0.5
                      , monad-control      >=0.3  && <0.4
+                     , persistent-sqlite
   hs-source-dirs:      src
   ghc-options:         -O2 -Wall
   default-language:    Haskell2010
diff --git a/src/Web/Apiary/Database/Persist.hs b/src/Web/Apiary/Database/Persist.hs
--- a/src/Web/Apiary/Database/Persist.hs
+++ b/src/Web/Apiary/Database/Persist.hs
@@ -10,6 +10,7 @@
 {-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 module Web.Apiary.Database.Persist
     ( Persist
@@ -54,15 +55,13 @@
 
 type With c m = forall a. (c -> m a) -> m a
 
-initPersist' :: (MonadIO n, MonadBaseControl IO n)
-             => (forall a. Extensions exts -> n a -> m a)
-             -> With Connection n
-             -> Migrator
-             -> Initializer exts m (Persist ': exts)
-initPersist' run with migr = Initializer $ \e ->
-    run e $ with $ \conn -> do
+initPersist' :: (MonadIO n, MonadBaseControl IO n) 
+             => (forall a. m a -> n a) -> (forall a. Extensions exts -> n a -> m a)
+             -> With Connection n -> Migrator -> Initializer m exts (Persist ': exts)
+initPersist' wrap run with migr = Initializer $ \es m -> run es $
+    with $ \conn -> do
         doMigration migr conn
-        return $ addExtension (PersistConn conn) e
+        wrap $ m (addExtension (PersistConn conn) es)
 
 -- | construct persist extension initializer with no connection pool.
 --
@@ -71,35 +70,33 @@
 -- @
 -- initPersist (withSqliteConn "db.sqlite") migrateAll
 -- @
-initPersist :: (MonadIO m, MonadBaseControl IO m, Has Logger exts)
+initPersist :: (MonadIO m, MonadBaseControl IO m) 
             => With Connection (LogWrapper exts m) -> Migration
-            -> Initializer exts m (Persist ': exts)
-initPersist w = initPersist' runLogWrapper w . Logging
+            -> Initializer m exts (Persist ': exts)
+initPersist with = initPersist' logWrapper runLogWrapper with . Logging
 
-initPersistNoLog :: (MonadIO m, MonadBaseControl IO m)
+initPersistNoLog :: (MonadIO m, MonadBaseControl IO m) 
                  => With Connection (NoLoggingT m)
-                 -> Migration -> Initializer es m (Persist ': es)
-initPersistNoLog w = initPersist' (const runNoLoggingT) w . Silent
+                 -> Migration -> Initializer m es (Persist ': es)
+initPersistNoLog with = initPersist' NoLoggingT (const runNoLoggingT) with . Silent
 
 initPersistPool' :: (MonadIO n, MonadBaseControl IO n)
-                 => (forall a. Extensions exts -> n a -> m a)
-                 -> With ConnectionPool n
-                 -> Migrator
-                 -> Initializer exts m (Persist ': exts)
-initPersistPool' run with migr = Initializer $ \e ->
-    run e $ with $ \pool -> do
+                 => (forall a. m a -> n a) -> (forall a. Extensions exts -> n a -> m a)
+                 -> With ConnectionPool n -> Migrator -> Initializer m exts (Persist ': exts)
+initPersistPool' wrap run with migr = Initializer $ \es m -> run es $
+    with $ \pool -> do
         withResource pool $ doMigration migr
-        return $ addExtension (PersistPool pool) e
+        wrap $ m (addExtension (PersistPool pool) es)
 
-initPersistPool :: (MonadIO m, MonadBaseControl IO m, Has Logger exts)
+initPersistPool :: (MonadIO m, MonadBaseControl IO m)
                 => With ConnectionPool (LogWrapper exts m) -> Migration
-                -> Initializer exts m (Persist ': exts)
-initPersistPool w = initPersistPool' runLogWrapper w . Logging
+                -> Initializer m exts (Persist ': exts)
+initPersistPool with = initPersistPool' logWrapper runLogWrapper with . Logging
 
 initPersistPoolNoLog :: (MonadIO m, MonadBaseControl IO m)
-                     => With ConnectionPool (NoLoggingT m) -> Migration
-                     -> Initializer exts m (Persist ': exts)
-initPersistPoolNoLog w = initPersistPool' (const runNoLoggingT) w . Silent
+                     => With ConnectionPool (NoLoggingT m)
+                     -> Migration -> Initializer m es (Persist ': es)
+initPersistPoolNoLog with = initPersistPool' NoLoggingT (const runNoLoggingT) with . Silent
 
 doMigration :: (MonadIO m, MonadBaseControl IO m) => Migrator -> Connection -> m ()
 doMigration migr conn = case migr of
