diff --git a/samtools.cabal b/samtools.cabal
--- a/samtools.cabal
+++ b/samtools.cabal
@@ -1,5 +1,5 @@
 Name:                samtools
-Version:             0.2.0.1
+Version:             0.2.1
 Synopsis:            Binding to the C samtools library
 Description:         Binding to the C samtools library, which reads and
                      writes SAM format alignments, both binary and tab-
diff --git a/src/Bio/SamTools/Bam.hs b/src/Bio/SamTools/Bam.hs
--- a/src/Bio/SamTools/Bam.hs
+++ b/src/Bio/SamTools/Bam.hs
@@ -39,6 +39,7 @@
   , closeInHandle
   , withTamInFile, withTamInFileWithIndex, withBamInFile
   , get1
+  , readBams
   -- * Writing SAM/BAM format files
   , OutHandle, outHeader
   , openTamOutFile, openBamOutFile
@@ -57,7 +58,7 @@
 import Foreign hiding (new)
 import Foreign.C.Types
 import Foreign.C.String
-
+import System.IO.Unsafe (unsafeInterleaveIO)
 import qualified Data.Vector as V
 
 import Bio.SeqLoc.OnSeq
@@ -337,6 +338,17 @@
                 else return Nothing
     else do bptr <- newForeignPtr bamDestroy1Ptr b
             return . Just $ Bam1 { ptrBam1 = bptr, header = inHeader inh }
+
+-- | Read a BAM file as a lazy strem of 'Bam1' records.
+readBams :: FilePath -> IO [Bam1]
+readBams = openBamInFile >=> getBams 
+  where
+    getBams h = do
+      b <- get1 h
+      case b of Nothing -> closeInHandle h >> return []
+                Just b1 -> do
+                  bs <- unsafeInterleaveIO (getBams h)
+                  return (b1:bs)
 
 -- | Handle for writing SAM/BAM format alignments
 data OutHandle = OutHandle { outFilename :: !FilePath
diff --git a/src/Bio/SamTools/BamIndex.hs b/src/Bio/SamTools/BamIndex.hs
--- a/src/Bio/SamTools/BamIndex.hs
+++ b/src/Bio/SamTools/BamIndex.hs
@@ -7,6 +7,7 @@
        , open, close, withIndex
        , Query, qyHandle
        , query, next
+       , readBamRegion
        )          
        where        
 
@@ -20,7 +21,7 @@
 import Bio.SamTools.Bam
 import Bio.SamTools.Internal
 import Bio.SamTools.LowLevel       
-       
+
 -- | Handle for fetching alignments by region from a sorted, indexed
 -- BAM file.
 data IdxHandle = IdxHandle { idxFilename :: !FilePath -- ^ Filename of sorted, indexed BAM file
@@ -92,3 +93,17 @@
                   then ioError . userError $
                        "Error reading BAM query from " ++ show (idxFilename . qyHandle $ rgn)
                   else return Nothing
+
+-- | Use a BAM index file to extract 'Bam1' records aligned to a 
+-- specific target sequence (chromosome) number and region.
+readBamRegion :: IdxHandle -> Int -> (Int64,Int64) -> IO [Bam1]
+readBamRegion h chr reg  = do
+  q <- query h chr reg
+  go q
+  where go x = do
+          mb1 <- next x
+          case mb1 of Nothing -> return []
+                      Just b1 -> do
+                        bs <- go x
+                        return (b1:bs)
+                       
