diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 0.1.15
+
+- Support customizing ClientHooks and ServerHooks config from tls
+
 ## 0.1.14
 
 - Using crypto-token v0.1
diff --git a/Network/QUIC/Config.hs b/Network/QUIC/Config.hs
--- a/Network/QUIC/Config.hs
+++ b/Network/QUIC/Config.hs
@@ -3,6 +3,7 @@
 
 module Network.QUIC.Config where
 
+import Data.Default.Class
 import Data.IP
 import Network.Socket
 import Network.TLS hiding (Hooks, HostName, Version)
@@ -57,6 +58,7 @@
     , ccCredentials :: Credentials
     -- ^ TLS credentials.
     , ccHooks :: Hooks
+    , ccTlsHooks :: ClientHooks
     , ccUse0RTT :: Bool
     -- ^ Use 0-RTT on the 2nd connection if possible.
     -- client original
@@ -89,6 +91,7 @@
         , ccQLog = Nothing
         , ccCredentials = mempty
         , ccHooks = defaultHooks
+        , ccTlsHooks = def
         , ccUse0RTT = False
         , -- client original
           ccServerName = "127.0.0.1"
@@ -117,6 +120,7 @@
     , scCredentials :: Credentials
     -- ^ Server certificate information.
     , scHooks :: Hooks
+    , scTlsHooks :: ServerHooks
     , scUse0RTT :: Bool
     -- ^ Use 0-RTT on the 2nd connection if possible.
     -- server original
@@ -143,6 +147,7 @@
         , scQLog = Nothing
         , scCredentials = mempty
         , scHooks = defaultHooks
+        , scTlsHooks = def
         , scUse0RTT = False
         , -- server original
           scAddresses = [("0.0.0.0", 4433), ("::", 4433)]
diff --git a/Network/QUIC/TLS.hs b/Network/QUIC/TLS.hs
--- a/Network/QUIC/TLS.hs
+++ b/Network/QUIC/TLS.hs
@@ -6,6 +6,7 @@
     serverHandshaker,
 ) where
 
+import Control.Applicative ((<|>))
 import Data.Default.Class
 import Network.TLS hiding (Version)
 import Network.TLS.QUIC
@@ -57,8 +58,8 @@
             , sharedSessionManager = sessionManager establish
             }
     hook =
-        def
-            { onSuggestALPN = ccALPN ver
+        ccTlsHooks
+            { onSuggestALPN = (<|>) <$> ccALPN ver <*> onSuggestALPN ccTlsHooks
             }
     supported =
         defaultSupported
@@ -101,14 +102,15 @@
             , sharedSessionManager = scSessionManager
             }
     hook =
-        def
+        scTlsHooks
             { onALPNClientSuggest = case scALPN of
-                Nothing -> Nothing
+                Nothing -> onALPNClientSuggest scTlsHooks
                 Just io -> Just $ io ver
             , onEncryptedExtensionsCreating = \exts0 -> do
+                exts0' <- onEncryptedExtensionsCreating scTlsHooks exts0
                 params <- getParams
                 let exts = convExt $ parametersToExtensionRaw ver $ convTP params
-                return $ exts ++ exts0
+                return $ exts ++ exts0'
             }
     supported =
         def
diff --git a/quic.cabal b/quic.cabal
--- a/quic.cabal
+++ b/quic.cabal
@@ -1,6 +1,6 @@
 cabal-version:      >=1.10
 name:               quic
-version:            0.1.14
+version:            0.1.15
 license:            BSD3
 license-file:       LICENSE
 maintainer:         kazu@iij.ad.jp
@@ -128,7 +128,7 @@
         base >=4.9 && <5,
         array >= 0.5 && < 0.6,
         base16-bytestring >= 1.0 && < 1.1,
-        bytestring >= 0.10 && < 0.12,
+        bytestring >= 0.10 && < 0.13,
         containers >= 0.6 && < 0.7,
         crypto-token >= 0.1 && < 0.2,
         crypton >= 0.34 && < 0.35,
