diff --git a/src/buf/ring.rs b/src/buf/ring.rs
index 926d05420e6e5649be523d2de85ac3286e7c1a7e..892b1ab08acbc0c5dca53ebe7ae4ffdae040a69f 100644
--- a/src/buf/ring.rs
+++ b/src/buf/ring.rs
@@ -91,6 +91,13 @@ impl RingBuf {
         }
     }
 
+    /// Resets all internal state to the initial state.
+    pub fn clear(&mut self) {
+        self.pos = 0;
+        self.len = 0;
+        self.mark = Mark::NoMark;
+    }
+
     /// Returns the number of bytes remaining to read.
     fn read_remaining(&self) -> usize {
         self.len
diff --git a/test/test_ring.rs b/test/test_ring.rs
index 78bf4a0fe8817bc607864130e1808b4cb8f371a5..c54423c9eab85073019cd71d821d685d81ea7ef9 100644
--- a/test/test_ring.rs
+++ b/test/test_ring.rs
@@ -120,3 +120,19 @@ fn test_reset_full() {
     buf.reset();
     assert_eq!(MutBuf::remaining(&buf), 0);
 }
+
+
+#[test]
+// Test that "RingBuf::clear" does the full reset
+fn test_clear() {
+    use bytes::traits::{Buf, MutBuf};
+    use std::io::Write;
+
+    let mut buf = RingBuf::new(8);
+    buf.write(&[0; 8]).unwrap();
+    assert_eq!(MutBuf::remaining(&buf), 0);
+    assert_eq!(Buf::remaining(&buf), 8);
+    buf.clear();
+    assert_eq!(MutBuf::remaining(&buf), 8);
+    assert_eq!(Buf::remaining(&buf), 0);
+}