diff --git a/src/buf/byte.rs b/src/buf/byte.rs
index 2fc77e647e28e4c56e7d68ee86bf9c3c79f00335..aae272cba0e985fe7ca19e443933268d1333209e 100644
--- a/src/buf/byte.rs
+++ b/src/buf/byte.rs
@@ -88,6 +88,14 @@ impl ByteBuf {
         buf
     }
 
+    /// Flips the buffer back to mutable, resetting the write position
+    /// to the byte after the previous write.
+    pub fn resume(mut self) -> MutByteBuf {
+        self.pos = self.lim;
+        self.lim = self.cap;
+        MutByteBuf { buf: self }
+    }
+
     pub fn read_slice(&mut self, dst: &mut [u8]) -> usize {
         let len = cmp::min(dst.len(), self.remaining());
         let cnt = len as u32;
diff --git a/test/test_byte_buf.rs b/test/test_byte_buf.rs
index 7557ddcad019f9a5ed3c9a60cbad2803e9862368..576bb0bb5569705c904c840ebe959cb6da23bf36 100644
--- a/test/test_byte_buf.rs
+++ b/test/test_byte_buf.rs
@@ -47,4 +47,13 @@ pub fn test_byte_buf_read_write() {
     let mut dst = [0; 7];
     assert_eq!(7, buf.read(&mut dst[..]).unwrap());
     assert_eq!(b"goodbye", &dst);
+
+    let mut buf = buf.resume();
+    assert_eq!(13, buf.remaining());
+
+    buf.write(&b" have fun"[..]).unwrap();
+    assert_eq!(4, buf.remaining());
+
+    let buf = buf.flip();
+    assert_eq!(buf.bytes(), b"hello world goodbye have fun");
 }