diff --git a/peyotls.cabal b/peyotls.cabal
--- a/peyotls.cabal
+++ b/peyotls.cabal
@@ -2,7 +2,7 @@
 cabal-version:	>= 1.8
 
 name:		peyotls
-version:	0.1.6.7
+version:	0.1.6.8
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -281,7 +281,7 @@
 source-repository	this
     type:	git
     location:	git://github.com/YoshikuniJujo/peyotls.git
-    tag:	peyotls-0.1.6.7
+    tag:	peyotls-0.1.6.8
 
 library
     hs-source-dirs:	src
@@ -305,7 +305,7 @@
         cryptohash == 0.11.*,
         crypto-pubkey == 0.2.*, crypto-pubkey-types == 0.4.*,
         cipher-aes == 0.2.*,
-        bytable == 0.1.*, handle-like == 0.1.*, peyotls-codec == 0.1.*,
+        bytable == 0.1.*, handle-like == 0.1.*, peyotls-codec == 0.2.*,
         stm == 2.4.*, transformers-base == 0.4.*, monad-control == 0.3.*
     ghc-options:	-Wall
     extensions:		PatternGuards, DoAndIfThenElse
diff --git a/src/Network/PeyoTLS/Base.hs b/src/Network/PeyoTLS/Base.hs
--- a/src/Network/PeyoTLS/Base.hs
+++ b/src/Network/PeyoTLS/Base.hs
@@ -15,7 +15,7 @@
 		readHandshake, writeHandshake,
 		CCSpec(..),
 	Handshake(HHelloReq),
-	ClHello(..), SvHello(..), SssnId(..), Extension(..), isRnInfo, emptyRnInfo,
+	ClHello(..), SvHello(..), PrtVrsn(..), SssnId(..), Extension(..), isRnInfo, emptyRnInfo,
 		CipherSuite(..), KeyEx(..), BulkEnc(..),
 		CmpMtd(..), HashAlg(..), SignAlg(..),
 		getCipherSuite, setCipherSuite,
@@ -61,7 +61,7 @@
 
 import Network.PeyoTLS.Codec (
 	Handshake(..), HandshakeItem(..),
-	ClHello(..), SvHello(..), SssnId(..),
+	ClHello(..), SvHello(..), PrtVrsn(..), SssnId(..),
 		CipherSuite(..), KeyEx(..), BulkEnc(..),
 		CmpMtd(..), Extension(..), isRnInfo, emptyRnInfo,
 	SvKeyEx(..), SvKeyExDhe(..), SvKeyExEcdhe(..),
diff --git a/src/Network/PeyoTLS/Client/Body.hs b/src/Network/PeyoTLS/Client/Body.hs
--- a/src/Network/PeyoTLS/Client/Body.hs
+++ b/src/Network/PeyoTLS/Client/Body.hs
@@ -55,7 +55,7 @@
 	ValidateHandle(..), handshakeValidate, validateAlert,
 	HandleBase, CertSecretKey(..),
 		readHandshake, writeHandshake, CCSpec(..),
-	ClHello(..), SvHello(..), SssnId(..), isRnInfo,
+	ClHello(..), SvHello(..), PrtVrsn(..), SssnId(..), isRnInfo,
 		CipherSuite(..), KeyEx(..), BulkEnc(..),
 		CmpMtd(..), HashAlg(..), SignAlg(..),
 		setCipherSuite,
@@ -167,7 +167,7 @@
 clientHello cscl = do
 	cr <- withRandom $ cprgGenerate 32
 	((>>) <$> writeHandshake <*> debug "low")
-		. ClHello (3, 3) cr (SssnId "") cscl [CmpMtdNull]
+		. ClHello (PrtVrsn 3 3) cr (SssnId "") cscl [CmpMtdNull]
 		. Just . (: []) =<< makeClRenego
 	return cr
 
@@ -188,7 +188,7 @@
 serverHello = do
 	SvHello v sr _sid cs@(CipherSuite ke _) cm e <- readHandshake
 	case v of
-		(3, 3) -> return ()
+		PrtVrsn 3 3 -> return ()
 		_ -> throw ALFtl ADProtoVer $
 			modNm ++ ".serverHello: only TLS 1.2"
 	case cm of
diff --git a/src/Network/PeyoTLS/Run/State.hs b/src/Network/PeyoTLS/Run/State.hs
--- a/src/Network/PeyoTLS/Run/State.hs
+++ b/src/Network/PeyoTLS/Run/State.hs
@@ -6,7 +6,7 @@
 		getRSn, getWSn, rstRSn, rstWSn, sccRSn, sccWSn,
 		getClFinished, setClFinished, getSvFinished, setSvFinished,
 	ContType(..), getRBuf, getWBuf, getAdBuf, setRBuf, setWBuf, setAdBuf,
-	ProtocolVersion,
+	PrtVrsn,
 	CipherSuite(..), BulkEnc(..), RW(..),
 		getCipherSuite, setCipherSuite, flushCipherSuite,
 	Keys(..), getKeys, setKeys,
@@ -27,8 +27,8 @@
 import qualified Crypto.PubKey.ECC.ECDSA as ECDSA
 
 import Network.PeyoTLS.CertSecretKey (CertSecretKey(..), isRsaKey, isEcdsaKey)
-import Network.PeyoTLS.Codec (CipherSuite(..), KeyEx(KE_NULL), BulkEnc(..))
-import Network.PeyoTLS.Codec.ContentTypes (ContType(..), ProtocolVersion)
+import Network.PeyoTLS.Codec (
+	CipherSuite(..), KeyEx(KE_NULL), BulkEnc(..), ContType(..), PrtVrsn)
 
 modNm :: String
 modNm = "Network.PeyoTLS.State"
diff --git a/src/Network/PeyoTLS/Server/Body.hs b/src/Network/PeyoTLS/Server/Body.hs
--- a/src/Network/PeyoTLS/Server/Body.hs
+++ b/src/Network/PeyoTLS/Server/Body.hs
@@ -29,7 +29,6 @@
 import "monads-tf" Control.Monad.Error.Class (strMsg)
 import Data.Maybe (fromJust)
 import Data.List (find)
-import Data.Word (Word8)
 import Data.Function
 import Data.HandleLike (HandleLike(..))
 import System.IO (Handle)
@@ -58,7 +57,7 @@
 	HandleBase, CertSecretKey(..), isRsaKey, isEcdsaKey,
 		readHandshake, writeHandshake, CCSpec(..),
 	Handshake(HHelloReq),
-	ClHello(..), SvHello(..), SssnId(..), Extension(..),
+	ClHello(..), SvHello(..), PrtVrsn(..), SssnId(..), Extension(..),
 		isRnInfo, emptyRnInfo,
 		CipherSuite(..), KeyEx(..), BulkEnc(..),
 		CmpMtd(..), HashAlg(..), SignAlg(..),
@@ -88,10 +87,8 @@
 	hlClose = adClose . tlsHandleS
 	hlFlush = wFlush . tlsHandleS
 
-type Version = (Word8, Word8)
-
-version :: Version
-version = (3, 3)
+version :: PrtVrsn
+version = PrtVrsn 3 3
 
 moduleName :: String
 moduleName = "Network.PeyoTLS.Server"
@@ -204,7 +201,7 @@
 		"43db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"
 
 clientHello :: (HandleLike h, CPRG g) => [CipherSuite] ->
-	HandshakeM h g (KeyEx, BulkEnc, BS.ByteString, Version)
+	HandshakeM h g (KeyEx, BulkEnc, BS.ByteString, PrtVrsn)
 clientHello cssv = do
 	ClHello cv cr _sid cscl cms me <- readHandshake
 	checkRnInfo cscl me
@@ -250,13 +247,13 @@
 			moduleName ++ ".serverHello: cert files not match"
 	return sr
 
-rsaKeyExchange :: (ValidateHandle h, CPRG g) => RSA.PrivateKey -> Version ->
+rsaKeyExchange :: (ValidateHandle h, CPRG g) => RSA.PrivateKey -> PrtVrsn ->
 	(BS.ByteString, BS.ByteString) -> Maybe X509.CertificateStore ->
 	HandshakeM h g (Maybe X509.PubKey)
-rsaKeyExchange sk (vj, vn) rs mcs = const `liftM` reqAndCert mcs `ap` do
+rsaKeyExchange sk vjvn@(PrtVrsn vj vn) rs mcs = const `liftM` reqAndCert mcs `ap` do
 	Epms epms <- readHandshake
 	makeKeys Server rs =<< mkpms epms `catchError` const
-		((BS.cons vj . BS.cons vn) `liftM` withRandom (cprgGenerate 46))
+		((B.encode vjvn `BS.append`) `liftM` withRandom (cprgGenerate 46))
 	where mkpms epms = do
 		pms <- either (E.throwError . strMsg . show) return =<<
 			withRandom (\g -> RSA.decryptSafer g sk epms)
