diff --git a/Database/Persist/Sqlite.hs b/Database/Persist/Sqlite.hs
--- a/Database/Persist/Sqlite.hs
+++ b/Database/Persist/Sqlite.hs
@@ -18,15 +18,16 @@
 import Data.List (intercalate)
 import Data.IORef
 import qualified Data.Map as Map
-import Control.Monad.Invert (MonadInvertIO, finally)
+import Control.Monad.IO.Peel (MonadPeelIO)
+import Control.Exception.Peel (finally)
 
-withSqlitePool :: MonadInvertIO m
+withSqlitePool :: MonadPeelIO m
                => String
                -> Int -- ^ number of connections to open
                -> (ConnectionPool -> m a) -> m a
 withSqlitePool s = withSqlPool $ open' s
 
-withSqliteConn :: MonadInvertIO m => String -> (Connection -> m a) -> m a
+withSqliteConn :: MonadPeelIO m => String -> (Connection -> m a) -> m a
 withSqliteConn = withSqlConn . open'
 
 open' :: String -> IO Connection
@@ -49,6 +50,7 @@
     helper t getter = do
         stmt <- getter t
         execute stmt []
+        reset stmt
 
 prepare' :: Sqlite.Connection -> String -> IO Statement
 prepare' conn sql = do
@@ -81,7 +83,7 @@
     Sqlite.Done <- Sqlite.step stmt
     return ()
 
-withStmt' :: MonadInvertIO m
+withStmt' :: MonadPeelIO m
           => Sqlite.Statement
           -> [PersistValue]
           -> (RowPopper m -> m a)
diff --git a/Database/Sqlite.hs b/Database/Sqlite.hs
--- a/Database/Sqlite.hs
+++ b/Database/Sqlite.hs
@@ -29,10 +29,12 @@
 import qualified Prelude
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Internal as BSI
-import qualified Data.ByteString.UTF8 as UTF8
 import Foreign
 import Foreign.C
 import Database.Persist.Base (PersistValue (..))
+import Data.Text (pack, unpack)
+import Data.Text.Encoding (encodeUtf8, decodeUtf8With)
+import Data.Text.Encoding.Error (lenientDecode)
 
 newtype Connection = Connection (Ptr ())
 newtype Statement = Statement (Ptr ())
@@ -123,8 +125,14 @@
 errmsg (Connection database) = do
   message <- errmsgC database
   byteString <- BS.packCString message
-  return $ UTF8.toString byteString
+  return $ toString byteString
 
+toString :: BSI.ByteString -> String
+toString = unpack . decodeUtf8With lenientDecode
+
+fromString :: String -> BSI.ByteString
+fromString = encodeUtf8 . pack
+
 sqlError :: Maybe Connection -> String -> Error -> IO a
 sqlError maybeConnection functionName error = do
   details <- case maybeConnection of
@@ -140,7 +148,7 @@
   openC :: CString -> Ptr (Ptr ()) -> IO Int
 openError :: String -> IO (Either Connection Error)
 openError path' = do
-  BS.useAsCString (UTF8.fromString path')
+  BS.useAsCString (fromString path')
                   (\path -> do
                      alloca (\database -> do
                                error' <- openC path database
@@ -174,7 +182,7 @@
   prepareC :: Ptr () -> CString -> Int -> Ptr (Ptr ()) -> Ptr (Ptr ()) -> IO Int
 prepareError :: Connection -> String -> IO (Either Statement Error)
 prepareError (Connection database) text' = do
-  BS.useAsCString (UTF8.fromString text')
+  BS.useAsCString (fromString text')
                   (\text -> do
                      alloca (\statement -> do
                                error' <- prepareC database text (-1) statement nullPtr
@@ -216,7 +224,7 @@
   error <- resetError statement
   case error of
     ErrorOK -> return ()
-    _ -> return () -- sqlError Nothing "reset" error
+    _ -> return () -- FIXME confirm this is correct sqlError Nothing "reset" error
 
 foreign import ccall "sqlite3_finalize"
   finalizeC :: Ptr () -> IO Int
@@ -304,7 +312,7 @@
   bindTextC :: Ptr () -> Int -> CString -> Int -> Ptr () -> IO Int
 bindTextError :: Statement -> Int -> String -> IO Error
 bindTextError (Statement statement) parameterIndex text = do
-  byteString <- return $ UTF8.fromString text
+  byteString <- return $ fromString text
   size <- return $ BS.length byteString
   BS.useAsCString byteString
                   (\dataC -> do
@@ -374,7 +382,7 @@
 columnText (Statement statement) columnIndex = do
   text <- columnTextC statement columnIndex
   byteString <- BS.packCString text
-  return $ UTF8.toString byteString
+  return $ toString byteString
 
 foreign import ccall "sqlite3_column_count"
   columnCountC :: Ptr () -> IO Int
diff --git a/persistent-sqlite.cabal b/persistent-sqlite.cabal
--- a/persistent-sqlite.cabal
+++ b/persistent-sqlite.cabal
@@ -1,12 +1,12 @@
 name:            persistent-sqlite
-version:         0.3.0.1
+version:         0.4.0
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
 maintainer:      Michael Snoyman <michael@snoyman.com>
 synopsis:        Backend for the persistent library using sqlite3.
 description:     This package includes a thin sqlite3 wrapper based on the direct-sqlite package, as well as the entire C library, so there are no system dependencies.
-category:        Database
+category:        Database, Yesod
 stability:       Stable
 cabal-version:   >= 1.6
 build-type:      Simple
@@ -17,14 +17,14 @@
   default: False
 
 library
-    build-depends:   base >= 4 && < 5,
-                     template-haskell >= 2.4 && < 2.6,
-                     bytestring >= 0.9.1 && < 0.10,
-                     transformers >= 0.2.1 && < 0.3,
-                     utf8-string >= 0.3.4 && < 0.4,
-                     persistent >= 0.3.0 && < 0.4,
-                     neither >= 0.1 && < 0.2,
-                     containers >= 0.2 && < 0.5
+    build-depends:   base                    >= 4         && < 5
+                   , template-haskell
+                   , bytestring              >= 0.9.1     && < 0.10
+                   , transformers            >= 0.2.1     && < 0.3
+                   , persistent              >= 0.4       && < 0.5
+                   , monad-peel              >= 0.1       && < 0.2
+                   , containers              >= 0.2       && < 0.5
+                   , text                    >= 0.7       && < 0.12
     exposed-modules: Database.Sqlite
                      Database.Persist.Sqlite
     ghc-options:     -Wall
