diff --git a/src/bytes.rs b/src/bytes.rs
index fc29c624fed386560ef5e0e0505c36bcee40fde5..9c8e249c2e80bb60fe53de03d7e8db4acb88491d 100644
--- a/src/bytes.rs
+++ b/src/bytes.rs
@@ -365,12 +365,7 @@ impl Bytes {
     pub fn new() -> Bytes {
         Bytes {
             inner: Inner2 {
-                inner: Inner {
-                    arc: AtomicPtr::new(ptr::null_mut()),
-                    ptr: ptr::null_mut(),
-                    len: 0,
-                    cap: 0,
-                }
+                inner: Inner::empty(),
             }
         }
     }
@@ -390,19 +385,9 @@ impl Bytes {
     /// ```
     #[inline]
     pub fn from_static(bytes: &'static [u8]) -> Bytes {
-        let ptr = bytes.as_ptr() as *mut u8;
-
         Bytes {
             inner: Inner2 {
-                inner: Inner {
-                    // `arc` won't ever store a pointer. Instead, use it to
-                    // track the fact that the `Bytes` handle is backed by a
-                    // static buffer.
-                    arc: AtomicPtr::new(KIND_STATIC as *mut Shared),
-                    ptr: ptr,
-                    len: bytes.len(),
-                    cap: bytes.len(),
-                }
+                inner: Inner::from_static(bytes),
             }
         }
     }
@@ -784,20 +769,10 @@ impl BytesMut {
     /// ```
     #[inline]
     pub fn with_capacity(capacity: usize) -> BytesMut {
-        if capacity <= INLINE_CAP {
-            unsafe {
-                // Using uninitialized memory is ~30% faster
-                BytesMut {
-                    inner: Inner2 {
-                        inner: Inner {
-                            arc: AtomicPtr::new(KIND_INLINE as *mut Shared),
-                            .. mem::uninitialized()
-                        },
-                    },
-                }
-            }
-        } else {
-            BytesMut::from(Vec::with_capacity(capacity))
+        BytesMut {
+            inner: Inner2 {
+                inner: Inner::with_capacity(capacity),
+            },
         }
     }
 
@@ -1186,21 +1161,10 @@ impl ops::DerefMut for BytesMut {
 }
 
 impl From<Vec<u8>> for BytesMut {
-    fn from(mut src: Vec<u8>) -> BytesMut {
-        let len = src.len();
-        let cap = src.capacity();
-        let ptr = src.as_mut_ptr();
-
-        mem::forget(src);
-
+    fn from(src: Vec<u8>) -> BytesMut {
         BytesMut {
             inner: Inner2 {
-                inner: Inner {
-                    arc: AtomicPtr::new(ptr::null_mut()),
-                    ptr: ptr,
-                    len: len,
-                    cap: cap,
-                }
+                inner: Inner::from_vec(src),
             },
         }
     }
@@ -1335,6 +1299,62 @@ impl<'a> IntoIterator for &'a BytesMut {
  */
 
 impl Inner {
+    #[inline]
+    fn empty() -> Inner {
+        Inner {
+            arc: AtomicPtr::new(ptr::null_mut()),
+            ptr: ptr::null_mut(),
+            len: 0,
+            cap: 0,
+        }
+    }
+
+    #[inline]
+    fn from_static(bytes: &'static [u8]) -> Inner {
+        let ptr = bytes.as_ptr() as *mut u8;
+
+        Inner {
+            // `arc` won't ever store a pointer. Instead, use it to
+            // track the fact that the `Bytes` handle is backed by a
+            // static buffer.
+            arc: AtomicPtr::new(KIND_STATIC as *mut Shared),
+            ptr: ptr,
+            len: bytes.len(),
+            cap: bytes.len(),
+        }
+    }
+
+    #[inline]
+    fn from_vec(mut src: Vec<u8>) -> Inner {
+        let len = src.len();
+        let cap = src.capacity();
+        let ptr = src.as_mut_ptr();
+
+        mem::forget(src);
+
+        Inner {
+            arc: AtomicPtr::new(ptr::null_mut()),
+            ptr: ptr,
+            len: len,
+            cap: cap,
+        }
+    }
+
+    #[inline]
+    fn with_capacity(capacity: usize) -> Inner {
+        if capacity <= INLINE_CAP {
+            unsafe {
+                // Using uninitialized memory is ~30% faster
+                Inner {
+                    arc: AtomicPtr::new(KIND_INLINE as *mut Shared),
+                    .. mem::uninitialized()
+                }
+            }
+        } else {
+            Inner::from_vec(Vec::with_capacity(capacity))
+        }
+    }
+
     /// Return a slice for the handle's view into the shared buffer
     #[inline]
     fn as_ref(&self) -> &[u8] {