diff --git a/HsHTSLib.cabal b/HsHTSLib.cabal
--- a/HsHTSLib.cabal
+++ b/HsHTSLib.cabal
@@ -1,5 +1,5 @@
 name:                HsHTSLib
-version:             1.3.2.0
+version:             1.3.2.1
 synopsis:            High level bindings to htslib.
 description:         This package provides high level bindings to htslib, a library
                      for processing high throughput DNA sequencing data.
@@ -7,7 +7,7 @@
 license-file:        LICENSE
 author:              Kai Zhang
 maintainer:          kai@kzhang.org
-copyright:           (c) 2016 Kai Zhang
+copyright:           (c) 2016-2017 Kai Zhang
 category:            Bio
 build-type:          Simple
 cabal-version:       >=1.10
@@ -29,7 +29,7 @@
     , bytestring-lexing
     , containers
     , conduit-combinators
-    , inline-c
+    , inline-c >=0.6 && <0.7
     , mtl
     , template-haskell
 
@@ -39,8 +39,6 @@
       htslib-1.3.2
 
   c-sources:
-      src/Bio/HTS.c
-
       htslib-1.3.2/bgzf.c
       htslib-1.3.2/bgzip.c
       htslib-1.3.2/faidx.c
diff --git a/src/Bio/HTS.c b/src/Bio/HTS.c
deleted file mode 100644
--- a/src/Bio/HTS.c
+++ /dev/null
@@ -1,167 +0,0 @@
-
-#include "htslib/sam.h"
-
-int inline_c_Bio_HTS_0_0efc6161c1b66bc79e862910b9e93f1d32ddc02d(htsFile * fp_inline_c_0, bam1_t * b_inline_c_1) {
-return ( bam_write1(fp_inline_c_0->fp.bgzf, b_inline_c_1) );
-}
-
-
-int inline_c_Bio_HTS_1_0c54bc94ad2e32d428064e2a5c26a7036890b9a6(htsFile * fp_inline_c_0, bam_hdr_t * hdr_inline_c_1) {
-return (
-                        bam_hdr_write(fp_inline_c_0->fp.bgzf, hdr_inline_c_1) );
-}
-
-
-htsFile * inline_c_Bio_HTS_2_07f3fede9c57363b6e41738becd5a00d64df9d5c(char * fn_27_inline_c_0) {
-return ( hts_open(fn_27_inline_c_0, "r") );
-}
-
-
-htsFile * inline_c_Bio_HTS_3_4af84655e4829571c79edc68791d221a719c60ab(char * fn_27_inline_c_0) {
-return ( hts_open(fn_27_inline_c_0, "wb") );
-}
-
-
-void inline_c_Bio_HTS_4_d667db7c61cb0de3c96f1d806701fe63606a1af0(htsFile * h_inline_c_0) {
- hts_close(h_inline_c_0) ;
-}
-
-
-bam_hdr_t * inline_c_Bio_HTS_5_9a30278929e5b8570bc58dc24e83fd868ec2513f(htsFile * h_inline_c_0) {
-return ( bam_hdr_read(h_inline_c_0->fp.bgzf) );
-}
-
-
-char * inline_c_Bio_HTS_6_5a31ba58a253c55850867b8802710825075bca03(bam_hdr_t * hdr_inline_c_0) {
-return ( hdr_inline_c_0->text );
-}
-
-
-bam1_t * inline_c_Bio_HTS_7_25f5b2f49b2eac08644b77f5a1c27030b81e5dc3(int * r_inline_c_0, htsFile * h_inline_c_1) {
-
-            bam1_t *b = bam_init1();
-            *r_inline_c_0 = bam_read1(h_inline_c_1->fp.bgzf, b);
-            return b;
-        
-}
-
-
-int32_t inline_c_Bio_HTS_8_8e12d9d09c24fcc6b41593e5bc03c97f756f6da1(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.tid );
-}
-
-
-char * inline_c_Bio_HTS_9_31676430ec791ba4f73764dc21c992d6d39307fc(bam_hdr_t * h_inline_c_0, int32_t i_inline_c_1) {
-return ( h_inline_c_0->target_name[i_inline_c_1] );
-}
-
-
-int32_t inline_c_Bio_HTS_10_c89b42fc83db79c1cd226594b3a86cd92b81f38b(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.pos );
-}
-
-
-int32_t inline_c_Bio_HTS_11_cc329ca55a7e13133af0b3dbb6abb3edc854b65e(bam1_t * b_inline_c_0) {
-return ( bam_endpos(b_inline_c_0) );
-}
-
-
-int32_t inline_c_Bio_HTS_12_6fb2dbf3d90d4141663e524757f874dcf05a03e4(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.l_qseq );
-}
-
-
-int inline_c_Bio_HTS_13_44d7a287b2cc95c82e760427675196e1ba7261a1(bam1_t * b_inline_c_0) {
-return (bam_is_rev(b_inline_c_0) );
-}
-
-
-uint16_t inline_c_Bio_HTS_14_12453aaa173031b617539dcd57698955b11bd327(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.flag );
-}
-
-
-uint8_t inline_c_Bio_HTS_15_49728fef988bc0954110504a26677faa43ce6ce9(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.qual );
-}
-
-
-int32_t inline_c_Bio_HTS_16_6fb2dbf3d90d4141663e524757f874dcf05a03e4(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.l_qseq );
-}
-
-
-void inline_c_Bio_HTS_17_ed1829c64b8823aa1711ba319219f175ed965ce4(bam1_t * b_inline_c_0, int32_t l_inline_c_1, char * str_inline_c_2) {
-
-                        int32_t i;
-                        uint8_t *s = bam_get_seq(b_inline_c_0);
-                        for (i = 0; i < l_inline_c_1; ++i)
-                            str_inline_c_2[i] = "=ACMGRSVTWYHKDBN"[bam_seqi(s, i)];
-                    
-}
-
-
-char * inline_c_Bio_HTS_18_7083ac4175bb445932400343a035586aa327afa8(bam1_t * b_inline_c_0) {
-return (bam_get_qname(b_inline_c_0) );
-}
-
-
-int32_t inline_c_Bio_HTS_19_6fb2dbf3d90d4141663e524757f874dcf05a03e4(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.l_qseq );
-}
-
-
-int8_t inline_c_Bio_HTS_20_ff7eee4e1210259019f9cd0f9e269fdcf8ed1666(bam1_t * b_inline_c_0) {
-
-                        uint8_t *s = bam_get_qual(b_inline_c_0);
-                        return (s[0] == 0xff);
-                     
-}
-
-
-void inline_c_Bio_HTS_21_4b537c6c8c081040b4dd320c93ee949f58ac34df(bam1_t * b_inline_c_0, int32_t l_inline_c_1, char * str_inline_c_2) {
-
-                                int32_t i;
-                                uint8_t *s = bam_get_qual(b_inline_c_0);
-                                for (i = 0; i < l_inline_c_1; ++i)
-                                    str_inline_c_2[i] = s[i];
-                            
-}
-
-
-uint16_t inline_c_Bio_HTS_22_ba4509ac6cfa51e21b3315e1bc0c79664332c151(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.n_cigar );
-}
-
-
-void inline_c_Bio_HTS_23_04238a6d67efdaba04e6fe62c62067daa422dedb(bam1_t * b_inline_c_0, uint16_t n_inline_c_1, int * num_inline_c_2, char * str_inline_c_3) {
-
-                            uint16_t i;
-                            uint32_t *cigar = bam_get_cigar(b_inline_c_0);
-                            for (i = 0; i < n_inline_c_1; ++i) {
-                                num_inline_c_2[i] = bam_cigar_oplen(cigar[i]);
-                                str_inline_c_3[i] = bam_cigar_opchr(cigar[i]);
-                            }
-                         
-}
-
-
-int32_t inline_c_Bio_HTS_24_a6dc5594b24fbf473396136e59bcee0228785fc4(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.mtid );
-}
-
-
-char * inline_c_Bio_HTS_25_31676430ec791ba4f73764dc21c992d6d39307fc(bam_hdr_t * h_inline_c_0, int32_t i_inline_c_1) {
-return ( h_inline_c_0->target_name[i_inline_c_1] );
-}
-
-
-int32_t inline_c_Bio_HTS_26_54a6e402cf38aa9b617612b54be97e879e2b17b7(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.mpos );
-}
-
-
-int32_t inline_c_Bio_HTS_27_14020e59f59859519591c231f45ae2ab8f85c395(bam1_t * b_inline_c_0) {
-return ( b_inline_c_0->core.isize );
-}
-
diff --git a/src/Bio/HTS.hs b/src/Bio/HTS.hs
--- a/src/Bio/HTS.hs
+++ b/src/Bio/HTS.hs
@@ -7,6 +7,7 @@
 import           Conduit
 import           Control.Monad
 import           Control.Monad.State
+import           Data.Bits                (testBit)
 import qualified Data.ByteString.Char8    as B
 import           Data.Int
 import           Data.Monoid              ((<>))
@@ -84,9 +85,11 @@
     BamHeader <$> [CU.exp| bam_hdr_t* { bam_hdr_read($(htsFile* h)->fp.bgzf) } |]
 
 showBamHeader :: FileHeader -> B.ByteString
-showBamHeader (BamHeader hdr) = unsafePerformIO $ join $ B.packCString <$>
-    [CU.exp| char* { $(bam_hdr_t* hdr)->text } |]
-showBamHeader _ = ""
+showBamHeader (BamHeader hdr) = unsafePerformIO $ do
+    ptr <- [CU.exp| char* { $(bam_hdr_t* hdr)->text } |]
+    l <- [CU.exp| uint32_t { $(bam_hdr_t* hdr)->l_text } |]
+    B.packCStringLen (ptr, fromIntegral l)
+showBamHeader _ = error "No Bam Header was found."
 
 data SortOrder = Unknown
                | Unsorted
@@ -289,3 +292,51 @@
 bamToSam :: Ptr BamHdr -> Bam -> Sam
 bamToSam h b = Sam (qName b) (flag b) (getChr h b) (position b) (mapq b)
     (cigar b) (mateChr h b) (matePos b) (tLen b) (getSeq b) (quality b)
+
+-- | Template having multiple segments in sequencing
+hasMultiSegments :: Word16 -> Bool
+hasMultiSegments f = testBit f 1
+
+-- | Each segment properly aligned according to the aligner
+isProperAligned :: Word16 -> Bool
+isProperAligned f = testBit f 2
+
+-- | Segment unmapped
+isUnmapped :: Word16 -> Bool
+isUnmapped f = testBit f 3
+
+-- | Next segment in the template unmapped
+isNextUnmapped :: Word16 -> Bool
+isNextUnmapped f = testBit f 4
+
+-- | SEQ being reverse complemented
+isRC :: Word16 -> Bool
+isRC f = testBit f 5
+
+-- | SEQ of the next segment in the template being reverse complemented
+isNextRC :: Word16 -> Bool
+isNextRC f = testBit f 6
+
+-- | The first segment in the template
+isFirstSegment :: Word16 -> Bool
+isFirstSegment f = testBit f 7
+
+-- | The last segment in the template
+isLastSegment :: Word16 -> Bool
+isLastSegment f = testBit f 8
+
+-- | Secondary alignment
+isSecondary :: Word16 -> Bool
+isSecondary f = testBit f 9
+
+-- | Not passing filters, such as platform/vendor quality controls
+isBadQual :: Word16 -> Bool
+isBadQual f = testBit f 10
+
+-- | PCR or optical duplicate
+isDup :: Word16 -> Bool
+isDup f = testBit f 11
+
+-- | Supplementary alignment
+isSupplementary :: Word16 -> Bool
+isSupplementary f = testBit f 12
diff --git a/src/Bio/HTS/Types.hs b/src/Bio/HTS/Types.hs
--- a/src/Bio/HTS/Types.hs
+++ b/src/Bio/HTS/Types.hs
@@ -11,6 +11,7 @@
     , Bam
     , Bam'
     , Sam(..)
+    , Flag(..)
     , showSam
     ) where
 
@@ -37,6 +38,9 @@
 
 data HTSFile
 newtype BamFileHandle = BamFileHandle (Ptr HTSFile)
+
+-- | SAM record flag
+newtype Flag = Flag Word16
 
 htsCtx :: C.Context
 htsCtx = mempty
