diff --git a/rtc_base/bytebuffer.cc b/rtc_base/bytebuffer.cc
index ea4de3a..f152d4f 100644
--- a/rtc_base/bytebuffer.cc
+++ b/rtc_base/bytebuffer.cc
@@ -15,126 +15,21 @@
 #include <algorithm>
 
 #include "rtc_base/basictypes.h"
-#include "rtc_base/byteorder.h"
 
 namespace rtc {
 
-static const int DEFAULT_SIZE = 4096;
-
-ByteBufferWriter::ByteBufferWriter()
-    : ByteBuffer(ORDER_NETWORK) {
-  Construct(nullptr, DEFAULT_SIZE);
-}
+ByteBufferWriter::ByteBufferWriter() : ByteBufferWriterT() {}
 
 ByteBufferWriter::ByteBufferWriter(ByteOrder byte_order)
-    : ByteBuffer(byte_order) {
-  Construct(nullptr, DEFAULT_SIZE);
-}
+    : ByteBufferWriterT(byte_order) {}
 
 ByteBufferWriter::ByteBufferWriter(const char* bytes, size_t len)
-    : ByteBuffer(ORDER_NETWORK) {
-  Construct(bytes, len);
-}
+    : ByteBufferWriterT(bytes, len) {}
 
-ByteBufferWriter::ByteBufferWriter(const char* bytes, size_t len,
+ByteBufferWriter::ByteBufferWriter(const char* bytes,
+                                   size_t len,
                                    ByteOrder byte_order)
-    : ByteBuffer(byte_order) {
-  Construct(bytes, len);
-}
-
-void ByteBufferWriter::Construct(const char* bytes, size_t len) {
-  size_ = len;
-  bytes_ = new char[size_];
-
-  if (bytes) {
-    end_ = len;
-    memcpy(bytes_, bytes, end_);
-  } else {
-    end_ = 0;
-  }
-}
-
-ByteBufferWriter::~ByteBufferWriter() {
-  delete[] bytes_;
-}
-
-void ByteBufferWriter::WriteUInt8(uint8_t val) {
-  WriteBytes(reinterpret_cast<const char*>(&val), 1);
-}
-
-void ByteBufferWriter::WriteUInt16(uint16_t val) {
-  uint16_t v = (Order() == ORDER_NETWORK) ? HostToNetwork16(val) : val;
-  WriteBytes(reinterpret_cast<const char*>(&v), 2);
-}
-
-void ByteBufferWriter::WriteUInt24(uint32_t val) {
-  uint32_t v = (Order() == ORDER_NETWORK) ? HostToNetwork32(val) : val;
-  char* start = reinterpret_cast<char*>(&v);
-  if (Order() == ORDER_NETWORK || IsHostBigEndian()) {
-    ++start;
-  }
-  WriteBytes(start, 3);
-}
-
-void ByteBufferWriter::WriteUInt32(uint32_t val) {
-  uint32_t v = (Order() == ORDER_NETWORK) ? HostToNetwork32(val) : val;
-  WriteBytes(reinterpret_cast<const char*>(&v), 4);
-}
-
-void ByteBufferWriter::WriteUInt64(uint64_t val) {
-  uint64_t v = (Order() == ORDER_NETWORK) ? HostToNetwork64(val) : val;
-  WriteBytes(reinterpret_cast<const char*>(&v), 8);
-}
-
-// Serializes an unsigned varint in the format described by
-// https://developers.google.com/protocol-buffers/docs/encoding#varints
-// with the caveat that integers are 64-bit, not 128-bit.
-void ByteBufferWriter::WriteUVarint(uint64_t val) {
-  while (val >= 0x80) {
-    // Write 7 bits at a time, then set the msb to a continuation byte (msb=1).
-    char byte = static_cast<char>(val) | 0x80;
-    WriteBytes(&byte, 1);
-    val >>= 7;
-  }
-  char last_byte = static_cast<char>(val);
-  WriteBytes(&last_byte, 1);
-}
-
-void ByteBufferWriter::WriteString(const std::string& val) {
-  WriteBytes(val.c_str(), val.size());
-}
-
-void ByteBufferWriter::WriteBytes(const char* val, size_t len) {
-  memcpy(ReserveWriteBuffer(len), val, len);
-}
-
-char* ByteBufferWriter::ReserveWriteBuffer(size_t len) {
-  if (Length() + len > Capacity())
-    Resize(Length() + len);
-
-  char* start = bytes_ + end_;
-  end_ += len;
-  return start;
-}
-
-void ByteBufferWriter::Resize(size_t size) {
-  size_t len = std::min(end_, size);
-  if (size > size_) {
-    // Reallocate a larger buffer.
-    size_ = std::max(size, 3 * size_ / 2);
-    char* new_bytes = new char[size_];
-    memcpy(new_bytes, bytes_, len);
-    delete [] bytes_;
-    bytes_ = new_bytes;
-  }
-  end_ = len;
-}
-
-void ByteBufferWriter::Clear() {
-  memset(bytes_, 0, size_);
-  end_ = 0;
-}
-
+    : ByteBufferWriterT(bytes, len, byte_order) {}
 
 ByteBufferReader::ByteBufferReader(const char* bytes, size_t len)
     : ByteBuffer(ORDER_NETWORK) {
