diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -2,6 +2,10 @@
 
 ## Unreleased changes
 
+## 0.3.0.0
+
+Support for warp-3.3.x .
+
 ## 0.2.0.0
 
 Support for different Protocol Buffers serialization libraries.
diff --git a/src/Network/GRPC/Server/Handlers.hs b/src/Network/GRPC/Server/Handlers.hs
--- a/src/Network/GRPC/Server/Handlers.hs
+++ b/src/Network/GRPC/Server/Handlers.hs
@@ -1,8 +1,10 @@
+{-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE CPP #-}
 module Network.GRPC.Server.Handlers where
 
 import           Control.Concurrent.Async (concurrently)
@@ -13,10 +15,24 @@
 import           Data.ByteString.Lazy (toStrict)
 import           Network.GRPC.HTTP2.Encoding
 import           Network.GRPC.HTTP2.Types (path, GRPCStatus(..), GRPCStatusCode(..))
+#if MIN_VERSION_wai(3,2,2)
 import           Network.Wai (Request, getRequestBodyChunk, strictRequestBody)
+#else
+import           Network.Wai (Request, requestBody, strictRequestBody)
+#endif
 
+#if MIN_VERSION_base(4,11,0)
+#else
+import Data.Monoid ((<>))
+#endif
+
 import Network.GRPC.Server.Wai (WaiHandler, ServiceHandler(..), closeEarly)
 
+#if !MIN_VERSION_wai(3,2,2)
+getRequestBodyChunk :: Request -> IO ByteString
+getRequestBodyChunk = requestBody
+#endif
+
 -- | Handy type to refer to Handler for 'unary' RPCs handler.
 type UnaryHandler i o = Request -> i -> IO o
 
@@ -280,4 +296,4 @@
 errorOnLeftOver :: (a -> IO b) -> ByteString -> a -> IO b
 errorOnLeftOver f rest
   | ByteString.null rest = f
-  | otherwise            = const $ closeEarly $ GRPCStatus INVALID_ARGUMENT ("left-overs: " <> rest)
+  | otherwise            = const $ putStrLn "left-over" >> closeEarly (GRPCStatus INVALID_ARGUMENT ("left-overs: " <> rest))
diff --git a/src/Network/GRPC/Server/Helpers.hs b/src/Network/GRPC/Server/Helpers.hs
--- a/src/Network/GRPC/Server/Helpers.hs
+++ b/src/Network/GRPC/Server/Helpers.hs
@@ -1,31 +1,35 @@
+{-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE CPP #-}
 module Network.GRPC.Server.Helpers where
 
 import qualified Data.ByteString.Char8 as ByteString
-import           Data.Maybe (fromMaybe)
-import           Network.GRPC.HTTP2.Types (GRPCStatus(..), trailerForStatusCode, grpcStatusH, grpcMessageH)
+import           Data.IORef
+import           Network.GRPC.HTTP2.Types (HeaderValue, HeaderKey, GRPCStatus(..), trailerForStatusCode, grpcStatusH, grpcMessageH)
+import           Network.Wai (Request)
+
 #if MIN_VERSION_warp(3,3,0)
-import           Network.HTTP2.Server (NextTrailersMaker(..))
+
+#else
+import           Data.Maybe (fromMaybe)
+import           Network.Wai.Handler.Warp (http2dataTrailers, defaultHTTP2Data, modifyHTTP2Data)
 #endif
-import           Network.Wai (Request)
-import           Network.Wai.Handler.Warp (http2dataTrailers, defaultHTTP2Data, modifyHTTP2Data, HTTP2Data)
 
--- | Helper to set the GRPCStatus on the trailers reply.
-modifyGRPCStatus :: Request -> GRPCStatus -> IO ()
-modifyGRPCStatus req = modifyHTTP2Data req . makeGRPCTrailers
+#if MIN_VERSION_base(4,11,0)
+#else
+import Data.Monoid ((<>))
+#endif
 
-makeGRPCTrailers :: GRPCStatus -> (Maybe HTTP2Data -> Maybe HTTP2Data)
-makeGRPCTrailers (GRPCStatus s msg) h2data =
+-- | Helper to set the GRPCStatus on the trailers reply.
+modifyGRPCStatus :: IORef [(HeaderKey, HeaderValue)] -> Request -> GRPCStatus -> IO ()
 #if MIN_VERSION_warp(3,3,0)
-    Just $! (fromMaybe defaultHTTP2Data h2data) { http2dataTrailers = trailersMaker }
+modifyGRPCStatus ref _ (GRPCStatus s msg) =
+  writeIORef ref trailers
 #else
-    Just $! (fromMaybe defaultHTTP2Data h2data) { http2dataTrailers = trailers }
+modifyGRPCStatus _ req (GRPCStatus s msg) = modifyHTTP2Data req $ \h2data ->
+  Just $! (fromMaybe defaultHTTP2Data h2data) { http2dataTrailers = trailers }
 #endif
   where
-#if MIN_VERSION_warp(3,3,0)
-    trailersMaker (Just _) = return $ NextTrailersMaker trailersMaker
-    trailersMaker Nothing  = return $ Trailers trailers
-#endif
-    trailers = if ByteString.null msg then [status] else [status, message]
+    !trailers = if ByteString.null msg then [status] else [status, message]
     status = (grpcStatusH, trailerForStatusCode s)
     message = (grpcMessageH, msg)
+    
diff --git a/src/Network/GRPC/Server/Wai.hs b/src/Network/GRPC/Server/Wai.hs
--- a/src/Network/GRPC/Server/Wai.hs
+++ b/src/Network/GRPC/Server/Wai.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE CPP #-}
 
 module Network.GRPC.Server.Wai where
 
@@ -8,6 +9,7 @@
 import qualified Data.ByteString.Char8 as ByteString
 import           Data.ByteString.Lazy (fromStrict)
 import           Data.Binary.Builder (Builder)
+import           Data.IORef
 import           Data.Maybe (fromMaybe)
 import qualified Data.CaseInsensitive as CI
 import qualified Data.List as List
@@ -15,7 +17,16 @@
 import           Network.GRPC.HTTP2.Types (GRPCStatus(..), GRPCStatusCode(..), grpcStatusH, grpcMessageH, grpcContentTypeHV, grpcEncodingH, grpcAcceptEncodingH)
 import           Network.HTTP.Types (status200, status404)
 import           Network.Wai (Application, Request(..), rawPathInfo, responseLBS, responseStream, requestHeaders)
+import           Network.Wai.Handler.Warp (http2dataTrailers, defaultHTTP2Data, modifyHTTP2Data)
+#if MIN_VERSION_warp(3,3,0)
+import           Network.HTTP2.Server (NextTrailersMaker(..))
+#endif
 
+#if MIN_VERSION_base(4,11,0)
+#else
+import Data.Monoid ((<>))
+#endif
+
 import Network.GRPC.Server.Helpers (modifyGRPCStatus)
 
 -- | A Wai Handler for a request.
@@ -62,6 +73,11 @@
 -- This lookup may be inefficient for large amount of services.
 grpcService :: [Compression] -> [ServiceHandler] -> (Application -> Application)
 grpcService compressions services app = \req rep -> do
+    r <- newIORef []
+#if MIN_VERSION_warp(3,3,0)
+    modifyHTTP2Data req $ \h2data -> 
+      Just $! (fromMaybe defaultHTTP2Data h2data) { http2dataTrailers = trailersMaker r }
+#endif
     case lookupHandler (rawPathInfo req) services of
         Just handler ->
             -- Handler that catches early GRPC termination and other exceptions.
@@ -72,9 +88,11 @@
             -- These exceptions are swallowed from the WAI "onException"
             -- handler, so we'll need a better way to handle this case.
             let grpcHandler write flush =
-                    (doHandle handler req write flush)
-                    `catches` [ Handler $ \(e::GRPCStatus)    -> modifyGRPCStatus req e
-                              , Handler $ \(e::SomeException) -> modifyGRPCStatus req (GRPCStatus INTERNAL $ ByteString.pack $ show e )
+                    doHandle r handler req write flush
+                    `catches` [ Handler $ \(e::GRPCStatus)    ->
+                                 modifyGRPCStatus r req e
+                              , Handler $ \(e::SomeException) -> 
+                                 modifyGRPCStatus r req (GRPCStatus INTERNAL $ ByteString.pack $ show e)
                               ]
             in (rep $ responseStream status200 hdrs200 grpcHandler)
         Nothing ->
@@ -88,24 +106,31 @@
     lookupHandler :: ByteString -> [ServiceHandler] -> Maybe WaiHandler
     lookupHandler p plainHandlers = grpcWaiHandler <$>
         List.find (\(ServiceHandler rpcPath _) -> rpcPath == p) plainHandlers
-    doHandle handler req write flush = do
+    doHandle r handler req write flush = do
         let bestCompression = lookupEncoding req compressions
         let pickedCompression = fromMaybe (Encoding uncompressed) bestCompression
 
         let hopefulDecompression = lookupDecoding req compressions
         let pickedDecompression = fromMaybe (Decoding uncompressed) hopefulDecompression
 
+        putStrLn "running handler"
         _ <- handler pickedDecompression pickedCompression req write flush
-        modifyGRPCStatus req (GRPCStatus OK "WAI handler ended.")
+        putStrLn "setting GRPC status"
+        modifyGRPCStatus r req (GRPCStatus OK "WAI handler ended.")
 
+#if MIN_VERSION_warp(3,3,0)
+    trailersMaker r Nothing = Trailers <$> readIORef r
+    trailersMaker r _ = return $ NextTrailersMaker (trailersMaker r)
+#endif
+
 -- | Looks-up header for encoding outgoing messages.
 requestAcceptEncodingNames :: Request -> [ByteString]
-requestAcceptEncodingNames  req = fromMaybe [] $
-    ByteString.split ',' <$> lookup grpcAcceptEncodingH (requestHeaders req)
+requestAcceptEncodingNames  req = maybe [] (ByteString.split ',') $
+    lookup grpcAcceptEncodingH (requestHeaders req)
 
 -- | Looks-up the compression to use from a set of known algorithms.
 lookupEncoding :: Request -> [Compression] -> Maybe Encoding
-lookupEncoding req compressions = fmap Encoding $
+lookupEncoding req compressions = Encoding <$>
     safeHead [ c | c <- compressions
                  , n <- requestAcceptEncodingNames req
                  , n == grpcCompressionHV c
diff --git a/warp-grpc.cabal b/warp-grpc.cabal
--- a/warp-grpc.cabal
+++ b/warp-grpc.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 5cc20b886f598a4b752f762493d70b24c9979d6893ffd1e239e260d1b36bd47b
+-- hash: 794fc7769141a0b3e1da1800fa7e22733da3750f11b1d80f2558372cf578b90e
 
 name:           warp-grpc
-version:        0.2.0.0
+version:        0.3.0.0
 synopsis:       A minimal gRPC server on top of Warp.
 description:    Please see the README on Github at <https://github.com/haskell-grpc-native/http2-grpc-haskell/blob/master/warp-grpc/README.md>
 category:       Networking
@@ -40,14 +40,14 @@
   ghc-options: -Wall
   build-depends:
       async >=2.2.1 && <3
-    , base >=4.11 && <5
+    , base >=4.10 && <5
     , binary >=0.8.5 && <0.9
     , bytestring >=0.10.8 && <0.11
     , case-insensitive >=1.2.0 && <1.3
     , http-types >=0.12 && <0.13
     , http2 >=1.6 && <3
     , http2-grpc-types >=0.5 && <0.6
-    , wai >=3.2 && <3.3
-    , warp >=3.2.24 && <3.3
-    , warp-tls >=3.2 && <3.3
+    , wai >=3.2 && <3.4
+    , warp >=3.2.23 && <3.4
+    , warp-tls >=3.2 && <3.4
   default-language: Haskell2010
