diff --git a/src/buf/byte.rs b/src/buf/byte.rs
index bf1e14ac27d6b2c4c8eebf07156b3ab12c9691eb..46c2e6d269cc9c4f7a9d03931087524e471d5570 100644
--- a/src/buf/byte.rs
+++ b/src/buf/byte.rs
@@ -329,7 +329,7 @@ impl MutBuf for MutByteBuf {
         self.buf.remaining()
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         self.buf.advance(cnt)
     }
 
diff --git a/src/buf/mod.rs b/src/buf/mod.rs
index a1539f418f931a69d738f029692634992e36d5e8..9acb915a43caa365944a120bae0a6e9abdea7583 100644
--- a/src/buf/mod.rs
+++ b/src/buf/mod.rs
@@ -95,7 +95,7 @@ pub trait MutBuf : Sized {
     fn remaining(&self) -> usize;
 
     /// Advance the internal cursor of the MutBuf
-    fn advance(&mut self, cnt: usize);
+    unsafe fn advance(&mut self, cnt: usize);
 
     /// Returns true iff there is any more space for bytes to be written
     fn has_remaining(&self) -> bool {
@@ -143,9 +143,10 @@ pub trait MutBuf : Sized {
                     cnt);
 
                 off += cnt;
+
             }
 
-            self.advance(cnt);
+            unsafe { self.advance(cnt); }
         }
 
         len
@@ -278,7 +279,7 @@ impl<'a, R: io::Read+'a> Source for &'a mut R {
                 break;
             }
 
-            buf.advance(i);
+            unsafe { buf.advance(i); }
             cnt += i;
         }
 
@@ -338,7 +339,7 @@ impl MutBuf for Vec<u8> {
         usize::MAX - self.len()
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         let len = self.len() + cnt;
 
         if len > self.capacity() {
@@ -348,9 +349,7 @@ impl MutBuf for Vec<u8> {
             self.reserve(cap - len);
         }
 
-        unsafe {
-            self.set_len(len);
-        }
+        self.set_len(len);
     }
 
     unsafe fn mut_bytes(&mut self) -> &mut [u8] {
diff --git a/src/buf/ring.rs b/src/buf/ring.rs
index 892b1ab08acbc0c5dca53ebe7ae4ffdae040a69f..730809505ce42decc783bd6647b427b3a4c54d1e 100644
--- a/src/buf/ring.rs
+++ b/src/buf/ring.rs
@@ -199,7 +199,7 @@ impl MutBuf for RingBuf {
         self.write_remaining()
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         self.advance_writer(cnt)
     }
 
diff --git a/src/buf/slice.rs b/src/buf/slice.rs
index fb117ff05bad85a1f55de5c9ac971e42bb827642..a526803bff0bd9a013d90338b06b8ff48228911b 100644
--- a/src/buf/slice.rs
+++ b/src/buf/slice.rs
@@ -48,7 +48,7 @@ impl<'a> MutBuf for MutSliceBuf<'a> {
         self.bytes.len() - self.pos
     }
 
-    fn advance(&mut self, mut cnt: usize) {
+    unsafe fn advance(&mut self, mut cnt: usize) {
         cnt = cmp::min(cnt, self.remaining());
         self.pos += cnt;
     }
diff --git a/src/buf/take.rs b/src/buf/take.rs
index edc72377f1fc59d1af1fe22dd94d21848f7bd87d..7fec5b9f3561cee9d4c560e6972ed97c4462d4ff 100644
--- a/src/buf/take.rs
+++ b/src/buf/take.rs
@@ -71,7 +71,7 @@ impl<T: MutBuf> MutBuf for Take<T> {
         &mut self.inner.mut_bytes()[..self.limit]
     }
 
-    fn advance(&mut self, cnt: usize) {
+    unsafe fn advance(&mut self, cnt: usize) {
         let cnt = cmp::min(cnt, self.limit);
         self.limit -= cnt;
         self.inner.advance(cnt);
diff --git a/src/str/bytes.rs b/src/str/bytes.rs
index 42e1756105fe6fb76279ae0638516e34a30a2a78..d5bf4092ac1a7854912ab613360217d877bd6177 100644
--- a/src/str/bytes.rs
+++ b/src/str/bytes.rs
@@ -220,7 +220,7 @@ impl<'a> Source for &'a Bytes {
             }
 
             src.advance(l);
-            dst.advance(l);
+            unsafe { dst.advance(l); }
 
             res += l;
         }