diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+0.12
+----
+
+- support servant-0.18
+- version bump for breaking change in
+  [#36](https://github.com/haskell-servant/servant-multipart/pull/36)
+
 0.11.6
 ------
 
diff --git a/servant-multipart.cabal b/servant-multipart.cabal
--- a/servant-multipart.cabal
+++ b/servant-multipart.cabal
@@ -1,5 +1,5 @@
 name:               servant-multipart
-version:            0.11.6
+version:            0.12
 synopsis:           multipart/form-data (e.g file upload) support for servant
 description:
   This package adds support for file upload to the servant ecosystem. It draws
@@ -17,7 +17,7 @@
 build-type:         Simple
 cabal-version:      >=1.10
 extra-source-files: CHANGELOG.md
-tested-with:        GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.3
+tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.2
 
 library
   default-language: Haskell2010
@@ -39,11 +39,11 @@
       http-media          >=0.7.1.3  && <0.9
     , lens                >=4.17     && <4.20
     , resourcet           >=1.2.2    && <1.3
-    , servant             >=0.16     && <0.18
-    , servant-client-core >=0.16     && <0.18
-    , servant-docs        >=0.10     && <0.16
-    , servant-foreign     >=0.15     && <0.16
-    , servant-server      >=0.16     && <0.18
+    , servant             >=0.16     && <0.19
+    , servant-client-core >=0.16     && <0.19
+    , servant-docs        >=0.10     && <0.19
+    , servant-foreign     >=0.15     && <0.19
+    , servant-server      >=0.16     && <0.19
     , string-conversions  >=0.4.0.1  && <0.5
     , wai                 >=3.2.1.2  && <3.3
     , wai-extra           >=3.0.24.3 && <3.1
diff --git a/src/Servant/Multipart.hs b/src/Servant/Multipart.hs
--- a/src/Servant/Multipart.hs
+++ b/src/Servant/Multipart.hs
@@ -293,6 +293,9 @@
 instance ( FromMultipart tag a
          , MultipartBackend tag
          , LookupContext config (MultipartOptions tag)
+#if MIN_VERSION_servant_server(0,18,0)
+         , LookupContext config ErrorFormatters
+#endif
          , SBoolI (FoldLenient mods)
          , HasServer sublayout config )
       => HasServer (MultipartForm' mods tag a :> sublayout) config where
@@ -312,7 +315,7 @@
       popts = Proxy :: Proxy (MultipartOptions tag)
       multipartOpts = fromMaybe (defaultMultipartOptions pbak)
                     $ lookupContext popts config
-      subserver' = addMultipartHandling @tag @a @mods pbak multipartOpts subserver
+      subserver' = addMultipartHandling @tag @a @mods @config pbak multipartOpts config subserver
 
 -- | Upon seeing @MultipartForm a :> ...@ in an API type,
 --   servant-client will take a parameter of type @(LBS.ByteString, a)@,
@@ -433,28 +436,46 @@
   where parseOpts = generalOptions tag
 
 -- Add multipart extraction support to a Delayed.
-addMultipartHandling :: forall tag multipart (mods :: [*]) env a. (FromMultipart tag multipart, MultipartBackend tag)
+addMultipartHandling :: forall tag multipart (mods :: [*]) config env a.
+                     ( FromMultipart tag multipart
+                     , MultipartBackend tag
+#if MIN_VERSION_servant_server(0,18,0)
+                     , LookupContext config ErrorFormatters
+#endif
+                     )
                      => SBoolI (FoldLenient mods)
                      => Proxy tag
                      -> MultipartOptions tag
+                     -> Context config
                      -> Delayed env (If (FoldLenient mods) (Either String multipart) multipart -> a)
                      -> Delayed env a
-addMultipartHandling pTag opts subserver =
+addMultipartHandling pTag opts _config subserver =
   addBodyCheck subserver contentCheck bodyCheck
   where
     contentCheck = withRequest $ \request ->
       fuzzyMultipartCTCheck (contentTypeH request)
 
-    bodyCheck () = do
+    bodyCheck () = withRequest $ \ request -> do
       mpd <- check pTag opts :: DelayedIO (MultipartData tag)
       case (sbool :: SBool (FoldLenient mods), fromMultipart @tag @multipart mpd) of
-        (SFalse, Left msg) -> liftRouteResult $ FailFatal
-          err400 { errBody = "Could not decode multipart mime body: " <> cs msg }
+        (SFalse, Left msg) -> liftRouteResult $ FailFatal $ formatError request msg
         (SFalse, Right x) -> return x
         (STrue, res) -> return $ either (Left . cs) Right res
 
     contentTypeH req = fromMaybe "application/octet-stream" $
           lookup "Content-Type" (requestHeaders req)
+
+    defaultFormatError msg = err400 { errBody = "Could not decode multipart mime body: " <> cs msg }
+#if MIN_VERSION_servant_server(0,18,0)
+    pFormatters = Proxy :: Proxy ErrorFormatters
+    rep = typeRep (Proxy :: Proxy MultipartForm')
+    formatError request =
+      case lookupContext pFormatters _config of
+        Nothing -> defaultFormatError
+        Just fmts -> bodyParserErrorFormatter fmts rep request
+#else
+    formatError _ = defaultFormatError
+#endif
 
 -- Check that the content type is one of:
 --   - application/x-www-form-urlencoded
