diff --git a/Dust-tools-pcap.cabal b/Dust-tools-pcap.cabal
--- a/Dust-tools-pcap.cabal
+++ b/Dust-tools-pcap.cabal
@@ -1,5 +1,5 @@
 Name:                Dust-tools-pcap
-Version:             1.1
+Version:             1.3.1
 Description:         A set of tools for exploring network filtering
 Synopsis:            Network filtering exploration tools that rely on pcap
 Category:            Network
@@ -15,12 +15,12 @@
   location: git@github.com:blanu/Dust-tools.git
 
 Executable replay-convert
-  Main-is: Dust/Services/Replay/convert.hs
+  Main-is: Dust/Model/convert.hs
   Build-Depends:
     base >= 3 && < 5,
     Dust-crypto,
-    Dust >= 2.3,
-    Dust-tools >=1.3,
+    Dust >= 2.3.1,
+    Dust-tools >=1.3.2,
     bytestring,
     entropy,
     network,
@@ -36,50 +36,8 @@
     split,
     pcap
 
-Executable update
+Executable shaper-update
   Main-is:           Dust/Model/update.hs
-  Build-Depends:
-    base >= 3 && < 5,
-    Dust,
-    bytestring,
-    entropy,
-    network,
-    cereal,
-    ghc-prim,
-    binary,
-    random,
-    random-extras,
-    random-source,
-    random-fu,
-    containers,
-    directory,
-    split,
-    pcap,
-    csv
-
-Executable export
-  Main-is:           Dust/Model/export.hs
-  Build-Depends:
-    base >= 3 && < 5,
-    Dust,
-    bytestring,
-    entropy,
-    network,
-    cereal,
-    ghc-prim,
-    binary,
-    random,
-    random-extras,
-    random-source,
-    random-fu,
-    containers,
-    directory,
-    split,
-    pcap,
-    csv
-
-Executable show
-  Main-is:           Dust/Model/show.hs
   Build-Depends:
     base >= 3 && < 5,
     Dust,
diff --git a/Dust/Model/convert.hs b/Dust/Model/convert.hs
new file mode 100644
--- /dev/null
+++ b/Dust/Model/convert.hs
@@ -0,0 +1,81 @@
+import System.IO
+import qualified Data.ByteString as B
+import Data.ByteString.Char8 (pack)
+import Data.Serialize
+import Text.Printf (printf)
+import Data.List as L
+import Control.Concurrent
+import Network.Socket hiding (recv, Stream)
+import Network.Socket.ByteString (recv, sendAll)
+import System.Entropy
+import Control.Exception
+import Data.Word (Word16)
+import Network.Pcap
+import System.Environment (getArgs)
+import Data.Word (Word32)
+
+import Dust.Network.Util
+import Dust.Model.Packet
+import Dust.Model.TrafficModel
+import Dust.Model.Observations
+import Dust.Services.Replay.Replay
+
+main :: IO()
+main = do
+    args <- getArgs
+
+    case args of
+        (pcappath:protocol:port:pspath:_) -> convert pcappath protocol port pspath
+        otherwise                         -> do
+          putStrLn "replay-convert converts .pcap files into the packetstream format for use in replay-server and replay-client"
+          putStrLn "Usage: replay-convert [pcap-file] [tcp|udp] [port] [packetstream-file]"
+
+convert :: FilePath -> String -> String -> FilePath -> IO()
+convert pcappath protocol sport pspath = do
+    let rport = (read sport)::Word16
+    case protocol of
+      "tcp" -> do
+          let config = TCPConfig (PortNum rport) False
+          pcap <- openPcap pcappath config
+          stream <- convertStream config pcap $ Stream ProtocolTCP rport []
+          putStrLn "---------------------------"
+          putStrLn $ show stream
+          let bs = encode stream
+          B.writeFile pspath bs
+      "udp" -> do
+          let config = UDPConfig (PortNum rport) False "" True
+          pcap <- openPcap pcappath config
+          stream <- convertStream config pcap $ Stream ProtocolUDP rport []
+          putStrLn $ show stream
+          let bs = encode stream
+          B.writeFile pspath bs
+      otherwise -> putStrLn $ "Unknown protocol " ++ protocol
+
+convertStream :: ReplayConfig -> PcapHandle -> Stream -> IO Stream
+convertStream config pcap stream@(Stream protocol rport packets) = do
+    (hdr, body) <- nextBS pcap
+    if hdrWireLength hdr /= 0
+        then do
+            let eitherHeaders = parsePacket body
+
+            case eitherHeaders of
+                Left error -> do
+                  putStrLn "Error parsing [TCP|UDP]/IP headers"
+                  return stream
+                Right packet@(Packet _ _ _ payload) -> do
+                    putStrLn $ show packet
+	            if (B.length payload) > 0
+        	        then convertStream config pcap $ Stream protocol rport $ packets ++ [packet]
+        		else convertStream config pcap stream
+        else return stream
+
+openPcap :: FilePath -> ReplayConfig -> IO PcapHandle
+openPcap pcappath config = do
+    pcap <- openOffline pcappath
+    putStrLn "Opened pcap file"
+    let ipmask = (fromIntegral 0)::Word32
+    case config of
+      (TCPConfig (PortNum port) _)     -> setFilter pcap ("tcp port " ++ (show port)) True ipmask
+      (UDPConfig (PortNum port) _ _ _) -> setFilter pcap ("udp port " ++ (show port)) True ipmask
+    return pcap
+
diff --git a/Dust/Model/export.hs b/Dust/Model/export.hs
deleted file mode 100644
--- a/Dust/Model/export.hs
+++ /dev/null
@@ -1,41 +0,0 @@
-import qualified Data.ByteString as B
-import qualified Data.ByteString.Lazy as BL
-import Data.ByteString.Char8 (pack)
-import System.Environment (getArgs)
-import System.IO.Error
-import Data.Serialize
-import Text.CSV
-import Data.List as L
-import Network.Pcap
-import Data.Word
-import Foreign.Ptr
-import Foreign.ForeignPtr
-import Control.Monad
-import System.Directory
-
-import Dust.Model.TrafficModel
-import Dust.Model.PacketLength
-import Dust.Model.Content
-import Dust.Model.Observations
-
-main = do
-    args <- getArgs
-
-    case args of
-        (modelpath:csvpath:_) -> export modelpath csvpath
-        otherwise      -> putStrLn "Usage: export [observation-file] [csv-file]"
-
-export :: FilePath -> FilePath -> IO()
-export modelpath csvpath = do
-    eitherObs <- loadObservations modelpath
-    case eitherObs of
-      Left error -> putStrLn "Could not load observations"
-      Right obs -> do
-        let model = makeModel obs
-        let text = csvify modelpath model
-        writeFile csvpath text
-
-csvify :: String -> TrafficModel -> String
-csvify name (TrafficModel (PacketLengthModel ls) _ _) =
-  name ++ "\n" ++ (unlines $ map show ls)
-
diff --git a/Dust/Model/show.hs b/Dust/Model/show.hs
deleted file mode 100644
--- a/Dust/Model/show.hs
+++ /dev/null
@@ -1,61 +0,0 @@
-import Data.ByteString (ByteString)
-import qualified Data.ByteString as B
-import qualified Data.ByteString.Lazy as BL
-import Data.ByteString.Char8 (pack)
-import System.Environment (getArgs)
-import System.IO.Error
-import Data.Serialize
-import Text.CSV
-import Data.List as L
-import Network.Pcap
-import Data.Word
-import Foreign.Ptr
-import Foreign.ForeignPtr
-import Control.Monad
-import System.Directory
-import Data.Map
-
-import Dust.Model.TrafficModel
-import Dust.Model.PacketLength
-import Dust.Model.Content
-import Dust.Model.Observations
-
-main = do
-    args <- getArgs
-
-    case args of
-        (modelpath:_) -> showModel modelpath
-        otherwise      -> putStrLn "Usage: show [observation-file]"
-
-showModel :: FilePath -> IO()
-showModel modelpath = do
-    eitherObs <- loadObservations modelpath
-    case eitherObs of
-      Left error -> putStrLn "Could not load observations"
-      Right obs -> do
---        putStrLn $ show obs
-        showSubstrings obs
-
-showSubstrings :: Observations -> IO()
-showSubstrings (Observations _ _ _ (SubstringObservations items)) = showSubstring 0 items
-
-showSubstring :: Int -> [(Map ByteString Int)] -> IO()
-showSubstring offset [] = return ()
-showSubstring offset (item:rest) = do
-  showMap offset item
-  showSubstring (offset+1) rest
-
-showMap :: Int -> (Map ByteString Int) -> IO()
-showMap offset item = showGoodItems offset (assocs item)
-
-showGoodItems :: Int -> [(ByteString,Int)] -> IO()
-showGoodItems offset [] = return ()
-showGoodItems offset ((bs,count):rest) = do
-  showGoodItem offset bs count
-  showGoodItems offset rest
-
-showGoodItem :: Int -> ByteString -> Int -> IO()
-showGoodItem offset bs count = do
-  if count > 1
-    then putStrLn $ (show offset) ++ " " ++ (show bs) ++ " " ++ (show count)
-    else return ()
diff --git a/Dust/Services/Replay/convert.hs b/Dust/Services/Replay/convert.hs
deleted file mode 100644
--- a/Dust/Services/Replay/convert.hs
+++ /dev/null
@@ -1,81 +0,0 @@
-import System.IO
-import qualified Data.ByteString as B
-import Data.ByteString.Char8 (pack)
-import Data.Serialize
-import Text.Printf (printf)
-import Data.List as L
-import Control.Concurrent
-import Network.Socket hiding (recv, Stream)
-import Network.Socket.ByteString (recv, sendAll)
-import System.Entropy
-import Control.Exception
-import Data.Word (Word16)
-import Network.Pcap
-import System.Environment (getArgs)
-import Data.Word (Word32)
-
-import Dust.Network.Util
-import Dust.Model.Packet
-import Dust.Model.TrafficModel
-import Dust.Model.Observations
-import Dust.Services.Replay.Replay
-
-main :: IO()
-main = do
-    args <- getArgs
-
-    case args of
-        (pcappath:protocol:port:pspath:_) -> convert pcappath protocol port pspath
-        otherwise                         -> do
-          putStrLn "replay-convert converts .pcap files into the packetstream format for use in replay-server and replay-client"
-          putStrLn "Usage: replay-client [pcap-file] [tcp|udp] [port] [packetstream-file]"
-
-convert :: FilePath -> String -> String -> FilePath -> IO()
-convert pcappath protocol sport pspath = do
-    let rport = (read sport)::Word16
-    case protocol of
-      "tcp" -> do
-          let config = TCPConfig (PortNum rport) False
-          pcap <- openPcap pcappath config
-          stream <- convertStream config pcap $ Stream ProtocolTCP rport []
-          putStrLn "---------------------------"
-          putStrLn $ show stream
-          let bs = encode stream
-          B.writeFile pspath bs
-      "udp" -> do
-          let config = UDPConfig (PortNum rport) False "" True
-          pcap <- openPcap pcappath config
-          stream <- convertStream config pcap $ Stream ProtocolUDP rport []
-          putStrLn $ show stream
-          let bs = encode stream
-          B.writeFile pspath bs
-      otherwise -> putStrLn $ "Unknown protocol " ++ protocol
-
-convertStream :: ReplayConfig -> PcapHandle -> Stream -> IO Stream
-convertStream config pcap stream@(Stream protocol rport packets) = do
-    (hdr, body) <- nextBS pcap
-    if hdrWireLength hdr /= 0
-        then do
-            let eitherHeaders = parsePacket body
-
-            case eitherHeaders of
-                Left error -> do
-                  putStrLn "Error parsing [TCP|UDP]/IP headers"
-                  return stream
-                Right packet@(Packet _ _ _ payload) -> do
-                    putStrLn $ show packet
-	            if (B.length payload) > 0
-        	        then convertStream config pcap $ Stream protocol rport $ packets ++ [packet]
-        		else convertStream config pcap stream
-        else return stream
-
-openPcap :: FilePath -> ReplayConfig -> IO PcapHandle
-openPcap pcappath config = do
-    pcap <- openOffline pcappath
-    putStrLn "Opened pcap file"
-    let ipmask = (fromIntegral 0)::Word32
-    case config of
-      (TCPConfig (PortNum port) _)     -> setFilter pcap ("tcp port " ++ (show port)) True ipmask
-      (UDPConfig (PortNum port) _ _ _) -> setFilter pcap ("udp port " ++ (show port)) True ipmask
-    return pcap
-
