diff --git a/Network/HTTP2/TLS/Client.hs b/Network/HTTP2/TLS/Client.hs
--- a/Network/HTTP2/TLS/Client.hs
+++ b/Network/HTTP2/TLS/Client.hs
@@ -19,6 +19,10 @@
     settingsValidateCert,
     settingsCAStore,
     settingsAddrInfoFlags,
+    settingsCacheLimit,
+    settingsConcurrentStreams,
+    settingsConnectionWindowSize,
+    settingsStreamWindowSize,
 ) where
 
 import Data.ByteString (ByteString)
@@ -28,6 +32,10 @@
 import Network.HTTP2.Client (
     Client,
     ClientConfig (..),
+    defaultClientConfig,
+    initialWindowSize,
+    maxConcurrentStreams,
+    settings,
  )
 import qualified Network.HTTP2.Client as H2Client
 import Network.Socket
@@ -67,21 +75,22 @@
 run :: Settings -> HostName -> PortNumber -> Client a -> IO a
 run settings serverName port client =
     runTLS settings serverName port "h2" $ \ctx mysa peersa ->
-        run' "https" serverName (sendTLS ctx) (recvTLS ctx) mysa peersa client
+        run' settings "https" serverName (sendTLS ctx) (recvTLS ctx) mysa peersa client
 
 -- | Running an HTTP\/2 client over TCP.
-runH2C :: HostName -> PortNumber -> Client a -> IO a
-runH2C serverName port client =
+runH2C :: Settings -> HostName -> PortNumber -> Client a -> IO a
+runH2C settings serverName port client =
     E.bracket open close $ \sock -> do
         mysa <- getSocketName sock
         peersa <- getPeerName sock
         recv <- mkRecvTCP Server.defaultSettings sock
-        run' "http" serverName (sendTCP sock) recv mysa peersa client
+        run' settings "http" serverName (sendTCP sock) recv mysa peersa client
   where
     open = openTCP (settingsAddrInfoFlags defaultSettings) serverName port
 
 run'
-    :: ByteString
+    :: Settings
+    -> ByteString
     -> HostName
     -> (ByteString -> IO ())
     -> IO ByteString
@@ -89,17 +98,23 @@
     -> SockAddr
     -> Client a
     -> IO a
-run' schm serverName send recv mysa peersa client =
+run' Settings{..} schm serverName send recv mysa peersa client =
     E.bracket
         (allocConfigForClient send recv mysa peersa)
         freeConfigForClient
         (\conf -> H2Client.run cliconf conf client)
   where
     cliconf =
-        ClientConfig
+        defaultClientConfig
             { scheme = schm
             , authority = C8.pack serverName
-            , cacheLimit = 20
+            , cacheLimit = settingsCacheLimit
+            , connectionWindowSize = settingsConnectionWindowSize
+            , settings =
+                (settings defaultClientConfig)
+                    { initialWindowSize = settingsStreamWindowSize
+                    , maxConcurrentStreams = Just settingsConcurrentStreams
+                    }
             }
 
 openTCP :: [AddrInfoFlag] -> HostName -> PortNumber -> IO Socket
diff --git a/Network/HTTP2/TLS/Client/Settings.hs b/Network/HTTP2/TLS/Client/Settings.hs
--- a/Network/HTTP2/TLS/Client/Settings.hs
+++ b/Network/HTTP2/TLS/Client/Settings.hs
@@ -3,24 +3,50 @@
 import Data.X509.CertificateStore (CertificateStore)
 import Network.Socket
 
+import Network.Control
+import Network.HTTP2.Client (
+    cacheLimit,
+    defaultClientConfig,
+ )
+
 -- Client settings type.
 data Settings = Settings
     { settingsKeyLogger :: String -> IO ()
-    -- ^ Key logger
+    -- ^ Key logger (TLS and H2)
     --
     -- Applications may wish to set this depending on the SSLKEYLOGFILE environment variable. Default is do nothing.
     , settingsValidateCert :: Bool
-    -- ^ Should we validate TLS certificates?
+    -- ^ Should we validate TLS certificates? (TLS and H2)
     --
     -- >>> settingsValidateCert defaultSettings
     -- True
     , settingsCAStore :: CertificateStore
-    -- ^ Certificate store used for validation. The default is 'mempty'.
+    -- ^ Certificate store used for validation. The default is 'mempty'. (TLS and H2)
     , settingsAddrInfoFlags :: [AddrInfoFlag]
-    -- ^ Flags that control the querying behaviour of @getAddrInfo@.
+    -- ^ Flags that control the querying behaviour of @getAddrInfo@. (TLS and H2)
     --
     -- >>> settingsAddrInfoFlags defaultSettings
     -- []
+    , settingsCacheLimit :: Int
+    -- ^ How many pushed responses are contained in the cache (H2 and H2c)
+    --
+    -- >>> settingsCacheLimits defaultSettings
+    -- 64
+    , settingsConcurrentStreams :: Int
+    -- ^ The maximum number of incoming streams on the net (H2 and H2c)
+    --
+    -- >>> settingsConcurrentStreams defaultSettings
+    -- 64
+    , settingsStreamWindowSize :: Int
+    -- ^ The window size of incoming streams (H2 and H2c)
+    --
+    -- >>> settingsStreamWindowSize defaultSettings
+    -- 262144
+    , settingsConnectionWindowSize :: Int
+    -- ^ The window size of a connection (H2 and H2c)
+    --
+    -- >>> settingsConnectionWindowSize defaultSettings
+    -- 1048575
     }
 
 -- | Default settings.
@@ -31,4 +57,8 @@
         , settingsValidateCert = True
         , settingsCAStore = mempty
         , settingsAddrInfoFlags = []
+        , settingsCacheLimit = cacheLimit defaultClientConfig
+        , settingsConcurrentStreams = defaultMaxStreams
+        , settingsStreamWindowSize = defaultMaxStreamData
+        , settingsConnectionWindowSize = defaultMaxData
         }
diff --git a/Network/HTTP2/TLS/Server.hs b/Network/HTTP2/TLS/Server.hs
--- a/Network/HTTP2/TLS/Server.hs
+++ b/Network/HTTP2/TLS/Server.hs
@@ -19,6 +19,10 @@
     settingsReadBufferSize,
     settingsReadBufferLowerLimit,
     settingsKeyLogger,
+    settingsNumberOfWorkers,
+    settingsConcurrentStreams,
+    settingsConnectionWindowSize,
+    settingsStreamWindowSize,
 
     -- * IO backend
     IOBackend,
@@ -27,12 +31,27 @@
     recv,
     mySockAddr,
     peerSockAddr,
+
+    -- * Internal
+    runIO,
+    Stream,
+    ServerIO (..),
 ) where
 
 import Data.ByteString (ByteString)
 import Data.Default.Class (def)
-import Network.HTTP2.Server (Server)
+import Network.HTTP2.Server (
+    Server,
+    connectionWindowSize,
+    defaultServerConfig,
+    initialWindowSize,
+    maxConcurrentStreams,
+    numberOfWorkers,
+    settings,
+ )
 import qualified Network.HTTP2.Server as H2Server
+import Network.HTTP2.Server.Internal (ServerIO, Stream)
+import qualified Network.HTTP2.Server.Internal as H2I
 import Network.Run.TCP.Timeout
 import Network.Socket (
     HostName,
@@ -84,11 +103,47 @@
         run' settings server mgr iobackend
 
 run' :: Settings -> Server -> T.Manager -> IOBackend -> IO ()
-run' settings server mgr IOBackend{..} =
+run' settings0@Settings{..} server mgr IOBackend{..} =
     E.bracket
-        (allocConfigForServer settings mgr send recv mySockAddr peerSockAddr)
+        (allocConfigForServer settings0 mgr send recv mySockAddr peerSockAddr)
         freeConfigForServer
-        (\conf -> H2Server.run conf server)
+        (\conf -> H2Server.run sconf conf server)
+  where
+    sconf =
+        defaultServerConfig
+            { numberOfWorkers = settingsNumberOfWorkers
+            , connectionWindowSize = settingsConnectionWindowSize
+            , settings =
+                (settings defaultServerConfig)
+                    { initialWindowSize = settingsStreamWindowSize
+                    , maxConcurrentStreams = Just settingsConcurrentStreams
+                    }
+            }
+
+runIO
+    :: Settings
+    -> Credentials
+    -> HostName
+    -> PortNumber
+    -> (ServerIO -> IO (IO ()))
+    -> IO ()
+runIO settings0@Settings{..} creds host port action =
+    runTLS settings0 creds host port "h2" $ \mgr IOBackend{..} -> do
+        E.bracket
+            (allocConfigForServer settings0 mgr send recv mySockAddr peerSockAddr)
+            freeConfigForServer
+            (\conf -> H2I.runIO sconf conf action)
+  where
+    sconf =
+        defaultServerConfig
+            { numberOfWorkers = settingsNumberOfWorkers
+            , connectionWindowSize = settingsConnectionWindowSize
+            , settings =
+                (settings defaultServerConfig)
+                    { initialWindowSize = settingsStreamWindowSize
+                    , maxConcurrentStreams = Just settingsConcurrentStreams
+                    }
+            }
 
 ----------------------------------------------------------------
 
diff --git a/Network/HTTP2/TLS/Server/Settings.hs b/Network/HTTP2/TLS/Server/Settings.hs
--- a/Network/HTTP2/TLS/Server/Settings.hs
+++ b/Network/HTTP2/TLS/Server/Settings.hs
@@ -1,5 +1,11 @@
 module Network.HTTP2.TLS.Server.Settings where
 
+import Network.Control
+import Network.HTTP2.Server (
+    defaultServerConfig,
+    numberOfWorkers,
+ )
+
 -- Server settings type.
 data Settings = Settings
     { settingsTimeout :: Int
@@ -33,6 +39,26 @@
     -- ^ Key logger (defaults to none)
     --
     -- Applications may wish to set this depending on the SSLKEYLOGFILE environment variable. The default is do nothing.
+    , settingsNumberOfWorkers :: Int
+    -- ^ The number of workers (H2 and H2c)
+    --
+    -- >>> settingsNumberOfWorkers defaultSettings
+    -- 8
+    , settingsConcurrentStreams :: Int
+    -- ^ The maximum number of incoming streams on the net (H2 and H2c)
+    --
+    -- >>> settingsConcurrentStreams defaultSettings
+    -- 64
+    , settingsStreamWindowSize :: Int
+    -- ^ The window size of incoming streams (H2 and H2c)
+    --
+    -- >>> settingsStreamWindowSize defaultSettings
+    -- 262144
+    , settingsConnectionWindowSize :: Int
+    -- ^ The window size of a connection (H2 and H2c)
+    --
+    -- >>> settingsConnectionWindowSize defaultSettings
+    -- 1048575
     }
 
 -- | Default settings.
@@ -45,4 +71,8 @@
         , settingsReadBufferSize = 16384
         , settingsReadBufferLowerLimit = 2048
         , settingsKeyLogger = \_ -> return ()
+        , settingsNumberOfWorkers = numberOfWorkers defaultServerConfig
+        , settingsConcurrentStreams = defaultMaxStreams
+        , settingsStreamWindowSize = defaultMaxStreamData
+        , settingsConnectionWindowSize = defaultMaxData
         }
diff --git a/http2-tls.cabal b/http2-tls.cabal
--- a/http2-tls.cabal
+++ b/http2-tls.cabal
@@ -1,22 +1,23 @@
-cabal-version:      >=1.10
-name:               http2-tls
-version:            0.1.0
-license:            BSD3
-license-file:       LICENSE
-maintainer:         Kazu Yamamoto <kazu@iij.ad.jp>
-author:             Kazu Yamamoto <kazu@iij.ad.jp>
-homepage:           https://github.com/kazu-yamamoto/http2-tls
-synopsis:           Library for HTTP/2 over TLS
-description:
-    Using the HTTP/2 library over TLS
-
-category:           Network
-build-type:         Simple
+cabal-version: >=1.10
+name:          http2-tls
+version:       0.2.0
+license:       BSD3
+license-file:  LICENSE
+maintainer:    Kazu Yamamoto <kazu@iij.ad.jp>
+author:        Kazu Yamamoto <kazu@iij.ad.jp>
+homepage:      https://github.com/kazu-yamamoto/http2-tls
+synopsis:      Library for HTTP/2 over TLS
+description:   Using the HTTP/2 library over TLS
+category:      Network
+build-type:    Simple
 
 source-repository head
     type:     git
     location: https://github.com/kazu-yamamoto/http2-tls
 
+flag crypton
+    description: Use the crypton-x509-* package family instead of x509-*
+
 library
     exposed-modules:
         Network.HTTP2.TLS.Client
@@ -35,14 +36,25 @@
     ghc-options:        -Wall
     build-depends:
         base >=4.9 && <5,
-        bytestring,
-        crypton-x509-store,
-        crypton-x509-validation,
-        data-default-class,
-        http2 >= 4.2.0,
-        network,
-        network-run >=0.2.6,
-        recv,
-        time-manager,
-        tls >=1.7.0,
-        unliftio
+        bytestring >= 0.10 && < 0.12,
+        http2 >=5.0 && < 5.1,
+        data-default-class >= 0.1 && < 0.2,
+        network >= 3.1.4 && < 3.2,
+        time-manager >= 0.0.1 && < 0.1,
+        unliftio >= 0.2 && < 0.3,
+        network-run >= 0.2.6 && < 0.3,
+        network-control >= 0.0.2 && < 0.1,
+        recv >= 0.1.0 && < 0.2,
+        tls >= 1.9 && < 1.10
+
+    if flag(crypton)
+        build-depends:
+            tls >=1.9,
+            crypton-x509-store >= 1.6 && < 1.7,
+            crypton-x509-validation >= 1.6 && < 1.7
+
+    else
+        build-depends:
+            tls <1.7,
+            x509-store,
+            x509-validation
