diff --git a/samtools-conduit.cabal b/samtools-conduit.cabal
--- a/samtools-conduit.cabal
+++ b/samtools-conduit.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                samtools-conduit
-version:             0.1.0.1
+version:             0.1.1.0
 synopsis:            Conduit interface to SAM/BAM format files through samtools
 description:         Conduit interface to SAM/BAM format files through samtools
 homepage:            http://www.ingolia-lab.org/samtools-tutorial.html
@@ -18,6 +18,17 @@
 library
   exposed-modules:     Bio.SamTools.Conduit
   -- other-modules:       
-  build-depends:       base >= 4.6 && <5, bytestring >= 0.9, samtools >= 0.2.4.1, filepath,
+  build-depends:       base ==4.6.*, bytestring >= 0.9, samtools >= 0.2.4.1, filepath,
                        transformers, resourcet, conduit >= 1.1
   hs-source-dirs:      src
+
+flag Examples
+  Description: Build example executables
+  Default:     False
+
+executable samtools-conduit-copy
+  main-is:             SamtoolsConduitCopy.hs
+  other-modules:       Bio.SamTools.Conduit
+  build-depends:       base ==4.6.*, bytestring >= 0.9, samtools >= 0.2.4.1, filepath,
+                       transformers, resourcet, conduit >= 1.1
+  hs-source-dirs:      src, test  
diff --git a/test/SamtoolsConduitCopy.hs b/test/SamtoolsConduitCopy.hs
new file mode 100644
--- /dev/null
+++ b/test/SamtoolsConduitCopy.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
+module Main
+       where
+
+import Control.Monad.IO.Class
+import Control.Monad.Trans.Resource
+import qualified Data.ByteString.Char8 as BS
+import qualified Data.Conduit as C
+import qualified Data.Conduit.List as C
+import Data.Maybe
+import Numeric
+import System.Environment
+import System.FilePath
+import System.IO
+
+import qualified Bio.SamTools.Bam as Bam
+import qualified Bio.SamTools.Conduit as Bam
+
+main :: IO ()
+main = getArgs >>= runWithArgs
+  where runWithArgs [ inname ] = copy inname
+        runWithArgs _ = do hPutStrLn stderr $ "Specify exactly one input BAM file"
+
+copy :: FilePath -> IO ()
+copy infile = do Bam.withBamInFile infile $ \hin ->
+                   Bam.withBamOutFile (outfile "-1") (Bam.inHeader hin) $ \hout ->
+                   runResourceT $ Bam.sourceHandle hin C.$$ Bam.sinkHandle hout
+                 runResourceT $ Bam.sourceBamInFile infile C.$= process C.$$ Bam.sinkBamOutFile (outfile "-2")
+                 runResourceT $ Bam.sourceBamInFile infile C.$= enumerate C.$$ Bam.sinkBamOutFile (outfile "-3")
+  where outfile suffix = (takeBaseName infile) ++ suffix ++ (takeExtension infile)
+                 
+process :: (MonadIO m) => C.Conduit Bam.Bam1 m Bam.Bam1
+process = C.mapM procOne
+  where procOne b0 = let qyseq = fromMaybe "" . Bam.querySeq $ b0
+                         nt = BS.foldl' (\n ch -> if ch == 'T' then n+1 else n) 0 qyseq
+                         nn = BS.length qyseq
+                         fstr = showFFloat (Just 3) ((fromIntegral nt / fromIntegral nn) :: Double) ""
+                     in liftIO (Bam.addAuxZ b0 "XX" fstr)
+
+enumerate :: (MonadIO m) => C.Conduit Bam.Bam1 m Bam.Bam1
+enumerate = C.mapAccumM procOne 0 >> return ()
+  where procOne b0 i = do b' <- liftIO $! Bam.addAuxi b0 "XY" i
+                          return (i + 1, b')
+                          
