diff --git a/Data/ByteString.hs b/Data/ByteString.hs
--- a/Data/ByteString.hs
+++ b/Data/ByteString.hs
@@ -1913,10 +1913,6 @@
 -- and the second is the number of bytes to read. It returns the bytes
 -- read, up to n, or 'null' if EOF has been reached.
 --
--- If there is any data to read, then 'hGet' will not block, instead
--- it will return whatever data is available without blocking.  It
--- only blocks if there is no data available to read.
---
 -- 'hGet' is implemented in terms of 'hGetBuf'.
 --
 -- If the handle is a pipe or socket, and the writing end
diff --git a/Data/ByteString/Lazy.hs b/Data/ByteString/Lazy.hs
--- a/Data/ByteString/Lazy.hs
+++ b/Data/ByteString/Lazy.hs
@@ -213,7 +213,7 @@
 import Data.Word                (Word8)
 import Data.Int                 (Int64)
 import System.IO                (Handle,stdin,stdout,openBinaryFile,IOMode(..)
-                                ,hClose)
+                                ,hClose,hWaitForInput,hIsEOF)
 import System.IO.Error          (mkIOError, illegalOperationErrorType)
 import System.IO.Unsafe
 #ifndef __NHC__
@@ -1174,9 +1174,15 @@
     lazyRead = unsafeInterleaveIO loop
 
     loop = do
-        c <- S.hGet h k -- only blocks if there is no data available
+        c <- S.hGetNonBlocking h k
+        --TODO: I think this should distinguish EOF from no data available
+        -- the underlying POSIX call makes this distincion, returning either
+        -- 0 or EAGAIN
         if S.null c
-          then hClose h >> return Empty
+          then do eof <- hIsEOF h
+                  if eof then hClose h >> return Empty
+                         else hWaitForInput h (-1)
+                           >> loop
           else do cs <- lazyRead
                   return (Chunk c cs)
 
diff --git a/bytestring.cabal b/bytestring.cabal
--- a/bytestring.cabal
+++ b/bytestring.cabal
@@ -1,5 +1,5 @@
 Name:                bytestring
-Version:             0.9.1.6
+Version:             0.9.1.7
 Synopsis:            Fast, packed, strict and lazy byte arrays with a list interface
 Description:
     A time and space-efficient implementation of byte vectors using
