diff --git a/app/App/Commands.hs b/app/App/Commands.hs
--- a/app/App/Commands.hs
+++ b/app/App/Commands.hs
@@ -6,7 +6,7 @@
 import App.Commands.EncodeFiles
 import App.Commands.ExtractFiles
 import App.Commands.ExtractSegments
-import Data.Monoid
+import Data.Monoid                  ((<>))
 import Options.Applicative
 
 globalOptions :: Parser (IO ())
diff --git a/app/App/Commands/Dump.hs b/app/App/Commands/Dump.hs
--- a/app/App/Commands/Dump.hs
+++ b/app/App/Commands/Dump.hs
@@ -18,7 +18,7 @@
 import Data.Generics.Product.Any
 import Data.List
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid                     ((<>))
 import Data.Thyme.Clock
 import Data.Thyme.Clock.POSIX          (POSIXTime)
 import Data.Thyme.Format               (formatTime)
@@ -95,7 +95,7 @@
           Just (Known F.TimeMillis64LE) ->
             forM_ (LBS.chunkBy 8 (segment ^. the @"payload")) $ \bs -> do
               let w = G.runGet G.getInt64le (LBS.take 8 (bs <> LBS.replicate 8 0))
-              let t :: POSIXTime = (w `div` 1000) ^. from microseconds
+              let t :: POSIXTime = (w * 1000) ^. from microseconds
               liftIO $ IO.hPutStrLn hOut $ showTime (posixSecondsToUTCTime t) <> " (" <> show w <> " ms)"
           Just (Known F.TimeMicros64LE) ->
             forM_ (LBS.chunkBy 8 (segment ^. the @"payload")) $ \bs -> do
diff --git a/app/App/Commands/EncodeFiles.hs b/app/App/Commands/EncodeFiles.hs
--- a/app/App/Commands/EncodeFiles.hs
+++ b/app/App/Commands/EncodeFiles.hs
@@ -13,7 +13,7 @@
 import Control.Monad.IO.Class                    (liftIO)
 import Control.Monad.Trans.Resource              (MonadResource, runResourceT)
 import Data.Generics.Product.Any
-import Data.Monoid
+import Data.Monoid                               ((<>))
 import Options.Applicative
 
 import qualified Data.ByteString     as BS
diff --git a/app/App/Commands/ExtractFiles.hs b/app/App/Commands/ExtractFiles.hs
--- a/app/App/Commands/ExtractFiles.hs
+++ b/app/App/Commands/ExtractFiles.hs
@@ -14,7 +14,7 @@
 import Data.Generics.Product.Any
 import Data.List
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid                    ((<>))
 import Options.Applicative
 import System.Directory
 
diff --git a/app/App/Commands/ExtractSegments.hs b/app/App/Commands/ExtractSegments.hs
--- a/app/App/Commands/ExtractSegments.hs
+++ b/app/App/Commands/ExtractSegments.hs
@@ -12,7 +12,7 @@
 import Control.Monad.IO.Class         (liftIO)
 import Control.Monad.Trans.Resource   (MonadResource, runResourceT)
 import Data.Generics.Product.Any
-import Data.Monoid
+import Data.Monoid                    ((<>))
 import Options.Applicative
 import System.Directory
 import Text.Printf
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -4,7 +4,7 @@
 
 import App.Commands
 import Control.Monad
-import Data.Semigroup
+import Data.Semigroup      ((<>))
 import Options.Applicative
 
 import qualified System.IO as IO
diff --git a/asif.cabal b/asif.cabal
--- a/asif.cabal
+++ b/asif.cabal
@@ -1,11 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.28.2.
+-- This file has been generated from package.yaml by hpack version 0.18.1.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: de051b0b916332afc5b6b544ffaf3c0cabbf5c7dbc32317927f1dbe7b6e0c55c
 
 name:           asif
-version:        2.0.0
+version:        3.0.0
 description:    Please see the README on Github at <https://github.com/packetloop/asif#readme>
 category:       Services
 homepage:       https://github.com/packetloop/asif#readme
@@ -17,6 +15,7 @@
 license-file:   LICENSE
 build-type:     Simple
 cabal-version:  >= 1.10
+
 extra-source-files:
     ChangeLog.md
     README.md
@@ -31,8 +30,8 @@
   default-extensions: BangPatterns FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings TupleSections
   ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      attoparsec
-    , base >=4.7 && <5
+      base >= 4.7 && < 5
+    , attoparsec
     , binary
     , bytestring
     , conduit
@@ -44,6 +43,7 @@
     , exceptions
     , generic-lens
     , hw-bits
+    , hw-ip
     , iproute
     , lens
     , old-locale
@@ -81,9 +81,8 @@
   default-extensions: BangPatterns FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings TupleSections
   ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -threaded -rtsopts -O2 -msse4.2
   build-depends:
-      asif
+      base >= 4.7 && < 5
     , attoparsec
-    , base >=4.7 && <5
     , binary
     , bytestring
     , conduit
@@ -91,20 +90,22 @@
     , conduit-extra
     , containers
     , cpu
-    , directory
     , either
     , exceptions
     , generic-lens
     , hw-bits
+    , hw-ip
     , iproute
     , lens
     , old-locale
-    , optparse-applicative
     , resourcet
     , temporary-resourcet
     , text
     , thyme
     , vector
+    , asif
+    , directory
+    , optparse-applicative
   other-modules:
       App.Commands
       App.Commands.Dump
@@ -113,7 +114,6 @@
       App.Commands.ExtractSegments
       App.Commands.Options.Type
       App.IO
-      Paths_asif
   default-language: Haskell2010
 
 test-suite asif-test
@@ -124,10 +124,8 @@
   default-extensions: BangPatterns FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving MultiParamTypeClasses OverloadedStrings TupleSections
   ghc-options: -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      arbor-ip
-    , asif
+      base >= 4.7 && < 5
     , attoparsec
-    , base >=4.7 && <5
     , binary
     , bytestring
     , conduit
@@ -138,10 +136,8 @@
     , either
     , exceptions
     , generic-lens
-    , hedgehog
-    , hspec
     , hw-bits
-    , hw-hspec-hedgehog
+    , hw-ip
     , iproute
     , lens
     , old-locale
@@ -150,11 +146,14 @@
     , text
     , thyme
     , vector
+    , asif
+    , hspec
+    , hedgehog
+    , hw-hspec-hedgehog
   other-modules:
       Arbor.File.Format.Asif.ByteString.BuilderSpec
       Arbor.File.Format.Asif.Data.IpSpec
       Arbor.File.Format.AsifSpec
       Gen.Feed
       TestApp
-      Paths_asif
   default-language: Haskell2010
diff --git a/src/Arbor/File/Format/Asif/ByIndex.hs b/src/Arbor/File/Format/Asif/ByIndex.hs
--- a/src/Arbor/File/Format/Asif/ByIndex.hs
+++ b/src/Arbor/File/Format/Asif/ByIndex.hs
@@ -7,7 +7,7 @@
   ( ByIndex(..)
   ) where
 
-import Data.Monoid
+import Data.Monoid ((<>))
 
 import qualified Data.Semigroup as S
 
@@ -22,8 +22,8 @@
   mappend = (S.<>)
   mempty = ByIndex []
 
-appendByIndex :: (Monoid a, S.Semigroup a) => [a] -> [a] -> [a]
-appendByIndex (a:as) (b:bs) = (a <> b):appendByIndex as bs
-appendByIndex (a:as) bs     =  a      :appendByIndex as bs
-appendByIndex    as  (b:bs) =       b :appendByIndex as bs
+appendByIndex :: Monoid a => [a] -> [a] -> [a]
+appendByIndex (a:as) (b:bs) = (a `mappend` b):appendByIndex as bs
+appendByIndex (a:as) bs     =  a             :appendByIndex as bs
+appendByIndex    as  (b:bs) =              b :appendByIndex as bs
 appendByIndex    []     []  = []
diff --git a/src/Arbor/File/Format/Asif/ByteString/Builder.hs b/src/Arbor/File/Format/Asif/ByteString/Builder.hs
--- a/src/Arbor/File/Format/Asif/ByteString/Builder.hs
+++ b/src/Arbor/File/Format/Asif/ByteString/Builder.hs
@@ -16,11 +16,10 @@
 import Control.Monad
 import Data.Bits
 import Data.ByteString.Builder
-import Data.Conduit                    (Source)
 import Data.Generics.Product.Any
 import Data.Int
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid                     ((<>))
 import Data.String
 import Data.Thyme.Clock
 import Data.Thyme.Clock.POSIX          (POSIXTime, getPOSIXTime)
@@ -70,7 +69,7 @@
 intersperse :: Int64 -> Int64 -> B.Builder
 intersperse a b = B.word32LE (fromIntegral a) <> B.word32LE (fromIntegral b)
 
-segmentsRawC :: MonadIO m => String -> [IO.Handle] -> Source m BS.ByteString
+segmentsRawC :: MonadIO m => String -> [IO.Handle] -> ConduitT () BS.ByteString m ()
 segmentsRawC asifType handles = do
   let segmentCount = fromIntegral $ length handles :: Int64
 
@@ -95,7 +94,7 @@
   => String
   -> Maybe POSIXTime
   -> [Z.Segment IO.Handle]
-  -> m (Source m BS.ByteString)
+  -> m (ConduitT () BS.ByteString m ())
 segmentsC asifType maybeTimestamp metas = do
   fileTime <- maybe (liftIO getPOSIXTime) return maybeTimestamp
   (_, _, hFilenames   ) <- IO.openTempFile Nothing "asif-filenames"
diff --git a/src/Arbor/File/Format/Asif/Get.hs b/src/Arbor/File/Format/Asif/Get.hs
--- a/src/Arbor/File/Format/Asif/Get.hs
+++ b/src/Arbor/File/Format/Asif/Get.hs
@@ -4,7 +4,7 @@
 import Control.Lens
 import Control.Monad
 import Data.Binary.Get
-import Data.Monoid
+import Data.Monoid                               ((<>))
 import Data.Text                                 (Text)
 import Data.Thyme.Clock                          (microseconds)
 import Data.Thyme.Clock.POSIX                    (POSIXTime)
diff --git a/src/Arbor/File/Format/Asif/Segment.hs b/src/Arbor/File/Format/Asif/Segment.hs
--- a/src/Arbor/File/Format/Asif/Segment.hs
+++ b/src/Arbor/File/Format/Asif/Segment.hs
@@ -17,7 +17,7 @@
 import Data.Binary.Get
 import Data.Generics.Product.Any
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid                    ((<>))
 import Data.Text                      (Text, pack)
 
 import qualified Arbor.File.Format.Asif.Extract as E
diff --git a/src/Arbor/File/Format/Asif/Type.hs b/src/Arbor/File/Format/Asif/Type.hs
--- a/src/Arbor/File/Format/Asif/Type.hs
+++ b/src/Arbor/File/Format/Asif/Type.hs
@@ -5,7 +5,7 @@
 import Arbor.File.Format.Asif.Format   (Format)
 import Arbor.File.Format.Asif.Maybe
 import Arbor.File.Format.Asif.Whatever
-import Data.Semigroup
+import Data.Semigroup                  (Semigroup, (<>))
 import Data.Text                       (Text)
 import Data.Thyme.Clock.POSIX          (POSIXTime)
 import GHC.Generics
diff --git a/test/Gen/Feed.hs b/test/Gen/Feed.hs
--- a/test/Gen/Feed.hs
+++ b/test/Gen/Feed.hs
@@ -5,22 +5,17 @@
   , ordBy
   ) where
 
-import Arbor.Network.Ip
 import Data.Word
+import HaskellWorks.Data.Network.Ip
+import HaskellWorks.Data.Network.Ip.Internal
 import Hedgehog
 
 import qualified Hedgehog.Gen   as G
 import qualified Hedgehog.Range as R
 
-ipv4 :: MonadGen m => Word8 -> Word8 -> m IPv4
-ipv4 start stop = do
-  o1 <- w8
-  o2 <- w8
-  o3 <- w8
-  o4 <- w8
-  return $ ipFromOctets o1 o2 o3 o4
-  where
-    w8 = G.word8 (R.linear start stop)
+ipv4 :: MonadGen m => Word8 -> Word8 -> m Ipv4Address
+ipv4 start stop = Ipv4Address <$> (fourOctetsToWord32 <$> w8 <*> w8 <*> w8 <*> w8)
+  where w8 = G.word8 (R.linear start stop)
 
 feedElemIp :: MonadGen m => Range Word32 -> m Word32
 feedElemIp = G.word32
