diff --git a/HsHTSLib.cabal b/HsHTSLib.cabal
--- a/HsHTSLib.cabal
+++ b/HsHTSLib.cabal
@@ -1,5 +1,5 @@
 name:                HsHTSLib
-version:             1.3.2.3
+version:             1.3.2.4
 synopsis:            High level bindings to htslib.
 description:         This package provides high level bindings to htslib, a library
                      for processing high throughput DNA sequencing data.
@@ -34,7 +34,7 @@
     , template-haskell
 
   hs-source-dirs:      src
-  extra-libraries: pthread
+  extra-libraries: pthread z
   include-dirs:
       htslib-1.3.2
 
@@ -75,11 +75,28 @@
       htslib-1.3.2/cram/thread_pool.c
       htslib-1.3.2/cram/vlen.c
       htslib-1.3.2/cram/zfio.c
-
       -- htslib-1.3.2/tabix.c
       -- htslib-1.3.2/htsfile.c
 
   default-language:    Haskell2010
+
+test-suite tests
+  type: exitcode-stdio-1.0
+  hs-source-dirs: tests
+  main-is: Main.hs
+  other-modules:
+
+  default-language:    Haskell2010
+  build-depends:
+      base
+    , HsHTSLib
+    , bytestring
+    , vector
+    , tasty
+    , tasty-golden
+    , tasty-hunit
+    , conduit
+    , mtl
 
 source-repository  head
   type: git
diff --git a/src/Bio/HTS.hs b/src/Bio/HTS.hs
--- a/src/Bio/HTS.hs
+++ b/src/Bio/HTS.hs
@@ -9,6 +9,7 @@
 import           Control.Monad.Reader
 import           Data.Bits                (testBit)
 import qualified Data.ByteString.Char8    as B
+import qualified Data.ByteString as BS
 import           Data.Int
 import           Data.Monoid              ((<>))
 import           Data.Word
@@ -212,6 +213,11 @@
         [CU.exp| char* {bam_get_qname($(bam1_t* b)) } |]
 {-# INLINE qName #-}
 
+-- | Human readable quality score which is (Phred base quality + 33).
+qualityS :: Bam -> Maybe B.ByteString
+qualityS = fmap (BS.map (+33)) . quality
+
+-- | Phred base quality (a sequence of 0xFF if absent).
 quality :: Bam -> Maybe B.ByteString
 quality = unsafePerformIO . flip withForeignPtr fn
   where
diff --git a/tests/Main.hs b/tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/tests/Main.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE FlexibleContexts #-}
+import Test.Tasty
+import           Test.Tasty.Golden
+import Conduit
+import Control.Monad.Reader
+
+import Bio.HTS
+import Bio.HTS.Types
+
+main :: IO ()
+main = defaultMain $ testGroup "Main"
+    [ tests ]
+
+tests :: TestTree
+tests = goldenVsFile "BAM Read/Write Test" expect output $
+    bamFileToSamFile input output
+  where
+    input = "tests/data/example.bam"
+    output = "tests/data/output.sam"
+    expect = "tests/data/example.sam"
+
+bamFileToSamFile :: FilePath  -- ^ Input bam file
+                 -> FilePath  -- ^ Output Sam file
+                 -> IO ()
+bamFileToSamFile input output = withBamFile input $ \fl ->
+    runConduit $ readBam fl .| mapMC f .| unlinesAsciiC .| sinkFile output
+  where
+    f bam = do
+        lift ask >>= \case
+            BamHeader hdr -> return $ showSam $ bamToSam hdr bam
