diff --git a/named-servant.cabal b/named-servant.cabal
--- a/named-servant.cabal
+++ b/named-servant.cabal
@@ -1,7 +1,7 @@
 cabal-version: 1.12
 name: named-servant
 description: support named parameters in servant using the named package
-version: 0.0.1
+version: 0.0.2
 maintainer: kristof@resonata.be
 copyright: Kristof Bastiaensen 2020
 license: BSD3
@@ -17,6 +17,7 @@
    Ghc-options: -Wall
    exposed-modules:
         Servant.Named
+        Servant.Record
    hs-source-dirs:
         src
    build-depends:
diff --git a/src/Servant/Named.hs b/src/Servant/Named.hs
--- a/src/Servant/Named.hs
+++ b/src/Servant/Named.hs
@@ -8,7 +8,7 @@
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE EmptyDataDecls #-}
 module Servant.Named (NamedQueryParam, OptionalQueryParam, NamedQueryParams,
-                      NamedQueryParam') where
+                      NamedQueryFlag, NamedQueryParam') where
 import Servant.API
 import Servant.API.Modifiers
 import Data.Proxy
@@ -57,3 +57,14 @@
     toLink toA _ l (Arg params) =
       toLink toA (Proxy :: Proxy (QueryParams sym v :> sub)) l params
 
+-- | Like `QueryFlag, but extracts a named type @named `:!` Bool@
+-- instead, where named corresponds to the query parameter string.
+data NamedQueryFlag (sym :: Symbol)
+instance (KnownSymbol sym, HasLink sub)
+    => HasLink (NamedQueryFlag sym :> sub)
+  where
+    type MkLink (NamedQueryFlag sym :> sub) a =
+      (sym :! Bool) -> MkLink sub a
+    toLink toA _ l (Arg qparam) =
+      toLink toA (Proxy :: Proxy (QueryFlag sym :> sub)) l qparam
+      
diff --git a/src/Servant/Record.hs b/src/Servant/Record.hs
new file mode 100644
--- /dev/null
+++ b/src/Servant/Record.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+module Servant.Record (RecordParam) where
+import Servant.API
+import Data.Proxy
+import GHC.TypeLits
+import GHC.Generics
+
+data RecordParam (a :: *)
+
+instance (Generic a, GHasLink (Rep a ()) sub) =>
+         HasLink (RecordParam a :> sub)
+  where
+    type MkLink (RecordParam a :> sub) b = a -> MkLink sub b
+    toLink toA _ l record =
+      gToLink toA (Proxy :: Proxy sub) l (from record :: Rep a ())
+
+data GParam a
+
+instance GHasLink a sub => HasLink (GParam a :> sub) where
+  type MkLink (GParam a :> sub) b = a -> MkLink sub b
+  toLink toA _ = gToLink toA (Proxy :: Proxy sub)
+  {-# INLINE toLink #-}
+  
+class HasLink sub => GHasLink a sub where
+  gToLink :: (Link -> b) -> Proxy sub -> Link -> a -> MkLink sub b
+
+instance GHasLink (c m2 ()) sub => GHasLink (D1 m (c m2) ()) sub where
+  gToLink toA _ l (M1 x) = gToLink toA (Proxy :: Proxy sub) l x
+  {-# INLINE gToLink #-}
+
+instance ( HasLink sub
+         , GHasLink (a ()) (GParam (b ()) :> sub)
+         )
+         => GHasLink ((a :*: b) ()) sub where
+  gToLink toA _ l (a :*: b) =
+    gToLink toA (Proxy :: Proxy (GParam (b ()) :> sub)) l a b
+  {-# INLINE gToLink #-}
+
+instance (GHasLink (a ()) sub, HasLink sub) =>
+         GHasLink (C1 m a ()) sub where
+  gToLink toA _ l (M1 x) = gToLink toA (Proxy :: Proxy sub) l x
+  {-# INLINE gToLink #-}
+
+instance {-# OVERLAPPING #-}
+  ( KnownSymbol sym
+  , HasLink sub
+  ) =>
+  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 Bool) ()) sub where
+  gToLink toA _ l (M1 (K1 x)) =
+    toLink toA (Proxy :: Proxy (QueryFlag sym :> sub)) l x
+  {-# INLINE gToLink #-}
+
+instance {-# OVERLAPPING #-}
+  ( KnownSymbol sym
+  , ToHttpApiData a
+  , HasLink (a :> sub)
+  , HasLink sub) =>
+  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 [a]) ()) sub where
+  gToLink toA _ l (M1 (K1 x)) =
+    toLink toA (Proxy :: Proxy (QueryParams sym a :> sub)) l x
+  {-# INLINE gToLink #-}
+
+instance {-# OVERLAPPING #-}
+  ( KnownSymbol sym
+  , ToHttpApiData a
+  , HasLink (a :> sub)
+  , HasLink sub) =>
+  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 (Maybe a)) ()) sub where
+  gToLink toA _ l (M1 (K1 x)) =
+    toLink toA (Proxy :: Proxy (QueryParam' '[Optional, Strict] sym a :> sub))
+    l x
+  {-# INLINE gToLink #-}
+
+instance {-# OVERLAPPABLE #-}
+  ( KnownSymbol sym
+  , ToHttpApiData a
+  , HasLink (a :> sub)
+  , HasLink sub) =>
+  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 a) ()) sub where
+  gToLink toA _ l (M1 (K1 x)) =
+    toLink toA (Proxy :: Proxy (QueryParam' '[Required, Strict] sym a :> sub))
+    l x
+  {-# INLINE gToLink #-}
+
