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
@@ -47,6 +47,7 @@
     settingsRstRateLimit,
 ) where
 
+import qualified Control.Exception as E
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as BS.C8
 import Data.Default.Class (def)
@@ -58,7 +59,6 @@
 import qualified Network.Run.TCP as TCP
 import Network.Socket
 import Network.TLS hiding (HostName)
-import qualified UnliftIO.Exception as E
 
 import Network.HTTP2.TLS.Client.Settings
 import Network.HTTP2.TLS.Config
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
@@ -92,25 +92,21 @@
     --
     -- Default: 'openClientSocket'
     , settingsOnServerFinished :: Information -> IO ()
-
     , settingsPingRateLimit :: Int
     -- ^ Maximum number of pings allowed per second (CVE-2019-9512)
     --
     -- >>> settingsPingRateLimit defaultSettings
     -- 10
-
     , settingsEmptyFrameRateLimit :: Int
     -- ^ Maximum number of empty data frames allowed per second (CVE-2019-9518)
     --
     -- >>> settingsEmptyFrameRateLimit defaultSettings
     -- 4
-
     , settingsSettingsRateLimit :: Int
     -- ^ Maximum number of settings frames allowed per second (CVE-2019-9515)
     --
     -- >>> settingsSettingsRateLimit defaultSettings
     -- 4
-
     , settingsRstRateLimit :: Int
     -- ^ Maximum number of reset frames allowed per second (CVE-2023-44487)
     --
diff --git a/Network/HTTP2/TLS/IO.hs b/Network/HTTP2/TLS/IO.hs
--- a/Network/HTTP2/TLS/IO.hs
+++ b/Network/HTTP2/TLS/IO.hs
@@ -3,6 +3,7 @@
 
 module Network.HTTP2.TLS.IO where
 
+import qualified Control.Exception as E
 import Control.Monad (void, when)
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS
@@ -13,7 +14,6 @@
 import Network.TLS hiding (HostName)
 import System.IO.Error (isEOFError)
 import qualified System.TimeManager as T
-import qualified UnliftIO.Exception as E
 
 import Network.HTTP2.TLS.Server.Settings
 
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
@@ -51,6 +51,7 @@
     ServerIO (..),
 ) where
 
+import qualified Control.Exception as E
 import Data.ByteString (ByteString)
 import Data.Default.Class (def)
 import Network.HTTP2.Server (
@@ -60,7 +61,6 @@
     emptyFrameRateLimit,
     initialWindowSize,
     maxConcurrentStreams,
-    numberOfWorkers,
     pingRateLimit,
     rstRateLimit,
     settings,
@@ -77,7 +77,6 @@
  )
 import Network.TLS hiding (HostName)
 import qualified System.TimeManager as T
-import qualified UnliftIO.Exception as E
 
 import Network.HTTP2.TLS.Config
 import Network.HTTP2.TLS.IO
@@ -103,10 +102,12 @@
         (show port)
         $ \mgr th sock -> do
             backend <- mkBackend settings sock
-            E.bracket (contextNew backend params) bye $ \ctx -> do
-                handshake ctx
-                iobackend <- timeoutIOBackend th settings <$> tlsIOBackend ctx sock
-                action mgr iobackend
+            ctx <- contextNew backend params
+            handshake ctx
+            iobackend <- timeoutIOBackend th settings <$> tlsIOBackend ctx sock
+            r <- action mgr iobackend
+            bye ctx
+            return r
   where
     params = getServerParams settings creds alpn
 
@@ -127,10 +128,12 @@
         s
         $ \mgr th sock -> do
             backend <- mkBackend settings sock
-            E.bracket (contextNew backend params) bye $ \ctx -> do
-                handshake ctx
-                iobackend <- timeoutIOBackend th settings <$> tlsIOBackend ctx sock
-                action mgr iobackend
+            ctx <- contextNew backend params
+            handshake ctx
+            iobackend <- timeoutIOBackend th settings <$> tlsIOBackend ctx sock
+            r <- action mgr iobackend
+            bye ctx
+            return r
   where
     params = getServerParams settings creds alpn
 
@@ -178,8 +181,7 @@
   where
     sconf =
         defaultServerConfig
-            { numberOfWorkers = settingsNumberOfWorkers
-            , connectionWindowSize = settingsConnectionWindowSize
+            { connectionWindowSize = settingsConnectionWindowSize
             , settings =
                 (settings defaultServerConfig)
                     { initialWindowSize = settingsStreamWindowSize
@@ -211,8 +213,7 @@
   where
     sconf =
         defaultServerConfig
-            { numberOfWorkers = settingsNumberOfWorkers
-            , connectionWindowSize = settingsConnectionWindowSize
+            { connectionWindowSize = settingsConnectionWindowSize
             , settings =
                 (settings defaultServerConfig)
                     { initialWindowSize = settingsStreamWindowSize
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,10 +1,6 @@
 module Network.HTTP2.TLS.Server.Settings where
 
 import Network.Control
-import Network.HTTP2.Server (
-    defaultServerConfig,
-    numberOfWorkers,
- )
 import Network.TLS (SessionManager, noSessionManager)
 
 -- Server settings type.
@@ -43,10 +39,7 @@
     --
     -- Default: do nothing
     , settingsNumberOfWorkers :: Int
-    -- ^ The number of workers. (H2 and H2c)
-    --
-    -- >>> settingsNumberOfWorkers defaultSettings
-    -- 8
+    -- ^ The http2 library now spawns a thread for each connection. Its limit is based on 'settingsConcurrentStreams'.
     , settingsConcurrentStreams :: Int
     -- ^ The maximum number of incoming streams on the net (H2 and H2c)
     --
@@ -72,25 +65,21 @@
     --
     -- >>> settingsEarlyDataSize defaultSettings
     -- 0
-
     , settingsPingRateLimit :: Int
     -- ^ Maximum number of pings allowed per second (CVE-2019-9512)
     --
     -- >>> settingsPingRateLimit defaultSettings
     -- 10
-
     , settingsEmptyFrameRateLimit :: Int
     -- ^ Maximum number of empty data frames allowed per second (CVE-2019-9518)
     --
     -- >>> settingsEmptyFrameRateLimit defaultSettings
     -- 4
-
     , settingsSettingsRateLimit :: Int
     -- ^ Maximum number of settings frames allowed per second (CVE-2019-9515)
     --
     -- >>> settingsSettingsRateLimit defaultSettings
     -- 4
-
     , settingsRstRateLimit :: Int
     -- ^ Maximum number of reset frames allowed per second (CVE-2023-44487)
     --
@@ -98,6 +87,8 @@
     -- 4
     }
 
+{-# DEPRECATED settingsNumberOfWorkers "This field is meaningless now" #-}
+
 -- | Default settings.
 defaultSettings :: Settings
 defaultSettings =
@@ -108,7 +99,7 @@
         , settingsReadBufferSize = 16384
         , settingsReadBufferLowerLimit = 2048
         , settingsKeyLogger = \_ -> return ()
-        , settingsNumberOfWorkers = numberOfWorkers defaultServerConfig
+        , settingsNumberOfWorkers = 8 -- dummy
         , 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,6 +1,6 @@
 cabal-version: >=1.10
 name:          http2-tls
-version:       0.4.2
+version:       0.4.3
 license:       BSD3
 license-file:  LICENSE
 maintainer:    Kazu Yamamoto <kazu@iij.ad.jp>
@@ -48,7 +48,6 @@
         recv >=0.1.0 && <0.2,
         time-manager >=0.0.1 && <0.2,
         tls >=2.1 && <2.2,
-        unliftio >=0.2 && <0.3,
         utf8-string >=1.0 && <1.1
 
 executable h2-client
