diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # ChangeLog
 
+## 0.2.13
+
+* Necessary transport parameters are now stored in ResumptionInfo.
+
 ## 0.2.12
 
 * Dont' send UDP packets of size 0. (Cloudfare)
diff --git a/Network/QUIC/Client/Run.hs b/Network/QUIC/Client/Run.hs
--- a/Network/QUIC/Client/Run.hs
+++ b/Network/QUIC/Client/Run.hs
@@ -153,6 +153,7 @@
             genSRT
     setSockConnected conn ccSockConnected
     addResource conn qclean
+    modifytPeerParameters conn ccResumption
     let ver = chosenVersion verInfo
     initializeCoder conn InitialLevel $ initialSecrets ver peerCID
     setupCryptoStreams conn -- fixme: cleanup
diff --git a/Network/QUIC/Connection/Misc.hs b/Network/QUIC/Connection/Misc.hs
--- a/Network/QUIC/Connection/Misc.hs
+++ b/Network/QUIC/Connection/Misc.hs
@@ -19,6 +19,7 @@
     getMyParameters,
     getPeerParameters,
     setPeerParameters,
+    modifytPeerParameters,
     delayedAck,
     resetDealyedAck,
     setMaxPacketSize,
@@ -132,6 +133,22 @@
 
 setPeerParameters :: Connection -> Parameters -> IO ()
 setPeerParameters Connection{..} params = writeIORef peerParameters params
+
+modifytPeerParameters :: Connection -> ResumptionInfo -> IO ()
+modifytPeerParameters Connection{..} ri =
+    atomicModifyIORef'' peerParameters $ resumptionToParameters ri
+
+resumptionToParameters :: ResumptionInfo -> Parameters -> Parameters
+resumptionToParameters ResumptionInfo{..} params =
+    params
+        { activeConnectionIdLimit = resumptionActiveConnectionIdLimit
+        , initialMaxData = resumptionInitialMaxData
+        , initialMaxStreamDataBidiLocal = resumptionInitialMaxStreamDataBidiLocal
+        , initialMaxStreamDataBidiRemote = resumptionInitialMaxStreamDataBidiRemote
+        , initialMaxStreamDataUni = resumptionInitialMaxStreamDataUni
+        , initialMaxStreamsBidi = resumptionInitialMaxStreamsBidi
+        , initialMaxStreamsUni = resumptionInitialMaxStreamsUni
+        }
 
 ----------------------------------------------------------------
 
diff --git a/Network/QUIC/Connection/Role.hs b/Network/QUIC/Connection/Role.hs
--- a/Network/QUIC/Connection/Role.hs
+++ b/Network/QUIC/Connection/Role.hs
@@ -11,6 +11,7 @@
     getIncompatibleVN,
     setResumptionSession,
     setNewToken,
+    setResumptionParameters,
     setRegister,
     getRegister,
     getUnregister,
@@ -31,6 +32,7 @@
 import Network.QUIC.Connection.Types
 import Network.QUIC.Connector
 import Network.QUIC.Imports
+import Network.QUIC.Parameters
 import Network.QUIC.Types
 
 ----------------------------------------------------------------
@@ -107,6 +109,25 @@
                     , resumptionToken = token
                     }
             }
+
+setResumptionParameters :: Connection -> Parameters -> IO ()
+setResumptionParameters Connection{..} params = do
+    atomicModifyIORef'' roleInfo $ \ci ->
+        ci
+            { resumptionInfo = parametersToResumption (resumptionInfo ci) params
+            }
+
+parametersToResumption :: ResumptionInfo -> Parameters -> ResumptionInfo
+parametersToResumption ri Parameters{..} =
+    ri
+        { resumptionActiveConnectionIdLimit = activeConnectionIdLimit
+        , resumptionInitialMaxData = initialMaxData
+        , resumptionInitialMaxStreamDataBidiLocal = initialMaxStreamDataBidiLocal
+        , resumptionInitialMaxStreamDataBidiRemote = initialMaxStreamDataBidiRemote
+        , resumptionInitialMaxStreamDataUni = initialMaxStreamDataUni
+        , resumptionInitialMaxStreamsBidi = initialMaxStreamsBidi
+        , resumptionInitialMaxStreamsUni = initialMaxStreamsUni
+        }
 
 ----------------------------------------------------------------
 
diff --git a/Network/QUIC/Connection/Types.hs b/Network/QUIC/Connection/Types.hs
--- a/Network/QUIC/Connection/Types.hs
+++ b/Network/QUIC/Connection/Types.hs
@@ -224,74 +224,76 @@
 
 ----------------------------------------------------------------
 
+{- FOURMOLU_DISABLE -}
 -- | A quic connection to carry multiple streams.
 data Connection = Connection
-    { connState :: ConnState
+    { connState         :: ConnState
     , -- Actions
-      connDebugLog :: DebugLogger
+      connDebugLog      :: DebugLogger
     -- ^ A logger for debugging.
-    , connQLog :: QLogger
-    , connHooks :: Hooks
-    , connSend :: ~Send -- ~ for testing
-    , connRecv :: ~Recv -- ~ for testing
+    , connQLog          :: QLogger
+    , connHooks         :: Hooks
+    , connSend          :: ~Send -- ~ for testing
+    , connRecv          :: ~Recv -- ~ for testing
     -- Manage
-    , connRecvQ :: RecvQ
-    , connSocket :: IORef Socket
+    , connRecvQ         :: RecvQ
+    , connSocket        :: IORef Socket
     , genStatelessResetToken :: CID -> StatelessResetToken
-    , readers :: IORef (Map Word64 (Weak ThreadId))
-    , mainThreadId :: ThreadId
-    , controlRate :: Rate
+    , readers           :: IORef (Map Word64 (Weak ThreadId))
+    , mainThreadId      :: ThreadId
+    , controlRate       :: Rate
     , -- Info
-      roleInfo :: IORef RoleInfo
-    , quicVersionInfo :: IORef VersionInfo
-    , origVersionInfo :: VersionInfo -- chosenVersion is client's ver in Initial
+      roleInfo          :: IORef RoleInfo
+    , quicVersionInfo   :: IORef VersionInfo
+    , origVersionInfo   :: VersionInfo -- chosenVersion is client's ver in Initial
     -- Mine
-    , myParameters :: Parameters
-    , myCIDDB :: IORef CIDDB
+    , myParameters      :: Parameters
+    , myCIDDB           :: IORef CIDDB
     , -- Peer
-      peerParameters :: IORef Parameters
-    , peerCIDDB :: TVar CIDDB
-    , peerInfo :: IORef PeerInfo
+      peerParameters    :: IORef Parameters
+    , peerCIDDB         :: TVar CIDDB
+    , peerInfo          :: IORef PeerInfo
     , -- Queues
-      inputQ :: InputQ
-    , cryptoQ :: CryptoQ
-    , outputQ :: OutputQ
-    , outputRate :: Rate
-    , shared :: Shared
-    , delayedAckCount :: IORef Int
-    , delayedAckCancel :: IORef (IO ())
+      inputQ            :: InputQ
+    , cryptoQ           :: CryptoQ
+    , outputQ           :: OutputQ
+    , outputRate        :: Rate
+    , shared            :: Shared
+    , delayedAckCount   :: IORef Int
+    , delayedAckCancel  :: IORef (IO ())
     , -- State
-      peerPacketNumber :: IORef PacketNumber -- for RTT1
-    , streamTable :: IORef StreamTable
-    , myStreamId :: TVar Concurrency -- C:0 S:1
-    , myUniStreamId :: TVar Concurrency -- C:2 S:3
-    , peerStreamId :: IORef Concurrency -- C:1 S:0
-    , peerUniStreamId :: IORef Concurrency -- C:3 S:2
-    , flowTx :: TVar TxFlow
-    , flowRx :: IORef RxFlow
-    , migrationState :: TVar MigrationState
+      peerPacketNumber  :: IORef PacketNumber -- for RTT1
+    , streamTable       :: IORef StreamTable
+    , myStreamId        :: TVar Concurrency -- C:0 S:1
+    , myUniStreamId     :: TVar Concurrency -- C:2 S:3
+    , peerStreamId      :: IORef Concurrency -- C:1 S:0
+    , peerUniStreamId   :: IORef Concurrency -- C:3 S:2
+    , flowTx            :: TVar TxFlow
+    , flowRx            :: IORef RxFlow
+    , migrationState    :: TVar MigrationState
     , sentRetirePriorTo :: IORef Bool
-    , minIdleTimeout :: IORef Microseconds
-    , bytesTx :: IORef Int
-    , bytesRx :: IORef Int
+    , minIdleTimeout    :: IORef Microseconds
+    , bytesTx           :: IORef Int
+    , bytesRx           :: IORef Int
     , -- TLS
-      pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
-    , ciphers :: IOArray EncryptionLevel Cipher
-    , coders :: IOArray EncryptionLevel Coder
-    , coders1RTT :: IOArray Bool Coder1RTT
-    , protectors :: IOArray EncryptionLevel Protector
-    , currentKeyPhase :: IORef (Bool, PacketNumber)
-    , negotiated :: IORef Negotiated
-    , connMyAuthCIDs :: IORef AuthCIDs
-    , connPeerAuthCIDs :: IORef AuthCIDs
+      pendingQ          :: Array EncryptionLevel (TVar [ReceivedPacket])
+    , ciphers           :: IOArray EncryptionLevel Cipher
+    , coders            :: IOArray EncryptionLevel Coder
+    , coders1RTT        :: IOArray Bool Coder1RTT
+    , protectors        :: IOArray EncryptionLevel Protector
+    , currentKeyPhase   :: IORef (Bool, PacketNumber)
+    , negotiated        :: IORef Negotiated
+    , connMyAuthCIDs    :: IORef AuthCIDs
+    , connPeerAuthCIDs  :: IORef AuthCIDs
     , -- Resources
-      connResources :: IORef (IO ())
-    , encodeBuf :: Buffer
-    , encryptRes :: SizedBuffer
-    , decryptBuf :: Buffer
+      encodeBuf         :: Buffer
+    , encryptRes        :: SizedBuffer
+    , decryptBuf        :: Buffer
+    , connResources     :: IORef (IO ())
     , -- Recovery
-      connLDCC :: LDCC
+      connLDCC          :: LDCC
     }
+{- FOURMOLU_ENABLE -}
 
 instance KeepQlog Connection where
     keepQlog conn = connQLog conn
@@ -316,6 +318,7 @@
         arr = array (RTT0Level, RTT1Level) lst
     return arr
 
+{- FOURMOLU_DISABLE -}
 newConnection
     :: Role
     -> Parameters
@@ -332,72 +335,65 @@
     -> Recv
     -> (CID -> StatelessResetToken)
     -> IO Connection
-newConnection rl myparams verInfo myAuthCIDs peerAuthCIDs debugLog qLog hooks sref piref recvQ ~send ~recv genSRT = do
-    -- ~ for testing
-    outQ <- newTQueueIO
-    let put x = atomically $ writeTQueue outQ $ OutRetrans x
-    connstate <- newConnState rl
-    let bufsiz = maximumUdpPayloadSize
-    encBuf <- mallocBytes bufsiz
-    ecrptBuf <- mallocBytes bufsiz
-    dcrptBuf <- mallocBytes bufsiz
-    Connection connstate debugLog qLog hooks send recv recvQ sref genSRT
-        <$> newIORef Map.empty
-        <*> myThreadId
-        <*> newRate
-        -- Info
-        <*> newIORef initialRoleInfo
-        <*> newIORef verInfo
-        <*> return verInfo
-        -- Mine
-        <*> return myparams
-        <*> newIORef (newCIDDB myCID)
-        -- Peer
-        <*> newIORef baseParameters
-        <*> newTVarIO (newCIDDB peerCID)
-        <*> return piref
-        -- Queues
-        <*> newTQueueIO
-        <*> newTQueueIO
-        <*> return outQ
-        <*> newRate
-        <*> newShared
-        <*> newIORef 0
-        <*> newIORef (return ())
-        -- State
-        <*> newIORef 0
-        <*> newIORef emptyStreamTable
-        <*> newTVarIO (newConcurrency rl Bidirectional 0)
-        <*> newTVarIO (newConcurrency rl Unidirectional 0)
-        <*> newIORef peerConcurrency
-        <*> newIORef peerUniConcurrency
-        <*> newTVarIO (newTxFlow 0) -- limit is set in Handshake
-        <*> newIORef (newRxFlow $ initialMaxData myparams)
-        <*> newTVarIO NonMigration
-        <*> newIORef False
-        <*> newIORef (milliToMicro $ maxIdleTimeout myparams)
-        <*> newIORef 0
-        <*> newIORef 0
-        -- TLS
-        <*> makePendingQ
-        <*> newArray (InitialLevel, RTT1Level) defaultCipher
-        <*> newArray (InitialLevel, HandshakeLevel) initialCoder
-        <*> newArray (False, True) initialCoder1RTT
-        <*> newArray (InitialLevel, RTT1Level) initialProtector
-        <*> newIORef (False, 0)
-        <*> newIORef initialNegotiated
-        <*> newIORef myAuthCIDs
-        <*> newIORef peerAuthCIDs
-        -- Resources
-        <*> newIORef (free encBuf >> free ecrptBuf >> free dcrptBuf)
-        <*> return encBuf -- used sender or closere
-        <*> return (SizedBuffer ecrptBuf bufsiz) -- used sender
-        <*> return dcrptBuf -- used receiver
-        -- Recovery
-        <*> newLDCC connstate qLog put
+newConnection rl myParameters origVersionInfo myAuthCIDs peerAuthCIDs connDebugLog connQLog connHooks connSocket peerInfo connRecvQ ~connSend ~connRecv genStatelessResetToken = do
+    connState         <- newConnState rl
+    -- Manage
+    readers           <- newIORef Map.empty
+    mainThreadId      <- myThreadId
+    controlRate       <- newRate
+    -- Info
+    roleInfo          <- newIORef roleinfo
+    quicVersionInfo   <- newIORef origVersionInfo
+    -- Mine
+    myCIDDB           <- newIORef (newCIDDB myCID)
+    -- Peer
+    peerParameters    <- newIORef baseParameters
+    peerCIDDB         <- newTVarIO (newCIDDB peerCID)
+    -- Queus
+    inputQ            <- newTQueueIO
+    cryptoQ           <- newTQueueIO
+    outputQ           <- newTQueueIO
+    outputRate        <- newRate
+    shared            <- newShared
+    delayedAckCount   <- newIORef 0
+    delayedAckCancel  <- newIORef (return ())
+    -- State
+    peerPacketNumber  <- newIORef 0
+    streamTable       <- newIORef emptyStreamTable
+    myStreamId        <- newTVarIO (newConcurrency rl Bidirectional 0)
+    myUniStreamId     <- newTVarIO (newConcurrency rl Unidirectional 0)
+    peerStreamId      <- newIORef peerConcurrency
+    peerUniStreamId   <- newIORef peerUniConcurrency
+    flowTx            <- newTVarIO (newTxFlow 0) -- limit is set in Handshake
+    flowRx            <- newIORef (newRxFlow $ initialMaxData myParameters)
+    migrationState    <- newTVarIO NonMigration
+    sentRetirePriorTo <- newIORef False
+    minIdleTimeout    <- newIORef (milliToMicro $ maxIdleTimeout myParameters)
+    bytesTx           <- newIORef 0
+    bytesRx           <- newIORef 0
+    -- TLS
+    pendingQ          <- makePendingQ
+    ciphers           <- newArray (InitialLevel, RTT1Level) defaultCipher
+    coders            <- newArray (InitialLevel, HandshakeLevel) initialCoder
+    coders1RTT        <- newArray (False, True) initialCoder1RTT
+    protectors        <- newArray (InitialLevel, RTT1Level) initialProtector
+    currentKeyPhase   <- newIORef (False, 0)
+    negotiated        <- newIORef initialNegotiated
+    connMyAuthCIDs    <- newIORef myAuthCIDs
+    connPeerAuthCIDs  <- newIORef peerAuthCIDs
+    -- Resources
+    encodeBuf         <- mallocBytes bufsiz -- used sender or closere
+    encryptBuf        <- mallocBytes bufsiz
+    let encryptRes = SizedBuffer encryptBuf bufsiz -- used sender
+    decryptBuf        <- mallocBytes bufsiz -- used receiver
+    connResources     <- newIORef (free encodeBuf >> free encryptBuf >> free decryptBuf)
+    -- Recovery
+    let put x = atomically $ writeTQueue outputQ $ OutRetrans x
+    connLDCC          <- newLDCC connState connQLog put
+    return Connection{..}
   where
     isclient = rl == Client
-    initialRoleInfo
+    roleinfo
         | isclient = defaultClientRoleInfo
         | otherwise = defaultServerRoleInfo
     myCID = fromJust $ initSrcCID myAuthCIDs
@@ -405,8 +401,10 @@
     peer
         | isclient = Server
         | otherwise = Client
-    peerConcurrency = newConcurrency peer Bidirectional (initialMaxStreamsBidi myparams)
-    peerUniConcurrency = newConcurrency peer Unidirectional (initialMaxStreamsUni myparams)
+    peerConcurrency = newConcurrency peer Bidirectional (initialMaxStreamsBidi myParameters)
+    peerUniConcurrency = newConcurrency peer Unidirectional (initialMaxStreamsUni myParameters)
+    bufsiz = maximumUdpPayloadSize
+{- FOURMOLU_ENABLE -}
 
 defaultTrafficSecrets :: (ClientTrafficSecret a, ServerTrafficSecret a)
 defaultTrafficSecrets = (ClientTrafficSecret "", ServerTrafficSecret "")
diff --git a/Network/QUIC/Handshake.hs b/Network/QUIC/Handshake.hs
--- a/Network/QUIC/Handshake.hs
+++ b/Network/QUIC/Handshake.hs
@@ -248,9 +248,11 @@
             checkInvalid params
             setParams params
             qlogParamsSet conn (params, "remote")
-            when (isServer conn) $
-                serverVersionNegotiation $
-                    versionInformation params
+            if isClient conn
+                then
+                    setResumptionParameters conn params
+                else
+                    serverVersionNegotiation $ versionInformation params
 
     checkAuthCIDs params = do
         peerAuthCIDs <- getPeerAuthCIDs conn
diff --git a/Network/QUIC/Types/Resumption.hs b/Network/QUIC/Types/Resumption.hs
--- a/Network/QUIC/Types/Resumption.hs
+++ b/Network/QUIC/Types/Resumption.hs
@@ -19,6 +19,13 @@
     , resumptionSession :: [(SessionID, SessionData)]
     , resumptionToken :: Token
     , resumptionRetry :: Bool
+    , resumptionActiveConnectionIdLimit :: Int
+    , resumptionInitialMaxData :: Int
+    , resumptionInitialMaxStreamDataBidiLocal :: Int
+    , resumptionInitialMaxStreamDataBidiRemote :: Int
+    , resumptionInitialMaxStreamDataUni :: Int
+    , resumptionInitialMaxStreamsBidi :: Int
+    , resumptionInitialMaxStreamsUni :: Int
     }
     deriving (Eq, Show, Generic)
 
@@ -31,6 +38,13 @@
         , resumptionSession = []
         , resumptionToken = emptyToken
         , resumptionRetry = False
+        , resumptionActiveConnectionIdLimit = 2 -- see baseParameters
+        , resumptionInitialMaxData = 0
+        , resumptionInitialMaxStreamDataBidiLocal = 0
+        , resumptionInitialMaxStreamDataBidiRemote = 0
+        , resumptionInitialMaxStreamDataUni = 0
+        , resumptionInitialMaxStreamsBidi = 0
+        , resumptionInitialMaxStreamsUni = 0
         }
 
 -- | Is 0RTT possible?
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.2.12
+version:            0.2.13
 license:            BSD3
 license-file:       LICENSE
 maintainer:         kazu@iij.ad.jp
