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.2
+version: 0.1.1
 maintainer: kristof@resonata.be
 copyright: Kristof Bastiaensen 2020
 license: BSD3
@@ -22,5 +22,5 @@
         src
    build-depends:
         base >= 4.7 && < 5,
-        servant,
-        named
+        servant >= 0.17 && < 0.18,
+        named >= 0.3 && < 0.4
diff --git a/src/Servant/Named.hs b/src/Servant/Named.hs
--- a/src/Servant/Named.hs
+++ b/src/Servant/Named.hs
@@ -14,6 +14,7 @@
 import Data.Proxy
 import GHC.TypeLits
 import Data.Functor.Identity
+import Data.Maybe
 import Named
 
 -- | Like `QueryParam'`, but instead of extracting a type @a@, it
@@ -46,16 +47,17 @@
 -- the query parameter string.
 type NamedQueryParam = NamedQueryParam' [Required, Strict]
 
--- | Like `QueryParams`, but extracts a named type @named `:!` [a]@
+-- | Like `QueryParams`, but extracts a named type @named `:?` [a]@
 -- instead, where named corresponds to the query parameter string.
 data NamedQueryParams (sym :: Symbol) (a :: *)
 
 instance (KnownSymbol sym, ToHttpApiData v, HasLink sub)
          => HasLink (NamedQueryParams sym v :> sub)
   where
-    type MkLink (NamedQueryParams sym v :> sub) a = sym :! [v] -> MkLink sub a
-    toLink toA _ l (Arg params) =
-      toLink toA (Proxy :: Proxy (QueryParams sym v :> sub)) l params
+    type MkLink (NamedQueryParams sym v :> sub) a = sym :? [v] -> MkLink sub a
+    toLink toA _ l (ArgF params) =
+      toLink toA (Proxy :: Proxy (QueryParams sym v :> sub)) l $
+      fromMaybe [] params
 
 -- | Like `QueryFlag, but extracts a named type @named `:!` Bool@
 -- instead, where named corresponds to the query parameter string.
diff --git a/src/Servant/Record.hs b/src/Servant/Record.hs
--- a/src/Servant/Record.hs
+++ b/src/Servant/Record.hs
@@ -9,7 +9,7 @@
 {-# LANGUAGE EmptyDataDecls #-}
 {-# LANGUAGE AllowAmbiguousTypes #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-module Servant.Record (RecordParam) where
+module Servant.Record (RecordParam, UnRecordParam) where
 import Servant.API
 import Data.Proxy
 import GHC.TypeLits
@@ -17,8 +17,38 @@
 
 data RecordParam (a :: *)
 
-instance (Generic a, GHasLink (Rep a ()) sub) =>
-         HasLink (RecordParam a :> sub)
+type family ServantAppend x y where
+  ServantAppend (a :> b) c = a :> ServantAppend b c
+  ServantAppend a c = a :> c
+
+-- | Type family to rewrite a RecordParam Api to a regular servant API.
+-- Useful to define instances for classes that extract information from
+-- the API type, such as Servant.Swagger, or servant-foreign.
+--
+-- Typical use:
+-- 
+-- > instance SomeClass (UnRecordParam (RecordParam a :> api))) =>
+-- >          SomeClass (RecordParam a :> api) where
+-- >    someMethod _ =
+-- >      someMethod (Proxy :: Proxy (UnRecordParam (RecordParam a :> api))
+
+type family UnRecordParam (x :: *) :: * where
+  UnRecordParam (a :> b) = ServantAppend (UnRecordParam a) b
+  UnRecordParam (RecordParam a) = UnRecordParam (Rep a ())
+  UnRecordParam (D1 m c d) = UnRecordParam (c d)
+  UnRecordParam ((a :*: b) d) = ServantAppend (UnRecordParam (a d))
+                                (UnRecordParam (b d))
+  UnRecordParam (C1 m a d) = UnRecordParam (a d)
+  UnRecordParam (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 Bool) d) =
+    QueryFlag sym
+  UnRecordParam (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 [a]) d) =
+    QueryParams sym a
+  UnRecordParam (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 (Maybe a)) d) =
+    QueryParam' [Optional, Strict] sym a
+  UnRecordParam (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 a) d) =
+    QueryParam' [Required, Strict] sym 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 =
@@ -26,28 +56,28 @@
 
 data GParam a
 
-instance GHasLink a sub => HasLink (GParam a :> sub) where
-  type MkLink (GParam a :> sub) b = a -> MkLink sub b
+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
+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
+instance GHasLink c sub => GHasLink (D1 m c) 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 (GParam (b ()) :> sub)
          )
-         => GHasLink ((a :*: b) ()) sub where
+         => 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
+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 #-}
 
@@ -55,7 +85,7 @@
   ( KnownSymbol sym
   , HasLink sub
   ) =>
-  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 Bool) ()) sub where
+  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 #-}
@@ -65,7 +95,7 @@
   , ToHttpApiData a
   , HasLink (a :> sub)
   , HasLink sub) =>
-  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 [a]) ()) sub where
+  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 #-}
@@ -75,7 +105,7 @@
   , ToHttpApiData a
   , HasLink (a :> sub)
   , HasLink sub) =>
-  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 (Maybe a)) ()) sub where
+  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
@@ -86,9 +116,8 @@
   , ToHttpApiData a
   , HasLink (a :> sub)
   , HasLink sub) =>
-  GHasLink (S1 ('MetaSel ('Just sym) d1 d2 d3) (Rec0 a) ()) sub where
+  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 #-}
-
