diff --git a/src/bytes.rs b/src/bytes.rs
index 094d0357a818ab0716b0417d7c460c9e6b8a8616..f5ac05a67b101037abf474cbd853c42a0686c49f 100644
--- a/src/bytes.rs
+++ b/src/bytes.rs
@@ -295,6 +295,8 @@ pub struct BytesMut {
 #[cfg(target_endian = "little")]
 #[repr(C)]
 struct Inner {
+    // WARNING: Do not access the fields directly unless you know what you are
+    // doing. Instead, use the fns. See implementation comment above.
     arc: AtomicPtr<Shared>,
     ptr: *mut u8,
     len: usize,
@@ -304,6 +306,8 @@ struct Inner {
 #[cfg(target_endian = "big")]
 #[repr(C)]
 struct Inner {
+    // WARNING: Do not access the fields directly unless you know what you are
+    // doing. Instead, use the fns. See implementation comment above.
     ptr: *mut u8,
     len: usize,
     cap: usize,
@@ -1401,6 +1405,15 @@ impl BytesMut {
     pub fn unsplit(&mut self, other: BytesMut) {
         let ptr;
 
+        if other.is_empty() {
+            return;
+        }
+
+        if self.is_empty() {
+            *self = other;
+            return;
+        }
+
         unsafe {
             ptr = self.inner.ptr.offset(self.inner.len as isize); 
         }
@@ -1415,7 +1428,7 @@ impl BytesMut {
             self.inner.cap += other.inner.cap;
         }
         else {
-            self.extend(other);
+            self.extend_from_slice(&other);
         }
     }
 }
diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs
index e5b1fe7fd3a7f3edf7e67c03e9f6b7f3aa400786..15c315748367403aad4b81a8fbe258e11c218a3d 100644
--- a/tests/test_bytes.rs
+++ b/tests/test_bytes.rs
@@ -566,6 +566,30 @@ fn unsplit_basic() {
     assert_eq!(b"aaabbbcccddd", &buf[..]);
 }
 
+#[test]
+fn unsplit_empty_other() {
+    let mut buf = BytesMut::with_capacity(64);
+    buf.extend_from_slice(b"aaabbbcccddd");
+
+    // empty other
+    let other = BytesMut::new();
+
+    buf.unsplit(other);
+    assert_eq!(b"aaabbbcccddd", &buf[..]);
+}
+
+#[test]
+fn unsplit_empty_self() {
+    // empty self
+    let mut buf = BytesMut::new();
+
+    let mut other = BytesMut::with_capacity(64);
+    other.extend_from_slice(b"aaabbbcccddd");
+
+    buf.unsplit(other);
+    assert_eq!(b"aaabbbcccddd", &buf[..]);
+}
+
 #[test]
 fn unsplit_inline_arc() {
     let mut buf = BytesMut::with_capacity(8); //inline