diff --git a/Network/ByteOrder.hs b/Network/ByteOrder.hs
--- a/Network/ByteOrder.hs
+++ b/Network/ByteOrder.hs
@@ -51,6 +51,7 @@
     -- *Writing to buffer
   , WriteBuffer(..)
   , newWriteBuffer
+  , clearWriteBuffer
   , withWriteBuffer
   , withWriteBuffer'
   , write8
@@ -369,6 +370,12 @@
 newWriteBuffer buf siz =
     WriteBuffer buf (buf `plusPtr` siz) <$> newIORef buf <*> newIORef buf
 
+-- | Reseting a write buffer.
+clearWriteBuffer :: WriteBuffer -> IO ()
+clearWriteBuffer WriteBuffer{..} = do
+    writeIORef offset start
+    writeIORef oldoffset start
+
 {-# INLINE write8 #-}
 -- | Write one byte and ff one byte.
 --   If buffer overrun occurs, 'BufferOverrun' is thrown.
@@ -561,16 +568,19 @@
     save :: a -> IO ()
     -- | Getting how many bytes from the saved offset pinter.
     savingSize :: a -> IO Int
+    -- | Moving the offset point to the saved point.
+    goBack :: a -> IO ()
 
 instance Readable WriteBuffer where
     {-# INLINE read8 #-}
     read8 WriteBuffer{..} = do
         ptr <- readIORef offset
-        let ptr' = ptr `plusPtr` 1
-        when (ptr' > limit) $ throwIO BufferOverrun
-        w <- peek ptr
-        writeIORef offset ptr'
-        return w
+        if ptr < limit then do
+            w <- peek ptr
+            writeIORef offset $ ptr `plusPtr` 1
+            return w
+          else
+            throwIO BufferOverrun
     {-# INLINE readInt8 #-}
     readInt8 WriteBuffer{..} = do
         ptr <- readIORef offset
@@ -585,6 +595,8 @@
     ff WriteBuffer{..} n = do
         ptr <- readIORef offset
         let ptr' = ptr `plusPtr` n
+        when (ptr' < start) $ throwIO BufferOverrun
+        when (ptr' > limit) $ throwIO BufferOverrun -- not >=
         writeIORef offset ptr'
     {-# INLINE remainingSize #-}
     remainingSize WriteBuffer{..} = do
@@ -599,6 +611,10 @@
         old <- readIORef oldoffset
         cur <- readIORef offset
         return $ cur `minusPtr` old
+    {-# INLINE goBack #-}
+    goBack WriteBuffer{..} = do
+        old <- readIORef oldoffset
+        writeIORef offset old
 
 instance Readable ReadBuffer where
     {-# INLINE read8 #-}
@@ -615,6 +631,8 @@
     save (ReadBuffer w) = save w
     {-# INLINE savingSize #-}
     savingSize (ReadBuffer w) = savingSize w
+    {-# INLINE goBack #-}
+    goBack (ReadBuffer w) = goBack w
 
 ----------------------------------------------------------------
 
diff --git a/network-byte-order.cabal b/network-byte-order.cabal
--- a/network-byte-order.cabal
+++ b/network-byte-order.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                network-byte-order
-version:             0.1.4.0
+version:             0.1.5
 synopsis:            Network byte order utilities
 description:         Peek and poke functions for network byte order.
 license:             BSD3
