diff --git a/biohazard.cabal b/biohazard.cabal
--- a/biohazard.cabal
+++ b/biohazard.cabal
@@ -1,5 +1,5 @@
 Name:                biohazard
-Version:             1.0.1
+Version:             1.0.2
 Synopsis:            bioinformatics support library
 Description:         This is a collection of modules I separated from
                      various bioinformatics tools.
@@ -58,7 +58,7 @@
   Build-depends:       async                    >= 2.0 && < 2.3,
                        attoparsec               >= 0.10 && < 0.14,
                        base                     >= 4.7 && < 4.12,
-                       base-prelude             == 1.2.*,
+                       base-prelude             == 1.2.0.*,
                        bytestring               >= 0.10.2 && < 0.11,
                        containers               == 0.5.*,
                        exceptions               >= 0.6 && < 0.9,
diff --git a/src/Bio/Bam/Fastq.hs b/src/Bio/Bam/Fastq.hs
--- a/src/Bio/Bam/Fastq.hs
+++ b/src/Bio/Bam/Fastq.hs
@@ -10,6 +10,8 @@
 import Bio.Prelude hiding ( isSpace )
 import Bio.Iteratee
 import Data.Attoparsec.ByteString.Char8
+        ( char, skipSpace, satisfy, inClass, skipWhile, takeTill
+        , scan, isSpace, isSpace_w8, (<?>) )
 
 import qualified Data.Attoparsec.ByteString.Char8   as P
 import qualified Data.ByteString                    as B
diff --git a/src/Bio/Bam/Header.hs b/src/Bio/Bam/Header.hs
--- a/src/Bio/Bam/Header.hs
+++ b/src/Bio/Bam/Header.hs
@@ -34,8 +34,10 @@
         flagFirstMate,
         flagSecondMate,
         flagAuxillary,
+        flagSecondary,
         flagFailsQC,
         flagDuplicate,
+        flagSupplementary,
         eflagTrimmed,
         eflagMerged,
         eflagAlternative,
@@ -50,7 +52,7 @@
 
 import Bio.Prelude           hiding ( uncons )
 import Data.ByteString              ( uncons )
-import Data.ByteString.Builder
+import Data.ByteString.Builder      ( Builder, byteString, char7, intDec, word16LE )
 import Data.Sequence                ( (><), (|>) )
 
 import qualified Data.Attoparsec.ByteString.Char8   as P
@@ -301,7 +303,8 @@
 
 flagPaired, flagProperlyPaired, flagUnmapped, flagMateUnmapped,
  flagReversed, flagMateReversed, flagFirstMate, flagSecondMate,
- flagAuxillary, flagFailsQC, flagDuplicate :: Int
+ flagAuxillary, flagSecondary, flagFailsQC, flagDuplicate,
+ flagSupplementary :: Int
 
 flagPaired         =   0x1
 flagProperlyPaired =   0x2
@@ -312,8 +315,10 @@
 flagFirstMate      =  0x40
 flagSecondMate     =  0x80
 flagAuxillary      = 0x100
+flagSecondary      = 0x100
 flagFailsQC        = 0x200
 flagDuplicate      = 0x400
+flagSupplementary  = 0x800
 
 eflagTrimmed, eflagMerged, eflagAlternative, eflagExactIndex :: Int
 eflagTrimmed     = 0x1
diff --git a/src/Bio/Bam/Rec.hs b/src/Bio/Bam/Rec.hs
--- a/src/Bio/Bam/Rec.hs
+++ b/src/Bio/Bam/Rec.hs
@@ -35,8 +35,10 @@
     isFirstMate,
     isSecondMate,
     isAuxillary,
+    isSecondary,
     isFailsQC,
     isDuplicate,
+    isSupplementary,
     isTrimmed,
     isMerged,
     isAlternative,
@@ -342,8 +344,9 @@
 
 
 isPaired, isProperlyPaired, isUnmapped, isMateUnmapped, isReversed,
-    isMateReversed, isFirstMate, isSecondMate, isAuxillary, isFailsQC,
-    isDuplicate, isTrimmed, isMerged, isAlternative, isExactIndex :: BamRec -> Bool
+    isMateReversed, isFirstMate, isSecondMate, isAuxillary, isSecondary,
+    isFailsQC, isDuplicate, isSupplementary,
+    isTrimmed, isMerged, isAlternative, isExactIndex :: BamRec -> Bool
 
 isPaired         = flip testBit  0 . b_flag
 isProperlyPaired = flip testBit  1 . b_flag
@@ -354,8 +357,10 @@
 isFirstMate      = flip testBit  6 . b_flag
 isSecondMate     = flip testBit  7 . b_flag
 isAuxillary      = flip testBit  8 . b_flag
+isSecondary      = flip testBit  8 . b_flag
 isFailsQC        = flip testBit  9 . b_flag
 isDuplicate      = flip testBit 10 . b_flag
+isSupplementary  = flip testBit 11 . b_flag
 
 isTrimmed        = flip testBit 0 . extAsInt 0 "FF"
 isMerged         = flip testBit 1 . extAsInt 0 "FF"
diff --git a/src/Bio/Bam/Writer.hs b/src/Bio/Bam/Writer.hs
--- a/src/Bio/Bam/Writer.hs
+++ b/src/Bio/Bam/Writer.hs
@@ -113,7 +113,8 @@
 
 {-# INLINE pushBamRaw #-}
 pushBamRaw :: BamRaw -> BgzfTokens -> BgzfTokens
-pushBamRaw = TkLnString . raw_data
+pushBamRaw r = TkWord32 (fromIntegral $ B.length $ raw_data r) .
+               TkString (raw_data r)
 
 -- | Writes BAM encoded stuff to a file.
 writeBamFile :: IsBamRec r => FilePath -> BamMeta -> Iteratee [r] IO ()
diff --git a/src/Bio/Iteratee.hs b/src/Bio/Iteratee.hs
--- a/src/Bio/Iteratee.hs
+++ b/src/Bio/Iteratee.hs
@@ -57,8 +57,8 @@
 import Bio.Util.Numeric                     ( showNum )
 import Control.Concurrent.Async             ( Async, async, wait, cancel )
 import Control.Monad.Catch                  ( MonadMask(..) )
-import Control.Monad.IO.Class
-import Control.Monad.Trans.Class
+import Control.Monad.IO.Class               ( MonadIO(..) )
+import Control.Monad.Trans.Class            ( MonadTrans(..) )
 import System.IO                            ( hIsTerminalDevice )
 
 import qualified Control.Monad.Catch            as CMC
diff --git a/src/Bio/Iteratee/Base.hs b/src/Bio/Iteratee/Base.hs
--- a/src/Bio/Iteratee/Base.hs
+++ b/src/Bio/Iteratee/Base.hs
@@ -35,8 +35,8 @@
 import Bio.Prelude
 
 import Control.Monad.Catch as CIO
-import Control.Monad.IO.Class
-import Control.Monad.Trans.Class
+import Control.Monad.IO.Class ( MonadIO(..) )
+import Control.Monad.Trans.Class ( MonadTrans(..) )
 
 import qualified Control.Exception    as E
 import qualified Data.ByteString      as B
diff --git a/src/Bio/Iteratee/Builder.hs b/src/Bio/Iteratee/Builder.hs
--- a/src/Bio/Iteratee/Builder.hs
+++ b/src/Bio/Iteratee/Builder.hs
@@ -55,7 +55,6 @@
                 | TkDouble   {-# UNPACK #-} !Double       BgzfTokens -- a double
                 | TkString   {-# UNPACK #-} !B.ByteString BgzfTokens -- a raw string
                 | TkDecimal  {-# UNPACK #-} !Int          BgzfTokens -- roughly ':%d'
-                | TkLnString {-# UNPACK #-} !B.ByteString BgzfTokens -- a length-prefixed string
                 -- lotsa stuff might be missing here
 
                 | TkSetMark                               BgzfTokens -- sets the first mark
@@ -128,10 +127,18 @@
     flush_blocks tk bb k
         | min (mark bb) (used bb) - off bb < maxBlockSize =
             case tk of TkEnd -> liftI $ go bb k
+                       _     -> expandBuffer (2 * size bb) bb `ioBind` \bb' ->
+                                go1 bb' k tk
+
+        | otherwise = flush_blocks1 tk bb k
+
+    flush_blocks1 tk bb k
+        | min (mark bb) (used bb) - off bb < maxBlockSize =
+            case tk of TkEnd -> liftI $ go bb k
                        _     -> go1 bb k tk
 
         | otherwise =
-            eneeCheckIfDone (flush_blocks tk bb { off = off bb + maxBlockSize }) $
+            eneeCheckIfDone (flush_blocks1 tk bb { off = off bb + maxBlockSize }) $
                 k $ Chunk [compressChunk' lv (buffer bb) (off bb) maxBlockSize]
 
     final_flush bb mx k
@@ -175,7 +182,7 @@
         TkString   s tk'
             -- Too big, can't handle.  We will get progressively bigger
             -- buffers and eventually handle it.
-            | B.length s > size bb - use -> return (bb { used = use },tk')
+            | B.length s > size bb - use -> return (bb { used = use },tk1)
 
             | otherwise  -> do let ln = B.length s
                                B.unsafeUseAsCString s $ \q ->
@@ -184,17 +191,6 @@
 
         TkDecimal  x tk' -> do ln <- int_loop (p `plusPtr` use) x
                                go_fast p bb (use + ln) tk'
-
-        TkLnString s tk'
-            -- Too big, can't handle.  We will get progressively bigger
-            -- buffers and eventually handle it.
-            | B.length s > size bb - use - 4 -> return (bb { used = use },tk')
-
-            | otherwise  -> do let ln = B.length s
-                               pokeByteOff p use (fromIntegral ln :: Word32)
-                               B.unsafeUseAsCString s $ \q ->
-                                    copyBytes (p `plusPtr` (use + 4)) q ln
-                               go_fast p bb (use + ln + 4) tk'
 
         TkSetMark        tk' ->    go_slowish p bb { used = use + 4, mark = use } tk'
 
diff --git a/src/Bio/Iteratee/IO.hs b/src/Bio/Iteratee/IO.hs
--- a/src/Bio/Iteratee/IO.hs
+++ b/src/Bio/Iteratee/IO.hs
@@ -16,8 +16,8 @@
 
 import Bio.Iteratee.Iteratee
 import Bio.Prelude hiding ( bracket, loop )
-import Control.Monad.Catch
-import Control.Monad.IO.Class
+import Control.Monad.Catch ( MonadMask, bracket )
+import Control.Monad.IO.Class ( MonadIO(..) )
 import System.IO (SeekMode(..))
 
 import qualified Data.ByteString as B
diff --git a/src/Bio/Iteratee/Iteratee.hs b/src/Bio/Iteratee/Iteratee.hs
--- a/src/Bio/Iteratee/Iteratee.hs
+++ b/src/Bio/Iteratee/Iteratee.hs
@@ -64,8 +64,8 @@
 
 import Bio.Iteratee.Base
 import Bio.Prelude hiding (loop)
-import Control.Monad.IO.Class
-import Control.Monad.Trans.Class
+import Control.Monad.IO.Class (MonadIO(..))
+import Control.Monad.Trans.Class (MonadTrans(..))
 
 -- exception helpers
 excDivergent :: SomeException
diff --git a/src/Bio/Iteratee/List.hs b/src/Bio/Iteratee/List.hs
--- a/src/Bio/Iteratee/List.hs
+++ b/src/Bio/Iteratee/List.hs
@@ -63,7 +63,7 @@
 
 import Bio.Iteratee.Iteratee
 import Bio.Prelude
-import Control.Monad.Trans.Class
+import Control.Monad.Trans.Class (MonadTrans(..))
 
 -- import qualified Data.ByteString          as B
 
diff --git a/src/Bio/TwoBit.hs b/src/Bio/TwoBit.hs
--- a/src/Bio/TwoBit.hs
+++ b/src/Bio/TwoBit.hs
@@ -36,7 +36,7 @@
 import           Bio.Prelude hiding ( left, right, chr )
 import           Bio.Util.MMap
 import           Bio.Util.Storable
-import           Control.Monad.Trans.State
+import           Control.Monad.Trans.State ( StateT(..), get, evalStateT )
 import qualified Data.ByteString                as B
 import qualified Data.ByteString.Unsafe         as B
 import qualified Data.IntMap.Strict             as I
