diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,12 +1,17 @@
-# What Hasql is
+# Summary
 
+Hasql is a highly efficient PostgreSQL driver for Haskell with a typesafe yet flexible mapping API. It targets both the users, who need maximum control, and the users who face the typical tasks of DB-powered applications, providing them with higher-level APIs. Currently it is known to be [the fastest driver](https://nikita-volkov.github.io/hasql-benchmarks/) in the Haskell ecosystem.
+
+Hasql also is one of the supported targets of the [pGenie](https://pgenie.io) code generator, which empowers it with schema and query validation, and relieves you from boilerplate.
+
+# Status
+
 [![Build Status](https://travis-ci.org/nikita-volkov/hasql.svg?branch=master)](https://travis-ci.org/nikita-volkov/hasql)
 [![Hackage](https://img.shields.io/hackage/v/hasql.svg)](https://hackage.haskell.org/package/hasql)
 
-Hasql is a highly efficient PostgreSQL driver and a mapping API. It targets both the users, who need a low level of abstraction, and the users, who face the typical tasks of DB-powered applications, providing them with higher-level APIs.
-
+Hasql is production-ready, actively maintained and the API is pretty stable. It's used by many companies and most notably by the [Postgrest](https://postgrest.org/) project.
 
-## Ecosystem
+# Ecosystem
 
 Hasql is not just a single library, it is a granular ecosystem of composable libraries, each isolated to perform its own task and stay simple.
 
diff --git a/benchmarks/Main.hs b/benchmarks/Main.hs
--- a/benchmarks/Main.hs
+++ b/benchmarks/Main.hs
@@ -31,8 +31,6 @@
 
 -- * Sessions
 
--------------------------
-
 sessionWithManySmallParameters :: Vector (Int64, Int64) -> B.Session ()
 sessionWithManySmallParameters =
   error "TODO: sessionWithManySmallParameters"
@@ -54,8 +52,6 @@
   replicateM 1000 (B.statement () statementWithSingleRow)
 
 -- * Statements
-
--------------------------
 
 statementWithManyParameters :: C.Statement (Vector (Int64, Int64)) ()
 statementWithManyParameters =
diff --git a/hasql.cabal b/hasql.cabal
--- a/hasql.cabal
+++ b/hasql.cabal
@@ -1,5 +1,5 @@
 name: hasql
-version: 1.6.1.3
+version: 1.6.1.4
 category: Hasql, Database, PostgreSQL
 synopsis: An efficient PostgreSQL driver with a flexible mapping API
 description:
@@ -65,10 +65,10 @@
     contravariant >=1.3 && <2,
     dlist ==0.8.* || >=1 && <2,
     hashable >=1.2 && <2,
-    hashtables >=1.3 && <2,
+    hashtables >=1.1 && <2,
     mtl >=2 && <3,
     network-ip >=0.3.0.3 && <0.4,
-    postgresql-binary >=0.13 && <0.14,
+    postgresql-binary >=0.13.1 && <0.14,
     postgresql-libpq ==0.9.*,
     profunctors >=5.1 && <6,
     scientific >=0.3 && <0.4,
diff --git a/library/Hasql/Encoders.hs b/library/Hasql/Encoders.hs
--- a/library/Hasql/Encoders.hs
+++ b/library/Hasql/Encoders.hs
@@ -44,11 +44,16 @@
     unknown,
     array,
     foldableArray,
+    composite,
 
     -- * Array
     Array,
     element,
     dimension,
+
+    -- * Composite
+    Composite,
+    field,
   )
 where
 
diff --git a/library/Hasql/Private/Decoders.hs b/library/Hasql/Private/Decoders.hs
--- a/library/Hasql/Private/Decoders.hs
+++ b/library/Hasql/Private/Decoders.hs
@@ -19,8 +19,6 @@
 
 -- * Result
 
--------------------------
-
 -- |
 -- Decoder of a query result.
 newtype Result a = Result (Results.Results a) deriving (Functor)
@@ -52,8 +50,6 @@
 
 -- ** Multi-row traversers
 
--------------------------
-
 -- |
 -- Foldl multiple rows.
 {-# INLINEABLE foldlRows #-}
@@ -68,8 +64,6 @@
 
 -- ** Specialized multi-row results
 
--------------------------
-
 -- |
 -- Maybe one row or none.
 {-# INLINEABLE rowMaybe #-}
@@ -93,8 +87,6 @@
 
 -- * Row
 
--------------------------
-
 -- |
 -- Decoder of an individual row,
 -- which gets composed of column value decoders.
@@ -118,8 +110,6 @@
 
 -- * Nullability
 
--------------------------
-
 -- |
 -- Extensional specification of nullability over a generic decoder.
 data NullableOrNot decoder a where
@@ -138,8 +128,6 @@
 
 -- * Value
 
--------------------------
-
 -- |
 -- Decoder of a value.
 newtype Value a = Value (Value.Value a)
@@ -371,8 +359,6 @@
 
 -- * Array decoders
 
--------------------------
-
 -- |
 -- A generic array decoder.
 --
@@ -409,8 +395,6 @@
   Nullable (Value imp) -> Array (Array.value (Value.run imp))
 
 -- * Composite decoders
-
--------------------------
 
 -- |
 -- Composable decoder of composite values (rows, records).
diff --git a/library/Hasql/Private/Decoders/Row.hs b/library/Hasql/Private/Decoders/Row.hs
--- a/library/Hasql/Private/Decoders/Row.hs
+++ b/library/Hasql/Private/Decoders/Row.hs
@@ -18,8 +18,6 @@
 
 -- * Functions
 
--------------------------
-
 {-# INLINE run #-}
 run :: Row a -> (LibPQ.Result, LibPQ.Row, LibPQ.Column, Bool) -> IO (Either (Int, RowError) a)
 run (Row impl) (result, row, columnsAmount, integerDatetimes) =
diff --git a/library/Hasql/Private/Encoders.hs b/library/Hasql/Private/Encoders.hs
--- a/library/Hasql/Private/Encoders.hs
+++ b/library/Hasql/Private/Encoders.hs
@@ -16,8 +16,6 @@
 
 -- * Parameters Product Encoder
 
--------------------------
-
 -- |
 -- Encoder of some representation of a parameters product.
 --
@@ -80,8 +78,6 @@
 
 -- * Nullability
 
--------------------------
-
 -- |
 -- Extensional specification of nullability over a generic encoder.
 data NullableOrNot encoder a where
@@ -100,8 +96,6 @@
 
 -- * Value
 
--------------------------
-
 -- |
 -- Value encoder.
 newtype Value a = Value (Value.Value a)
@@ -278,13 +272,24 @@
 unknown = Value (Value.unsafePTIWithShow PTI.unknown (const A.bytea_strict))
 
 -- |
--- Lift an array encoder into a parameter encoder.
+-- Lift an array encoder into a value encoder.
 array :: Array a -> Value a
 array (Array (Array.Array valueOID arrayOID arrayEncoder renderer)) =
   let encoder env input = A.array (PTI.oidWord32 valueOID) (arrayEncoder env input)
    in Value (Value.Value arrayOID arrayOID encoder renderer)
 
 -- |
+-- Lift a composite encoder into a value encoder.
+composite :: Composite a -> Value a
+composite (Composite encode print) =
+  Value (Value.unsafePTI PTI.unknown encodeValue printValue)
+  where
+    encodeValue idt val =
+      A.composite $ encode val idt
+    printValue val =
+      "ROW (" <> C.intercalate ", " (print val) <> ")"
+
+-- |
 -- Lift a value encoder of element into a unidimensional array encoder of a foldable value.
 --
 -- This function is merely a shortcut to the following expression:
@@ -308,8 +313,6 @@
 
 -- * Array
 
--------------------------
-
 -- |
 -- Generic array encoder.
 --
@@ -348,3 +351,51 @@
 {-# INLINEABLE dimension #-}
 dimension :: (forall a. (a -> b -> a) -> a -> c -> a) -> Array b -> Array c
 dimension foldl (Array imp) = Array (Array.dimension foldl imp)
+
+-- * Composite
+
+-- |
+-- Composite or row-types encoder.
+data Composite a
+  = Composite
+      (a -> Bool -> A.Composite)
+      (a -> [C.Builder])
+
+instance Contravariant Composite where
+  contramap f (Composite encode print) =
+    Composite (encode . f) (print . f)
+
+instance Divisible Composite where
+  divide f (Composite encodeL printL) (Composite encodeR printR) =
+    Composite
+      (\val idt -> case f val of (lVal, rVal) -> encodeL lVal idt <> encodeR rVal idt)
+      (\val -> case f val of (lVal, rVal) -> printL lVal <> printR rVal)
+  conquer = mempty
+
+instance Semigroup (Composite a) where
+  Composite encodeL printL <> Composite encodeR printR =
+    Composite
+      (\val idt -> encodeL val idt <> encodeR val idt)
+      (\val -> printL val <> printR val)
+
+instance Monoid (Composite a) where
+  mempty = Composite mempty mempty
+
+-- | Single field of a row-type.
+field :: NullableOrNot Value a -> Composite a
+field = \case
+  NonNullable (Value (Value.Value elementOID arrayOID encode print)) ->
+    Composite
+      (\val idt -> A.field (PTI.oidWord32 elementOID) (encode idt val))
+      (\val -> [print val])
+  Nullable (Value (Value.Value elementOID arrayOID encode print)) ->
+    Composite
+      ( \val idt -> case val of
+          Nothing -> A.nullField (PTI.oidWord32 elementOID)
+          Just val -> A.field (PTI.oidWord32 elementOID) (encode idt val)
+      )
+      ( \val ->
+          case val of
+            Nothing -> ["NULL"]
+            Just val -> [print val]
+      )
diff --git a/library/Hasql/Private/PTI.hs b/library/Hasql/Private/PTI.hs
--- a/library/Hasql/Private/PTI.hs
+++ b/library/Hasql/Private/PTI.hs
@@ -19,8 +19,6 @@
 
 -- * Constants
 
--------------------------
-
 abstime = mkPTI LibPQ.Binary 702 (Just 1023)
 
 aclitem = mkPTI LibPQ.Binary 1033 (Just 1034)
