diff --git a/Data/Packer.hs b/Data/Packer.hs
--- a/Data/Packer.hs
+++ b/Data/Packer.hs
@@ -50,6 +50,8 @@
     , getFloat64LE
     , getFloat64BE
     , isolate
+    , endOfInput
+    , countRemaining
     -- * Packing functions
     , packGetPosition
     , putWord8
@@ -244,6 +246,18 @@
 -- this function will raises an exception
 isolate :: Int -> Unpacking a -> Unpacking a
 isolate n subUnpacker = unpackIsolate n subUnpacker
+
+-- | Return True if there are no more bytes to be unpacked.
+--
+-- No input is consumed.
+endOfInput :: Unpacking Bool
+endOfInput = (== 0) <$> unpackGetNbRemaining
+
+-- | Return the number of bytes remaining in the current Unpacking.
+--
+-- No input is consumed.
+countRemaining :: Unpacking Int
+countRemaining = unpackGetNbRemaining
 
 -- | Put a Word8
 putWord8 :: Word8 -> Packing ()
diff --git a/Tests/Tests.hs b/Tests/Tests.hs
--- a/Tests/Tests.hs
+++ b/Tests/Tests.hs
@@ -5,6 +5,7 @@
 
 import Test.Tasty.QuickCheck
 import Test.Tasty.HUnit
+import Test.Tasty (TestTree)
 import Control.Applicative ((<$>))
 import Control.Monad
 import Control.Exception
@@ -26,6 +27,7 @@
     , ("64BE", putWord64BE . fromIntegral, (fromIntegral <$> getWord64BE), B.pack [8,7,6,5,4,3,2,1], 0x0807060504030201)
     ]
 
+toEndianCase :: (Eq a, Show a) => (String, a -> Packing (), Unpacking a, B.ByteString, a) -> [TestTree]
 toEndianCase (n, pAct, gAct, bs, v) =
     [ testCase ("put" ++ n) (runPacking 8 (pAct v) @=? bs)
     , testCase ("get" ++ n) (runUnpacking gAct bs @=? v)
@@ -200,6 +202,36 @@
 assertException msg filterE act =
     handleJust filterE (\_ -> return ()) (evaluate act >> assertFailure (msg ++ " didn't raise the proper exception"))
 
+
+endOfInputCase :: [TestTree]
+endOfInputCase =
+    [ testCase "endOfInput False" (getEndOfInput getWord8 "as" @=? False)
+    , testCase "endOfInput True" (getEndOfInput getWord16 "as" @=? True)
+    ]
+  where
+    getEndOfInput :: Unpacking a -> B.ByteString -> Bool
+    getEndOfInput getter bs =
+        let inner = do
+                _ <- getter
+                endOfInput
+        in runUnpacking inner bs
+
+
+countRemainingCase :: [TestTree]
+countRemainingCase =
+    [ testCase "countRemaining 3" (getRemainingCount getWord8 "abcd" @=? 3)
+    , testCase "countRemaining 2" (getRemainingCount getWord16 "abcd" @=? 2)
+    , testCase "countRemaining 0" (getRemainingCount getWord32 "abcd" @=? 0)
+    ]
+  where
+    getRemainingCount :: Unpacking a -> B.ByteString -> Int
+    getRemainingCount getter bs =
+        let inner = do
+                _ <- getter
+                countRemaining
+        in runUnpacking inner bs
+
+
 main :: IO ()
 main = defaultMain $ testGroup "packer"
     [ testGroup "serialization"
@@ -221,7 +253,10 @@
             , testCase "unpacking isolate not consumed" $
                 assertException "unpacking isolate" (\(IsolationNotFullyConsumed _ _) -> Just ())
                     (runUnpacking (isolate 3 (getBytes 2)) (B.pack [1,2,3]))
+
             ]
+        , testGroup "endOfInput" endOfInputCase
+        , testGroup "countRemaining" countRemainingCase
         , testGroup "endianness cases" $ concatMap toEndianCase endiannessCases
         , testProperty "unpacking.packing=id" (\ds -> unpackDataStream ds (packDataStream ds) == ds)
         , testProperty "holes" test_property_hole
diff --git a/packer.cabal b/packer.cabal
--- a/packer.cabal
+++ b/packer.cabal
@@ -1,5 +1,5 @@
 Name:                packer
-Version:             0.1.8
+Version:             0.1.9
 Description:         Fast byte serializer and unserializer
 License:             BSD3
 License-file:        LICENSE
