diff --git a/src/buf/byte.rs b/src/buf/byte.rs
index 46c2e6d269cc9c4f7a9d03931087524e471d5570..e536ab233c613f65cdc8998880f25053d5df472c 100644
--- a/src/buf/byte.rs
+++ b/src/buf/byte.rs
@@ -1,5 +1,4 @@
-use {alloc, Bytes, SeqByteStr, MAX_CAPACITY};
-use traits::{Buf, MutBuf, MutBufExt, ByteStr};
+use {alloc, Buf, Bytes, MutBuf, SeqByteStr, MAX_CAPACITY};
 use std::{cmp, fmt, ptr};
 
 /*
@@ -24,7 +23,7 @@ impl ByteBuf {
     /// Create a new `ByteBuf` by copying the contents of the given slice.
     pub fn from_slice(bytes: &[u8]) -> ByteBuf {
         let mut buf = ByteBuf::mut_with_capacity(bytes.len());
-        buf.write(bytes).ok().expect("unexpected failure");
+        buf.write_slice(bytes);
         buf.flip()
     }
 
diff --git a/src/buf/mod.rs b/src/buf/mod.rs
index 9acb915a43caa365944a120bae0a6e9abdea7583..b52e99a75bd8ab7ccab761c404f10755094b51bf 100644
--- a/src/buf/mod.rs
+++ b/src/buf/mod.rs
@@ -10,7 +10,7 @@ pub use self::ring::RingBuf;
 pub use self::slice::{SliceBuf, MutSliceBuf};
 pub use self::take::Take;
 
-use {BufError, RopeBuf};
+use {BufError, ByteStr, RopeBuf};
 use std::{cmp, fmt, io, ptr, usize};
 
 /// A trait for values that provide sequential read access to bytes.
@@ -31,6 +31,11 @@ pub trait Buf {
         self.remaining() > 0
     }
 
+    fn copy_to<S: Sink>(&mut self, dst: S) -> Result<usize, BufError>
+            where Self: Sized {
+        dst.copy_from(self)
+    }
+
     /// Read bytes from the `Buf` into the given slice and advance the cursor by
     /// the number of bytes read.
     /// Returns the number of bytes read.
@@ -80,14 +85,6 @@ pub trait Buf {
     }
 }
 
-/// An extension trait providing extra functions applicable to all `Buf` values.
-pub trait BufExt {
-
-    /// Read bytes from this Buf into the given sink and advance the cursor by
-    /// the number of bytes read.
-    fn read<S: Sink>(&mut self, dst: S) -> Result<usize, S::Error>;
-}
-
 /// A trait for values that provide sequential write access to bytes.
 pub trait MutBuf : Sized {
 
@@ -108,6 +105,11 @@ pub trait MutBuf : Sized {
     /// The returned byte slice may represent uninitialized memory.
     unsafe fn mut_bytes<'a>(&'a mut self) -> &'a mut [u8];
 
+    fn copy_from<S: Source>(&mut self, src: S) -> Result<usize, BufError>
+            where Self: Sized {
+        src.copy_to(self)
+    }
+
     /// Write bytes from the given slice into the `MutBuf` and advance the
     /// cursor by the number of bytes written.
     /// Returns the number of bytes written.
@@ -151,77 +153,74 @@ pub trait MutBuf : Sized {
 
         len
     }
-
-    /// Write a single byte to the `MuBuf`
-    fn write_byte(&mut self, byte: u8) -> bool {
-        let src = [byte];
-
-        if self.write_slice(&src) == 0 {
-            return false;
-        }
-
-        true
-    }
-}
-
-/// An extension trait providing extra functions applicable to all `MutBuf` values.
-pub trait MutBufExt {
-
-    /// Write bytes from the given source into the current `MutBuf` and advance
-    /// the cursor by the number of bytes written.
-    fn write<S: Source>(&mut self, src: S) -> Result<usize, S::Error>;
 }
 
 /*
  *
- * ===== *Ext impls =====
+ * ===== Sink / Source =====
  *
  */
 
-impl<B: Buf> BufExt for B {
-    fn read<S: Sink>(&mut self, dst: S) -> Result<usize, S::Error> {
-        dst.sink(self)
+
+/// A value that writes bytes from itself into a `MutBuf`.
+pub trait Source {
+    fn copy_to<B: MutBuf>(self, buf: &mut B) -> Result<usize, BufError>;
+}
+
+impl<'a> Source for &'a [u8] {
+    fn copy_to<B: MutBuf>(self, buf: &mut B) -> Result<usize, BufError> {
+        Ok(buf.write_slice(self))
     }
 }
 
-impl<B: MutBuf> MutBufExt for B {
-    fn write<S: Source>(&mut self, src: S) -> Result<usize, S::Error> {
-        src.fill(self)
+impl Source for u8 {
+    fn copy_to<B: MutBuf>(self, buf: &mut B) -> Result<usize, BufError> {
+        let src = [self];
+        Ok(buf.write_slice(&src))
     }
 }
 
-/*
- *
- * ===== Sink / Source =====
- *
- */
+impl<'a, T: ByteStr> Source for &'a T {
+    fn copy_to<B: MutBuf>(self, buf: &mut B) -> Result<usize, BufError> {
+        let mut src = ByteStr::buf(self);
+        let mut res = 0;
 
-/// A value that reads bytes from a Buf into itself
-pub trait Sink {
-    type Error;
+        while src.has_remaining() && buf.has_remaining() {
+            let l;
 
-    fn sink<B: Buf>(self, buf: &mut B) -> Result<usize, Self::Error>;
-}
+            unsafe {
+                let s = src.bytes();
+                let d = buf.mut_bytes();
+                l = cmp::min(s.len(), d.len());
 
-/// A value that writes bytes from itself into a `MutBuf`.
-pub trait Source {
-    type Error;
+                ptr::copy_nonoverlapping(
+                    s.as_ptr(),
+                    d.as_mut_ptr(),
+                    l);
+            }
+
+            src.advance(l);
+            unsafe { buf.advance(l); }
+
+            res += l;
+        }
 
-    fn fill<B: MutBuf>(self, buf: &mut B) -> Result<usize, Self::Error>;
+        Ok(res)
+    }
 }
 
-impl<'a> Sink for &'a mut [u8] {
-    type Error = BufError;
+pub trait Sink {
+    fn copy_from<B: Buf>(self, buf: &mut B) -> Result<usize, BufError>;
+}
 
-    fn sink<B: Buf>(self, buf: &mut B) -> Result<usize, BufError> {
+impl<'a> Sink for &'a mut [u8] {
+    fn copy_from<B: Buf>(self, buf: &mut B) -> Result<usize, BufError> {
         Ok(buf.read_slice(self))
     }
 }
 
 impl<'a> Sink for &'a mut Vec<u8> {
-    type Error = BufError;
-
-    fn sink<B: Buf>(self, buf: &mut B) -> Result<usize, BufError> {
+    fn copy_from<B: Buf>(self, buf: &mut B) -> Result<usize, BufError> {
         use std::slice;
 
         self.clear();
@@ -249,41 +248,44 @@ impl<'a> Sink for &'a mut Vec<u8> {
     }
 }
 
-impl<'a> Source for &'a [u8] {
-    type Error = BufError;
+/*
+ *
+ * ===== Read / Write =====
+ *
+ */
 
-    fn fill<B: MutBuf>(self, buf: &mut B) -> Result<usize, BufError> {
-        Ok(buf.write_slice(self))
-    }
+pub trait ReadExt {
+    fn read_buf<B: MutBuf>(&mut self, buf: &mut B) -> io::Result<usize>;
 }
 
-impl<'a> Source for &'a Vec<u8> {
-    type Error = BufError;
+impl<T: io::Read> ReadExt for T {
+    fn read_buf<B: MutBuf>(&mut self, buf: &mut B) -> io::Result<usize> {
+        if !buf.has_remaining() {
+            return Ok(0);
+        }
+
+        unsafe {
+            let i = try!(self.read(buf.mut_bytes()));
 
-    fn fill<B: MutBuf>(self, buf: &mut B) -> Result<usize, BufError> {
-        Ok(buf.write_slice(self.as_ref()))
+            buf.advance(i);
+            Ok(i)
+        }
     }
 }
 
+pub trait WriteExt {
+    fn write_buf<B: Buf>(&mut self, buf: &mut B) -> io::Result<usize>;
+}
 
-impl<'a, R: io::Read+'a> Source for &'a mut R {
-    type Error = io::Error;
-
-    fn fill<B: MutBuf>(self, buf: &mut B) -> Result<usize, io::Error> {
-        let mut cnt = 0;
-
-        while buf.has_remaining() {
-            let i = try!(self.read(unsafe { buf.mut_bytes() }));
-
-            if i == 0 {
-                break;
-            }
-
-            unsafe { buf.advance(i); }
-            cnt += i;
+impl<T: io::Write> WriteExt for T {
+    fn write_buf<B: Buf>(&mut self, buf: &mut B) -> io::Result<usize> {
+        if !buf.has_remaining() {
+            return Ok(0);
         }
 
-        Ok(cnt)
+        let i = try!(self.write(buf.bytes()));
+        buf.advance(i);
+        Ok(i)
     }
 }
 
diff --git a/src/buf/ring.rs b/src/buf/ring.rs
index 730809505ce42decc783bd6647b427b3a4c54d1e..75ab492e8cd6e7d8cb58bead9defe6d42abae43c 100644
--- a/src/buf/ring.rs
+++ b/src/buf/ring.rs
@@ -1,5 +1,5 @@
 use {alloc, Buf, MutBuf};
-use std::{cmp, fmt, io, ptr};
+use std::{cmp, fmt, ptr};
 
 enum Mark {
     NoMark,
@@ -223,28 +223,4 @@ impl MutBuf for RingBuf {
     }
 }
 
-impl io::Read for RingBuf {
-    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
-        if !Buf::has_remaining(self) {
-            return Ok(0);
-        }
-
-        Ok(self.read_slice(buf))
-    }
-}
-
-impl io::Write for RingBuf {
-    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
-        if !MutBuf::has_remaining(self) {
-            return Ok(0);
-        }
-
-        Ok(self.write_slice(buf))
-    }
-
-    fn flush(&mut self) -> io::Result<()> {
-        Ok(())
-    }
-}
-
 unsafe impl Send for RingBuf { }
diff --git a/src/lib.rs b/src/lib.rs
index 6fa8922224394fbb8eb02349081f8e2a30e0ca88..d5eca9b610deb61690e8c4755e47fd5fa7c04c3d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,18 +7,16 @@ pub mod str;
 
 pub use buf::{
     Buf,
-    BufExt,
     MutBuf,
-    MutBufExt,
     ByteBuf,
     MutByteBuf,
     RingBuf,
     ROByteBuf,
     SliceBuf,
     MutSliceBuf,
-    Source,
-    Sink,
     Take,
+    ReadExt,
+    WriteExt,
 };
 pub use str::{
     ByteStr,
@@ -35,7 +33,7 @@ use std::u32;
 
 pub mod traits {
     //! All traits are re-exported here to allow glob imports.
-    pub use {Buf, BufExt, MutBuf, MutBufExt, ByteStr, ToBytes};
+    pub use {Buf, MutBuf, ByteStr, ToBytes};
 }
 
 const MAX_CAPACITY: usize = u32::MAX as usize;
diff --git a/src/str/bytes.rs b/src/str/bytes.rs
index d5bf4092ac1a7854912ab613360217d877bd6177..902e9300d53efc8d6bda8d3145440815f7362876 100644
--- a/src/str/bytes.rs
+++ b/src/str/bytes.rs
@@ -1,7 +1,7 @@
-use {ByteBuf, MutBuf, SmallByteStr, Source, BufError};
+use {ByteBuf, SmallByteStr};
 use traits::{Buf, ByteStr, ToBytes};
-use std::{cmp, fmt, mem, ops, ptr};
-use std::any::{Any, TypeId};
+use std::{fmt, mem, ops, ptr};
+use std::any::{TypeId};
 
 const INLINE: usize = 1;
 
@@ -198,37 +198,6 @@ impl Drop for Bytes {
 unsafe impl Send for Bytes { }
 unsafe impl Sync for Bytes { }
 
-impl<'a> Source for &'a Bytes {
-    type Error = BufError;
-
-    fn fill<B: MutBuf>(self, dst: &mut B) -> Result<usize, BufError> {
-        let mut src = ByteStr::buf(self);
-        let mut res = 0;
-
-        while src.has_remaining() && dst.has_remaining() {
-            let l;
-
-            unsafe {
-                let s = src.bytes();
-                let d = dst.mut_bytes();
-                l = cmp::min(s.len(), d.len());
-
-                ptr::copy_nonoverlapping(
-                    s.as_ptr(),
-                    d.as_mut_ptr(),
-                    l);
-            }
-
-            src.advance(l);
-            unsafe { dst.advance(l); }
-
-            res += l;
-        }
-
-        Ok(res)
-    }
-}
-
 trait ByteStrPriv {
 
     fn buf(&self) -> Box<Buf+'static>;
diff --git a/src/str/rope.rs b/src/str/rope.rs
index ca724df805fa4530110961d61af5ea799fa6ec44..d3798555bab5c81d0cd25466e5cf51efa5e62985 100644
--- a/src/str/rope.rs
+++ b/src/str/rope.rs
@@ -1,5 +1,5 @@
-use {Bytes, ByteBuf, Source, BufError};
-use traits::{Buf, ByteStr, MutBuf, MutBufExt, ToBytes};
+use {Bytes, ByteBuf};
+use traits::{Buf, ByteStr, MutBuf, ToBytes};
 use std::{cmp, mem, ops};
 use std::sync::Arc;
 
@@ -176,14 +176,6 @@ impl Clone for Rope {
     }
 }
 
-impl<'a> Source for &'a Rope {
-    type Error = BufError;
-
-    fn fill<B: MutBuf>(self, _buf: &mut B) -> Result<usize, BufError> {
-        unimplemented!();
-    }
-}
-
 /*
  *
  * ===== Helper Fns =====
@@ -266,8 +258,8 @@ fn concat(left: Bytes, right: Bytes) -> Rope {
 fn concat_bytes(left: &Bytes, right: &Bytes, len: usize) -> Rope {
     let mut buf = ByteBuf::mut_with_capacity(len);
 
-    buf.write(left).ok().expect("unexpected error");
-    buf.write(right).ok().expect("unexpected error");
+    buf.copy_from(left).ok().expect("unexpected error");
+    buf.copy_from(right).ok().expect("unexpected error");
 
     return Rope::of(buf.flip().to_bytes());
 }
diff --git a/src/str/seq.rs b/src/str/seq.rs
index a8ab256f189950f58fdb1be5b5834dc4b29ee240..2b67e6bd2c9186b97c743391deb63f9a6f683c63 100644
--- a/src/str/seq.rs
+++ b/src/str/seq.rs
@@ -1,4 +1,4 @@
-use {alloc, ByteBuf, MutBufExt, ByteStr, ROByteBuf, Rope, Bytes, ToBytes};
+use {alloc, ByteBuf, ByteStr, MutBuf, ROByteBuf, Rope, Bytes, ToBytes};
 use std::ops;
 
 pub struct SeqByteStr {
@@ -14,7 +14,7 @@ impl SeqByteStr {
     pub fn from_slice(bytes: &[u8]) -> SeqByteStr {
         let mut buf = ByteBuf::mut_with_capacity(bytes.len());
 
-        if let Err(e) = buf.write(bytes) {
+        if let Err(e) = buf.copy_from(bytes) {
             panic!("failed to copy bytes from slice; err={:?}", e);
         }
 
diff --git a/src/str/small.rs b/src/str/small.rs
index 949ac1bc691c412753c1db5cc21aeddabb55d1aa..9128a95495f769056478a787a716ea978c5768af 100644
--- a/src/str/small.rs
+++ b/src/str/small.rs
@@ -1,5 +1,5 @@
 use {Bytes, Rope};
-use traits::{Buf, MutBuf, ByteStr, ToBytes};
+use traits::{Buf, ByteStr, ToBytes};
 use std::{cmp, ops};
 
 /*
diff --git a/test/test_buf.rs b/test/test_buf.rs
index ecdf1db3729a815909537fdfdaedfbc66f1d291f..24644761b7d0d553d3002e6dfce7ad98be338630 100644
--- a/test/test_buf.rs
+++ b/test/test_buf.rs
@@ -1,4 +1,4 @@
-use bytes::{Buf, MutBuf, MutBufExt};
+use bytes::{Buf, MutBuf};
 use std::usize;
 use std::io::{Cursor};
 
@@ -35,7 +35,7 @@ pub fn test_vec_as_mut_buf() {
         assert!(buf.mut_bytes().len() >= 64);
     }
 
-    buf.write(&b"zomg"[..]).unwrap();
+    buf.copy_from(&b"zomg"[..]).unwrap();
 
     assert_eq!(&buf, b"zomg");
 
@@ -43,7 +43,7 @@ pub fn test_vec_as_mut_buf() {
     assert_eq!(buf.capacity(), 64);
 
     for _ in 0..16 {
-        buf.write(&b"zomg"[..]).unwrap();
+        buf.copy_from(&b"zomg"[..]).unwrap();
     }
 
     assert_eq!(buf.len(), 68);
diff --git a/test/test_buf_fill.rs b/test/test_buf_fill.rs
index d32a1ed58a9bee73d175789f708a0955c1a3e599..5f6bc9425ddcaa0dbcf905fdc5f5bda4f24df380 100644
--- a/test/test_buf_fill.rs
+++ b/test/test_buf_fill.rs
@@ -2,12 +2,12 @@ use bytes::*;
 use std::io;
 
 #[test]
-pub fn test_filling_buf_from_reader() {
+pub fn test_readijng_buf_from_reader() {
     let mut reader = chunks(vec![b"foo", b"bar", b"baz"]);
     let mut buf = ByteBuf::mut_with_capacity(1024);
 
-    assert_eq!(9, buf.write(&mut reader).unwrap());
-    assert_eq!(b"foobarbaz".to_bytes(), buf.flip().to_bytes());
+    assert_eq!(3, reader.read_buf(&mut buf).unwrap());
+    assert_eq!(b"foo".to_bytes(), buf.flip().to_bytes());
 }
 
 fn chunks(chunks: Vec<&'static [u8]>) -> Chunked {
diff --git a/test/test_buf_take.rs b/test/test_buf_take.rs
index b2300c11c0e300abd6d7a7f3d2cba99522f62580..efb3744712f8ad4d66a83ba997c9a0beb168622f 100644
--- a/test/test_buf_take.rs
+++ b/test/test_buf_take.rs
@@ -6,7 +6,7 @@ pub fn test_take_from_buf() {
     let mut buf = Take::new(Cursor::new(b"hello world".to_vec()), 5);
     let mut res = vec![];
 
-    buf.read_to_end(&mut res);
+    buf.read_to_end(&mut res).unwrap();
 
     assert_eq!(&res, b"hello");
 }
diff --git a/test/test_byte_buf.rs b/test/test_byte_buf.rs
index a0e69376672c5f22d259fea6c2b1ebdffc6f594c..110da8ae0243a6f25fac71ebb7556656d1a593fd 100644
--- a/test/test_byte_buf.rs
+++ b/test/test_byte_buf.rs
@@ -20,10 +20,10 @@ pub fn test_initial_buf_empty() {
 #[test]
 pub fn test_byte_buf_bytes() {
     let mut buf = ByteBuf::mut_with_capacity(32);
-    buf.write(&b"hello "[..]).unwrap();
+    buf.copy_from(&b"hello "[..]).unwrap();
     assert_eq!(&b"hello "[..], buf.bytes());
 
-    buf.write(&b"world"[..]).unwrap();
+    buf.copy_from(&b"world"[..]).unwrap();
     assert_eq!(&b"hello world"[..], buf.bytes());
     let buf = buf.flip();
     assert_eq!(&b"hello world"[..], buf.bytes());
@@ -33,37 +33,37 @@ pub fn test_byte_buf_bytes() {
 pub fn test_byte_buf_read_write() {
     let mut buf = ByteBuf::mut_with_capacity(32);
 
-    buf.write(&b"hello world"[..]).unwrap();
+    buf.copy_from(&b"hello world"[..]).unwrap();
     assert_eq!(21, buf.remaining());
 
-    buf.write(&b" goodbye"[..]).unwrap();
+    buf.copy_from(&b" goodbye"[..]).unwrap();
     assert_eq!(13, buf.remaining());
 
     let mut buf = buf.flip();
     let mut dst = [0; 5];
 
     buf.mark();
-    assert_eq!(5, buf.read(&mut dst[..]).unwrap());
+    assert_eq!(5, buf.copy_to(&mut dst[..]).unwrap());
     assert_eq!(b"hello", &dst);
     buf.reset();
-    assert_eq!(5, buf.read(&mut dst[..]).unwrap());
+    assert_eq!(5, buf.copy_to(&mut dst[..]).unwrap());
     assert_eq!(b"hello", &dst);
 
-    assert_eq!(5, buf.read(&mut dst[..]).unwrap());
+    assert_eq!(5, buf.copy_to(&mut dst[..]).unwrap());
     assert_eq!(b" worl", &dst);
 
     let mut dst = [0; 2];
-    assert_eq!(2, buf.read(&mut dst[..]).unwrap());
+    assert_eq!(2, buf.copy_to(&mut dst[..]).unwrap());
     assert_eq!(b"d ", &dst);
 
     let mut dst = [0; 7];
-    assert_eq!(7, buf.read(&mut dst[..]).unwrap());
+    assert_eq!(7, buf.copy_to(&mut dst[..]).unwrap());
     assert_eq!(b"goodbye", &dst);
 
     let mut buf = buf.resume();
     assert_eq!(13, buf.remaining());
 
-    buf.write(&b" have fun"[..]).unwrap();
+    buf.copy_from(&b" have fun"[..]).unwrap();
     assert_eq!(4, buf.remaining());
 
     let buf = buf.flip();
diff --git a/test/test_ring.rs b/test/test_ring.rs
index c54423c9eab85073019cd71d821d685d81ea7ef9..f42219fb0f00f1f19b2fc88f9b1a70aae6bd0238 100644
--- a/test/test_ring.rs
+++ b/test/test_ring.rs
@@ -1,18 +1,17 @@
-use bytes::RingBuf;
-
+use bytes::{RingBuf, Buf, MutBuf};
 
 #[test]
 pub fn test_initial_buf_empty() {
-    use bytes::traits::{Buf, BufExt, MutBuf, MutBufExt};
+    use bytes::traits::{Buf, MutBuf};
 
     let mut buf = RingBuf::new(16);
     assert_eq!(MutBuf::remaining(&buf), 16);
     assert_eq!(Buf::remaining(&buf), 0);
 
-    let bytes_written = buf.write(&[1, 2, 3][..]).unwrap();
+    let bytes_written = buf.copy_from(&[1, 2, 3][..]).unwrap();
     assert_eq!(bytes_written, 3);
 
-    let bytes_written = buf.write(&[][..]).unwrap();
+    let bytes_written = buf.copy_from(&[][..]).unwrap();
     assert_eq!(bytes_written, 0);
     assert_eq!(MutBuf::remaining(&buf), 13);
     assert_eq!(Buf::remaining(&buf), 3);
@@ -21,11 +20,11 @@ pub fn test_initial_buf_empty() {
     let mut out = [0u8; 3];
 
     buf.mark();
-    let bytes_read = buf.read(&mut out[..]).unwrap();;
+    let bytes_read = buf.copy_to(&mut out[..]).unwrap();;
     assert_eq!(bytes_read, 3);
     assert_eq!(out, [1, 2, 3]);
     buf.reset();
-    let bytes_read = buf.read(&mut out[..]).unwrap();;
+    let bytes_read = buf.copy_to(&mut out[..]).unwrap();;
     assert_eq!(bytes_read, 3);
     assert_eq!(out, [1, 2, 3]);
 
@@ -35,44 +34,41 @@ pub fn test_initial_buf_empty() {
 
 #[test]
 fn test_wrapping_write() {
-    use bytes::traits::{BufExt, MutBufExt};
     let mut buf = RingBuf::new(16);
     let mut out = [0;10];
 
-    buf.write(&[42;12][..]).unwrap();
-    let bytes_read = buf.read(&mut out[..]).unwrap();
+    buf.copy_from(&[42;12][..]).unwrap();
+    let bytes_read = buf.copy_to(&mut out[..]).unwrap();
     assert_eq!(bytes_read, 10);
 
-    let bytes_written = buf.write(&[23;8][..]).unwrap();
+    let bytes_written = buf.copy_from(&[23;8][..]).unwrap();
     assert_eq!(bytes_written, 8);
 
     buf.mark();
-    let bytes_read = buf.read(&mut out[..]).unwrap();
+    let bytes_read = buf.copy_to(&mut out[..]).unwrap();
     assert_eq!(bytes_read, 10);
     assert_eq!(out, [42, 42, 23, 23, 23, 23, 23, 23, 23, 23]);
     buf.reset();
-    let bytes_read = buf.read(&mut out[..]).unwrap();
+    let bytes_read = buf.copy_to(&mut out[..]).unwrap();
     assert_eq!(bytes_read, 10);
     assert_eq!(out, [42, 42, 23, 23, 23, 23, 23, 23, 23, 23]);
 }
 
 #[test]
 fn test_io_write_and_read() {
-    use std::io::{Read, Write};
-
     let mut buf = RingBuf::new(16);
-    let mut out = [0;8];
+    let mut out = [0u8;8];
 
-    let written = buf.write(&[1;8][..]).unwrap();
+    let written = buf.copy_from(&[1;8][..]).unwrap();
     assert_eq!(written, 8);
 
-    buf.read(&mut out).unwrap();
+    buf.copy_to(&mut out[..]).unwrap();
     assert_eq!(out, [1;8]);
 
-    let written = buf.write(&[2;8][..]).unwrap();
+    let written = buf.copy_from(&[2;8][..]).unwrap();
     assert_eq!(written, 8);
 
-    let bytes_read = buf.read(&mut out).unwrap();
+    let bytes_read = buf.copy_to(&mut out[..]).unwrap();
     assert_eq!(bytes_read, 8);
     assert_eq!(out, [2;8]);
 }
@@ -80,29 +76,25 @@ fn test_io_write_and_read() {
 #[test]
 #[should_panic]
 fn test_wrap_reset() {
-    use std::io::{Read, Write};
-
     let mut buf = RingBuf::new(8);
-    buf.write(&[1, 2, 3, 4, 5, 6, 7]).unwrap();
+    buf.copy_from(&[1, 2, 3, 4, 5, 6, 7][..]).unwrap();
     buf.mark();
-    buf.read(&mut [0; 4]).unwrap();
-    buf.write(&[1, 2, 3, 4]).unwrap();
+    buf.copy_to(&mut [0; 4][..]).unwrap();
+    buf.copy_from(&[1, 2, 3, 4][..]).unwrap();
     buf.reset();
 }
 
 #[test]
 // Test that writes across a mark/reset are preserved.
 fn test_mark_write() {
-    use std::io::{Read, Write};
-
     let mut buf = RingBuf::new(8);
-    buf.write(&[1, 2, 3, 4, 5, 6, 7]).unwrap();
+    buf.copy_from(&[1, 2, 3, 4, 5, 6, 7][..]).unwrap();
     buf.mark();
-    buf.write(&[8]).unwrap();
+    buf.copy_from(&[8][..]).unwrap();
     buf.reset();
 
     let mut buf2 = [0; 8];
-    buf.read(&mut buf2).unwrap();
+    buf.copy_to(&mut buf2[..]).unwrap();
     assert_eq!(buf2, [1, 2, 3, 4, 5, 6, 7, 8]);
 }
 
@@ -111,10 +103,9 @@ fn test_mark_write() {
 // full buffer to zero.
 fn test_reset_full() {
     use bytes::traits::MutBuf;
-    use std::io::Write;
 
     let mut buf = RingBuf::new(8);
-    buf.write(&[1, 2, 3, 4, 5, 6, 7, 8]).unwrap();
+    buf.copy_from(&[1, 2, 3, 4, 5, 6, 7, 8][..]).unwrap();
     assert_eq!(MutBuf::remaining(&buf), 0);
     buf.mark();
     buf.reset();
@@ -126,10 +117,9 @@ fn test_reset_full() {
 // 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();
+    buf.copy_from(&[0; 8][..]).unwrap();
     assert_eq!(MutBuf::remaining(&buf), 0);
     assert_eq!(Buf::remaining(&buf), 8);
     buf.clear();
diff --git a/test/test_rope.rs b/test/test_rope.rs
index f478f0e1acd4bf6d6b327481d94b65a8be6a2e1a..ded1cd528f514dac7478e44a14efbb8e6d7be853 100644
--- a/test/test_rope.rs
+++ b/test/test_rope.rs
@@ -34,7 +34,7 @@ pub fn test_rope_round_trip() {
     assert_eq!(4, rope.len());
 
     let mut dst = vec![];
-    rope.buf().read(&mut dst).unwrap();
+    rope.buf().copy_to(&mut dst).unwrap();
 
     assert_eq!(b"zomg", &dst[..]);
 }
@@ -46,19 +46,19 @@ pub fn test_rope_slice() {
     let bytes = Rope::from_slice(TEST_BYTES_1);
     assert_eq!(TEST_BYTES_1.len(), bytes.len());
 
-    bytes.buf().read(&mut dst).unwrap();
+    bytes.buf().copy_to(&mut dst).unwrap();
     assert_eq!(dst, TEST_BYTES_1);
 
     let left = bytes.slice_to(250);
     assert_eq!(250, left.len());
 
-    left.buf().read(&mut dst).unwrap();
+    left.buf().copy_to(&mut dst).unwrap();
     assert_eq!(dst, &TEST_BYTES_1[..250]);
 
     let right = bytes.slice_from(250);
     assert_eq!(TEST_BYTES_1.len() - 250, right.len());
 
-    right.buf().read(&mut dst).unwrap();
+    right.buf().copy_to(&mut dst).unwrap();
     assert_eq!(dst, &TEST_BYTES_1[250..]);
 }
 
@@ -73,7 +73,7 @@ pub fn test_rope_concat_two_byte_str() {
 
     assert_eq!(both.len(), TEST_BYTES_1.len() + TEST_BYTES_2.len());
 
-    both.buf().read(&mut dst).unwrap();
+    both.buf().copy_to(&mut dst).unwrap();
     let mut expected = Vec::new();
     expected.extend(TEST_BYTES_1.iter().cloned());
     expected.extend(TEST_BYTES_2.iter().cloned());
diff --git a/test/test_seq_byte_str.rs b/test/test_seq_byte_str.rs
index 23e959afcf002935047acfae3ad0ca6bf97b71f2..9e5508e8f9ca7edf3874c647ca0e9e76e6ec34c0 100644
--- a/test/test_seq_byte_str.rs
+++ b/test/test_seq_byte_str.rs
@@ -10,7 +10,7 @@ pub fn test_slice_round_trip() {
     let s = SeqByteStr::from_slice(&src);
     assert_eq!(2000, s.len());
 
-    s.buf().read(&mut dst).unwrap();
+    s.buf().copy_to(&mut dst).unwrap();
     assert_eq!(dst, src);
 }
 
diff --git a/test/test_small_byte_str.rs b/test/test_small_byte_str.rs
index 938b73223fd564483f1b7e8eff5e870881b23191..454e2d588437dc8cd3b417a8de97e62058938455 100644
--- a/test/test_small_byte_str.rs
+++ b/test/test_small_byte_str.rs
@@ -10,7 +10,7 @@ pub fn test_slice_round_trip() {
     let s = SmallByteStr::from_slice(&src).unwrap();
     assert_eq!(3, s.len());
 
-    s.buf().read(&mut dst).unwrap();
+    s.buf().copy_to(&mut dst).unwrap();
     assert_eq!(dst, src);
 }