diff --git a/Network/Pcap/Streaming.hs b/Network/Pcap/Streaming.hs
deleted file mode 100644
--- a/Network/Pcap/Streaming.hs
+++ /dev/null
@@ -1,47 +0,0 @@
--- |
--- Module    : Network.Pcap.Streaming
--- Copyright : (c) Colin Woodbury, 2018
--- License   : BSD3
--- Maintainer: Colin Woodbury <colingw@gmail.com>
---
--- A streaming interface to the <http://hackage.haskell.org/package/pcap-0.4.5.2 pcap>
--- Haskell library, which itself is a binding to /libpcap/. Humbly adapted from
--- <http://hackage.haskell.org/package/pcap-conduit pcap-conduit> by Austin Seipp.
-
-module Network.Pcap.Streaming
-  ( Packet(..)
-  , PktHdr(..)
-  , offline
-  , online
-  ) where
-
-import qualified Data.Attoparsec.ByteString.Streaming as A
-import qualified Data.ByteString.Streaming as Q
-import           Data.Int (Int64)
-import           Network.Pcap
-import           Network.Pcap.Streaming.Internal
-import           Streaming
-import qualified Streaming.Prelude as P
-
----
-
--- | Read `Packet`s from some file dump. Uses a custom parser, not /libpcap/.
---
--- /SPECIALIZE/d for @ResourceT IO@.
-offline :: MonadResource m => FilePath -> Stream (Of Packet) m ()
-offline = void . A.parsed packetP . Q.drop 24 . Q.readFile
-{-# SPECIALIZE offline :: FilePath -> Stream (Of Packet) (ResourceT IO) () #-}
-
--- | Read `Packet`s from some network device. See `Network.Pcap.openLive`
--- for a description of each argument.
---
--- /SPECIALIZE/d for @IO@.
-online :: MonadIO m => String -> Int -> Bool -> Int64 -> Stream (Of Packet) m ()
-online n s p t = liftIO (openLive n s p t) >>= packets
-{-# SPECIALIZE online :: String -> Int -> Bool -> Int64 -> Stream (Of Packet) IO () #-}
-
-packets :: MonadIO m => PcapHandle -> Stream (Of Packet) m ()
-packets h = do
-  (hdr,bs) <- liftIO (nextBS h)
-  if hdrCaptureLength hdr == 0 then pure () else P.yield (Packet hdr bs) *> packets h
-{-# SPECIALIZE packets :: PcapHandle -> Stream (Of Packet) IO () #-}
diff --git a/Network/Pcap/Streaming/Internal.hs b/Network/Pcap/Streaming/Internal.hs
deleted file mode 100644
--- a/Network/Pcap/Streaming/Internal.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-module Network.Pcap.Streaming.Internal where
-
-import qualified Data.Attoparsec.ByteString as A
-import qualified Data.ByteString as BS
-import           Data.Word (Word32)
-import           Network.Pcap
-
----
-
--- | A <https://en.wikipedia.org/wiki/Pcap pcap> packet. Assumes nothing about
--- the contents or structure of the `bytes` value.
-data Packet = Packet { header :: PktHdr, bytes :: BS.ByteString } deriving (Eq, Show)
-
-packetP :: A.Parser Packet
-packetP = do
-  hdr <- pktHeader
-  bts <- A.take . fromIntegral $ hdrCaptureLength hdr
-  pure $ Packet hdr bts
-
-pktHeader :: A.Parser PktHdr
-pktHeader = PktHdr <$> four <*> four <*> four <*> four
-
-four :: A.Parser Word32
-four = BS.foldr' (\w acc -> acc * 256 + fromIntegral w) 0 <$> A.take 4
-{-# INLINE four #-}
diff --git a/bench/Bench.hs b/bench/Bench.hs
deleted file mode 100644
--- a/bench/Bench.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Main where
-
-import           Criterion.Main
-import           Streaming (runResourceT)
-import qualified Streaming.Prelude as P
-import           Network.Pcap.Streaming
-
----
-
-main :: IO ()
-main = defaultMain
-  [ bgroup "Benchmarks"
-    [ bench "Count all entries in stream" . nfIO $ runResourceT (P.length_ $ offline "test/test.pcap")
-    , bench "Sum all timestamps" . nfIO $ runResourceT (P.sum_ . P.map (hdrSeconds . header) $ offline "test/test.pcap")
-    ]
-  ]
diff --git a/lib/Network/Pcap/Streaming.hs b/lib/Network/Pcap/Streaming.hs
new file mode 100644
--- /dev/null
+++ b/lib/Network/Pcap/Streaming.hs
@@ -0,0 +1,48 @@
+-- |
+-- Module    : Network.Pcap.Streaming
+-- Copyright : (c) Colin Woodbury, 2018 - 2019
+-- License   : BSD3
+-- Maintainer: Colin Woodbury <colin@fosskers.ca>
+--
+-- A streaming interface to the <http://hackage.haskell.org/package/pcap-0.4.5.2 pcap>
+-- Haskell library, which itself is a binding to /libpcap/. Humbly adapted from
+-- <http://hackage.haskell.org/package/pcap-conduit pcap-conduit> by Austin Seipp.
+
+module Network.Pcap.Streaming
+  ( Packet(..)
+  , PktHdr(..)
+  , offline
+  , online
+  ) where
+
+import           Control.Monad.Trans.Resource
+import qualified Data.Attoparsec.ByteString.Streaming as A
+import qualified Data.ByteString.Streaming as Q
+import           Data.Int (Int64)
+import           Network.Pcap
+import           Network.Pcap.Streaming.Internal
+import           Streaming
+import qualified Streaming.Prelude as P
+
+---
+
+-- | Read `Packet`s from some file dump. Uses a custom parser, not /libpcap/.
+--
+-- /SPECIALIZE/d for @ResourceT IO@.
+offline :: MonadResource m => FilePath -> Stream (Of Packet) m ()
+offline = void . A.parsed packetP . Q.drop 24 . Q.readFile
+{-# SPECIALIZE offline :: FilePath -> Stream (Of Packet) (ResourceT IO) () #-}
+
+-- | Read `Packet`s from some network device. See `Network.Pcap.openLive` for a
+-- description of each argument.
+--
+-- /SPECIALIZE/d for @IO@.
+online :: MonadIO m => String -> Int -> Bool -> Int64 -> Stream (Of Packet) m ()
+online n s p t = liftIO (openLive n s p t) >>= packets
+{-# SPECIALIZE online :: String -> Int -> Bool -> Int64 -> Stream (Of Packet) IO () #-}
+
+packets :: MonadIO m => PcapHandle -> Stream (Of Packet) m ()
+packets h = do
+  (hdr,bs) <- liftIO (nextBS h)
+  if hdrCaptureLength hdr == 0 then pure () else P.yield (Packet hdr bs) *> packets h
+{-# SPECIALIZE packets :: PcapHandle -> Stream (Of Packet) IO () #-}
diff --git a/lib/Network/Pcap/Streaming/Internal.hs b/lib/Network/Pcap/Streaming/Internal.hs
new file mode 100644
--- /dev/null
+++ b/lib/Network/Pcap/Streaming/Internal.hs
@@ -0,0 +1,25 @@
+module Network.Pcap.Streaming.Internal where
+
+import qualified Data.Attoparsec.ByteString as A
+import qualified Data.ByteString as BS
+import           Data.Word (Word32)
+import           Network.Pcap
+
+---
+
+-- | A <https://en.wikipedia.org/wiki/Pcap pcap> packet. Assumes nothing about
+-- the contents or structure of the `bytes` value.
+data Packet = Packet { header :: PktHdr, bytes :: BS.ByteString } deriving (Eq, Show)
+
+packetP :: A.Parser Packet
+packetP = do
+  hdr <- pktHeader
+  bts <- A.take . fromIntegral $ hdrCaptureLength hdr
+  pure $ Packet hdr bts
+
+pktHeader :: A.Parser PktHdr
+pktHeader = PktHdr <$> four <*> four <*> four <*> four
+
+four :: A.Parser Word32
+four = BS.foldr' (\w acc -> acc * 256 + fromIntegral w) 0 <$> A.take 4
+{-# INLINE four #-}
diff --git a/streaming-pcap.cabal b/streaming-pcap.cabal
--- a/streaming-pcap.cabal
+++ b/streaming-pcap.cabal
@@ -1,79 +1,60 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
---
--- see: https://github.com/sol/hpack
---
--- hash: f9eb58b0494a5226978946a213672383849ef6447e4052afd869091691f04040
+cabal-version: 2.2
 
-name:           streaming-pcap
-version:        1.1.1
-synopsis:       Stream packets via libpcap.
-description:    Stream packets via libpcap. Requires `libpcap` to be installed.
-category:       Web
-homepage:       https://github.com/fosskers/streaming-pcap
-author:         Colin Woodbury
-maintainer:     colingw@gmail.com
-copyright:      2018 Colin Woodbury
-license:        BSD3
-license-file:   LICENSE
-build-type:     Simple
-cabal-version:  >= 1.10
+name:         streaming-pcap
+version:      1.1.1.1
+synopsis:     Stream packets via libpcap.
+description:  Stream packets via libpcap. Requires `libpcap` to be installed.
+category:     Web
+homepage:     https://github.com/fosskers/streaming-pcap
+author:       Colin Woodbury
+maintainer:   colin@fosskers.ca
+copyright:    2018 - 2019 Colin Woodbury
+license:      BSD-3-Clause
+license-file: LICENSE
+build-type:   Simple
 
 extra-source-files:
-    CHANGELOG.md
     README.md
+    CHANGELOG.md
     test/test.pcap
-    test/tsuru.pcap
 
-library
-  hs-source-dirs:
-      ./.
-  ghc-options: -fwarn-unused-imports -fwarn-unused-binds -fwarn-name-shadowing -fwarn-unused-matches -fwarn-incomplete-patterns -fwarn-incomplete-uni-patterns
+common commons
+  default-language: Haskell2010
+  ghc-options: -Wall
   build-depends:
-      attoparsec >=0.13 && <0.14
-    , base >=4.7 && <5
+      base >= 4.8 && < 5
+    , attoparsec ^>=0.13
     , bytestring
-    , pcap >=0.4 && <0.5
+    , pcap ^>=0.4
+    , resourcet ^>=1.2
     , streaming >=0.1 && <0.3
-    , streaming-bytestring >=0.1 && <0.2
-    , streaming-utils >=0.1 && <0.2
+    , streaming-attoparsec ^>= 1.0
+    , streaming-bytestring ^>=0.1
+
+library
+  import: commons
+  hs-source-dirs: lib
   exposed-modules:
       Network.Pcap.Streaming
       Network.Pcap.Streaming.Internal
-  default-language: Haskell2010
 
 test-suite streaming-pcap-test
+  import: commons
   type: exitcode-stdio-1.0
   main-is: Test.hs
-  hs-source-dirs:
-      test
-  ghc-options: -fwarn-unused-imports -fwarn-unused-binds -fwarn-name-shadowing -fwarn-unused-matches -fwarn-incomplete-patterns -fwarn-incomplete-uni-patterns -threaded
+  hs-source-dirs: test
+  ghc-options: -threaded -with-rtsopts=-N
   build-depends:
-      attoparsec >=0.13 && <0.14
-    , base >=4.7 && <5
-    , bytestring
-    , pcap >=0.4 && <0.5
-    , streaming >=0.1 && <0.3
-    , streaming-bytestring >=0.1 && <0.2
-    , streaming-pcap
-    , streaming-utils >=0.1 && <0.2
-    , tasty >=0.11 && <1.1
+      streaming-pcap
+    , tasty >=0.11 && <1.3
     , tasty-hunit >=0.9 && <0.11
-  default-language: Haskell2010
 
-benchmark kanji-bench
-  type: exitcode-stdio-1.0
-  main-is: Bench.hs
-  hs-source-dirs:
-      bench
-  ghc-options: -fwarn-unused-imports -fwarn-unused-binds -fwarn-name-shadowing -fwarn-unused-matches -fwarn-incomplete-patterns -fwarn-incomplete-uni-patterns -threaded -O2
-  build-depends:
-      attoparsec >=0.13 && <0.14
-    , base >=4.7 && <5
-    , bytestring
-    , criterion >=1.1 && <1.5
-    , pcap >=0.4 && <0.5
-    , streaming >=0.1 && <0.3
-    , streaming-bytestring >=0.1 && <0.2
-    , streaming-pcap
-    , streaming-utils >=0.1 && <0.2
-  default-language: Haskell2010
+-- benchmark streaming-pcap-bench
+--   import: commons
+--   type: exitcode-stdio-1.0
+--   main-is: Bench.hs
+--   hs-source-dirs: bench
+--   ghc-options: -threaded -O2
+--   build-depends:
+--       criterion >=1.1 && <1.5
+--     , streaming-pcap
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -1,10 +1,10 @@
 module Main ( main ) where
 
+import           Control.Monad.Trans.Resource
 import qualified Data.Attoparsec.ByteString as A
 import qualified Data.ByteString as BS
 import           Network.Pcap.Streaming
 import           Network.Pcap.Streaming.Internal
-import           Streaming (runResourceT)
 import qualified Streaming.Prelude as P
 import           Test.Tasty
 import           Test.Tasty.HUnit
diff --git a/test/tsuru.pcap b/test/tsuru.pcap
deleted file mode 100644
# file too large to diff: test/tsuru.pcap
