diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # CHANGELOG
 
+## 3.5.0
+### Changed
+* Copatibility with ghc-8.4
+* Drop dependency from `derive`
+### Fixed
+* Implemented method `hlocal`
+
 ## 3.4.0
 ### Removed
 * Drop `EitherT` support
diff --git a/postgresql-query.cabal b/postgresql-query.cabal
--- a/postgresql-query.cabal
+++ b/postgresql-query.cabal
@@ -1,5 +1,5 @@
 name:                postgresql-query
-version:             3.4.0
+version:             3.5.0
 
 synopsis: Sql interpolating quasiquote plus some kind of primitive ORM
           using it
@@ -41,6 +41,7 @@
                  , Database.PostgreSQL.Query.TH.Row
                  , Database.PostgreSQL.Query.TH.SqlExp
                  , Database.PostgreSQL.Query.Types
+  other-modules:   Database.PostgreSQL.Query.Import
 
   default-extensions: AutoDeriveTypeable
                     , CPP
@@ -117,10 +118,10 @@
                     , QuasiQuotes
                     , TemplateHaskell
 
-  build-depends: QuickCheck
+  build-depends: base                          >=4.6 && < 5
+               , QuickCheck
                , attoparsec
-               , base                          >=4.6 && < 5
-               , derive
+               , generic-arbitrary
                , postgresql-query
                , postgresql-simple
                , quickcheck-assertions
diff --git a/src/Database/PostgreSQL/Query/Entity/Class.hs b/src/Database/PostgreSQL/Query/Entity/Class.hs
--- a/src/Database/PostgreSQL/Query/Entity/Class.hs
+++ b/src/Database/PostgreSQL/Query/Entity/Class.hs
@@ -3,8 +3,7 @@
        , Ent
        ) where
 
-import Data.Proxy
-import Data.Typeable ( Typeable )
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.Types
 
 -- | Auxiliary typeclass for data types which can map to rows of some
diff --git a/src/Database/PostgreSQL/Query/Entity/Functions.hs b/src/Database/PostgreSQL/Query/Entity/Functions.hs
--- a/src/Database/PostgreSQL/Query/Entity/Functions.hs
+++ b/src/Database/PostgreSQL/Query/Entity/Functions.hs
@@ -14,14 +14,11 @@
   , pgSelectCount
   ) where
 
-import Control.Monad.Logger
 import Data.Int ( Int64 )
-import Data.Maybe ( listToMaybe )
-import Data.Proxy ( Proxy(..) )
-import Data.Typeable ( Typeable )
 import Database.PostgreSQL.Query.Entity.Class
 import Database.PostgreSQL.Query.Entity.Internal
 import Database.PostgreSQL.Query.Functions
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.SqlBuilder
 import Database.PostgreSQL.Query.TH
     ( sqlExp )
@@ -29,10 +26,6 @@
 import Database.PostgreSQL.Simple
 import Database.PostgreSQL.Simple.FromField
 import Database.PostgreSQL.Simple.ToField
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
 
 import qualified Data.List as L
 import qualified Data.List.NonEmpty as NL
diff --git a/src/Database/PostgreSQL/Query/Entity/Internal.hs b/src/Database/PostgreSQL/Query/Entity/Internal.hs
--- a/src/Database/PostgreSQL/Query/Entity/Internal.hs
+++ b/src/Database/PostgreSQL/Query/Entity/Internal.hs
@@ -9,10 +9,8 @@
   , entityToMR
   ) where
 
-import Data.List.NonEmpty ( NonEmpty )
-import Data.Monoid
-import Data.Proxy ( Proxy(..) )
 import Database.PostgreSQL.Query.Entity.Class
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.Internal
 import Database.PostgreSQL.Query.SqlBuilder
     ( SqlBuilder, ToSqlBuilder(..), mkValue )
diff --git a/src/Database/PostgreSQL/Query/Functions.hs b/src/Database/PostgreSQL/Query/Functions.hs
--- a/src/Database/PostgreSQL/Query/Functions.hs
+++ b/src/Database/PostgreSQL/Query/Functions.hs
@@ -14,12 +14,8 @@
        , pgRepsertRow
        ) where
 
-import Control.Monad
-import Control.Monad.Base
-import Control.Monad.Logger
-import Control.Monad.Trans.Control
 import Data.Int ( Int64 )
-import Data.Monoid
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.Internal
 import Database.PostgreSQL.Query.SqlBuilder
 import Database.PostgreSQL.Query.TH
diff --git a/src/Database/PostgreSQL/Query/Import.hs b/src/Database/PostgreSQL/Query/Import.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/PostgreSQL/Query/Import.hs
@@ -0,0 +1,27 @@
+-- | Module for internal usage. Just reexports and some compatibility
+-- stuff
+
+module Database.PostgreSQL.Query.Import
+  ( module X
+  ) where
+
+import Control.Applicative as X
+import Control.Monad as X
+import Control.Monad.Base as X
+import Control.Monad.Catch as X
+import Control.Monad.Logger as X
+import Control.Monad.Trans.Control as X
+import Data.List.NonEmpty as X (NonEmpty)
+import Data.Maybe as X
+import Data.Proxy as X
+import Data.String as X
+import Data.Text as X (Text)
+import Data.Typeable as X
+import GHC.Generics as X (Generic)
+
+#if MIN_VERSION_base(4,8,0)
+import Data.Semigroup as X
+#else
+import Data.Monoid as X
+import Data.Semigroup as X
+#endif
diff --git a/src/Database/PostgreSQL/Query/Internal.hs b/src/Database/PostgreSQL/Query/Internal.hs
--- a/src/Database/PostgreSQL/Query/Internal.hs
+++ b/src/Database/PostgreSQL/Query/Internal.hs
@@ -9,11 +9,6 @@
 import Database.PostgreSQL.Query.TH
 import Database.PostgreSQL.Query.Types
 
-#if !MIN_VERSION_base(4,8,0)
-import Data.Monoid
-#endif
-
-
 import qualified Data.List as L
 
 {- $setup
diff --git a/src/Database/PostgreSQL/Query/SqlBuilder/Builder.hs b/src/Database/PostgreSQL/Query/SqlBuilder/Builder.hs
--- a/src/Database/PostgreSQL/Query/SqlBuilder/Builder.hs
+++ b/src/Database/PostgreSQL/Query/SqlBuilder/Builder.hs
@@ -14,19 +14,14 @@
 
 import Blaze.ByteString.Builder (Builder)
 import Data.ByteString (ByteString)
-import Data.Semigroup
 import Data.String
 import Data.Typeable
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.SqlBuilder.Types
 import Database.PostgreSQL.Simple
 import Database.PostgreSQL.Simple.Internal
 import Database.PostgreSQL.Simple.ToField
 import Database.PostgreSQL.Simple.Types
-import GHC.Generics (Generic)
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
 
 import qualified Blaze.ByteString.Builder as BB
 import qualified Blaze.ByteString.Builder.Char.Utf8 as BB
diff --git a/src/Database/PostgreSQL/Query/SqlBuilder/Types.hs b/src/Database/PostgreSQL/Query/SqlBuilder/Types.hs
--- a/src/Database/PostgreSQL/Query/SqlBuilder/Types.hs
+++ b/src/Database/PostgreSQL/Query/SqlBuilder/Types.hs
@@ -11,10 +11,7 @@
 
 
 import Blaze.ByteString.Builder (Builder)
-import Data.Semigroup
-import Data.String
-import Data.Typeable
-import GHC.Generics (Generic)
+import Database.PostgreSQL.Query.Import
 import Language.Haskell.TH.Lift
 
 import qualified Blaze.ByteString.Builder as BB
diff --git a/src/Database/PostgreSQL/Query/TH/Common.hs b/src/Database/PostgreSQL/Query/TH/Common.hs
--- a/src/Database/PostgreSQL/Query/TH/Common.hs
+++ b/src/Database/PostgreSQL/Query/TH/Common.hs
@@ -6,8 +6,6 @@
   , dataConstructors
   ) where
 
-import Prelude
-
 import Language.Haskell.TH
 
 -- | Return constructor name
diff --git a/src/Database/PostgreSQL/Query/TH/Entity.hs b/src/Database/PostgreSQL/Query/TH/Entity.hs
--- a/src/Database/PostgreSQL/Query/TH/Entity.hs
+++ b/src/Database/PostgreSQL/Query/TH/Entity.hs
@@ -3,23 +3,18 @@
   , deriveEntity
   ) where
 
-import Prelude
-
 import Data.Default
-import Data.Text (Text, pack, unpack)
 import Database.PostgreSQL.Query.Entity.Class
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.TH.Common
 import Database.PostgreSQL.Query.Types ( FN(..), textFN )
 import Database.PostgreSQL.Simple.FromField
 import Database.PostgreSQL.Simple.ToField
-import GHC.Generics (Generic)
 import Language.Haskell.TH
 import Language.Haskell.TH.Syntax
 import Text.Inflections
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
+import qualified Data.Text as T
 
 -- | Options for deriving `Entity`
 data EntityOptions = EntityOptions
@@ -31,7 +26,7 @@
 
 #if !MIN_VERSION_inflections(0,3,0)
 toUnderscore' :: Text -> Text
-toUnderscore' = pack . toUnderscore . unpack
+toUnderscore' = T.pack . toUnderscore . T.unpack
 #else
 toUnderscore' :: Text -> Text
 toUnderscore' = either error' id . toUnderscore
@@ -113,8 +108,8 @@
         iddec = NewtypeInstD [] entityIdName [ConT tname]
                 idcon (eoDeriveClasses opts)
 #endif
-        tblName = eoTableName opts $ pack tnames
-        fldNames = map (eoColumnNames opts . pack . nameBase)
+        tblName = eoTableName opts $ T.pack tnames
+        fldNames = map (eoColumnNames opts . T.pack . nameBase)
                    $ cFieldNames tcon
     VarE ntableName  <- [e|tableName|]
     VarE nfieldNames <- [e|fieldNames|]
diff --git a/src/Database/PostgreSQL/Query/TH/Enum.hs b/src/Database/PostgreSQL/Query/TH/Enum.hs
--- a/src/Database/PostgreSQL/Query/TH/Enum.hs
+++ b/src/Database/PostgreSQL/Query/TH/Enum.hs
@@ -11,11 +11,6 @@
 import Database.PostgreSQL.Simple.ToField
 import Language.Haskell.TH
 
-#if !MIN_VERSION_base(4,8,0)
-import Data.Traversable
-import Control.Applicative
-#endif
-
 import qualified Data.Text.Encoding as T
 import qualified Data.Text as T
 
diff --git a/src/Database/PostgreSQL/Query/TH/Row.hs b/src/Database/PostgreSQL/Query/TH/Row.hs
--- a/src/Database/PostgreSQL/Query/TH/Row.hs
+++ b/src/Database/PostgreSQL/Query/TH/Row.hs
@@ -3,16 +3,10 @@
   , deriveToRow
   ) where
 
-import Prelude
-
 import Database.PostgreSQL.Query.TH.Common
 import Database.PostgreSQL.Simple.FromRow ( FromRow(..), field )
 import Database.PostgreSQL.Simple.ToRow ( ToRow(..) )
 import Language.Haskell.TH
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
 
 {-| Derive 'FromRow' instance. i.e. you have type like that
 
diff --git a/src/Database/PostgreSQL/Query/TH/SqlExp.hs b/src/Database/PostgreSQL/Query/TH/SqlExp.hs
--- a/src/Database/PostgreSQL/Query/TH/SqlExp.hs
+++ b/src/Database/PostgreSQL/Query/TH/SqlExp.hs
@@ -12,26 +12,24 @@
        , sqlExpEmbed
        , sqlExpFile
        ) where
+
 import Prelude hiding (takeWhile)
 
-import Control.Applicative
-import Control.Monad ( when )
 import Data.Attoparsec.Combinator
 import Data.Attoparsec.Text
 import Data.Char ( isSpace )
 import Data.FileEmbed ( bsToExp )
-import Data.Maybe
-import Data.Monoid
-import Data.Text ( Text )
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.SqlBuilder
+import Language.Haskell.TH
+import Language.Haskell.TH.Quote
+import Language.Haskell.TH.Syntax
+
 #if MIN_VERSION_haskell_src_meta(0,8,0)
 import Language.Haskell.Meta.Parse
 #else
 import Language.Haskell.Meta.Parse.Careful
 #endif
-import Language.Haskell.TH
-import Language.Haskell.TH.Quote
-import Language.Haskell.TH.Syntax
 
 import qualified Data.ByteString as B
 import qualified Data.Text as T
diff --git a/src/Database/PostgreSQL/Query/Types.hs b/src/Database/PostgreSQL/Query/Types.hs
--- a/src/Database/PostgreSQL/Query/Types.hs
+++ b/src/Database/PostgreSQL/Query/Types.hs
@@ -16,11 +16,6 @@
        , ToMarkedRow(..)
        ) where
 
-import Control.Applicative
-import Control.Monad
-import Control.Monad.Base ( MonadBase(..) )
-import Control.Monad.Catch
-    ( MonadThrow, MonadMask, MonadCatch )
 import Control.Monad.Cont.Class ( MonadCont )
 import Control.Monad.Error.Class ( MonadError )
 import Control.Monad.Fix ( MonadFix(..) )
@@ -39,22 +34,17 @@
 import Data.HSet
 import Data.Pool
 import Data.String
-import Data.Text ( Text )
 import Data.Typeable
+import Database.PostgreSQL.Query.Import
 import Database.PostgreSQL.Query.SqlBuilder
 import Database.PostgreSQL.Query.TH.SqlExp
 import Database.PostgreSQL.Simple
 import Database.PostgreSQL.Simple.FromField
 import Database.PostgreSQL.Simple.ToField
 import Database.PostgreSQL.Simple.Types
-import GHC.Generics
 import Instances.TH.Lift ()
 import Language.Haskell.TH.Lift ( deriveLift )
 
-#if !MIN_VERSION_base(4,8,0)
-import Data.Monoid
-#endif
-
 import qualified Blaze.ByteString.Builder.ByteString as BB
 import qualified Control.Monad.Trans.State.Lazy as STL
 import qualified Control.Monad.Trans.State.Strict as STS
@@ -83,7 +73,7 @@
 newtype InetText = InetText
     { unInetText :: T.Text
     } deriving ( IsString, Eq, Ord, Read, Show
-               , Typeable, Monoid, ToField )
+               , Typeable, Semigroup, Monoid, ToField )
 
 
 instance FromField InetText where
@@ -130,7 +120,7 @@
 -}
 
 newtype FN = FN [Text]
-    deriving (Ord, Eq, Show, Monoid, Typeable, Generic)
+    deriving (Ord, Eq, Show, Semigroup, Monoid, Typeable, Generic)
 
 $(deriveLift ''FN)
 
@@ -182,7 +172,7 @@
 
 newtype MarkedRow = MR
     { unMR :: [(FN, SqlBuilder)]
-    } deriving (Monoid, Typeable, Generic)
+    } deriving (Semigroup, Monoid, Typeable, Generic)
 
 class ToMarkedRow a where
     -- | generate list of pairs (field name, field value)
@@ -359,6 +349,7 @@
   type MHRElements (PgMonadT m) = MHRElements m
   askHSet = PgMonadT askHSet
   {-# INLINEABLE askHSet #-}
+  hlocal f (PgMonadT ma) = PgMonadT $ hlocal f ma
 
 instance (MonadBase IO m) => HasPostgres (PgMonadT m) where
     withPGConnection action = do
diff --git a/test/ParserTest.hs b/test/ParserTest.hs
--- a/test/ParserTest.hs
+++ b/test/ParserTest.hs
@@ -5,12 +5,11 @@
        ) where
 
 import Data.Attoparsec.Text ( parseOnly )
-import Data.Derive.Arbitrary
-import Data.DeriveTH
 import Data.Monoid
-import Data.Text ( Text )
+import Data.Text (Text)
 import Database.PostgreSQL.Query.SqlBuilder
 import Database.PostgreSQL.Query.TH.SqlExp
+import Test.QuickCheck.Arbitrary.Generic
 import Test.QuickCheck.Assertions
 import Test.QuickCheck.Instances ()
 import Test.QuickCheck.Modifiers
@@ -19,10 +18,6 @@
 import Test.Tasty.QuickCheck
 import Test.Tasty.TH
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
-
 import qualified Data.Text as T
 
 noSeqSpace :: [Rope] -> [Rope]
@@ -37,6 +32,10 @@
 instance Arbitrary RopeList where
   arbitrary = resize 10 $ (RopeList . noSeqSpace . getNonEmpty) <$> arbitrary
 
+instance Arbitrary FieldOption where
+  arbitrary = genericArbitrary
+  shrink = genericShrink
+
 wordAlpha :: [Text]
 wordAlpha = map T.singleton
             $ ['A'..'Z'] ++ ['a'..'z']
@@ -51,7 +50,6 @@
 intAlpha :: [Text]
 intAlpha = wordAlpha ++ [" "]
 
-derive makeArbitrary ''FieldOption
 
 instance Arbitrary Rope where
     arbitrary =
