diff --git a/src/bytes.rs b/src/bytes.rs
index cee2ecd708c8fc91ffe7f7aefd7d08f7ef30f415..097487fae8909c02ae4a4371f6e82ebc47d73814 100644
--- a/src/bytes.rs
+++ b/src/bytes.rs
@@ -1298,6 +1298,28 @@ impl<'a> IntoIterator for &'a BytesMut {
     }
 }
 
+impl Extend<u8> for BytesMut {
+    fn extend<T>(&mut self, iter: T) where T: IntoIterator<Item = u8> {
+        let iter = iter.into_iter();
+
+        let (lower, _) = iter.size_hint();
+        self.reserve(lower);
+
+        for b in iter {
+            unsafe {
+                self.bytes_mut()[0] = b;
+                self.advance_mut(1);
+            }
+        }
+    }
+}
+
+impl<'a> Extend<&'a u8> for BytesMut {
+    fn extend<T>(&mut self, iter: T) where T: IntoIterator<Item = &'a u8> {
+        self.extend(iter.into_iter().map(|b| *b))
+    }
+}
+
 /*
  *
  * ===== Inner =====
diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs
index ce1006b48e2261655247f334ff99f5c74af554bb..cfb50707d9b8dfaf0f164ffc5bb516e0f0ef3659 100644
--- a/tests/test_bytes.rs
+++ b/tests/test_bytes.rs
@@ -290,6 +290,13 @@ fn inline_storage() {
     assert_eq!(*bytes, zero[0..inline_cap()]);
 }
 
+#[test]
+fn extend() {
+    let mut bytes = BytesMut::with_capacity(0);
+    bytes.extend(LONG);
+    assert_eq!(*bytes, LONG[..]);
+}
+
 #[test]
 fn stress() {
     // Tests promoting a buffer from a vec -> shared in a concurrent situation