diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # ChangeLog for http2
 
+## 5.3.3
+
+* Enclosing IPv6 literal authority with square brackets.
+  [#143](https://github.com/kazu-yamamoto/http2/pull/143)
+
 ## 5.3.2
 
 * Avoid unnecessary empty data frames at end of stream
diff --git a/Network/HTTP2/Client/Run.hs b/Network/HTTP2/Client/Run.hs
--- a/Network/HTTP2/Client/Run.hs
+++ b/Network/HTTP2/Client/Run.hs
@@ -8,11 +8,13 @@
 import Control.Concurrent.STM (check)
 import qualified Data.ByteString.UTF8 as UTF8
 import Data.IORef
+import Data.IP (IPv6)
 import Network.Control (RxFlow (..), defaultMaxData)
 import Network.HTTP.Semantics.Client
 import Network.HTTP.Semantics.Client.Internal
 import Network.HTTP.Semantics.IO
 import Network.Socket (SockAddr)
+import Text.Read (readMaybe)
 import UnliftIO.Async
 import UnliftIO.Concurrent
 import UnliftIO.Exception
@@ -176,12 +178,16 @@
             -- the ordering of responses can be out-of-order.
             -- But for clients, the ordering must be maintained.
             -- To implement this, 'outputQStreamID' is used.
+            let isIPv6 = isJust (readMaybe auth :: Maybe IPv6)
+                auth'
+                    | isIPv6 = "[" <> UTF8.fromString auth <> "]"
+                    | otherwise = UTF8.fromString auth
             let hdr1, hdr2 :: [Header]
                 hdr1
                     | scheme /= "" = (":scheme", scheme) : hdr0
                     | otherwise = hdr0
                 hdr2
-                    | auth /= "" = (":authority", UTF8.fromString auth) : hdr1
+                    | auth /= "" = (":authority", auth') : hdr1
                     | otherwise = hdr1
                 req' = req{outObjHeaders = hdr2}
             -- FLOW CONTROL: SETTINGS_MAX_CONCURRENT_STREAMS: send: respecting peer's limit
diff --git a/bench-hpack/Main.hs b/bench-hpack/Main.hs
--- a/bench-hpack/Main.hs
+++ b/bench-hpack/Main.hs
@@ -2,8 +2,8 @@
 
 module Main where
 
+import Criterion.Main
 import Data.ByteString (ByteString)
-import Gauge.Main
 import Network.HPACK
 import UnliftIO.Exception
 
@@ -39,7 +39,7 @@
         ]
 
 ----------------------------------------------------------------
-prepare :: [HeaderList] -> IO [ByteString]
+prepare :: [[Header]] -> IO [ByteString]
 prepare hdrs = do
     tbl <- newDynamicTableForEncoding defaultDynamicTableSize
     go tbl hdrs id
@@ -59,7 +59,7 @@
         !_ <- decodeHeader tbl f
         go tbl fs
 
-enc :: EncodeStrategy -> [HeaderList] -> IO ()
+enc :: EncodeStrategy -> [[Header]] -> IO ()
 enc stgy hdrs = do
     tbl <- newDynamicTableForEncoding defaultDynamicTableSize
     go tbl hdrs
diff --git a/http2.cabal b/http2.cabal
--- a/http2.cabal
+++ b/http2.cabal
@@ -1,6 +1,6 @@
 cabal-version:      >=1.10
 name:               http2
-version:            5.3.2
+version:            5.3.3
 license:            BSD3
 license-file:       LICENSE
 maintainer:         Kazu Yamamoto <kazu@iij.ad.jp>
@@ -118,6 +118,7 @@
         containers >=0.6,
         http-semantics >= 0.2 && <0.3,
         http-types >=0.12 && <0.13,
+        iproute >= 1.7 && < 1.8,
         network >=3.1,
         network-byte-order >=0.1.7 && <0.2,
         network-control >=0.1 && <0.2,
@@ -409,7 +410,8 @@
         bytestring,
         case-insensitive,
         containers,
-        gauge,
+        criterion,
+        http2,
         network-byte-order,
         stm,
-        http2
+        unliftio
