diff --git a/hasql-dynamic-statements.cabal b/hasql-dynamic-statements.cabal
--- a/hasql-dynamic-statements.cabal
+++ b/hasql-dynamic-statements.cabal
@@ -1,5 +1,5 @@
 name: hasql-dynamic-statements
-version: 0.1.0.2
+version: 0.2
 synopsis: Toolkit for constructing Hasql statements dynamically
 description:
   This library introduces into the Hasql ecosystem a new abstraction named Snippet,
@@ -36,6 +36,22 @@
     base >=4.12 && <5,
     bytestring >=0.10 && <0.11,
     containers >=0.6 && <0.7,
-    data-default >=0.7 && <0.8,
-    hasql >=1.3.0.5 && <1.4,
+    hasql >=1.4 && <1.5,
+    hasql-implicits >=0.1 && <0.2,
     ptr >=0.16.6 && <0.17
+
+test-suite test
+  type: exitcode-stdio-1.0
+  hs-source-dirs: test
+  main-is: Main.hs
+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language: Haskell2010
+  build-depends:
+    hasql,
+    hasql-dynamic-statements,
+    QuickCheck >=2.8.1 && <3,
+    quickcheck-instances >=0.3.11 && <0.4,
+    rerebase <2,
+    tasty >=0.12 && <2,
+    tasty-hunit >=0.9 && <0.11,
+    tasty-quickcheck >=0.9 && <0.11
diff --git a/library/Hasql/DynamicStatements/Prelude.hs b/library/Hasql/DynamicStatements/Prelude.hs
--- a/library/Hasql/DynamicStatements/Prelude.hs
+++ b/library/Hasql/DynamicStatements/Prelude.hs
@@ -80,7 +80,3 @@
 -- bytestring
 -------------------------
 import Data.ByteString as Exports (ByteString)
-
--- data-default
--------------------------
-import Data.Default as Exports
diff --git a/library/Hasql/DynamicStatements/Snippet.hs b/library/Hasql/DynamicStatements/Snippet.hs
--- a/library/Hasql/DynamicStatements/Snippet.hs
+++ b/library/Hasql/DynamicStatements/Snippet.hs
@@ -2,9 +2,7 @@
 (
   Snippet,
   param,
-  nullableParam,
   encoderAndParam,
-  encoderAndNullableParam,
 )
 where
 
diff --git a/library/Hasql/DynamicStatements/Snippet/Defs.hs b/library/Hasql/DynamicStatements/Snippet/Defs.hs
--- a/library/Hasql/DynamicStatements/Snippet/Defs.hs
+++ b/library/Hasql/DynamicStatements/Snippet/Defs.hs
@@ -2,6 +2,7 @@
 
 import Hasql.DynamicStatements.Prelude
 import qualified Hasql.Encoders as Encoders
+import qualified Hasql.Implicits.Encoders as Encoders
 
 
 {-|
@@ -48,26 +49,11 @@
 {-|
 Parameter encoded using an implicitly derived encoder from the type.
 -}
-param :: Default (Encoders.Value param) => param -> Snippet
-param = encoderAndParam def
-
-{-|
-Nullable parameter encoded using an implicitly derived encoder from the type.
--}
-nullableParam :: Default (Encoders.Value param) => Maybe param -> Snippet
-nullableParam = encoderAndNullableParam def
+param :: Encoders.DefaultParamEncoder param => param -> Snippet
+param = encoderAndParam Encoders.defaultParam
 
 {-|
 Parameter with an explicitly defined encoder.
 -}
-encoderAndParam :: Encoders.Value param -> param -> Snippet
-encoderAndParam = paramsEncoderAndParam . Encoders.param
-
-{-|
-Nullable parameter with an explicitly defined encoder.
--}
-encoderAndNullableParam :: Encoders.Value param -> Maybe param -> Snippet
-encoderAndNullableParam =  paramsEncoderAndParam . Encoders.nullableParam
-
-paramsEncoderAndParam :: Encoders.Params param -> param -> Snippet
-paramsEncoderAndParam encoder param = Snippet (pure (ParamSnippetChunk (param >$ encoder)))
+encoderAndParam :: Encoders.NullableOrNot Encoders.Value param -> param -> Snippet
+encoderAndParam encoder param = Snippet (pure (ParamSnippetChunk (param >$ Encoders.param encoder)))
diff --git a/library/Hasql/DynamicStatements/Statement.hs b/library/Hasql/DynamicStatements/Statement.hs
--- a/library/Hasql/DynamicStatements/Statement.hs
+++ b/library/Hasql/DynamicStatements/Statement.hs
@@ -26,7 +26,7 @@
     foldMap (mappend " from " . Snippet.'SnippetDefs.param') from <>
     foldMap (mappend " for " . Snippet.'SnippetDefs.param') to <>
     ")"
-  decoder = Decoders.'Decoders.singleRow' (Decoders.'Decoders.column' Decoders.'Decoders.text')
+  decoder = Decoders.'Decoders.singleRow' (Decoders.'Decoders.column' (Decoders.'Decoders.nonNullable' Decoders.'Decoders.text'))
   in 'dynamicallyParameterized' snippet decoder
 @
 
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,62 @@
+module Main where
+
+import Prelude hiding (assert)
+import Test.QuickCheck.Instances
+import Test.Tasty
+import Test.Tasty.Runners
+import Test.Tasty.HUnit
+import Test.Tasty.QuickCheck
+import qualified Test.QuickCheck as QuickCheck
+import qualified Hasql.Statement as Statement
+import qualified Hasql.Encoders as Encoders
+import qualified Hasql.Decoders as Decoders
+import qualified Hasql.Session as Session
+import qualified Hasql.Connection as Connection
+import qualified Hasql.DynamicStatements.Snippet as Snippet
+import qualified Hasql.DynamicStatements.Session as Session
+
+
+main =
+  defaultMain tree
+
+tree =
+  testGroup "All tests"
+  [
+    testCase "Select substring" $ let
+      sample string from to = let
+        snippet =
+          "select substring(" <> Snippet.param @Text string <>
+          foldMap (mappend " from " . Snippet.param @Int32) from <>
+          foldMap (mappend " for " . Snippet.param @Int32) to <>
+          ")"
+        decoder = Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.text))
+        in runSession (Session.dynamicallyParameterizedStatement snippet decoder)
+      in do
+        assertEqual "" (Right (Right "bc")) =<< sample "abcd" (Just 2) (Just 2)
+        assertEqual "" (Right (Right "bcd")) =<< sample "abcd" (Just 2) (Just 3)
+        assertEqual "" (Right (Right "abc")) =<< sample "abcd" Nothing (Just 3)
+        assertEqual "" (Right (Right "bcd")) =<< sample "abcd" (Just 2) Nothing
+  ]
+
+runSession :: Session.Session a -> IO (Either Connection.ConnectionError (Either Session.QueryError a))
+runSession = withConnection . Session.run
+
+withConnection :: (Connection.Connection -> IO a) -> IO (Either Connection.ConnectionError a)
+withConnection handler =
+  runExceptT $ acquire >>= \connection -> use connection <* release connection
+  where
+    acquire =
+      ExceptT $ Connection.acquire settings
+      where
+        settings =
+          Connection.settings host port user password database
+          where
+            host = "localhost"
+            port = 5432
+            user = "postgres"
+            password = ""
+            database = "postgres"
+    use connection =
+      lift $ handler connection
+    release connection =
+      lift $ Connection.release connection
