diff --git a/snmp.cabal b/snmp.cabal
--- a/snmp.cabal
+++ b/snmp.cabal
@@ -1,5 +1,5 @@
 name:                snmp
-version:             0.1.0.2
+version:             0.1.0.3
 synopsis:            API for write snmp client.
 description:         API for write snmp client.        
 license:             BSD3
@@ -20,7 +20,7 @@
   exposed-modules: Network.Protocol.Snmp, Network.Snmp.Client, Network.Snmp.Example
   other-modules: Network.Snmp.Client.Internal, Network.Snmp.Client.Types, Network.Snmp.Client.Version2, Network.Snmp.Client.Version3     
   -- other-extensions:    
-  build-depends:       base >=4.6 && <4.8, 
+  build-depends:       base >=4.6 && <4.9, 
                        asn1-encoding, 
                        asn1-types, 
                        asn1-parse, 
diff --git a/src/Network/Protocol/Snmp.hs b/src/Network/Protocol/Snmp.hs
--- a/src/Network/Protocol/Snmp.hs
+++ b/src/Network/Protocol/Snmp.hs
@@ -44,8 +44,6 @@
 -- *** PDU snmpV3
 , ContextEngineID(..)
 , ContextName(..)
--- * pack, unpack Packet
-, Pack(..)
 -- * some classes and helpers 
 -- *** universal, for work with both versions
 , HasItem(..)
@@ -113,7 +111,6 @@
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as BL
-import Data.Word (Word8, Word32, Word64)
 #if MIN_VERSION_base(4,7,0)
 import Data.Bits (testBit, complement, shiftL, (.|.), (.&.), setBit, shiftR, zeroBits, xor, clearBit)
 #else
@@ -134,6 +131,9 @@
 import qualified Crypto.Cipher.DES as Priv
 import qualified Crypto.Cipher.AES as Priv
 import Data.Int
+import Data.Binary
+import Data.Binary.Get
+import Data.Binary.Put
 
 -- $example
 --
@@ -310,11 +310,6 @@
                      | ServerException Integer
                      deriving (Typeable, Eq)
 
--- | class for make binary packet from [ASN1] 
-class Pack a where
-    encode :: a -> ByteString
-    decode :: ByteString -> a
-
 -- | some universal getters, setters
 class HasItem a where
     getHeader :: Packet -> Header a
@@ -805,9 +800,11 @@
      End Sequence <- getNext
      return $ SecurityParameter msgAuthoritiveEngineId (fromIntegral msgAuthoritiveEngineBoots) (fromIntegral msgAuthoritiveEngineTime) msgUserName msgAuthenticationParameters msgPrivacyParameters 
 
-instance Pack (PDU V3) where
-    encode s = encodeASN1' DER $ toASN1 s []
-    decode = toP
+instance Binary (PDU V3) where
+    put = putByteString . encodeASN1' DER . flip toASN1 [] 
+    get = toP . BL.toStrict <$> getRemainingLazyByteString
+--    encode s = encodeASN1' DER $ toASN1 s []
+--    decode = toP
 
 toP :: ByteString -> PDU V3
 toP bs = let a = fromASN1 <$> decodeASN1' DER bs
@@ -815,9 +812,10 @@
                  Right (Right (r, _)) -> r
                  _ -> throw $ ServerException 9
 
-instance Pack Packet where
-    encode s = encodeASN1' DER $ toASN1 s []
-    decode = toB 
+instance Binary Packet where
+    put = putByteString . encodeASN1' DER . flip toASN1 []
+--    encode s = encodeASN1' DER $ toASN1 s []
+    get = toB . BL.toStrict <$> getRemainingLazyByteString
 
 toB :: ByteString -> Packet 
 toB bs = let a = fromASN1 <$> decodeASN1' DER bs
@@ -949,7 +947,7 @@
 -- | (only V3) sign Packet 
 signPacket :: AuthType -> Key -> Packet -> Packet 
 signPacket at key packet = 
-    let packetAsBin = encode packet
+    let packetAsBin = BL.toStrict $ encode packet
         sign = B.take 12 $ HMAC.hmac (hash at) 64 key packetAsBin 
     in setAuthenticationParametersP sign packet
 
diff --git a/src/Network/Snmp/Client.hs b/src/Network/Snmp/Client.hs
--- a/src/Network/Snmp/Client.hs
+++ b/src/Network/Snmp/Client.hs
@@ -26,7 +26,7 @@
 , bulkwalk
 , set
 , close
--- * usefull functions
+-- * useful functions
 , oidFromBS
 )
 where
diff --git a/src/Network/Snmp/Client/Version2.hs b/src/Network/Snmp/Client/Version2.hs
--- a/src/Network/Snmp/Client/Version2.hs
+++ b/src/Network/Snmp/Client/Version2.hs
@@ -5,7 +5,7 @@
 
 import Network.Socket hiding (recv, socket, close)
 import qualified Network.Socket as NS
-import Network.Socket.ByteString (recv, sendAll)
+import Network.Socket.ByteString.Lazy (recv, sendAll)
 import Control.Applicative ((<$>))
 import Control.Concurrent.Async
 import Data.IORef (newIORef)
@@ -13,6 +13,7 @@
 import Control.Exception
 import Control.Monad (when)
 import Data.Monoid ((<>), mconcat, mempty)
+import Data.Binary hiding (get)
 
 import Network.Protocol.Snmp hiding (rid)
 import Network.Snmp.Client.Internal
diff --git a/src/Network/Snmp/Client/Version3.hs b/src/Network/Snmp/Client/Version3.hs
--- a/src/Network/Snmp/Client/Version3.hs
+++ b/src/Network/Snmp/Client/Version3.hs
@@ -9,9 +9,10 @@
 where
 
 import Data.ByteString (ByteString)
+import Data.ByteString.Lazy (toStrict, fromStrict)
 import Network.Socket hiding (recv, socket, close)
 import qualified Network.Socket as NS
-import Network.Socket.ByteString (recv, sendAll)
+import Network.Socket.ByteString.Lazy (recv, sendAll)
 import Control.Applicative ((<$>))
 import Control.Concurrent.Async
 import Data.IORef (newIORef, IORef, readIORef, atomicWriteIORef)
@@ -22,6 +23,7 @@
 import Data.Int
 import Control.Exception 
 import System.Random (randomIO)
+import Data.Binary 
 
 import Network.Protocol.Snmp
 import Network.Snmp.Client.Types
@@ -232,13 +234,13 @@
   | privType' st == DES = do
       s <- succCounter (salt32 st)
       let eib = getEngineBootsP packet'
-          (encrypted, salt) = desEncrypt key eib s (encode $ (getPDU packet' :: PDU V3))
+          (encrypted, salt) = desEncrypt key eib s (toStrict $ encode $ (getPDU packet' :: PDU V3))
       return $ setPrivParametersP salt . setPDU (CryptedPDU encrypted) $ packet'
   | privType' st == AES = do
       s <- succCounter (salt64 st)
       let eib = getEngineBootsP packet'
           t = getEngineTimeP packet'
-          (encrypted, salt) = aesEncrypt key eib t s (encode $ (getPDU packet' :: PDU V3))
+          (encrypted, salt) = aesEncrypt key eib t s (toStrict $ encode $ (getPDU packet' :: PDU V3))
       return $ setPrivParametersP salt . setPDU (CryptedPDU encrypted) $ packet'
   | otherwise = throwIO $ ServerException 5
 
@@ -248,7 +250,7 @@
       let pdu = getPDU packet' :: PDU V3
           salt = getPrivParametersP packet'
       in case pdu of
-              CryptedPDU x -> setPDU (decode (desDecrypt key salt x) :: PDU V3) packet'
+              CryptedPDU x -> setPDU (decode (fromStrict $ desDecrypt key salt x) :: PDU V3) packet'
               _ -> packet'
   | privType' st == AES =
       let pdu = getPDU packet' :: PDU V3
@@ -256,7 +258,7 @@
           eib = getEngineBootsP packet'
           t = getEngineTimeP packet'
       in case pdu of
-              CryptedPDU x -> setPDU (decode (aesDecrypt key salt eib t x) :: PDU V3) packet'
+              CryptedPDU x -> setPDU (decode (fromStrict $ aesDecrypt key salt eib t x) :: PDU V3) packet'
               _ -> packet'
   | otherwise = throw $ ServerException 5
 
