diff --git a/Codec/BMP.hs b/Codec/BMP.hs
--- a/Codec/BMP.hs
+++ b/Codec/BMP.hs
@@ -69,14 +69,19 @@
 --	If there is anything wrong this gives an `Error` instead.
 hGetBMP :: Handle -> IO (Either Error BMP)
 hGetBMP h
- = do	-- load the file header.
-	buf	<- BSL.hGet h sizeOfFileHeader
-	if (fromIntegral $ BSL.length buf) /= sizeOfFileHeader
-	 then 	return $ Left ErrorReadOfFileHeaderFailed
-	 else	hGetBMP2 h (decode buf)
+ = do	-- lazily load the whole file
+	buf	<- BSL.hGetContents h
+
+	-- split off the file header
+	let (bufFileHeader, bufRest) 
+		= BSL.splitAt (fromIntegral sizeOfFileHeader) buf
 	
+	if (fromIntegral $ BSL.length bufFileHeader) /= sizeOfFileHeader
+	 then	return $ Left ErrorReadOfFileHeaderFailed
+	 else	hGetBMP2 bufRest (decode bufFileHeader)
 	
-hGetBMP2 h fileHeader
+		
+hGetBMP2 buf fileHeader
  -- Check the magic before doing anything else.
  --	If the specified file is not a BMP file then we'd prefer to get 
  --	this error than a `ReadOfImageHeaderFailed`.
@@ -85,62 +90,59 @@
 	
  | otherwise
  = do	-- Next comes the image header. 
-	-- The first word tells us which header format it is.
-	bufSize		<- BSL.hGet h 4
-	let sizeHeader	= runGet getWord32le bufSize
+	-- The first word tells us how long it is.
+	let sizeHeader	= runGet getWord32le buf
 	
-	-- Load the rest of the image header
-	let sizeRest	= fromIntegral sizeHeader - 4
-	bufRest	<- BSL.hGet h sizeRest
-	if (fromIntegral $ BSL.length bufRest) /= sizeRest
+	-- split off the image header
+	let (bufImageHeader, bufRest)
+		= BSL.splitAt (fromIntegral sizeHeader) buf
+
+	if (fromIntegral $ BSL.length bufImageHeader) /= sizeHeader
 	 then 	return $ Left ErrorReadOfImageHeaderFailed
-	 else do
-		let bufHeader 	= BSL.append bufSize bufRest
-		hGetBMP3 h fileHeader sizeHeader bufHeader
-		
+	 else 	hGetBMP3 fileHeader bufImageHeader bufRest
+
 			
-hGetBMP3 h fileHeader sizeHeader bufHeader
-	| sizeHeader == 40 
-	= do	let info	= decode bufHeader
+hGetBMP3 fileHeader bufImageHeader bufRest
+	| BSL.length bufImageHeader == 40 
+	= do	let info	= decode bufImageHeader
 		case checkBitmapInfoV3 info of
 		 Just err	-> return $ Left err
-		 Nothing	-> hGetBMP4 h fileHeader (InfoV3 info) 
+		 Nothing	-> hGetBMP4 fileHeader (InfoV3 info) bufRest
 					(fromIntegral $ dib3ImageSize info)
 
-	| sizeHeader == 108
-	= do	let info	= decode bufHeader
+	| BSL.length bufImageHeader == 108
+	= do	let info	= decode bufImageHeader
 		case checkBitmapInfoV4 info of
 		 Just err	-> return $ Left err
-		 Nothing	-> hGetBMP4 h fileHeader (InfoV4 info) 
+		 Nothing	-> hGetBMP4 fileHeader (InfoV4 info) bufRest
 					(fromIntegral 
 						$ dib3ImageSize 
 						$ dib4InfoV3 info)
 		
-	| sizeHeader == 124
-	= do	let info	= decode bufHeader
+	| BSL.length bufImageHeader == 124
+	= do	let info	= decode bufImageHeader
 		case checkBitmapInfoV5 info of
 		 Just err	-> return $ Left err
-		 Nothing	-> hGetBMP4 h fileHeader (InfoV5 info) 
+		 Nothing	-> hGetBMP4 fileHeader (InfoV5 info) bufRest
 					(fromIntegral
 					 	$ dib3ImageSize 
 						$ dib4InfoV3
 						$ dib5InfoV4 info)
 		
 	| otherwise
- 	= return $ Left $ ErrorUnhandledBitmapHeaderSize (fromIntegral sizeHeader)
+ 	= return 
+		$ Left 
+		$ ErrorUnhandledBitmapHeaderSize (fromIntegral $ BSL.length bufImageHeader)
 
 
-hGetBMP4 h fileHeader imageHeader sizeImage
- = do	-- load the image data.
-	imageData	<- BS.hGet h sizeImage
-				
-	if (fromIntegral $ BS.length imageData) /= sizeImage
+hGetBMP4 fileHeader imageHeader bufImage (sizeImage :: Int)
+ = if (fromIntegral $ BSL.length bufImage) /= sizeImage
 	 then return $ Left ErrorReadOfImageDataFailed
 	 else return 
 		$ Right $ BMP 
 		{ bmpFileHeader 	= fileHeader
 		, bmpBitmapInfo		= imageHeader
-		, bmpRawImageData	= imageData }
+		, bmpRawImageData	= BS.pack $ BSL.unpack bufImage }
 
 
 -- Writing ----------------------------------------------------------------------------------------
diff --git a/Codec/BMP/BitmapInfoV3.hs b/Codec/BMP/BitmapInfoV3.hs
--- a/Codec/BMP/BitmapInfoV3.hs
+++ b/Codec/BMP/BitmapInfoV3.hs
@@ -14,37 +14,37 @@
 -- | Device Independent Bitmap (DIB) header for Windows V3.
 data BitmapInfoV3
 	= BitmapInfoV3			
-	{ -- | Size of the image header, in bytes.
+	{ -- | (+0) Size of the image header, in bytes.
 	  dib3Size		:: Word32
 
-	  -- | Width of the image, in pixels.
+	  -- | (+4) Width of the image, in pixels.
 	, dib3Width		:: Word32
 	
-	  -- | Height of the image, in pixels.
+	  -- | (+8) Height of the image, in pixels.
 	, dib3Height		:: Word32
 	
-	  -- | Number of color planes.
+	  -- | (+12) Number of color planes.
 	, dib3Planes		:: Word16
 
-	  -- | Number of bits per pixel.
+	  -- | (+14) Number of bits per pixel.
 	, dib3BitCount		:: Word16
 
-	  -- | Image compression mode.
+	  -- | (+16) Image compression mode.
 	, dib3Compression	:: Compression
 
-	  -- | Size of raw image data.
+	  -- | (+20) Size of raw image data.
 	, dib3ImageSize		:: Word32
 
-	  -- | Prefered resolution in pixels per meter, along the X axis.
+	  -- | (+24) Prefered resolution in pixels per meter, along the X axis.
 	, dib3PelsPerMeterX	:: Word32
 
-	  -- | Prefered resolution in pixels per meter, along the Y axis.
+	  -- | (+28) Prefered resolution in pixels per meter, along the Y axis.
 	, dib3PelsPerMeterY	:: Word32
 
-	  -- | Number of color entries that are used.
+	  -- | (+32) Number of color entries that are used.
 	, dib3ColorsUsed	:: Word32
 
-	  -- | Number of significant colors.
+	  -- | (+36) Number of significant colors.
 	, dib3ColorsImportant	:: Word32
 	}
 	deriving (Show)
diff --git a/Codec/BMP/FileHeader.hs b/Codec/BMP/FileHeader.hs
--- a/Codec/BMP/FileHeader.hs
+++ b/Codec/BMP/FileHeader.hs
@@ -15,19 +15,19 @@
 -- | BMP file header.
 data FileHeader
 	= FileHeader			
-	{ -- | Magic numbers 0x42 0x4d
+	{ -- | (+0) Magic numbers 0x42 0x4d
 	  fileHeaderType	:: Word16
 	
-	  -- | Size of the file, in bytes.
+	  -- | (+2) Size of the file, in bytes.
 	, fileHeaderFileSize	:: Word32
 
-	  -- | Reserved, must be zero.
+	  -- | (+6) Reserved, must be zero.
 	, fileHeaderReserved1	:: Word16
 
-	  -- | Reserved, must be zero.
+	  -- | (+8) Reserved, must be zero.
 	, fileHeaderReserved2	:: Word16
 
-	  -- | Offset in bytes to the start of the pixel data.
+	  -- | (+10) Offset in bytes to the start of the pixel data.
 	, fileHeaderOffset	:: Word32
 	}
 	deriving (Show)
diff --git a/bmp.cabal b/bmp.cabal
--- a/bmp.cabal
+++ b/bmp.cabal
@@ -1,5 +1,5 @@
 Name:                bmp
-Version:             1.1.0.0
+Version:             1.1.1.0
 License:             MIT
 License-file:        LICENSE
 Author:              Ben Lippmeier
