diff --git a/Dust.cabal b/Dust.cabal
--- a/Dust.cabal
+++ b/Dust.cabal
@@ -1,5 +1,5 @@
 Name:                Dust
-Version:             2.0
+Version:             2.1
 Description:         Dust is a polymorphic protocol engine designed to circumvent Internet filtering based on protocol identification
 Synopsis:            Polymorphic protocol engine
 Category:            Network
@@ -26,26 +26,26 @@
     containers,
     directory,
     split,
-    cipher-aes
+    cipher-aes == 0.1.8
   Extensions:
     ForeignFunctionInterface
 
   Exposed-modules:
-      Dust.Network.TcpServer
-      Dust.Network.UdpServer
-      Dust.Network.TcpClient
-      Dust.Network.Util
-      Dust.Model.PacketLength
-      Dust.Model.Huffman
-      Dust.Model.Content
       Dust.Core.Invite
-      Dust.Model.Observations
-      Dust.Model.Stats
       Dust.Crypto.Keys
       Dust.Crypto.ECDSA
       Dust.Crypto.ECDH
       Dust.Crypto.DustCipher
-
+      Dust.Model.PacketLength
+      Dust.Model.Huffman
+      Dust.Model.Content
+      Dust.Model.TrafficModel
+      Dust.Model.Observations
+      Dust.Model.Stats
+      Dust.Network.TcpServer
+      Dust.Network.UdpServer
+      Dust.Network.TcpClient
+      Dust.Network.Util
 
 --  if os(windows)
 --    build-depends: Win32
@@ -58,15 +58,15 @@
     Include-Dirs: lib
     extra-libraries: crypto
     Exposed-modules:
-      Dust.Crypto.Curve25519
-      Dust.Crypto.Ed25519
       Dust.Core.DustPacket
       Dust.Core.CryptoProtocol
       Dust.Core.WireProtocol
       Dust.Core.WireProtocolHandler
-      Dust.Network.DustServer
+      Dust.Crypto.Curve25519
+      Dust.Crypto.Ed25519
       Dust.Model.Port
       Dust.Model.Packet
+      Dust.Network.DustServer
 
 test-suite crypto
   type: exitcode-stdio-1.0
diff --git a/Dust/Crypto/DustCipher.hs b/Dust/Crypto/DustCipher.hs
--- a/Dust/Crypto/DustCipher.hs
+++ b/Dust/Crypto/DustCipher.hs
@@ -31,13 +31,13 @@
 
 encrypt :: EncryptionKey -> IV -> Plaintext -> Ciphertext
 encrypt (EncryptionKey keyBytes) (IV iv) (Plaintext plaintext) =
-  let aesKey = AES.initAES keyBytes
-  in Ciphertext $ AES.encryptCTR aesKey iv plaintext
+  let aesKey = AES.initKey keyBytes
+  in Ciphertext $ AES.encryptCTR aesKey (AES.IV iv) plaintext
 
 decrypt :: EncryptionKey -> IV -> Ciphertext -> Plaintext
 decrypt (EncryptionKey keyBytes) (IV iv) (Ciphertext ciphertext) =
-  let aesKey = AES.initAES keyBytes
-  in Plaintext $ AES.decryptCTR aesKey iv ciphertext
+  let aesKey = AES.initKey keyBytes
+  in Plaintext $ AES.decryptCTR aesKey (AES.IV iv) ciphertext
 
 createIV :: IO (IV)
 createIV = do
diff --git a/Dust/Model/TrafficModel.hs b/Dust/Model/TrafficModel.hs
new file mode 100644
--- /dev/null
+++ b/Dust/Model/TrafficModel.hs
@@ -0,0 +1,50 @@
+{-# LANGUAGE DeriveGeneric, DefaultSignatures #-} -- For automatic generation of cereal put and get
+
+module Dust.Model.TrafficModel
+(
+    TrafficModel(..),
+    TrafficGenerator(..),
+    loadModel,
+    makeGenerator
+)
+where
+
+import GHC.Generics
+import Data.Serialize
+import Data.ByteString (ByteString)
+import qualified Data.ByteString as B
+
+import Dust.Model.PacketLength
+import qualified Dust.Model.Content as C
+import Dust.Model.Port
+
+data TrafficModel = TrafficModel {
+    lengths :: PacketLengthModel,
+    content :: C.ContentModel,
+    ports   :: PortModel
+} deriving (Generic)
+instance Serialize TrafficModel
+
+data TrafficGenerator = TrafficGenerator {
+    generateLength :: IO Int,
+    encodeContent  :: (ByteString -> ByteString),
+    decodeContent  :: (ByteString -> ByteString),
+    generatePort   :: IO Int
+}
+
+loadModel :: FilePath -> IO (Either String TrafficModel)
+loadModel path = do
+    s <- B.readFile path
+    return ((decode s)::(Either String TrafficModel))
+
+makeGenerator :: TrafficModel -> TrafficGenerator
+makeGenerator model =
+    let (PacketLengthModel probs) = lengths model
+        cdf = probsToCDF probs
+        lengthGen = nextLength cdf
+        (C.ContentModel tree) = content model
+        enc = C.encodeContent tree
+        dec = C.decodeContent tree
+        (PortModel portList) = ports model
+        portGen = nextPort portList
+    in TrafficGenerator lengthGen enc dec portGen
