diff --git a/sample/subsetter/main.cc b/sample/subsetter/main.cc
index a9e1524..19a3e0e 100644
--- a/sample/subsetter/main.cc
+++ b/sample/subsetter/main.cc
@@ -34,7 +34,7 @@
   }
 
   sfntly::SubsetUtil subset_util;
-  subset_util.subset(argv[1], argv[2]);
+  subset_util.Subset(argv[1], argv[2]);
 
 #ifdef _CRTDBG_MAP_ALLOC
   _CrtDumpMemoryLeaks();
diff --git a/sample/subsetter/subset_util.cc b/sample/subsetter/subset_util.cc
index 013a903..9e4e652 100644
--- a/sample/subsetter/subset_util.cc
+++ b/sample/subsetter/subset_util.cc
@@ -37,7 +37,7 @@
 SubsetUtil::~SubsetUtil() {
 }
 
-void SubsetUtil::subset(const char *input_file_path,
+void SubsetUtil::Subset(const char *input_file_path,
                         const char *output_file_path) {
   UNREFERENCED_PARAMETER(output_file_path);
   ByteVector input_buffer;
@@ -56,10 +56,10 @@
 
   ByteArrayPtr ba = new MemoryByteArray(&(input_buffer[0]), file_size);
   FontFactoryPtr factory;
-  factory.attach(FontFactory::getInstance());
+  factory.Attach(FontFactory::GetInstance());
 
   FontArray font_array;
-  factory->loadFonts(ba, &font_array);
+  factory->LoadFonts(ba, &font_array);
   if (font_array.empty() || font_array[0] == NULL)
     return;
 
@@ -71,25 +71,25 @@
   glyphs.push_back(10);
 
   Ptr<Subsetter> subsetter = new Subsetter(font_array[0], factory);
-  subsetter->setGlyphs(&glyphs);
+  subsetter->SetGlyphs(&glyphs);
   IntegerSet remove_tables;
   remove_tables.insert(Tag::DSIG);
-  subsetter->setRemoveTables(&remove_tables);
+  subsetter->SetRemoveTables(&remove_tables);
 
   FontBuilderPtr font_builder;
-  font_builder.attach(subsetter->subset());
+  font_builder.Attach(subsetter->Subset());
 
   FontPtr new_font;
-  new_font.attach(font_builder->build());
+  new_font.Attach(font_builder->Build());
 
   // TODO(arthurhsu): glyph renumbering/Loca table
   // TODO(arthurhsu): alter CMaps
 
   MemoryOutputStream output_stream;
-  factory->serializeFont(new_font, &output_stream);
+  factory->SerializeFont(new_font, &output_stream);
 
   FILE* output_file = fopen(output_file_path, "wb");
-  fwrite(output_stream.get(), 1, output_stream.size(), output_file);
+  fwrite(output_stream.Get(), 1, output_stream.Size(), output_file);
   fflush(output_file);
   fclose(output_file);
 }
diff --git a/sample/subsetter/subset_util.h b/sample/subsetter/subset_util.h
index bea28b8..109d63a 100644
--- a/sample/subsetter/subset_util.h
+++ b/sample/subsetter/subset_util.h
@@ -24,7 +24,7 @@
   SubsetUtil();
   virtual ~SubsetUtil();
 
-  void subset(const char* input_file_path, const char* output_file_path);
+  void Subset(const char* input_file_path, const char* output_file_path);
 };
 
 }  // namespace sfntly
diff --git a/sfntly/cmap_table.cc b/sfntly/cmap_table.cc
index 8cbc83e..668dc07 100644
--- a/sfntly/cmap_table.cc
+++ b/sfntly/cmap_table.cc
@@ -30,41 +30,43 @@
 /******************************************************************************
  * CMapTable class
  ******************************************************************************/
-CMapTable::CMapTable(Header* header, ReadableFontData* data)
-    : Table(header, data) {}
 CMapTable::~CMapTable() {}
 
-int32_t CMapTable::version() {
-  return data_->readUShort(Offset::kVersion);
+int32_t CMapTable::Version() {
+  return data_->ReadUShort(Offset::kVersion);
 }
 
-int32_t CMapTable::numCMaps() {
-  return data_->readUShort(Offset::kNumTables);
+int32_t CMapTable::NumCMaps() {
+  return data_->ReadUShort(Offset::kNumTables);
 }
 
-int32_t CMapTable::offsetForEncodingRecord(int32_t index) {
+CMapTable::CMapId CMapTable::GetCMapId(int32_t index) {
+  return CMapId(PlatformId(index), EncodingId(index));
+}
+
+int32_t CMapTable::PlatformId(int32_t index) {
+  return data_->ReadUShort(Offset::kEncodingRecordPlatformId +
+                           OffsetForEncodingRecord(index));
+}
+
+int32_t CMapTable::EncodingId(int32_t index) {
+  return data_->ReadUShort(Offset::kEncodingRecordEncodingId +
+                           OffsetForEncodingRecord(index));
+}
+
+int32_t CMapTable::Offset(int32_t index) {
+  return data_->ReadULongAsInt(Offset::kEncodingRecordOffset +
+                               OffsetForEncodingRecord(index));
+}
+
+CMapTable::CMapTable(Header* header, ReadableFontData* data)
+    : Table(header, data) {
+}
+
+int32_t CMapTable::OffsetForEncodingRecord(int32_t index) {
   return Offset::kEncodingRecordStart + index * Offset::kEncodingRecordSize;
 }
 
-CMapTable::CMapId CMapTable::cmapId(int32_t index) {
-  return CMapId(platformId(index), encodingId(index));
-}
-
-int32_t CMapTable::platformId(int32_t index) {
-  return data_->readUShort(Offset::kEncodingRecordPlatformId +
-                           offsetForEncodingRecord(index));
-}
-
-int32_t CMapTable::encodingId(int32_t index) {
-  return data_->readUShort(Offset::kEncodingRecordEncodingId +
-                           offsetForEncodingRecord(index));
-}
-
-int32_t CMapTable::offset(int32_t index) {
-  return data_->readULongAsInt(Offset::kEncodingRecordOffset +
-                               offsetForEncodingRecord(index));
-}
-
 /******************************************************************************
  * CMapTable::CMapId class
  ******************************************************************************/
@@ -76,9 +78,6 @@
     : platform_id_(obj.platform_id_), encoding_id_(obj.encoding_id_) {
 }
 
-int32_t CMapTable::CMapId::platformId() { return platform_id_; }
-int32_t CMapTable::CMapId::encodingId() { return encoding_id_; }
-
 bool CMapTable::CMapId::operator==(const CMapTable::CMapId& obj) {
   return obj.platform_id_ == platform_id_ && obj.encoding_id_ == encoding_id_;
 }
@@ -90,7 +89,7 @@
   return *this;
 }
 
-int CMapTable::CMapId::hashCode() const {
+int CMapTable::CMapId::HashCode() const {
   return platform_id_ << 8 | encoding_id_;
 }
 
@@ -106,7 +105,7 @@
 
 bool CMapTable::CMapIdComparator::operator()(const CMapId& lhs,
                                              const CMapId& rhs) {
-  return lhs.hashCode() > rhs.hashCode();
+  return lhs.HashCode() > rhs.HashCode();
 }
 
 /******************************************************************************
@@ -117,101 +116,102 @@
     : SubTable(data), format_(format), cmap_id_(cmap_id) {
 }
 
-CMapTable::CMap::~CMap() {}
-int32_t CMapTable::CMap::format() { return format_; }
-CMapTable::CMapId CMapTable::CMap::cmapId() { return cmap_id_; }
-int32_t CMapTable::CMap::platformId() { return cmap_id_.platformId(); }
-int32_t CMapTable::CMap::encodingId() { return cmap_id_.encodingId(); }
+CMapTable::CMap::~CMap() {
+}
 
 /******************************************************************************
  * CMapTable::CMap::Builder class
  ******************************************************************************/
+CMapTable::CMap::Builder::~Builder() {
+}
+
+CALLER_ATTACH CMapTable::CMap::Builder*
+    CMapTable::CMap::Builder::GetBuilder(
+        FontDataTableBuilderContainer* container,
+        ReadableFontData* data,
+        int32_t offset,
+        const CMapId& cmap_id) {
+  // NOT IMPLEMENTED: Java enum value validation
+  int32_t format = data->ReadUShort(offset);
+  CMapBuilderPtr builder;
+  switch (format) {
+    case CMapFormat::kFormat0:
+      builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
+      break;
+    case CMapFormat::kFormat2:
+      builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
+      break;
+    default:
+      break;
+  }
+  return builder.Detach();
+}
+
 CMapTable::CMap::Builder::Builder(FontDataTableBuilderContainer* container,
                                   ReadableFontData* data, int32_t format,
                                   const CMapId& cmap_id)
-    : SubTable::Builder(container, data), format_(format), cmap_id_(cmap_id) {
+    : SubTable::Builder(container, data),
+      format_(format),
+      cmap_id_(cmap_id) {
 }
 
 CMapTable::CMap::Builder::Builder(FontDataTableBuilderContainer* container,
                                   WritableFontData* data, int32_t format,
                                   const CMapId& cmap_id)
-    : SubTable::Builder(container, data), format_(format), cmap_id_(cmap_id) {
+    : SubTable::Builder(container, data),
+      format_(format),
+      cmap_id_(cmap_id) {
 }
 
-CMapTable::CMap::Builder::~Builder() {}
-
-CMapTable::CMapId CMapTable::CMap::Builder::cmapId() {
-  return cmap_id_;
+int32_t CMapTable::CMap::Builder::SubSerialize(WritableFontData* new_data) {
+  return InternalReadData()->CopyTo(new_data);
 }
 
-int32_t CMapTable::CMap::Builder::platformId() {
-  return cmap_id_.platformId();
-}
-
-int32_t CMapTable::CMap::Builder::encodingId() {
-  return cmap_id_.encodingId();
-}
-
-int32_t CMapTable::CMap::Builder::subSerialize(WritableFontData* new_data) {
-  return internalReadData()->copyTo(new_data);
-}
-
-bool CMapTable::CMap::Builder::subReadyToSerialize() {
+bool CMapTable::CMap::Builder::SubReadyToSerialize() {
   return true;
 }
 
-int32_t CMapTable::CMap::Builder::subDataSizeToSerialize() {
-  return internalReadData()->length();
+int32_t CMapTable::CMap::Builder::SubDataSizeToSerialize() {
+  return InternalReadData()->Length();
 }
 
-void CMapTable::CMap::Builder::subDataSet() {
+void CMapTable::CMap::Builder::SubDataSet() {
   // NOP
 }
 
-CALLER_ATTACH CMapTable::CMap::Builder* CMapTable::CMap::Builder::getBuilder(
-    FontDataTableBuilderContainer* container, ReadableFontData* data,
-    int32_t offset, const CMapId& cmap_id) {
-  // NOT IMPLEMENTED: Java enum value validation
-  int32_t format = data->readUShort(offset);
-  CMapBuilderPtr builder;
-  switch (format) {
-    case CMapFormat::kFormat0:
-      builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
-    case CMapFormat::kFormat2:
-      builder = new CMapFormat0::Builder(container, data, offset, cmap_id);
-    default:
-      break;
-  }
-  return builder.detach();
+/******************************************************************************
+ * CMapTable::CMapFormat0
+ ******************************************************************************/
+CMapTable::CMapFormat0::~CMapFormat0() {
 }
 
-/******************************************************************************
- * CMapTable::CMapFormat0 and CMapTable::CMapFormat0::Builder
- ******************************************************************************/
+int32_t CMapTable::CMapFormat0::Language() {
+  return 0;
+}
+
+int32_t CMapTable::CMapFormat0::GlyphId(int32_t character) {
+  if (character < 0 || character > 255) {
+    return CMapTable::NOTDEF;
+  }
+  return data_->ReadByte(character + Offset::kFormat0GlyphIdArray);
+}
+
 CMapTable::CMapFormat0::CMapFormat0(ReadableFontData* data,
                                     const CMapId& cmap_id)
     : CMap(data, CMapFormat::kFormat0, cmap_id) {
 }
 
-CMapTable::CMapFormat0::~CMapFormat0() {}
-
-int32_t CMapTable::CMapFormat0::glyphId(int32_t character) {
-  if (character < 0 || character > 255) {
-    return CMapTable::NOTDEF;
-  }
-  return data_->readByte(character + Offset::kFormat0GlyphIdArray);
-}
-
-int32_t CMapTable::CMapFormat0::language() {
-  return 0;
-}
-
+/******************************************************************************
+ * CMapTable::CMapFormat0::Builder
+ ******************************************************************************/
 CMapTable::CMapFormat0::Builder::Builder(
-    FontDataTableBuilderContainer* container, WritableFontData* data,
-    int32_t offset, const CMapId& cmap_id)
+    FontDataTableBuilderContainer* container,
+    WritableFontData* data,
+    int32_t offset,
+    const CMapId& cmap_id)
     : CMapTable::CMap::Builder(container,
                                data ? down_cast<WritableFontData*>(
-                                   data->slice(offset, data->readUShort(
+                                   data->Slice(offset, data->ReadUShort(
                                        offset + Offset::kFormat0Length)))
                                : reinterpret_cast<WritableFontData*>(NULL),
                                CMapFormat::kFormat0, cmap_id) {
@@ -219,101 +219,68 @@
 }
 
 CMapTable::CMapFormat0::Builder::Builder(
-    FontDataTableBuilderContainer* container, ReadableFontData* data,
-    int32_t offset, const CMapId& cmap_id)
+    FontDataTableBuilderContainer* container,
+    ReadableFontData* data,
+    int32_t offset,
+    const CMapId& cmap_id)
     : CMapTable::CMap::Builder(container,
                                data ? down_cast<ReadableFontData*>(
-                                   data->slice(offset, data->readUShort(
+                                   data->Slice(offset, data->ReadUShort(
                                        offset + Offset::kFormat0Length)))
                                : reinterpret_cast<WritableFontData*>(NULL),
                                CMapFormat::kFormat0, cmap_id) {
   // TODO(arthurhsu): FIXIT: heavy lifting and leak, need fix.
 }
 
-CMapTable::CMapFormat0::Builder::~Builder() {}
+CMapTable::CMapFormat0::Builder::~Builder() {
+}
 
-CALLER_ATTACH FontDataTable* CMapTable::CMapFormat0::Builder::subBuildTable(
-    ReadableFontData* data) {
-  FontDataTablePtr table = new CMapFormat0(data, cmapId());
-  return table.detach();
+CALLER_ATTACH FontDataTable*
+    CMapTable::CMapFormat0::Builder::SubBuildTable(ReadableFontData* data) {
+  FontDataTablePtr table = new CMapFormat0(data, cmap_id());
+  return table.Detach();
 }
 
 /******************************************************************************
- * CMapTable::CMapFormat2 and CMapTable::CMapFormat2::Builder
+ * CMapTable::CMapFormat2
  ******************************************************************************/
-CMapTable::CMapFormat2::CMapFormat2(ReadableFontData* data,
-                                    const CMapId& cmap_id)
-    : CMap(data, CMapFormat::kFormat2, cmap_id) {
+CMapTable::CMapFormat2::~CMapFormat2() {
 }
 
-CMapTable::CMapFormat2::~CMapFormat2() {}
-
-int32_t CMapTable::CMapFormat2::subHeaderOffset(int32_t sub_header_index) {
-  return data_->readUShort(Offset::kFormat2SubHeaderKeys + sub_header_index *
-                           DataSize::kUSHORT);
+int32_t CMapTable::CMapFormat2::Language() {
+  return 0;
 }
 
-int32_t CMapTable::CMapFormat2::firstCode(int32_t sub_header_index) {
-  int32_t sub_header_offset = subHeaderOffset(sub_header_index);
-  return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
-                           Offset::kFormat2SubHeader_firstCode);
-}
-
-int32_t CMapTable::CMapFormat2::entryCount(int32_t sub_header_index) {
-  int32_t sub_header_offset = subHeaderOffset(sub_header_index);
-  return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
-                           Offset::kFormat2SubHeader_entryCount);
-}
-
-int32_t CMapTable::CMapFormat2::idRangeOffset(int32_t sub_header_index) {
-  int32_t sub_header_offset = subHeaderOffset(sub_header_index);
-  return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
-                           Offset::kFormat2SubHeader_idRangeOffset);
-}
-
-int32_t CMapTable::CMapFormat2::idDelta(int32_t sub_header_index) {
-  int32_t sub_header_offset = subHeaderOffset(sub_header_index);
-  return data_->readUShort(sub_header_offset + Offset::kFormat2SubHeaderKeys +
-                           Offset::kFormat2SubHeader_idDelta);
-}
-
-int32_t CMapTable::CMapFormat2::bytesConsumed(int32_t character) {
-  uint32_t c = toBE32(character);
-  int32_t high_byte = (c >> 8) & 0xff;
-  int32_t offset = subHeaderOffset(high_byte);
-  return (offset == 0) ? 1 : 2;
-}
-
-int32_t CMapTable::CMapFormat2::glyphId(int32_t character) {
+int32_t CMapTable::CMapFormat2::GlyphId(int32_t character) {
   if (character > 0xffff) {
     return CMapTable::NOTDEF;
   }
 
-  uint32_t c = toBE32(character);
+  uint32_t c = ToBE32(character);
   byte_t high_byte = (c >> 8) & 0xff;
   byte_t low_byte = c & 0xff;
-  int32_t offset = subHeaderOffset(high_byte);
+  int32_t offset = SubHeaderOffset(high_byte);
 
   if (offset == 0) {
     low_byte = high_byte;
     high_byte = 0;
   }
 
-  int32_t first_code = firstCode(high_byte);
-  int32_t entry_count = entryCount(high_byte);
+  int32_t first_code = FirstCode(high_byte);
+  int32_t entry_count = EntryCount(high_byte);
 
   if (low_byte < first_code || low_byte >= first_code + entry_count) {
     return CMapTable::NOTDEF;
   }
 
-  int32_t id_range_offset = idRangeOffset(high_byte);
+  int32_t id_range_offset = IdRangeOffset(high_byte);
 
   // position of idRangeOffset + value of idRangeOffset + index for low byte
   // = firstcode
   int32_t p_location = (offset + Offset::kFormat2SubHeader_idRangeOffset) +
       id_range_offset +
       (low_byte - first_code) * DataSize::kUSHORT;
-  int p = data_->readUShort(p_location);
+  int p = data_->ReadUShort(p_location);
   if (p == 0) {
     return CMapTable::NOTDEF;
   }
@@ -321,20 +288,66 @@
   if (offset == 0) {
     return p;
   }
-  int id_delta = idDelta(high_byte);
+  int id_delta = IdDelta(high_byte);
   return (p + id_delta) % 65536;
 }
 
-int32_t CMapTable::CMapFormat2::language() {
-  return 0;
+int32_t CMapTable::CMapFormat2::BytesConsumed(int32_t character) {
+  uint32_t c = ToBE32(character);
+  int32_t high_byte = (c >> 8) & 0xff;
+  int32_t offset = SubHeaderOffset(high_byte);
+  return (offset == 0) ? 1 : 2;
 }
 
+CMapTable::CMapFormat2::CMapFormat2(ReadableFontData* data,
+                                    const CMapId& cmap_id)
+    : CMap(data, CMapFormat::kFormat2, cmap_id) {
+}
+
+int32_t CMapTable::CMapFormat2::SubHeaderOffset(int32_t sub_header_index) {
+  return data_->ReadUShort(Offset::kFormat2SubHeaderKeys +
+                           sub_header_index * DataSize::kUSHORT);
+}
+
+int32_t CMapTable::CMapFormat2::FirstCode(int32_t sub_header_index) {
+  int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+  return data_->ReadUShort(sub_header_offset +
+                           Offset::kFormat2SubHeaderKeys +
+                           Offset::kFormat2SubHeader_firstCode);
+}
+
+int32_t CMapTable::CMapFormat2::EntryCount(int32_t sub_header_index) {
+  int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+  return data_->ReadUShort(sub_header_offset +
+                           Offset::kFormat2SubHeaderKeys +
+                           Offset::kFormat2SubHeader_entryCount);
+}
+
+int32_t CMapTable::CMapFormat2::IdRangeOffset(int32_t sub_header_index) {
+  int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+  return data_->ReadUShort(sub_header_offset +
+                           Offset::kFormat2SubHeaderKeys +
+                           Offset::kFormat2SubHeader_idRangeOffset);
+}
+
+int32_t CMapTable::CMapFormat2::IdDelta(int32_t sub_header_index) {
+  int32_t sub_header_offset = SubHeaderOffset(sub_header_index);
+  return data_->ReadUShort(sub_header_offset +
+                           Offset::kFormat2SubHeaderKeys +
+                           Offset::kFormat2SubHeader_idDelta);
+}
+
+/******************************************************************************
+ * CMapTable::CMapFormat2::Builder
+ ******************************************************************************/
 CMapTable::CMapFormat2::Builder::Builder(
-    FontDataTableBuilderContainer* container, WritableFontData* data,
-    int32_t offset, const CMapId& cmap_id)
+    FontDataTableBuilderContainer* container,
+    WritableFontData* data,
+    int32_t offset,
+    const CMapId& cmap_id)
     : CMapTable::CMap::Builder(container,
                                data ? down_cast<WritableFontData*>(
-                                   data->slice(offset, data->readUShort(
+                                   data->Slice(offset, data->ReadUShort(
                                        offset + Offset::kFormat0Length)))
                                : reinterpret_cast<WritableFontData*>(NULL),
                                CMapFormat::kFormat2, cmap_id) {
@@ -342,23 +355,26 @@
 }
 
 CMapTable::CMapFormat2::Builder::Builder(
-    FontDataTableBuilderContainer* container, ReadableFontData* data,
-    int32_t offset, const CMapId& cmap_id)
+    FontDataTableBuilderContainer* container,
+    ReadableFontData* data,
+    int32_t offset,
+    const CMapId& cmap_id)
     : CMapTable::CMap::Builder(container,
                                data ? down_cast<ReadableFontData*>(
-                                   data->slice(offset, data->readUShort(
+                                   data->Slice(offset, data->ReadUShort(
                                        offset + Offset::kFormat0Length)))
                                : reinterpret_cast<ReadableFontData*>(NULL),
                                CMapFormat::kFormat2, cmap_id) {
   // TODO(arthurhsu): FIXIT: heavy lifting and leak, need fix.
 }
 
-CMapTable::CMapFormat2::Builder::~Builder() {}
+CMapTable::CMapFormat2::Builder::~Builder() {
+}
 
-CALLER_ATTACH FontDataTable* CMapTable::CMapFormat2::Builder::subBuildTable(
-    ReadableFontData* data) {
-  FontDataTablePtr table = new CMapFormat2(data, cmapId());
-  return table.detach();
+CALLER_ATTACH FontDataTable*
+    CMapTable::CMapFormat2::Builder::SubBuildTable(ReadableFontData* data) {
+  FontDataTablePtr table = new CMapFormat2(data, cmap_id());
+  return table.Detach();
 }
 
 /******************************************************************************
@@ -367,16 +383,16 @@
 CMapTable::CMapIterator::CMapIterator(CMapTable* table, CMapFilter* filter)
     : table_index_(0), filter_(filter), table_(table) {}
 
-bool CMapTable::CMapIterator::hasNext() {
+bool CMapTable::CMapIterator::HasNext() {
   if (!filter_) {
-    if (table_index_ < table_->numCMaps()) {
+    if (table_index_ < table_->NumCMaps()) {
       return true;
     }
     return false;
   }
 
-  for (; table_index_ < table_->numCMaps(); ++table_index_) {
-    if (filter_->accept(table_->cmapId(table_index_))) {
+  for (; table_index_ < table_->NumCMaps(); ++table_index_) {
+    if (filter_->accept(table_->GetCMapId(table_index_))) {
       return true;
     }
   }
@@ -387,105 +403,109 @@
  * CMapTable::Builder class
  ******************************************************************************/
 CMapTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                            Header* header, WritableFontData* data)
+                            Header* header,
+                            WritableFontData* data)
     : Table::ArrayElementTableBuilder(font_builder, header, data) {
 }
 
 CMapTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                            Header* header, ReadableFontData* data)
+                            Header* header,
+                            ReadableFontData* data)
     : Table::ArrayElementTableBuilder(font_builder, header, data) {
 }
 
-int32_t CMapTable::Builder::subSerialize(WritableFontData* new_data) {
-  int32_t size = new_data->writeUShort(CMapTable::Offset::kVersion,
+CMapTable::Builder::~Builder() {
+}
+
+int32_t CMapTable::Builder::SubSerialize(WritableFontData* new_data) {
+  int32_t size = new_data->WriteUShort(CMapTable::Offset::kVersion,
                                        version_);
-  size += new_data->writeUShort(CMapTable::Offset::kNumTables,
+  size += new_data->WriteUShort(CMapTable::Offset::kNumTables,
                                 cmap_builders_.size());
 
   int32_t index_offset = size;
   size += cmap_builders_.size() * CMapTable::Offset::kEncodingRecordSize;
   for (CMapBuilderMap::iterator it = cmap_builders_.begin(),
-           e = cmap_builders_.end(); it != e; ++it) {
+                                e = cmap_builders_.end(); it != e; ++it) {
     CMapBuilderPtr b = it->second;
     // header entry
-    index_offset += new_data->writeUShort(index_offset, b->platformId());
-    index_offset += new_data->writeUShort(index_offset, b->encodingId());
-    index_offset += new_data->writeULong(index_offset, size);
+    index_offset += new_data->WriteUShort(index_offset, b->platform_id());
+    index_offset += new_data->WriteUShort(index_offset, b->encoding_id());
+    index_offset += new_data->WriteULong(index_offset, size);
 
     // cmap
     FontDataPtr slice;
-    slice.attach(new_data->slice(size));
-    size +=
-        b->subSerialize(down_cast<WritableFontData*>(slice.p_));
+    slice.Attach(new_data->Slice(size));
+    size += b->SubSerialize(down_cast<WritableFontData*>(slice.p_));
   }
   return size;
 }
 
-bool CMapTable::Builder::subReadyToSerialize() {
+bool CMapTable::Builder::SubReadyToSerialize() {
   if (cmap_builders_.empty())
     return false;
 
   // check each table
   for (CMapBuilderMap::iterator it = cmap_builders_.begin(),
-           e = cmap_builders_.end(); it != e; ++it) {
-    if (!it->second->subReadyToSerialize())
+                                e = cmap_builders_.end(); it != e; ++it) {
+    if (!it->second->SubReadyToSerialize())
       return false;
   }
   return true;
 }
 
-int32_t CMapTable::Builder::subDataSizeToSerialize() {
+int32_t CMapTable::Builder::SubDataSizeToSerialize() {
   if (cmap_builders_.empty())
     return 0;
 
   bool variable = false;
   int32_t size = CMapTable::Offset::kEncodingRecordStart +
-      cmap_builders_.size() * CMapTable::Offset::kEncodingRecordSize;
+                 cmap_builders_.size() * CMapTable::Offset::kEncodingRecordSize;
 
   // calculate size of each table
   for (CMapBuilderMap::iterator it = cmap_builders_.begin(),
-           e = cmap_builders_.end(); it != e; ++it) {
-    int32_t cmap_size = it->second->subDataSizeToSerialize();
+                                e = cmap_builders_.end(); it != e; ++it) {
+    int32_t cmap_size = it->second->SubDataSizeToSerialize();
     size += abs(cmap_size);
     variable |= cmap_size <= 0;
   }
   return variable ? -size : size;
 }
 
-void CMapTable::Builder::subDataSet() {
+void CMapTable::Builder::SubDataSet() {
   cmap_builders_.clear();
-  Table::Builder::setModelChanged(false);
+  Table::Builder::set_model_changed(false);
 }
 
-CALLER_ATTACH FontDataTable* CMapTable::Builder::subBuildTable(
-    ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+    CMapTable::Builder::SubBuildTable(ReadableFontData* data) {
   FontDataTablePtr table = new CMapTable(header(), data);
-  return table.detach();
+  return table.Detach();
 }
 
-CALLER_ATTACH CMapTable::CMap::Builder* CMapTable::Builder::cmapBuilder(
+CALLER_ATTACH CMapTable::CMap::Builder* CMapTable::Builder::CMapBuilder(
     FontDataTableBuilderContainer* container, ReadableFontData* data,
     int32_t index) {
-  if (index < 0 || index > numCMaps(data))
+  if (index < 0 || index > NumCMaps(data))
     return NULL;
 
   int32_t record_offset = Offset::kEncodingRecordOffset + index *
       Offset::kEncodingRecordSize;
-  int32_t platform_id = data->readUShort(Offset::kEncodingRecordPlatformId +
-                                         record_offset);
-  int32_t encoding_id = data->readUShort(Offset::kEncodingRecordEncodingId +
-                                         record_offset);
+  int32_t platform_id =
+      data->ReadUShort(Offset::kEncodingRecordPlatformId + record_offset);
+  int32_t encoding_id =
+      data->ReadUShort(Offset::kEncodingRecordEncodingId + record_offset);
   CMapId cmap_id(platform_id, encoding_id);
-  int32_t offset = data->readULongAsInt(Offset::kEncodingRecordOffset +
-                                        record_offset);
-  return CMap::Builder::getBuilder(container, data, offset, cmap_id);
+  int32_t offset =
+      data->ReadULongAsInt(Offset::kEncodingRecordOffset + record_offset);
+  return CMap::Builder::GetBuilder(container, data, offset, cmap_id);
 }
 
-int32_t CMapTable::Builder::numCMaps(ReadableFontData* data) {
+int32_t CMapTable::Builder::NumCMaps(ReadableFontData* data) {
   if (data == NULL) {
     return 0;
   }
-  return data->readUShort(Offset::kNumTables);
+  return data->ReadUShort(Offset::kNumTables);
 }
 
 }  // namespace sfntly
diff --git a/sfntly/cmap_table.h b/sfntly/cmap_table.h
index a102b82..cdbcad8 100644
--- a/sfntly/cmap_table.h
+++ b/sfntly/cmap_table.h
@@ -44,6 +44,268 @@
 
 // A CMap table
 class CMapTable : public Table, public RefCounted<CMapTable> {
+public:
+  // CMapTable::CMapId
+  class CMapId {
+   public:
+    CMapId(int32_t platform_id, int32_t encoding_id);
+    CMapId(const CMapId& obj);
+
+    int32_t platform_id() { return platform_id_; }
+    int32_t encoding_id() { return encoding_id_; }
+
+    bool operator==(const CMapId& obj);
+    const CMapId& operator=(const CMapId& obj);
+    int HashCode() const;
+
+    friend class CMapIdComparator;
+
+   private:
+    int32_t platform_id_;
+    int32_t encoding_id_;
+  };
+  static CMapId WINDOWS_BMP;
+  static CMapId WINDOWS_UCS4;
+  static CMapId MAC_ROMAN;
+
+  // CMapTable::CMapIdComparator
+  class CMapIdComparator {
+   public:
+    bool operator()(const CMapId& lhs, const CMapId& rhs);
+  };
+
+  // A filter on cmap
+  // CMapTable::CMapFilter
+  class CMapFilter {
+   public:
+    // Test on whether the cmap is acceptable or not
+    // @param cmap_id the id of the cmap
+    // @return true if the cmap is acceptable; false otherwise
+    virtual bool accept(CMapId cmap_id) = 0;
+    // Make gcc -Wnon-virtual-dtor happy.
+    virtual ~CMapFilter() {}
+  };
+
+  // The abstract base class for all cmaps.
+  //
+  // CMap equality is based on the equality of the (@link {@link CMapId} that
+  // defines the CMap. In the cmap table for a font there can only be one cmap
+  // with a given cmap id (pair of platform and encoding ids) no matter what the
+  // type of the cmap is.
+  //
+  // The cmap implements {@code Iterable<Integer>} to allow iteration over
+  // characters that are mapped by the cmap. This iteration mostly returns the
+  // characters mapped by the cmap. It will return all characters mapped by the
+  // cmap to anything but .notdef <b>but</b> it may return some that are not
+  // mapped or are mapped to .notdef. Various cmap tables provide ranges and
+  // such to describe characters for lookup but without going the full way to
+  // mapping to the glyph id it isn't always possible to tell if a character
+  // will end up with a valid glyph id. So, some of the characters returned from
+  // the iterator may still end up pointing to the .notdef glyph. However, the
+  // number of such characters should be small in most cases with well designed
+  // cmaps.
+  class Builder;
+  class CMap : public SubTable {
+   public:
+    // CMapTable::CMap::Builder
+    class Builder : public SubTable::Builder {
+     public:
+      virtual ~Builder();
+
+      CALLER_ATTACH static Builder*
+          GetBuilder(FontDataTableBuilderContainer* container,
+                     ReadableFontData* data,
+                     int32_t offset,
+                     const CMapId& cmap_id);
+
+      // Note: yes, an object is returned on stack since it's small enough.
+      virtual CMapId cmap_id() { return cmap_id_; }
+      virtual int32_t platform_id() { return cmap_id_.platform_id(); }
+      virtual int32_t encoding_id() { return cmap_id_.encoding_id(); }
+
+     protected:
+      Builder(FontDataTableBuilderContainer* container,
+              ReadableFontData* data,
+              int32_t format,
+              const CMapId& cmap_id);
+      Builder(FontDataTableBuilderContainer* container,
+              WritableFontData* data,
+              int32_t format,
+              const CMapId& cmap_id);
+
+      virtual int32_t SubSerialize(WritableFontData* new_data);
+      virtual bool SubReadyToSerialize();
+      virtual int32_t SubDataSizeToSerialize();
+      virtual void SubDataSet();
+
+     private:
+      int32_t format_;
+      CMapId cmap_id_;
+
+      friend class CMapTable::Builder;
+    };
+
+    CMap(ReadableFontData* data, int32_t format, const CMapId& cmap_id);
+    virtual ~CMap();
+    virtual int32_t format() { return format_; }
+    virtual CMapId cmap_id() { return cmap_id_; }
+    virtual int32_t platform_id() { return cmap_id_.platform_id(); }
+    virtual int32_t encoding_id() { return cmap_id_.encoding_id(); }
+
+    // Get the language of the cmap.
+    //
+    // Note on the language field in 'cmap' subtables: The language field must
+    // be set to zero for all cmap subtables whose platform IDs are other than
+    // Macintosh (platform ID 1). For cmap subtables whose platform IDs are
+    // Macintosh, set this field to the Macintosh language ID of the cmap
+    // subtable plus one, or to zero if the cmap subtable is not
+    // language-specific. For example, a Mac OS Turkish cmap subtable must set
+    // this field to 18, since the Macintosh language ID for Turkish is 17. A
+    // Mac OS Roman cmap subtable must set this field to 0, since Mac OS Roman
+    // is not a language-specific encoding.
+    //
+    // @return the language id
+    virtual int32_t Language() = 0;
+
+    // Gets the glyph id for the character code provided.
+    // The character code provided must be in the encoding used by the cmap
+    // table.
+    virtual int32_t GlyphId(int32_t character) = 0;
+
+   private:
+    int32_t format_;
+    CMapId cmap_id_;
+  };
+  typedef Ptr<CMap::Builder> CMapBuilderPtr;
+  typedef std::map<CMapId, CMapBuilderPtr, CMapIdComparator> CMapBuilderMap;
+
+  // A cmap format 0 sub table
+  class CMapFormat0 : public CMap, public RefCounted<CMapFormat0> {
+   public:
+    // CMapTable::CMapFormat0::Builder
+    class Builder : public CMap::Builder,
+                    public RefCounted<Builder> {
+     public:
+      Builder(FontDataTableBuilderContainer* container,
+              ReadableFontData* data,
+              int32_t offset,
+              const CMapId& cmap_id);
+      Builder(FontDataTableBuilderContainer* container,
+              WritableFontData* data,
+              int32_t offset,
+              const CMapId& cmap_id);
+      virtual ~Builder();
+
+     protected:
+      virtual CALLER_ATTACH FontDataTable*
+          SubBuildTable(ReadableFontData* data);
+    };
+
+    virtual ~CMapFormat0();
+    virtual int32_t Language();
+    virtual int32_t GlyphId(int32_t character);
+
+   private:
+    CMapFormat0(ReadableFontData* data, const CMapId& cmap_id);
+  };
+
+  // A cmap format 2 sub table
+  // The format 2 cmap is used for multi-byte encodings such as SJIS,
+  // EUC-JP/KR/CN, Big5, etc.
+  class CMapFormat2 : public CMap, public RefCounted<CMapFormat2> {
+   public:
+    // CMapTable::CMapFormat2::Builder
+    class Builder : public CMap::Builder,
+                    public RefCounted<Builder> {
+     public:
+      Builder(FontDataTableBuilderContainer* container,
+              ReadableFontData* data,
+              int32_t offset,
+              const CMapId& cmap_id);
+      Builder(FontDataTableBuilderContainer* container,
+              WritableFontData* data,
+              int32_t offset,
+              const CMapId& cmap_id);
+      virtual ~Builder();
+
+     protected:
+      virtual CALLER_ATTACH FontDataTable*
+          SubBuildTable(ReadableFontData* data);
+    };
+
+    virtual ~CMapFormat2();
+    virtual int32_t Language();
+    virtual int32_t GlyphId(int32_t character);
+
+    // Returns how many bytes would be consumed by a lookup of this character
+    // with this cmap. This comes about because the cmap format 2 table is
+    // designed around multi-byte encodings such as SJIS, EUC-JP, Big5, etc.
+    // return the number of bytes consumed from this "character" - either 1 or 2
+    virtual int32_t BytesConsumed(int32_t character);
+
+   private:
+    CMapFormat2(ReadableFontData* data, const CMapId& cmap_id);
+
+    int32_t SubHeaderOffset(int32_t sub_header_index);
+    int32_t FirstCode(int32_t sub_header_index);
+    int32_t EntryCount(int32_t sub_header_index);
+    int32_t IdRangeOffset(int32_t sub_header_index);
+    int32_t IdDelta(int32_t sub_header_index);
+  };
+
+  // CMapTable::Builder
+  class Builder : public Table::ArrayElementTableBuilder,
+                  public RefCounted<Builder> {
+   public:
+    // Constructor scope altered to public because C++ does not allow base
+    // class to instantiate derived class with protected constructors.
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
+            WritableFontData* data);
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
+            ReadableFontData* data);
+    virtual ~Builder();
+
+    virtual int32_t SubSerialize(WritableFontData* new_data);
+    virtual bool SubReadyToSerialize();
+    virtual int32_t SubDataSizeToSerialize();
+    virtual void SubDataSet();
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+   protected:
+    static CALLER_ATTACH CMap::Builder*
+        CMapBuilder(FontDataTableBuilderContainer* container,
+                    ReadableFontData* data,
+                    int32_t index);
+
+   private:
+    static int32_t NumCMaps(ReadableFontData* data);
+
+    int32_t version_;
+    CMapBuilderMap cmap_builders_;
+  };
+
+  virtual ~CMapTable();
+
+  // Get the table version.
+  virtual int32_t Version();
+
+  // Get the number of cmaps within the CMap table.
+  virtual int32_t NumCMaps();
+
+  // Get the cmap id for the cmap with the given index.
+  // Note: yes, an object is returned on stack since it's small enough.
+  //       This function is renamed from cmapId to GetCMapId().
+  virtual CMapId GetCMapId(int32_t index);
+
+  virtual int32_t PlatformId(int32_t index);
+  virtual int32_t EncodingId(int32_t index);
+
+  // Get the offset in the table data for the cmap table with the given index.
+  // The offset is from the beginning of the table.
+  virtual int32_t Offset(int32_t index);
+
  private:
   static const int32_t NOTDEF;
 
@@ -158,238 +420,12 @@
     };
   };
 
- public:
-  // CMapTable::CMapId
-  class CMapId {
-   public:
-    CMapId(int32_t platform_id, int32_t encoding_id);
-    CMapId(const CMapId& obj);
-    int32_t platformId();
-    int32_t encodingId();
-    bool operator==(const CMapId& obj);
-    const CMapId& operator=(const CMapId& obj);
-    int hashCode() const;
-
-    friend class CMapIdComparator;
-
-   private:
-    int32_t platform_id_;
-    int32_t encoding_id_;
-  };
-  static CMapId WINDOWS_BMP;
-  static CMapId WINDOWS_UCS4;
-  static CMapId MAC_ROMAN;
-
-  // CMapTable::CMapIdComparator
-  class CMapIdComparator {
-   public:
-    bool operator()(const CMapId& lhs, const CMapId& rhs);
-  };
-
-  // A filter on cmap
-  // CMapTable::CMapFilter
-  class CMapFilter {
-   public:
-    // Test on whether the cmap is acceptable or not
-    // @param cmap_id the id of the cmap
-    // @return true if the cmap is acceptable; false otherwise
-    virtual bool accept(CMapId cmap_id) = 0;
-    // Make gcc -Wnon-virtual-dtor happy.
-    virtual ~CMapFilter() {}
-  };
-
-  // The abstract base class for all cmaps.
-  //
-  // CMap equality is based on the equality of the (@link {@link CMapId} that
-  // defines the CMap. In the cmap table for a font there can only be one cmap
-  // with a given cmap id (pair of platform and encoding ids) no matter what the
-  // type of the cmap is.
-  //
-  // The cmap implements {@code Iterable<Integer>} to allow iteration over
-  // characters that are mapped by the cmap. This iteration mostly returns the
-  // characters mapped by the cmap. It will return all characters mapped by the
-  // cmap to anything but .notdef <b>but</b> it may return some that are not
-  // mapped or are mapped to .notdef. Various cmap tables provide ranges and
-  // such to describe characters for lookup but without going the full way to
-  // mapping to the glyph id it isn't always possible to tell if a character
-  // will end up with a valid glyph id. So, some of the characters returned from
-  // the iterator may still end up pointing to the .notdef glyph. However, the
-  // number of such characters should be small in most cases with well designed
-  // cmaps.
-  class Builder;
-  class CMap : public SubTable {
-   public:
-    CMap(ReadableFontData* data, int32_t format, const CMapId& cmap_id);
-    virtual ~CMap();
-    virtual int32_t format();
-    virtual CMapId cmapId();
-    virtual int32_t platformId();
-    virtual int32_t encodingId();
-
-    // Get the language of the cmap.
-    //
-    // Note on the language field in 'cmap' subtables: The language field must
-    // be set to zero for all cmap subtables whose platform IDs are other than
-    // Macintosh (platform ID 1). For cmap subtables whose platform IDs are
-    // Macintosh, set this field to the Macintosh language ID of the cmap
-    // subtable plus one, or to zero if the cmap subtable is not
-    // language-specific. For example, a Mac OS Turkish cmap subtable must set
-    // this field to 18, since the Macintosh language ID for Turkish is 17. A
-    // Mac OS Roman cmap subtable must set this field to 0, since Mac OS Roman
-    // is not a language-specific encoding.
-    //
-    // @return the language id
-    virtual int32_t language() = 0;
-
-    // Gets the glyph id for the character code provided.
-    // The character code provided must be in the encoding used by the cmap
-    // table.
-    virtual int32_t glyphId(int32_t character) = 0;
-
-   public:
-    // CMapTable::CMap::Builder
-    class Builder : public SubTable::Builder {
-     public:
-      friend class CMapTable::Builder;
-
-     protected:
-      Builder(FontDataTableBuilderContainer* container, ReadableFontData* data,
-              int32_t format, const CMapId& cmap_id);
-      Builder(FontDataTableBuilderContainer* container, WritableFontData* data,
-              int32_t format, const CMapId& cmap_id);
-
-     public:
-      virtual ~Builder();
-      CALLER_ATTACH static Builder*
-          getBuilder(FontDataTableBuilderContainer* container,
-                     ReadableFontData* data, int32_t offset,
-                     const CMapId& cmap_id);
-
-      // Note: yes, an object is returned on stack since it's small enough.
-      virtual CMapId cmapId();
-      virtual int32_t platformId();
-      virtual int32_t encodingId();
-
-     protected:
-      virtual int32_t subSerialize(WritableFontData* new_data);
-      virtual bool subReadyToSerialize();
-      virtual int32_t subDataSizeToSerialize();
-      virtual void subDataSet();
-
-     private:
-      int32_t format_;
-      CMapId cmap_id_;
-    };
-
-   private:
-    int32_t format_;
-    CMapId cmap_id_;
-  };
-  typedef Ptr<CMap::Builder> CMapBuilderPtr;
-  typedef std::map<CMapId, CMapBuilderPtr, CMapIdComparator> CMapBuilderMap;
-
-  // A cmap format 0 sub table
-  class CMapFormat0 : public CMap, public RefCounted<CMapFormat0> {
-   protected:
-    CMapFormat0(ReadableFontData* data, const CMapId& cmap_id);
-
-   public:
-    virtual ~CMapFormat0();
-    virtual int32_t language();
-    virtual int32_t glyphId(int32_t character);
-
-    // CMapTable::CMapFormat0::Builder
-    class Builder : public CMap::Builder,
-                    public RefCounted<Builder> {
-     public:
-      Builder(FontDataTableBuilderContainer* container, ReadableFontData* data,
-        int32_t offset, const CMapId& cmap_id);
-      Builder(FontDataTableBuilderContainer* container, WritableFontData* data,
-        int32_t offset, const CMapId& cmap_id);
-      virtual ~Builder();
-     protected:
-      virtual CALLER_ATTACH FontDataTable*
-          subBuildTable(ReadableFontData* data);
-    };
-  };
-
-  // A cmap format 2 sub table
-  // The format 2 cmap is used for multi-byte encodings such as SJIS,
-  // EUC-JP/KR/CN, Big5, etc.
-  class CMapFormat2 : public CMap, public RefCounted<CMapFormat2> {
-   protected:
-    CMapFormat2(ReadableFontData* data, const CMapId& cmap_id);
-
-   public:
-    virtual ~CMapFormat2();
-    virtual int32_t language();
-    virtual int32_t glyphId(int32_t character);
-
-    // Returns how many bytes would be consumed by a lookup of this character
-    // with this cmap. This comes about because the cmap format 2 table is
-    // designed around multi-byte encodings such as SJIS, EUC-JP, Big5, etc.
-    // return the number of bytes consumed from this "character" - either 1 or 2
-    virtual int32_t bytesConsumed(int32_t character);
-
-   private:
-    int32_t subHeaderOffset(int32_t sub_header_index);
-    int32_t firstCode(int32_t sub_header_index);
-    int32_t entryCount(int32_t sub_header_index);
-    int32_t idRangeOffset(int32_t sub_header_index);
-    int32_t idDelta(int32_t sub_header_index);
-
-    // CMapTable::CMapFormat2::Builder
-    class Builder : public CMap::Builder,
-                    public RefCounted<Builder> {
-     public:
-      Builder(FontDataTableBuilderContainer* container, ReadableFontData* data,
-        int32_t offset, const CMapId& cmap_id);
-      Builder(FontDataTableBuilderContainer* container, WritableFontData* data,
-        int32_t offset, const CMapId& cmap_id);
-      virtual ~Builder();
-     protected:
-      virtual CALLER_ATTACH FontDataTable*
-          subBuildTable(ReadableFontData* data);
-    };
-  };
-
-  // CMapTable::Builder
-  class Builder : public Table::ArrayElementTableBuilder,
-                  public RefCounted<Builder> {
-   public:
-    // Constructor scope altered to public because C++ does not allow base
-    // class to instantiate derived class with protected constructors.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-      WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-      ReadableFontData* data);
-
-    virtual int32_t subSerialize(WritableFontData* new_data);
-    virtual bool subReadyToSerialize();
-    virtual int32_t subDataSizeToSerialize();
-    virtual void subDataSet();
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
-   protected:
-    static CALLER_ATTACH CMap::Builder* cmapBuilder(
-        FontDataTableBuilderContainer* container, ReadableFontData* data,
-        int32_t index);
-
-   private:
-    static int32_t numCMaps(ReadableFontData* data);
-
-   private:
-    int32_t version_;
-    CMapBuilderMap cmap_builders_;
-  };
-
- private:
   class CMapIterator {
    public:
     // If filter is NULL, filter through all tables.
     CMapIterator(CMapTable* table, CMapFilter* filter);
-    bool hasNext();
-    CMap* next();
+    bool HasNext();
+    CMap* Next();
 
    private:
     int32_t table_index_;
@@ -397,33 +433,11 @@
     CMapTable* table_;
   };
 
- private:
   CMapTable(Header* header, ReadableFontData* data);
 
- public:
-  virtual ~CMapTable();
-
-  // Get the table version.
-  virtual int32_t version();
-
-  // Get the number of cmaps within the CMap table.
-  virtual int32_t numCMaps();
-
-  // Get the cmap id for the cmap with the given index.
-  // Note: yes, an object is returned on stack since it's small enough.
-  virtual CMapId cmapId(int32_t index);
-
-  virtual int32_t platformId(int32_t index);
-  virtual int32_t encodingId(int32_t index);
-
-  // Get the offset in the table data for the cmap table with the given index.
-  // The offset is from the beginning of the table.
-  virtual int32_t offset(int32_t index);
-
- private:
   // Get the offset in the table data for the encoding record for the cmap with
   // the given index. The offset is from the beginning of the table.
-  int32_t offsetForEncodingRecord(int32_t index);
+  int32_t OffsetForEncodingRecord(int32_t index);
 };
 typedef std::vector<CMapTable::CMapId> CMapIdList;
 typedef Ptr<CMapTable> CMapTablePtr;
diff --git a/sfntly/data/byte_array.cc b/sfntly/data/byte_array.cc
index b8c3717..5502185 100644
--- a/sfntly/data/byte_array.cc
+++ b/sfntly/data/byte_array.cc
@@ -14,52 +14,38 @@
  * limitations under the License.
  */
 
+#include "sfntly/data/byte_array.h"
+
 #include <algorithm>
 
-#include "sfntly/data/byte_array.h"
 #include "sfntly/port/exception_type.h"
 
 namespace sfntly {
 
 const int32_t ByteArray::COPY_BUFFER_SIZE = 8192;
 
-void ByteArray::init(int32_t filled_length, int32_t storage_length,
-                     bool growable) {
-  storage_length_ = storage_length;
-  growable_ = growable;
-  setFilledLength(filled_length);
-}
-
-ByteArray::ByteArray(int32_t filled_length, int32_t storage_length,
-                     bool growable) {
-  init(filled_length, storage_length, growable);
-}
-
-ByteArray::ByteArray(int32_t filled_length, int32_t storage_length) {
-  init(filled_length, storage_length, false);
-}
-
 ByteArray::~ByteArray() {}
 
-int32_t ByteArray::length() { return filled_length_; }
-int32_t ByteArray::size() { return storage_length_; }
-bool ByteArray::growable() { return growable_; }
+int32_t ByteArray::Length() { return filled_length_; }
+int32_t ByteArray::Size() { return storage_length_; }
 
-int32_t ByteArray::setFilledLength(int32_t filled_length) {
+int32_t ByteArray::SetFilledLength(int32_t filled_length) {
   filled_length_ = std::min<int32_t>(filled_length, storage_length_);
   return filled_length_;
 }
 
-byte_t ByteArray::get(int32_t index) {
-  return internalGet(index);
+byte_t ByteArray::Get(int32_t index) {
+  return InternalGet(index);
 }
 
-int32_t ByteArray::get(int32_t index, ByteVector* b) {
+int32_t ByteArray::Get(int32_t index, ByteVector* b) {
   assert(b);
-  return get(index, b, 0, b->size());
+  return Get(index, b, 0, b->size());
 }
 
-int32_t ByteArray::get(int32_t index, ByteVector* b, int32_t offset,
+int32_t ByteArray::Get(int32_t index,
+                       ByteVector* b,
+                       int32_t offset,
                        int32_t length) {
   assert(b);
   if (index < 0 || index >= filled_length_) {
@@ -69,47 +55,49 @@
   if (actual_length < 0) {
       return -1;
   }
-  return internalGet(index, b, offset, actual_length);
+  return InternalGet(index, b, offset, actual_length);
 }
 
-bool ByteArray::put(int32_t index, byte_t b) {
-  if (index < 0 || index >= size()) {
+bool ByteArray::Put(int32_t index, byte_t b) {
+  if (index < 0 || index >= Size()) {
     return false;
   }
-  bool result = internalPut(index, b);
+  bool result = InternalPut(index, b);
   filled_length_ = std::max<int32_t>(filled_length_, index + 1);
   return result;
 }
 
-int32_t ByteArray::put(int index, ByteVector* b) {
+int32_t ByteArray::Put(int index, ByteVector* b) {
   assert(b);
-  return put(index, b, 0, b->size());
+  return Put(index, b, 0, b->size());
 }
 
-int32_t ByteArray::put(int32_t index, ByteVector* b, int32_t offset,
+int32_t ByteArray::Put(int32_t index,
+                       ByteVector* b,
+                       int32_t offset,
                        int32_t length) {
   assert(b);
-  if (index < 0 || index >= size()) {
+  if (index < 0 || index >= Size()) {
     return 0;
   }
-  int32_t actual_length = std::min<int32_t>(length, size() - index);
-  int32_t bytes_written = internalPut(index, b, offset, actual_length);
+  int32_t actual_length = std::min<int32_t>(length, Size() - index);
+  int32_t bytes_written = InternalPut(index, b, offset, actual_length);
   filled_length_ = std::max<int32_t>(filled_length_, index + bytes_written);
   return bytes_written;
 }
 
-int32_t ByteArray::copyTo(ByteArray* array) {
-  return copyTo(array, 0, length());
+int32_t ByteArray::CopyTo(ByteArray* array) {
+  return CopyTo(array, 0, Length());
 }
 
-int32_t ByteArray::copyTo(ByteArray* array, int32_t offset, int32_t length) {
-  return copyTo(0, array, offset, length);
+int32_t ByteArray::CopyTo(ByteArray* array, int32_t offset, int32_t length) {
+  return CopyTo(0, array, offset, length);
 }
 
-int32_t ByteArray::copyTo(int32_t dst_offset, ByteArray* array,
+int32_t ByteArray::CopyTo(int32_t dst_offset, ByteArray* array,
                           int32_t src_offset, int32_t length) {
   assert(array);
-  if (array->size() < dst_offset + length) {  // insufficient space
+  if (array->Size() < dst_offset + length) {  // insufficient space
     return -1;
   }
 
@@ -118,8 +106,8 @@
   int32_t index = 0;
   int32_t remaining_length = length;
   int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
-  while ((bytes_read = get(index + src_offset, &b, 0, buffer_length)) > 0) {
-    int bytes_written = array->put(index + dst_offset, &b, 0, bytes_read);
+  while ((bytes_read = Get(index + src_offset, &b, 0, buffer_length)) > 0) {
+    int bytes_written = array->Put(index + dst_offset, &b, 0, bytes_read);
     if (bytes_written != bytes_read) {
 #if defined (SFNTLY_NO_EXCEPTION)
       return 0;
@@ -134,31 +122,30 @@
   return index;
 }
 
-int32_t ByteArray::copyTo(OutputStream* os) {
-    return copyTo(os, 0, length());
+int32_t ByteArray::CopyTo(OutputStream* os) {
+    return CopyTo(os, 0, Length());
 }
 
-int32_t ByteArray::copyTo(OutputStream* os, int32_t offset, int32_t length) {
+int32_t ByteArray::CopyTo(OutputStream* os, int32_t offset, int32_t length) {
   ByteVector b(COPY_BUFFER_SIZE);
   int32_t bytes_read = 0;
   int32_t index = 0;
   int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
-  while ((bytes_read = get(index + offset, &b, 0, buffer_length)) > 0) {
-    os->write(&b, 0, bytes_read);
+  while ((bytes_read = Get(index + offset, &b, 0, buffer_length)) > 0) {
+    os->Write(&b, 0, bytes_read);
     index += bytes_read;
     buffer_length = std::min<int32_t>(b.size(), length - index);
   }
   return index;
 }
 
-bool ByteArray::copyFrom(InputStream* is, int32_t length) {
+bool ByteArray::CopyFrom(InputStream* is, int32_t length) {
   ByteVector b(COPY_BUFFER_SIZE);
   int32_t bytes_read = 0;
   int32_t index = 0;
   int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
-  while ((bytes_read =
-          is->read(&b, 0, buffer_length)) > 0) {
-    if (put(index, &b, 0, bytes_read) != bytes_read) {
+  while ((bytes_read = is->Read(&b, 0, buffer_length)) > 0) {
+    if (Put(index, &b, 0, bytes_read) != bytes_read) {
 #if defined (SFNTLY_NO_EXCEPTION)
       return 0;
 #else
@@ -172,14 +159,13 @@
   return true;
 }
 
-bool ByteArray::copyFrom(InputStream* is) {
+bool ByteArray::CopyFrom(InputStream* is) {
   ByteVector b(COPY_BUFFER_SIZE);
   int32_t bytes_read = 0;
   int32_t index = 0;
   int32_t buffer_length = COPY_BUFFER_SIZE;
-  while ((bytes_read =
-          is->read(&b, 0, buffer_length)) > 0) {
-    if (put(index, &b, 0, bytes_read) != bytes_read) {
+  while ((bytes_read = is->Read(&b, 0, buffer_length)) > 0) {
+    if (Put(index, &b, 0, bytes_read) != bytes_read) {
 #if defined (SFNTLY_NO_EXCEPTION)
       return 0;
 #else
@@ -191,4 +177,22 @@
   return true;
 }
 
+ByteArray::ByteArray(int32_t filled_length,
+                     int32_t storage_length,
+                     bool growable) {
+  Init(filled_length, storage_length, growable);
+}
+
+ByteArray::ByteArray(int32_t filled_length, int32_t storage_length) {
+  Init(filled_length, storage_length, false);
+}
+
+void ByteArray::Init(int32_t filled_length,
+                     int32_t storage_length,
+                     bool growable) {
+  storage_length_ = storage_length;
+  growable_ = growable;
+  SetFilledLength(filled_length);
+}
+
 }  // namespace sfntly
diff --git a/sfntly/data/byte_array.h b/sfntly/data/byte_array.h
index edb4633..9ac56c0 100644
--- a/sfntly/data/byte_array.h
+++ b/sfntly/data/byte_array.h
@@ -29,38 +29,27 @@
 // C++ port of this class assumes that the data are stored in a linear region
 // like std::vector.
 class ByteArray : virtual public RefCount {
- protected:
-  // filledLength the length that is "filled" and readable counting from offset
-  // storageLength the maximum storage size of the underlying data
-  // growable is the storage growable - storageLength is the max growable size
-  ByteArray(int32_t filled_length, int32_t storage_length, bool growable);
-  ByteArray(int32_t filled_length, int32_t storage_length);
-  void init(int32_t filled_length, int32_t storage_length, bool growable);
-
-  static const int32_t COPY_BUFFER_SIZE;
-
  public:
   virtual ~ByteArray();
 
   // Get the current filled and readable length of the array.
-  int32_t length();
+  int32_t Length();
 
   // Get the maximum size of the array. This is the maximum number of bytes that
   // the array can hold and all of it may not be filled with data or even fully
   // allocated yet.
-  int32_t size();
+  int32_t Size();
 
-  bool growable();
-  int32_t setFilledLength(int32_t filled_length);
+  bool growable() { return growable_; }
+  int32_t SetFilledLength(int32_t filled_length);
 
- public:
   // Get the byte from the given index.
-  virtual byte_t get(int32_t index);
+  virtual byte_t Get(int32_t index);
 
   // Get the bytes from the given index and fill the buffer with them. As many
   // bytes as will fit into the buffer are read unless that would go past the
   // end of the array.
-  virtual int32_t get(int32_t index, ByteVector* b);
+  virtual int32_t Get(int32_t index, ByteVector* b);
 
   // Get the bytes from the given index and fill the buffer with them starting
   // at the offset given. As many bytes as the specified length are read unless
@@ -70,17 +59,19 @@
   // @param offset the location in the buffer to start putting the bytes
   // @param length the number of bytes to put into the buffer
   // @return the number of bytes put into the buffer
-  virtual int32_t get(int32_t index, ByteVector* b, int32_t offset,
+  virtual int32_t Get(int32_t index,
+                      ByteVector* b,
+                      int32_t offset,
                       int32_t length);
 
   // Put the specified byte into the array at the given index unless that would
   // be beyond the length of the array and it isn't growable.
-  virtual bool put(int32_t index, byte_t b);
+  virtual bool Put(int32_t index, byte_t b);
 
   // Put the specified bytes into the array at the given index. The entire
   // buffer is put into the array unless that would extend beyond the length and
   // the array isn't growable.
-  virtual int32_t put(int32_t index, ByteVector* b);
+  virtual int32_t Put(int32_t index, ByteVector* b);
 
   // Put the specified bytes into the array at the given index. All of the bytes
   // specified are put into the array unless that would extend beyond the length
@@ -91,19 +82,21 @@
   // @param offset the offset in the bytes to start copying from
   // @param length the number of bytes to copy into the array
   // @return the number of bytes actually written
-  virtual int32_t put(int32_t index, ByteVector* b, int32_t offset,
+  virtual int32_t Put(int32_t index,
+                      ByteVector* b,
+                      int32_t offset,
                       int32_t length);
 
   // Fully copy this ByteArray to another ByteArray to the extent that the
   // destination array has storage for the data copied.
-  virtual int32_t copyTo(ByteArray* array);
+  virtual int32_t CopyTo(ByteArray* array);
 
   // Copy a segment of this ByteArray to another ByteArray.
   // @param array the destination
   // @param offset the offset in this ByteArray to start copying from
   // @param length the maximum length in bytes to copy
   // @return the number of bytes copied
-  virtual int32_t copyTo(ByteArray* array, int32_t offset, int32_t length);
+  virtual int32_t CopyTo(ByteArray* array, int32_t offset, int32_t length);
 
   // Copy this ByteArray to another ByteArray.
   // @param dstOffset the offset in the destination array to start copying to
@@ -111,25 +104,40 @@
   // @param srcOffset the offset in this ByteArray to start copying from
   // @param length the maximum length in bytes to copy
   // @return the number of bytes copied
-  virtual int32_t copyTo(int32_t dst_offset, ByteArray* array,
-                         int32_t src_offset, int32_t length);
+  virtual int32_t CopyTo(int32_t dst_offset,
+                         ByteArray* array,
+                         int32_t src_offset,
+                         int32_t length);
 
-  virtual int32_t copyTo(OutputStream* os);
-  virtual int32_t copyTo(OutputStream* os, int32_t offset, int32_t length);
-  virtual bool copyFrom(InputStream* is, int32_t length);
-  virtual bool copyFrom(InputStream* is);
+  virtual int32_t CopyTo(OutputStream* os);
+  virtual int32_t CopyTo(OutputStream* os, int32_t offset, int32_t length);
+  virtual bool CopyFrom(InputStream* is, int32_t length);
+  virtual bool CopyFrom(InputStream* is);
 
  protected:
-  virtual bool internalPut(int32_t index, byte_t b) = 0;
-  virtual int32_t internalPut(int32_t index, ByteVector* b, int32_t offset,
-                              int32_t length) = 0;
-  virtual byte_t internalGet(int32_t index) = 0;
-  virtual int32_t internalGet(int32_t index, ByteVector* b, int32_t offset,
-                              int32_t length) = 0;
-  virtual void close() = 0;
+  // filledLength the length that is "filled" and readable counting from offset.
+  // storageLength the maximum storage size of the underlying data.
+  // growable is the storage growable - storageLength is the max growable size.
+  ByteArray(int32_t filled_length, int32_t storage_length, bool growable);
+  ByteArray(int32_t filled_length, int32_t storage_length);
+  void Init(int32_t filled_length, int32_t storage_length, bool growable);
 
-  // C++ port only, raw pointer to the first element of storage
-  virtual byte_t* begin() = 0;
+  virtual bool InternalPut(int32_t index, byte_t b) = 0;
+  virtual int32_t InternalPut(int32_t index,
+                              ByteVector* b,
+                              int32_t offset,
+                              int32_t length) = 0;
+  virtual byte_t InternalGet(int32_t index) = 0;
+  virtual int32_t InternalGet(int32_t index,
+                              ByteVector* b,
+                              int32_t offset,
+                              int32_t length) = 0;
+  virtual void Close() = 0;
+
+  // C++ port only, raw pointer to the first element of storage.
+  virtual byte_t* Begin() = 0;
+
+  static const int32_t COPY_BUFFER_SIZE;
 
  private:
   int32_t filled_length_;
diff --git a/sfntly/data/font_data.cc b/sfntly/data/font_data.cc
index fdba5f8..437a810 100644
--- a/sfntly/data/font_data.cc
+++ b/sfntly/data/font_data.cc
@@ -22,30 +22,12 @@
 
 namespace sfntly {
 
-FontData::~FontData() {}
-
-void FontData::init(ByteArray* ba) {
-  array_ = ba;
-  bound_offset_ = 0;
-  bound_length_ = INT_MAX;
+int32_t FontData::Size() const {
+  return std::min<int32_t>(array_->Size() - bound_offset_, bound_length_);
 }
 
-FontData::FontData(ByteArray* ba) {
-  init(ba);
-}
-
-FontData::FontData(FontData* data, int32_t offset, int32_t length) {
-  init(data->array_);
-  bound(data->bound_offset_ + offset, length);
-}
-
-FontData::FontData(FontData* data, int32_t offset) {
-  init(data->array_);
-  bound(offset);
-}
-
-bool FontData::bound(int32_t offset, int32_t length) {
-  if (offset + length > size() || offset < 0 || length < 0)
+bool FontData::Bound(int32_t offset, int32_t length) {
+  if (offset + length > Size() || offset < 0 || length < 0)
     return false;
 
   bound_offset_ += offset;
@@ -53,27 +35,45 @@
   return true;
 }
 
-bool FontData::bound(int32_t offset) {
-if (offset > size() || offset < 0)
+bool FontData::Bound(int32_t offset) {
+if (offset > Size() || offset < 0)
     return false;
 
   bound_offset_ += offset;
   return true;
 }
 
-int32_t FontData::length() const {
-  return std::min<int32_t>(array_->length() - bound_offset_, bound_length_);
+int32_t FontData::Length() const {
+  return std::min<int32_t>(array_->Length() - bound_offset_, bound_length_);
 }
 
-int32_t FontData::size() const {
-  return std::min<int32_t>(array_->size() - bound_offset_, bound_length_);
+FontData::FontData(ByteArray* ba) {
+  Init(ba);
 }
 
-int32_t FontData::boundOffset(int32_t offset) {
+FontData::FontData(FontData* data, int32_t offset, int32_t length) {
+  Init(data->array_);
+  Bound(data->bound_offset_ + offset, length);
+}
+
+FontData::FontData(FontData* data, int32_t offset) {
+  Init(data->array_);
+  Bound(offset);
+}
+
+FontData::~FontData() {}
+
+void FontData::Init(ByteArray* ba) {
+  array_ = ba;
+  bound_offset_ = 0;
+  bound_length_ = INT_MAX;
+}
+
+int32_t FontData::BoundOffset(int32_t offset) {
   return offset + bound_offset_;
 }
 
-int32_t FontData::boundLength(int32_t offset, int32_t length) {
+int32_t FontData::BoundLength(int32_t offset, int32_t length) {
   return std::min<int32_t>(length, bound_length_ - offset);
 }
 
diff --git a/sfntly/data/font_data.h b/sfntly/data/font_data.h
index 6bcdb73..ab5cf54 100644
--- a/sfntly/data/font_data.h
+++ b/sfntly/data/font_data.h
@@ -18,6 +18,7 @@
 #define TYPOGRAPHY_FONT_SFNTLY_SRC_SFNTLY_DATA_FONT_DATA_H_
 
 #include <vector>
+
 #include "sfntly/port/type.h"
 #include "sfntly/data/byte_array.h"
 #include "sfntly/port/refcount.h"
@@ -51,13 +52,13 @@
   // that the font data can hold and all of it may not be filled with data or
   // even fully allocated yet.
   // @return the size of this array
-  virtual int32_t size() const;
+  virtual int32_t Size() const;
 
   // Sets limits on the size of the FontData. The font data is
   // @param offset the start of the new bounds
   // @param length the number of bytes in the bounded array
   // @return true if the bounding range was successful; false otherwise
-  virtual bool bound(int32_t offset, int32_t length);
+  virtual bool Bound(int32_t offset, int32_t length);
 
   // Sets limits on the size of the FontData. This is a offset bound only so if
   // the FontData is writable and growable then there is no limit to that growth
@@ -65,28 +66,25 @@
   // @param offset the start of the new bounds which must be within the current
   //        size of the FontData
   // @return true if the bounding range was successful; false otherwise
-  virtual bool bound(int32_t offset);
+  virtual bool Bound(int32_t offset);
 
   // Makes a slice of this FontData. The returned slice will share the data with
   // the original FontData.
   // @param offset the start of the slice
   // @param length the number of bytes in the slice
   // @return a slice of the original FontData
-  virtual CALLER_ATTACH FontData* slice(int32_t offset, int32_t length) = 0;
+  virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length) = 0;
 
   // Makes a bottom bound only slice of this array. The returned slice will
   // share the data with the original FontData.
   // @param offset the start of the slice
   // @return a slice of the original FontData
-  virtual CALLER_ATTACH FontData* slice(int32_t offset) = 0;
+  virtual CALLER_ATTACH FontData* Slice(int32_t offset) = 0;
 
   // Get the length of the data.
-  virtual int32_t length() const;
-
+  virtual int32_t Length() const;
 
  protected:
-  virtual ~FontData();
-
   // Constructor.
   // @param ba the byte array to use for the backing data
   explicit FontData(ByteArray* ba);
@@ -101,12 +99,13 @@
   // @param data the data to wrap
   // @param offset the offset to start the wrap from
   FontData(FontData* data, int32_t offset);
+  virtual ~FontData();
 
-  void init(ByteArray* ba);
-  int32_t boundOffset(int32_t offset);
-  int32_t boundLength(int32_t offset, int32_t length);
+  void Init(ByteArray* ba);
+  int32_t BoundOffset(int32_t offset);
+  int32_t BoundLength(int32_t offset, int32_t length);
 
- protected:
+  // TODO(arthurhsu): style guide violation: refactor this protected member
   ByteArrayPtr array_;
 
  private:
diff --git a/sfntly/data/font_input_stream.cc b/sfntly/data/font_input_stream.cc
index b9eccdb..a1fbe44 100644
--- a/sfntly/data/font_input_stream.cc
+++ b/sfntly/data/font_input_stream.cc
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-#include <algorithm>
-
 #include "sfntly/data/font_input_stream.h"
 
+#include <algorithm>
+
 namespace sfntly {
 
 FontInputStream::FontInputStream(InputStream* is)
@@ -32,50 +32,50 @@
   // Do not close here, underlying InputStream will close themselves.
 }
 
-int32_t FontInputStream::available() {
+int32_t FontInputStream::Available() {
   if (stream_) {
-    return stream_->available();
+    return stream_->Available();
   }
   return 0;
 }
 
-void FontInputStream::close() {
+void FontInputStream::Close() {
   if (stream_) {
-    stream_->close();
+    stream_->Close();
   }
 }
 
-void FontInputStream::mark(int32_t readlimit) {
+void FontInputStream::Mark(int32_t readlimit) {
   if (stream_) {
-    stream_->mark(readlimit);
+    stream_->Mark(readlimit);
   }
 }
 
-bool FontInputStream::markSupported() {
+bool FontInputStream::MarkSupported() {
   if (stream_) {
-    return stream_->markSupported();
+    return stream_->MarkSupported();
   }
   return false;
 }
 
-void FontInputStream::reset() {
+void FontInputStream::Reset() {
   if (stream_) {
-    stream_->reset();
+    stream_->Reset();
   }
 }
 
-int32_t FontInputStream::read() {
+int32_t FontInputStream::Read() {
   if (!stream_ || (bounded_ && position_ >= length_)) {
     return -1;
   }
-  int32_t b = stream_->read();
+  int32_t b = stream_->Read();
   if (b >= 0) {
     position_++;
   }
   return b;
 }
 
-int32_t FontInputStream::read(ByteVector* b, int32_t offset, int32_t length) {
+int32_t FontInputStream::Read(ByteVector* b, int32_t offset, int32_t length) {
   if (!stream_ || offset < 0 || length < 0 ||
       (bounded_ && position_ >= length_)) {
     return -1;
@@ -83,59 +83,55 @@
   int32_t bytes_to_read =
       bounded_ ? std::min<int32_t>(length, (int32_t)(length_ - position_)) :
                  length;
-  int32_t bytes_read = stream_->read(b, offset, bytes_to_read);
+  int32_t bytes_read = stream_->Read(b, offset, bytes_to_read);
   position_ += bytes_read;
   return bytes_read;
 }
 
-int32_t FontInputStream::read(ByteVector* b) {
-  return read(b, 0, b->size());
+int32_t FontInputStream::Read(ByteVector* b) {
+  return Read(b, 0, b->size());
 }
 
-int64_t FontInputStream::position() {
-  return position_;
+int32_t FontInputStream::ReadChar() {
+  return Read();
 }
 
-int32_t FontInputStream::readChar() {
-  return read();
+int32_t FontInputStream::ReadUShort() {
+  return 0xffff & (Read() << 8 | Read());
 }
 
-int32_t FontInputStream::readUShort() {
-  return 0xffff & (read() << 8 | read());
+int32_t FontInputStream::ReadShort() {
+  return ((Read() << 8 | Read()) << 16) >> 16;
 }
 
-int32_t FontInputStream::readShort() {
-  return ((read() << 8 | read()) << 16) >> 16;
+int32_t FontInputStream::ReadUInt24() {
+  return 0xffffff & (Read() << 16 | Read() << 8 | Read());
 }
 
-int32_t FontInputStream::readUInt24() {
-  return 0xffffff & (read() << 16 | read() << 8 | read());
+int64_t FontInputStream::ReadULong() {
+  return 0xffffffffL & ReadLong();
 }
 
-int64_t FontInputStream::readULong() {
-  return 0xffffffffL & readLong();
-}
-
-int32_t FontInputStream::readULongAsInt() {
-  int64_t ulong = readULong();
+int32_t FontInputStream::ReadULongAsInt() {
+  int64_t ulong = ReadULong();
   return ((int32_t)ulong) & ~0x80000000;
 }
 
-int32_t FontInputStream::readLong() {
-  return read() << 24 | read() << 16 | read() << 8 | read();
+int32_t FontInputStream::ReadLong() {
+  return Read() << 24 | Read() << 16 | Read() << 8 | Read();
 }
 
-int32_t FontInputStream::readFixed() {
-  return readLong();
+int32_t FontInputStream::ReadFixed() {
+  return ReadLong();
 }
 
-int64_t FontInputStream::readDateTimeAsLong() {
-  return (int64_t)readULong() << 32 | readULong();
+int64_t FontInputStream::ReadDateTimeAsLong() {
+  return (int64_t)ReadULong() << 32 | ReadULong();
 }
 
-int64_t FontInputStream::skip(int64_t n) {
+int64_t FontInputStream::Skip(int64_t n) {
   if (stream_) {
-    int64_t skipped = stream_->skip(n);
+    int64_t skipped = stream_->Skip(n);
     position_ += skipped;
     return skipped;
   }
diff --git a/sfntly/data/font_input_stream.h b/sfntly/data/font_input_stream.h
index ed8d364..7404825 100644
--- a/sfntly/data/font_input_stream.h
+++ b/sfntly/data/font_input_stream.h
@@ -33,33 +33,33 @@
   FontInputStream(InputStream* is, size_t length);
   virtual ~FontInputStream();
 
-  virtual int32_t available();
-  virtual void close();
-  virtual void mark(int32_t readlimit);
-  virtual bool markSupported();
-  virtual void reset();
+  virtual int32_t Available();
+  virtual void Close();
+  virtual void Mark(int32_t readlimit);
+  virtual bool MarkSupported();
+  virtual void Reset();
 
-  virtual int32_t read();
-  virtual int32_t read(ByteVector* buffer);
-  virtual int32_t read(ByteVector* buffer, int32_t offset, int32_t length);
+  virtual int32_t Read();
+  virtual int32_t Read(ByteVector* buffer);
+  virtual int32_t Read(ByteVector* buffer, int32_t offset, int32_t length);
 
-  virtual int64_t position();
+  virtual int64_t position() { return position_; }
 
-  virtual int32_t readChar();
-  virtual int32_t readUShort();
-  virtual int32_t readShort();
-  virtual int32_t readUInt24();
-  virtual int64_t readULong();
-  virtual int32_t readULongAsInt();
-  virtual int32_t readLong();
-  virtual int32_t readFixed();
-  virtual int64_t readDateTimeAsLong();
-  virtual int64_t skip(int64_t n);  // n can be negative
+  virtual int32_t ReadChar();
+  virtual int32_t ReadUShort();
+  virtual int32_t ReadShort();
+  virtual int32_t ReadUInt24();
+  virtual int64_t ReadULong();
+  virtual int32_t ReadULongAsInt();
+  virtual int32_t ReadLong();
+  virtual int32_t ReadFixed();
+  virtual int64_t ReadDateTimeAsLong();
+  virtual int64_t Skip(int64_t n);  // n can be negative.
 
  private:
   InputStream* stream_;
   int64_t position_;
-  int64_t length_;  // bound on length of data to read
+  int64_t length_;  // Bound on length of data to read.
   bool bounded_;
 };
 
diff --git a/sfntly/data/font_output_stream.cc b/sfntly/data/font_output_stream.cc
index f0f4744..a88a29e 100644
--- a/sfntly/data/font_output_stream.cc
+++ b/sfntly/data/font_output_stream.cc
@@ -14,95 +14,91 @@
  * limitations under the License.
  */
 
-#include <algorithm>
-
 #include "sfntly/data/font_output_stream.h"
-#include "sfntly/port/endian.h"
+
+#include <algorithm>
 
 namespace sfntly {
 
 FontOutputStream::FontOutputStream(OutputStream* os)
-    : stream_(os), position_(0) {
+    : stream_(os),
+      position_(0) {
 }
 
 FontOutputStream::~FontOutputStream() {
   // Do not close, underlying stream shall clean up themselves.
 }
 
-size_t FontOutputStream::position() {
-  return position_;
-}
-
-void FontOutputStream::write(byte_t b) {
+void FontOutputStream::Write(byte_t b) {
   if (stream_) {
-    stream_->write(b);
+    stream_->Write(b);
     position_++;
   }
 }
 
-void FontOutputStream::write(ByteVector* b) {
+void FontOutputStream::Write(ByteVector* b) {
   if (b) {
-    write(b, 0, b->size());
+    Write(b, 0, b->size());
     position_ += b->size();
   }
 }
 
-void FontOutputStream::write(ByteVector* b, int32_t offset, int32_t length) {
+void FontOutputStream::Write(ByteVector* b, int32_t offset, int32_t length) {
   if (stream_ && b) {
-    stream_->write(b, offset, length);
+    stream_->Write(b, offset, length);
     position_ += length;
   }
 }
 
-void FontOutputStream::writeChar(byte_t c) {
-  write(c);
+void FontOutputStream::WriteChar(byte_t c) {
+  Write(c);
 }
 
-void FontOutputStream::writeUShort(int32_t us) {
-  write((byte_t)((us >> 8) & 0xff));
-  write((byte_t)(us & 0xff));
+void FontOutputStream::WriteUShort(int32_t us) {
+  Write((byte_t)((us >> 8) & 0xff));
+  Write((byte_t)(us & 0xff));
 }
 
-void FontOutputStream::writeShort(int32_t s) {
-  writeUShort(s);
+void FontOutputStream::WriteShort(int32_t s) {
+  WriteUShort(s);
 }
 
-void FontOutputStream::writeUInt24(int32_t ui) {
-  write((byte_t)(ui >> 16) & 0xff);
-  write((byte_t)(ui >> 8) & 0xff);
-  write((byte_t)ui & 0xff);
+void FontOutputStream::WriteUInt24(int32_t ui) {
+  Write((byte_t)(ui >> 16) & 0xff);
+  Write((byte_t)(ui >> 8) & 0xff);
+  Write((byte_t)ui & 0xff);
 }
 
-void FontOutputStream::writeULong(int64_t ul) {
-  write((byte_t)((ul >> 24) & 0xff));
-  write((byte_t)((ul >> 16) & 0xff));
-  write((byte_t)((ul >> 8) & 0xff));
-  write((byte_t)(ul & 0xff));
+void FontOutputStream::WriteULong(int64_t ul) {
+  Write((byte_t)((ul >> 24) & 0xff));
+  Write((byte_t)((ul >> 16) & 0xff));
+  Write((byte_t)((ul >> 8) & 0xff));
+  Write((byte_t)(ul & 0xff));
 }
 
-void FontOutputStream::writeLong(int64_t l) {
-  writeULong(l);
+void FontOutputStream::WriteLong(int64_t l) {
+  WriteULong(l);
 }
 
-void FontOutputStream::writeFixed(int32_t f) {
-  writeULong(f);
+void FontOutputStream::WriteFixed(int32_t f) {
+  WriteULong(f);
 }
 
-void FontOutputStream::writeDateTime(int64_t date) {
-  writeULong((date >> 32) & 0xffffffff);
-  writeULong(date & 0xffffffff);
+void FontOutputStream::WriteDateTime(int64_t date) {
+  WriteULong((date >> 32) & 0xffffffff);
+  WriteULong(date & 0xffffffff);
 }
 
-void FontOutputStream::flush() {
+void FontOutputStream::Flush() {
   if (stream_) {
-    stream_->flush();
+    stream_->Flush();
   }
 }
 
-void FontOutputStream::close() {
+void FontOutputStream::Close() {
   if (stream_) {
-    stream_->flush();
-    stream_->close();
+    stream_->Flush();
+    stream_->Close();
     position_ = 0;
   }
 }
diff --git a/sfntly/data/font_output_stream.h b/sfntly/data/font_output_stream.h
index 4bb923d..6938b66 100644
--- a/sfntly/data/font_output_stream.h
+++ b/sfntly/data/font_output_stream.h
@@ -32,22 +32,22 @@
   explicit FontOutputStream(OutputStream* os);
   virtual ~FontOutputStream();
 
-  virtual size_t position();
+  virtual size_t position() { return position_; }
 
-  virtual void write(byte_t b);
-  virtual void write(ByteVector* b);
-  virtual void write(ByteVector* b, int32_t offset, int32_t len);
-  virtual void writeChar(byte_t c);
-  virtual void writeUShort(int32_t us);
-  virtual void writeShort(int32_t s);
-  virtual void writeUInt24(int32_t ui);
-  virtual void writeULong(int64_t ul);
-  virtual void writeLong(int64_t l);
-  virtual void writeFixed(int32_t l);
-  virtual void writeDateTime(int64_t date);
+  virtual void Write(byte_t b);
+  virtual void Write(ByteVector* b);
+  virtual void Write(ByteVector* b, int32_t offset, int32_t len);
+  virtual void WriteChar(byte_t c);
+  virtual void WriteUShort(int32_t us);
+  virtual void WriteShort(int32_t s);
+  virtual void WriteUInt24(int32_t ui);
+  virtual void WriteULong(int64_t ul);
+  virtual void WriteLong(int64_t l);
+  virtual void WriteFixed(int32_t l);
+  virtual void WriteDateTime(int64_t date);
 
-  virtual void flush();
-  virtual void close();
+  virtual void Flush();
+  virtual void Close();
 
  private:
   OutputStream* stream_;
diff --git a/sfntly/data/growable_memory_byte_array.cc b/sfntly/data/growable_memory_byte_array.cc
index 0821321..9e1a043 100644
--- a/sfntly/data/growable_memory_byte_array.cc
+++ b/sfntly/data/growable_memory_byte_array.cc
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-#include <limits.h>
-#include <algorithm>
-
 #include "sfntly/data/growable_memory_byte_array.h"
 
+#include <limits.h>
+
+#include <algorithm>
+
 namespace sfntly {
 
 GrowableMemoryByteArray::GrowableMemoryByteArray()
@@ -27,40 +28,46 @@
 
 GrowableMemoryByteArray::~GrowableMemoryByteArray() {}
 
-bool GrowableMemoryByteArray::internalPut(int32_t index, byte_t b) {
+bool GrowableMemoryByteArray::InternalPut(int32_t index, byte_t b) {
   if ((size_t)index >= b_.capacity()) {
-    b_.resize((size_t)(index + 1) << 2);  // grow exponentially
+    b_.resize((size_t)(index + 1) << 2);  // Grow exponentially.
   }
   b_[index] = b;
   return true;
 }
 
-int32_t GrowableMemoryByteArray::internalPut(int32_t index, ByteVector* b,
-                                             int32_t offset, int32_t length) {
+int32_t GrowableMemoryByteArray::InternalPut(int32_t index,
+                                             ByteVector* b,
+                                             int32_t offset,
+                                             int32_t length) {
   if ((size_t)index + length >= b_.capacity()) {
     b_.resize((size_t)(index + length + 1) << 2);
   }
-  std::copy(b->begin() + offset, b->begin() + (offset + length),
+  std::copy(b->begin() + offset,
+            b->begin() + (offset + length),
             b_.begin() + index);
   return length;
 }
 
-byte_t GrowableMemoryByteArray::internalGet(int32_t index) {
+byte_t GrowableMemoryByteArray::InternalGet(int32_t index) {
   return b_[index];
 }
 
-int32_t GrowableMemoryByteArray::internalGet(int32_t index, ByteVector* b,
-                                             int32_t offset, int32_t length) {
-  std::copy(b_.begin() + index, b_.begin() + (index + length),
+int32_t GrowableMemoryByteArray::InternalGet(int32_t index,
+                                             ByteVector* b,
+                                             int32_t offset,
+                                             int32_t length) {
+  std::copy(b_.begin() + index,
+            b_.begin() + (index + length),
             b->begin() + offset);
   return length;
 }
 
-void GrowableMemoryByteArray::close() {
+void GrowableMemoryByteArray::Close() {
   b_.clear();
 }
 
-byte_t* GrowableMemoryByteArray::begin() {
+byte_t* GrowableMemoryByteArray::Begin() {
   return &(b_[0]);
 }
 
diff --git a/sfntly/data/growable_memory_byte_array.h b/sfntly/data/growable_memory_byte_array.h
index 3c9d4f0..dc59f62 100644
--- a/sfntly/data/growable_memory_byte_array.h
+++ b/sfntly/data/growable_memory_byte_array.h
@@ -30,14 +30,18 @@
   virtual ~GrowableMemoryByteArray();
 
  protected:
-  virtual bool internalPut(int32_t index, byte_t b);
-  virtual int32_t internalPut(int32_t index, ByteVector* b, int32_t offset,
+  virtual bool InternalPut(int32_t index, byte_t b);
+  virtual int32_t InternalPut(int32_t index,
+                              ByteVector* b,
+                              int32_t offset,
                               int32_t length);
-  virtual byte_t internalGet(int32_t index);
-  virtual int32_t internalGet(int32_t index, ByteVector* b, int32_t offset,
+  virtual byte_t InternalGet(int32_t index);
+  virtual int32_t InternalGet(int32_t index,
+                              ByteVector* b,
+                              int32_t offset,
                               int32_t length);
-  virtual void close();
-  virtual byte_t* begin();
+  virtual void Close();
+  virtual byte_t* Begin();
 
  private:
   ByteVector b_;
diff --git a/sfntly/data/memory_byte_array.cc b/sfntly/data/memory_byte_array.cc
index 528979a..0138b21 100644
--- a/sfntly/data/memory_byte_array.cc
+++ b/sfntly/data/memory_byte_array.cc
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-#include <string.h>
-
 #include "sfntly/data/memory_byte_array.h"
 
+#include <string.h>
+
 namespace sfntly {
 
-// Note: this constructor can fail under low-memory situation
+// Note: this constructor can fail under low-memory situation.
 MemoryByteArray::MemoryByteArray(int32_t length)
     : ByteArray(0, length), b_(NULL), allocated_(true) {
 }
@@ -29,56 +29,61 @@
     : ByteArray(buffer_length, buffer_length), b_(b), allocated_(false) {
 }
 
-MemoryByteArray::MemoryByteArray(byte_t* b, int32_t buffer_length,
+MemoryByteArray::MemoryByteArray(byte_t* b,
+                                 int32_t buffer_length,
                                  int32_t filled_length)
     : ByteArray(filled_length, buffer_length), b_(b), allocated_(false) {
 }
 
 MemoryByteArray::~MemoryByteArray() {
-  close();
+  Close();
 }
 
-void MemoryByteArray::init() {
+void MemoryByteArray::Init() {
   if (allocated_ && b_ == NULL) {
-    b_ = new byte_t[size()];
-    memset(b_, 0, size());
+    b_ = new byte_t[Size()];
+    memset(b_, 0, Size());
   }
 }
 
-bool MemoryByteArray::internalPut(int32_t index, byte_t b) {
-  init();
+bool MemoryByteArray::InternalPut(int32_t index, byte_t b) {
+  Init();
   b_[index] = b;
   return true;
 }
 
-int32_t MemoryByteArray::internalPut(int32_t index, ByteVector* b,
-                                     int32_t offset, int32_t length) {
-  init();
+int32_t MemoryByteArray::InternalPut(int32_t index,
+                                     ByteVector* b,
+                                     int32_t offset,
+                                     int32_t length) {
+  Init();
   memcpy(b_ + index, &((*b)[offset]), length);
   return length;
 }
 
-byte_t MemoryByteArray::internalGet(int32_t index) {
-  init();
+byte_t MemoryByteArray::InternalGet(int32_t index) {
+  Init();
   return b_[index];
 }
 
-int32_t MemoryByteArray::internalGet(int32_t index, ByteVector* b,
-                                     int32_t offset, int32_t length) {
-  init();
+int32_t MemoryByteArray::InternalGet(int32_t index,
+                                     ByteVector* b,
+                                     int32_t offset,
+                                     int32_t length) {
+  Init();
   memcpy(&((*b)[offset]), b_ + index, length);
   return length;
 }
 
-void MemoryByteArray::close() {
+void MemoryByteArray::Close() {
   if (allocated_ && b_) {
     delete[] b_;
   }
   b_ = NULL;
 }
 
-byte_t* MemoryByteArray::begin() {
-  init();
+byte_t* MemoryByteArray::Begin() {
+  Init();
   return b_;
 }
 
diff --git a/sfntly/data/memory_byte_array.h b/sfntly/data/memory_byte_array.h
index 34b26a6..171dcc7 100644
--- a/sfntly/data/memory_byte_array.h
+++ b/sfntly/data/memory_byte_array.h
@@ -29,17 +29,21 @@
   virtual ~MemoryByteArray();
 
  protected:
-  virtual bool internalPut(int32_t index, byte_t b);
-  virtual int32_t internalPut(int32_t index, ByteVector* b, int32_t offset,
+  virtual bool InternalPut(int32_t index, byte_t b);
+  virtual int32_t InternalPut(int32_t index,
+                              ByteVector* b,
+                              int32_t offset,
                               int32_t length);
-  virtual byte_t internalGet(int32_t index);
-  virtual int32_t internalGet(int32_t index, ByteVector* b, int32_t offset,
+  virtual byte_t InternalGet(int32_t index);
+  virtual int32_t InternalGet(int32_t index,
+                              ByteVector* b,
+                              int32_t offset,
                               int32_t length);
-  virtual void close();
-  virtual byte_t* begin();
+  virtual void Close();
+  virtual byte_t* Begin();
 
  private:
-  void init();  // C++ port only, used to allocate memory outside constructor.
+  void Init();  // C++ port only, used to allocate memory outside constructor.
 
   byte_t* b_;
   bool allocated_;
diff --git a/sfntly/data/readable_font_data.cc b/sfntly/data/readable_font_data.cc
index fa7279e..5f8478d 100644
--- a/sfntly/data/readable_font_data.cc
+++ b/sfntly/data/readable_font_data.cc
@@ -20,27 +20,148 @@
 
 namespace sfntly {
 
+ReadableFontData::ReadableFontData(ByteArray* array)
+    : FontData(array),
+      checksum_set_(false),
+      checksum_(0) {
+}
+
 ReadableFontData::~ReadableFontData() {}
 
-ReadableFontData::ReadableFontData(ByteArray* array)
-    : FontData(array), checksum_set_(false), checksum_(0) {
+int64_t ReadableFontData::Checksum() {
+  // TODO(arthurhsu): IMPLEMENT: atomicity
+  if (!checksum_set_) {
+    ComputeChecksum();
+  }
+  return checksum_;
+}
+
+void ReadableFontData::SetCheckSumRanges(const IntegerList& ranges) {
+  checksum_range_ = ranges;
+  checksum_set_ = false;  // UNIMPLEMENTED: atomicity
+}
+
+int32_t ReadableFontData::ReadUByte(int32_t index) {
+  return 0xff & array_->Get(BoundOffset(index));
+}
+
+int32_t ReadableFontData::ReadByte(int32_t index) {
+  return (array_->Get(BoundOffset(index)) << 24) >> 24;
+}
+
+int32_t ReadableFontData::ReadBytes(int32_t index,
+                                    ByteVector* b,
+                                    int32_t offset,
+                                    int32_t length) {
+  return array_->Get(BoundOffset(index), b, offset, BoundLength(index, length));
+}
+
+int32_t ReadableFontData::ReadChar(int32_t index) {
+  return ReadUByte(index);
+}
+
+int32_t ReadableFontData::ReadUShort(int32_t index) {
+  return 0xffff & (ReadUByte(index) << 8 | ReadUByte(index + 1));
+}
+
+int32_t ReadableFontData::ReadShort(int32_t index) {
+  return ((ReadByte(index) << 8 | ReadUByte(index + 1)) << 16) >> 16;
+}
+
+int32_t ReadableFontData::ReadUInt24(int32_t index) {
+  return 0xffffff & (ReadUByte(index) << 16 |
+                     ReadUByte(index + 1) << 8 |
+                     ReadUByte(index + 2));
+}
+
+int64_t ReadableFontData::ReadULong(int32_t index) {
+  return 0xffffffffL & (ReadUByte(index) << 24 |
+                        ReadUByte(index + 1) << 16 |
+                        ReadUByte(index + 2) << 8 |
+                        ReadUByte(index + 3));
+}
+
+int32_t ReadableFontData::ReadULongAsInt(int32_t index) {
+  int64_t ulong = ReadULong(index);
+#if !defined (SFNTLY_NO_EXCEPTION)
+  if ((ulong & 0x80000000) == 0x80000000) {
+    throw ArithmeticException("Long value too large to fit into an integer.");
+  }
+#endif
+  return ((int32_t)ulong) & ~0x80000000;
+}
+
+int32_t ReadableFontData::ReadLong(int32_t index) {
+  return ReadByte(index) << 24 |
+         ReadUByte(index + 1) << 16 |
+         ReadUByte(index + 2) << 8 |
+         ReadUByte(index + 3);
+}
+
+int32_t ReadableFontData::ReadFixed(int32_t index) {
+  return ReadLong(index);
+}
+
+int64_t ReadableFontData::ReadDateTimeAsLong(int32_t index) {
+  return (int64_t)ReadULong(index) << 32 | ReadULong(index + 4);
+}
+
+int32_t ReadableFontData::ReadFWord(int32_t index) {
+  return ReadShort(index);
+}
+
+int32_t ReadableFontData::ReadFUFWord(int32_t index) {
+  return ReadUShort(index);
+}
+
+int32_t ReadableFontData::CopyTo(OutputStream* os) {
+  return array_->CopyTo(os, BoundOffset(0), Length());
+}
+
+int32_t ReadableFontData::CopyTo(WritableFontData* wfd) {
+  return array_->CopyTo(wfd->BoundOffset(0),
+                        wfd->array_,
+                        BoundOffset(0),
+                        Length());
+}
+
+int32_t ReadableFontData::CopyTo(ByteArray* ba) {
+  return array_->CopyTo(ba, BoundOffset(0), Length());
+}
+
+CALLER_ATTACH FontData* ReadableFontData::Slice(int32_t offset,
+                                                int32_t length) {
+  if (offset < 0 || offset + length > Size()) {
+    return NULL;
+  }
+  FontDataPtr slice = new ReadableFontData(this, offset, length);
+  // Note: exception not ported because the condition is always false in C++.
+  // if (slice == null) { throw new IndexOutOfBoundsException( ...
+  return slice.Detach();
+}
+
+CALLER_ATTACH FontData* ReadableFontData::Slice(int32_t offset) {
+  if (offset < 0 || offset > Size()) {
+    return NULL;
+  }
+  FontDataPtr slice = new ReadableFontData(this, offset);
+  // Note: exception not ported because the condition is always false in C++.
+  // if (slice == null) { throw new IndexOutOfBoundsException( ...
+  return slice.Detach();
 }
 
 ReadableFontData::ReadableFontData(ReadableFontData* data, int32_t offset)
-    : FontData(data, offset), checksum_set_(false), checksum_(0) {
+    : FontData(data, offset),
+      checksum_set_(false),
+      checksum_(0) {
 }
 
-ReadableFontData::ReadableFontData(ReadableFontData* data, int32_t offset,
+ReadableFontData::ReadableFontData(ReadableFontData* data,
+                                   int32_t offset,
                                    int32_t length)
-    : FontData(data, offset, length), checksum_set_(false), checksum_(0) {
-}
-
-int64_t ReadableFontData::checksum() {
-  // TODO(arthurhsu): IMPLEMENT: atomicity
-  if (!checksum_set_) {
-    computeChecksum();
-  }
-  return checksum_;
+    : FontData(data, offset, length),
+      checksum_set_(false),
+      checksum_(0) {
 }
 
 /* OpenType checksum
@@ -54,19 +175,19 @@
 return Sum;
 }
 */
-void ReadableFontData::computeChecksum() {
+void ReadableFontData::ComputeChecksum() {
   // TODO(arthurhsu): IMPLEMENT: synchronization/atomicity
   int64_t sum = 0;
   if (checksum_range_.empty()) {
-    sum = computeCheckSum(0, length());
+    sum = ComputeCheckSum(0, Length());
   } else {
     for (uint32_t low_bound_index = 0; low_bound_index < checksum_range_.size();
          low_bound_index += 2) {
       int32_t low_bound = checksum_range_[low_bound_index];
       int32_t high_bound = (low_bound_index == checksum_range_.size() - 1) ?
-                                length() :
+                                Length() :
                                 checksum_range_[low_bound_index + 1];
-      sum += computeCheckSum(low_bound, high_bound);
+      sum += ComputeCheckSum(low_bound, high_bound);
     }
   }
 
@@ -74,126 +195,21 @@
   checksum_set_ = true;
 }
 
-int64_t ReadableFontData::computeCheckSum(int32_t low_bound,
+int64_t ReadableFontData::ComputeCheckSum(int32_t low_bound,
                                           int32_t high_bound) {
   int64_t sum = 0;
   for (int32_t i = low_bound; i < high_bound; i += 4) {
-    int32_t b3 = readUByte(i);
+    int32_t b3 = ReadUByte(i);
     b3 = (b3 == -1) ? 0 : b3;
-    int32_t b2 = readUByte(i + 1);
+    int32_t b2 = ReadUByte(i + 1);
     b2 = (b2 == -1) ? 0 : b2;
-    int32_t b1 = readUByte(i + 2);
+    int32_t b1 = ReadUByte(i + 2);
     b1 = (b1 == -1) ? 0 : b1;
-    int32_t b0 = readUByte(i + 3);
+    int32_t b0 = ReadUByte(i + 3);
     b0 = (b0 == -1) ? 0 : b0;
     sum += (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
   }
   return sum;
 }
 
-void ReadableFontData::setCheckSumRanges(const IntegerList& ranges) {
-  checksum_range_ = ranges;
-  checksum_set_ = false;  // UNIMPLEMENTED: atomicity
-}
-
-int32_t ReadableFontData::readUByte(int32_t index) {
-  return 0xff & array_->get(boundOffset(index));
-}
-
-int32_t ReadableFontData::readByte(int32_t index) {
-  return (array_->get(boundOffset(index)) << 24) >> 24;
-}
-
-int32_t ReadableFontData::readBytes(int32_t index, ByteVector* b,
-                                    int32_t offset, int32_t length) {
-  return array_->get(boundOffset(index), b, offset, boundLength(index, length));
-}
-
-int32_t ReadableFontData::readChar(int32_t index) {
-  return readUByte(index);
-}
-
-int32_t ReadableFontData::readUShort(int32_t index) {
-  return 0xffff & (readUByte(index) << 8 | readUByte(index + 1));
-}
-
-int32_t ReadableFontData::readShort(int32_t index) {
-  return ((readByte(index) << 8 | readUByte(index + 1)) << 16) >> 16;
-}
-
-int32_t ReadableFontData::readUInt24(int32_t index) {
-  return 0xffffff & (readUByte(index) << 16 |
-                     readUByte(index + 1) << 8 | readUByte(index + 2));
-}
-
-int64_t ReadableFontData::readULong(int32_t index) {
-  return 0xffffffffL & (readUByte(index) << 24 | readUByte(index + 1) << 16 |
-                        readUByte(index + 2) << 8 | readUByte(index + 3));
-}
-
-int32_t ReadableFontData::readULongAsInt(int32_t index) {
-  int64_t ulong = readULong(index);
-#if !defined (SFNTLY_NO_EXCEPTION)
-  if ((ulong & 0x80000000) == 0x80000000) {
-    throw ArithmeticException("Long value too large to fit into an integer.");
-  }
-#endif
-  return ((int32_t)ulong) & ~0x80000000;
-}
-
-int32_t ReadableFontData::readLong(int32_t index) {
-  return readByte(index) << 24 | readUByte(index + 1) << 16 |
-         readUByte(index + 2) << 8 | readUByte(index + 3);
-}
-
-int32_t ReadableFontData::readFixed(int32_t index) {
-  return readLong(index);
-}
-
-int64_t ReadableFontData::readDateTimeAsLong(int32_t index) {
-  return (int64_t)readULong(index) << 32 | readULong(index + 4);
-}
-
-int32_t ReadableFontData::readFWord(int32_t index) {
-  return readShort(index);
-}
-
-int32_t ReadableFontData::readFUFWord(int32_t index) {
-  return readUShort(index);
-}
-
-int32_t ReadableFontData::copyTo(OutputStream* os) {
-  return array_->copyTo(os, boundOffset(0), length());
-}
-
-int32_t ReadableFontData::copyTo(WritableFontData* wfd) {
-  return array_->copyTo(wfd->boundOffset(0), wfd->array_, boundOffset(0),
-                        length());
-}
-
-int32_t ReadableFontData::copyTo(ByteArray* ba) {
-  return array_->copyTo(ba, boundOffset(0), length());
-}
-
-CALLER_ATTACH FontData* ReadableFontData::slice(int32_t offset,
-                                                int32_t length) {
-  if (offset < 0 || offset + length > size()) {
-    return NULL;
-  }
-  FontDataPtr slice = new ReadableFontData(this, offset, length);
-  // Note: exception not ported because the condition is always false in C++.
-  // if (slice == null) { throw new IndexOutOfBoundsException( ...
-  return slice.detach();
-}
-
-CALLER_ATTACH FontData* ReadableFontData::slice(int32_t offset) {
-  if (offset < 0 || offset > size()) {
-    return NULL;
-  }
-  FontDataPtr slice = new ReadableFontData(this, offset);
-  // Note: exception not ported because the condition is always false in C++.
-  // if (slice == null) { throw new IndexOutOfBoundsException( ...
-  return slice.detach();
-}
-
 }  // namespace sfntly
diff --git a/sfntly/data/readable_font_data.h b/sfntly/data/readable_font_data.h
index be466de..b1ca846 100644
--- a/sfntly/data/readable_font_data.h
+++ b/sfntly/data/readable_font_data.h
@@ -30,6 +30,69 @@
   explicit ReadableFontData(ByteArray* array);
   virtual ~ReadableFontData();
 
+  // Get a computed checksum for the data. This checksum uses the OpenType spec
+  // calculation. Every ULong value (32 bit unsigned) in the data is summed and
+  // the resulting value is truncated to 32 bits. If the data length in bytes is
+  // not an integral multiple of 4 then any remaining bytes are treated as the
+  // start of a 4 byte sequence whose remaining bytes are zero.
+  // @return the checksum
+  int64_t Checksum();
+
+  // Sets the bounds to use for computing the checksum. These bounds are in
+  // begin and end pairs. If an odd number is given then the final range is
+  // assumed to extend to the end of the data. The lengths of each range must be
+  // a multiple of 4.
+  // @param ranges the range bounds to use for the checksum
+  void SetCheckSumRanges(const IntegerList& ranges);
+
+  virtual int32_t ReadUByte(int32_t index);
+  virtual int32_t ReadByte(int32_t index);
+  virtual int32_t ReadBytes(int32_t index, ByteVector* b, int32_t offset,
+                            int32_t length);
+  virtual int32_t ReadChar(int32_t index);
+  virtual int32_t ReadUShort(int32_t index);
+  virtual int32_t ReadShort(int32_t index);
+  virtual int32_t ReadUInt24(int32_t index);
+  virtual int64_t ReadULong(int32_t index);
+  virtual int32_t ReadULongAsInt(int32_t index);
+  virtual int32_t ReadLong(int32_t index);
+  virtual int32_t ReadFixed(int32_t index);
+  virtual int64_t ReadDateTimeAsLong(int32_t index);
+
+  virtual int32_t ReadFWord(int32_t index);
+  virtual int32_t ReadFUFWord(int32_t index);
+
+  virtual int32_t CopyTo(OutputStream* os);
+  virtual int32_t CopyTo(WritableFontData* wfd);
+  virtual int32_t CopyTo(ByteArray* ba);
+
+  // TODO(arthurhsu): IMPLEMENT
+  /*
+  virtual int32_t ReadFUnit(int32_t index);
+  virtual int64_t ReadF2Dot14(int32_t index);
+  virtual int64_t ReadLongDateTime(int32_t index);
+  virtual int32_t SearchUShort(int32_t start, int32_t length, int32_t key);
+  virtual int32_t SearchUShort(int32_t start_index, int32_t start_offset,
+                               int32_t count_index, int32_t count_offset,
+                               int32_t length, int32_t key);
+  virtual int32_t SearchULong(int32_t start_index, int32_t start_offset,
+                              int32_t end_index, int32_t end_offset,
+                              int32_t length, int32_t key);
+  */
+
+  // Makes a slice of this FontData. The returned slice will share the data with
+  // the original FontData.
+  // @param offset the start of the slice
+  // @param length the number of bytes in the slice
+  // @return a slice of the original FontData
+  virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length);
+
+  // Makes a bottom bound only slice of this array. The returned slice will
+  // share the data with the original FontData.
+  // @param offset the start of the slice
+  // @return a slice of the original FontData
+  virtual CALLER_ATTACH FontData* Slice(int32_t offset);
+
  protected:
   // Constructor. Creates a bounded wrapper of another ReadableFontData from the
   // given offset until the end of the original ReadableFontData.
@@ -44,76 +107,10 @@
   ReadableFontData(ReadableFontData* data, int32_t offset, int32_t length);
 
  private:
-  void computeChecksum();
-  int64_t computeCheckSum(int32_t low_bound, int32_t high_bound);
+  void ComputeChecksum();
+  int64_t ComputeCheckSum(int32_t low_bound, int32_t high_bound);
 
- public:
-  // Get a computed checksum for the data. This checksum uses the OpenType spec
-  // calculation. Every ULong value (32 bit unsigned) in the data is summed and
-  // the resulting value is truncated to 32 bits. If the data length in bytes is
-  // not an integral multiple of 4 then any remaining bytes are treated as the
-  // start of a 4 byte sequence whose remaining bytes are zero.
-  // @return the checksum
-  int64_t checksum();
-
-  // Sets the bounds to use for computing the checksum. These bounds are in
-  // begin and end pairs. If an odd number is given then the final range is
-  // assumed to extend to the end of the data. The lengths of each range must be
-  // a multiple of 4.
-  // @param ranges the range bounds to use for the checksum
-  void setCheckSumRanges(const IntegerList& ranges);
-
- public:
-  virtual int32_t readUByte(int32_t index);
-  virtual int32_t readByte(int32_t index);
-  virtual int32_t readBytes(int32_t index, ByteVector* b, int32_t offset,
-                            int32_t length);
-  virtual int32_t readChar(int32_t index);
-  virtual int32_t readUShort(int32_t index);
-  virtual int32_t readShort(int32_t index);
-  virtual int32_t readUInt24(int32_t index);
-  virtual int64_t readULong(int32_t index);
-  virtual int32_t readULongAsInt(int32_t index);
-  virtual int32_t readLong(int32_t index);
-  virtual int32_t readFixed(int32_t index);
-  virtual int64_t readDateTimeAsLong(int32_t index);
-
-  virtual int32_t readFWord(int32_t index);
-  virtual int32_t readFUFWord(int32_t index);
-
-  virtual int32_t copyTo(OutputStream* os);
-  virtual int32_t copyTo(WritableFontData* wfd);
-  virtual int32_t copyTo(ByteArray* ba);
-
-  // TODO(arthurhsu): IMPLEMENT
-  /*
-  virtual int32_t readFUnit(int32_t index);
-  virtual int64_t readF2Dot14(int32_t index);
-  virtual int64_t readLongDateTime(int32_t index);
-  virtual int32_t searchUShort(int32_t start, int32_t length, int32_t key);
-  virtual int32_t searchUShort(int32_t start_index, int32_t start_offset,
-                               int32_t count_index, int32_t count_offset,
-                               int32_t length, int32_t key);
-  virtual int32_t searchULong(int32_t start_index, int32_t start_offset,
-                              int32_t end_index, int32_t end_offset,
-                              int32_t length, int32_t key);
-  */
-
-  // Makes a slice of this FontData. The returned slice will share the data with
-  // the original FontData.
-  // @param offset the start of the slice
-  // @param length the number of bytes in the slice
-  // @return a slice of the original FontData
-  virtual CALLER_ATTACH FontData* slice(int32_t offset, int32_t length);
-
-  // Makes a bottom bound only slice of this array. The returned slice will
-  // share the data with the original FontData.
-  // @param offset the start of the slice
-  // @return a slice of the original FontData
-  virtual CALLER_ATTACH FontData* slice(int32_t offset);
-
- private:
-  bool checksum_set_;  // TODO(arthurhsu): IMPLEMENT: must be set atomically
+  bool checksum_set_;  // TODO(arthurhsu): IMPLEMENT: must be set atomically.
   int64_t checksum_;
   IntegerList checksum_range_;
 };
diff --git a/sfntly/data/writable_font_data.cc b/sfntly/data/writable_font_data.cc
index 8588acb..586acc1 100644
--- a/sfntly/data/writable_font_data.cc
+++ b/sfntly/data/writable_font_data.cc
@@ -18,111 +18,116 @@
 
 namespace sfntly {
 
+WritableFontData::WritableFontData(ByteArray* ba) : ReadableFontData(ba) {
+}
+
 WritableFontData::~WritableFontData() {}
 
-WritableFontData::WritableFontData(ByteArray* ba) : ReadableFontData(ba) {
+int32_t WritableFontData::WriteByte(int32_t index, byte_t b) {
+  array_->Put(BoundOffset(index), b);
+  return 1;
+}
+
+int32_t WritableFontData::WriteBytes(int32_t offset,
+                                     ByteVector* b,
+                                     int32_t index,
+                                     int32_t length) {
+  return array_->Put(BoundOffset(offset),
+                     b,
+                     index,
+                     BoundLength(offset, length));
+}
+
+int32_t WritableFontData::WriteBytes(int32_t index, ByteVector* b) {
+  return WriteBytes(index, b, 0, b->size());
+}
+
+int32_t WritableFontData::WriteChar(int32_t index, byte_t c) {
+  return WriteByte(index, c);
+}
+
+int32_t WritableFontData::WriteUShort(int32_t index, int32_t us) {
+  WriteByte(index, (byte_t)((us >> 8) & 0xff));
+  WriteByte(index + 1, (byte_t)(us & 0xff));
+  return 2;
+}
+
+int32_t WritableFontData::WriteUShortLE(int32_t index, int32_t us) {
+  WriteByte(index, (byte_t)(us & 0xff));
+  WriteByte(index + 1, (byte_t)((us >> 8) & 0xff));
+  return 2;
+}
+
+int32_t WritableFontData::WriteShort(int32_t index, int32_t s) {
+  return WriteUShort(index, s);
+}
+
+int32_t WritableFontData::WriteUInt24(int32_t index, int32_t ui) {
+  WriteByte(index, (byte_t)((ui >> 16) & 0xff));
+  WriteByte(index + 1, (byte_t)((ui >> 8) & 0xff));
+  WriteByte(index + 2, (byte_t)(ui & 0xff));
+  return 3;
+}
+
+int32_t WritableFontData::WriteULong(int32_t index, int64_t ul) {
+  WriteByte(index, (byte_t)((ul >> 24) & 0xff));
+  WriteByte(index + 1, (byte_t)((ul >> 16) & 0xff));
+  WriteByte(index + 2, (byte_t)((ul >> 8) & 0xff));
+  WriteByte(index + 3, (byte_t)(ul & 0xff));
+  return 4;
+}
+
+int32_t WritableFontData::WriteULongLE(int32_t index, int64_t ul) {
+  WriteByte(index, (byte_t)(ul & 0xff));
+  WriteByte(index + 1, (byte_t)((ul >> 8) & 0xff));
+  WriteByte(index + 2, (byte_t)((ul >> 16) & 0xff));
+  WriteByte(index + 3, (byte_t)((ul >> 24) & 0xff));
+  return 4;
+}
+
+int32_t WritableFontData::WriteLong(int32_t index, int64_t l) {
+  return WriteULong(index, l);
+}
+
+int32_t WritableFontData::WriteFixed(int32_t index, int32_t l) {
+  return WriteLong(index, l);
+}
+
+int32_t WritableFontData::WriteDateTime(int32_t index, int64_t date) {
+  WriteULong(index, (date >> 32) & 0xffffffff);
+  WriteULong(index + 4, date & 0xffffffff);
+  return 8;
+}
+
+CALLER_ATTACH FontData* WritableFontData::Slice(int32_t offset,
+                                                int32_t length) {
+  if (offset < 0 || offset + length > Size()) {
+    return NULL;
+  }
+  FontDataPtr slice = new WritableFontData(this, offset, length);
+  // Note: exception not ported because the condition is always false in C++.
+  // if (slice == null) { throw new IndexOutOfBoundsException( ...
+  return slice.Detach();
+}
+
+CALLER_ATTACH FontData* WritableFontData::Slice(int32_t offset) {
+  if (offset > Size()) {
+    return NULL;
+  }
+  FontDataPtr slice = new WritableFontData(this, offset);
+  // Note: exception not ported because the condition is always false in C++.
+  // if (slice == null) { throw new IndexOutOfBoundsException( ...
+  return slice.Detach();
 }
 
 WritableFontData::WritableFontData(WritableFontData* data, int32_t offset)
     : ReadableFontData(data, offset) {
 }
 
-WritableFontData::WritableFontData(WritableFontData* data, int32_t offset,
+WritableFontData::WritableFontData(WritableFontData* data,
+                                   int32_t offset,
                                    int32_t length)
     : ReadableFontData(data, offset, length) {
 }
 
-int32_t WritableFontData::writeByte(int32_t index, byte_t b) {
-  array_->put(boundOffset(index), b);
-  return 1;
-}
-
-int32_t WritableFontData::writeBytes(int32_t offset, ByteVector* b,
-                                     int32_t index, int32_t length) {
-  return array_->put(boundOffset(offset), b, index,
-                     boundLength(offset, length));
-}
-
-int32_t WritableFontData::writeBytes(int32_t index, ByteVector* b) {
-  return writeBytes(index, b, 0, b->size());
-}
-
-int32_t WritableFontData::writeChar(int32_t index, byte_t c) {
-  return writeByte(index, c);
-}
-
-int32_t WritableFontData::writeUShort(int32_t index, int32_t us) {
-  writeByte(index, (byte_t)((us >> 8) & 0xff));
-  writeByte(index + 1, (byte_t)(us & 0xff));
-  return 2;
-}
-
-int32_t WritableFontData::writeUShortLE(int32_t index, int32_t us) {
-  writeByte(index, (byte_t)(us & 0xff));
-  writeByte(index + 1, (byte_t)((us >> 8) & 0xff));
-  return 2;
-}
-
-int32_t WritableFontData::writeShort(int32_t index, int32_t s) {
-  return writeUShort(index, s);
-}
-
-int32_t WritableFontData::writeUInt24(int32_t index, int32_t ui) {
-  writeByte(index, (byte_t)((ui >> 16) & 0xff));
-  writeByte(index + 1, (byte_t)((ui >> 8) & 0xff));
-  writeByte(index + 2, (byte_t)(ui & 0xff));
-  return 3;
-}
-
-int32_t WritableFontData::writeULong(int32_t index, int64_t ul) {
-  writeByte(index, (byte_t)((ul >> 24) & 0xff));
-  writeByte(index + 1, (byte_t)((ul >> 16) & 0xff));
-  writeByte(index + 2, (byte_t)((ul >> 8) & 0xff));
-  writeByte(index + 3, (byte_t)(ul & 0xff));
-  return 4;
-}
-
-int32_t WritableFontData::writeULongLE(int32_t index, int64_t ul) {
-  writeByte(index, (byte_t)(ul & 0xff));
-  writeByte(index + 1, (byte_t)((ul >> 8) & 0xff));
-  writeByte(index + 2, (byte_t)((ul >> 16) & 0xff));
-  writeByte(index + 3, (byte_t)((ul >> 24) & 0xff));
-  return 4;
-}
-
-int32_t WritableFontData::writeLong(int32_t index, int64_t l) {
-  return writeULong(index, l);
-}
-
-int32_t WritableFontData::writeFixed(int32_t index, int32_t l) {
-  return writeLong(index, l);
-}
-
-int32_t WritableFontData::writeDateTime(int32_t index, int64_t date) {
-  writeULong(index, (date >> 32) & 0xffffffff);
-  writeULong(index + 4, date & 0xffffffff);
-  return 8;
-}
-
-CALLER_ATTACH FontData* WritableFontData::slice(int32_t offset,
-                                                int32_t length) {
-  if (offset < 0 || offset + length > size()) {
-    return NULL;
-  }
-  FontDataPtr slice = new WritableFontData(this, offset, length);
-  // Note: exception not ported because the condition is always false in C++.
-  // if (slice == null) { throw new IndexOutOfBoundsException( ...
-  return slice.detach();
-}
-
-CALLER_ATTACH FontData* WritableFontData::slice(int32_t offset) {
-  if (offset > size()) {
-    return NULL;
-  }
-  FontDataPtr slice = new WritableFontData(this, offset);
-  // Note: exception not ported because the condition is always false in C++.
-  // if (slice == null) { throw new IndexOutOfBoundsException( ...
-  return slice.detach();
-}
-
 }  // namespace sfntly
diff --git a/sfntly/data/writable_font_data.h b/sfntly/data/writable_font_data.h
index 9542cd0..98c9204 100644
--- a/sfntly/data/writable_font_data.h
+++ b/sfntly/data/writable_font_data.h
@@ -26,38 +26,39 @@
   explicit WritableFontData(ByteArray* ba);
   virtual ~WritableFontData();
 
- private:
-  WritableFontData(WritableFontData* data, int32_t offset);
-  WritableFontData(WritableFontData* data, int32_t offset, int32_t length);
-
- public:
-  virtual int32_t writeByte(int32_t index, byte_t b);
-  virtual int32_t writeBytes(int32_t offset, ByteVector* b, int32_t index,
+  virtual int32_t WriteByte(int32_t index, byte_t b);
+  virtual int32_t WriteBytes(int32_t offset,
+                             ByteVector* b,
+                             int32_t index,
                              int32_t length);
-  virtual int32_t writeBytes(int32_t index, ByteVector* b);
-  virtual int32_t writeChar(int32_t index, byte_t c);
-  virtual int32_t writeUShort(int32_t index, int32_t us);
-  virtual int32_t writeUShortLE(int32_t index, int32_t us);
-  virtual int32_t writeShort(int32_t index, int32_t s);
-  virtual int32_t writeUInt24(int32_t index, int32_t ui);
-  virtual int32_t writeULong(int32_t index, int64_t ul);
-  virtual int32_t writeULongLE(int32_t index, int64_t ul);
-  virtual int32_t writeLong(int32_t index, int64_t l);
-  virtual int32_t writeFixed(int32_t index, int32_t l);
-  virtual int32_t writeDateTime(int32_t index, int64_t date);
+  virtual int32_t WriteBytes(int32_t index, ByteVector* b);
+  virtual int32_t WriteChar(int32_t index, byte_t c);
+  virtual int32_t WriteUShort(int32_t index, int32_t us);
+  virtual int32_t WriteUShortLE(int32_t index, int32_t us);
+  virtual int32_t WriteShort(int32_t index, int32_t s);
+  virtual int32_t WriteUInt24(int32_t index, int32_t ui);
+  virtual int32_t WriteULong(int32_t index, int64_t ul);
+  virtual int32_t WriteULongLE(int32_t index, int64_t ul);
+  virtual int32_t WriteLong(int32_t index, int64_t l);
+  virtual int32_t WriteFixed(int32_t index, int32_t l);
+  virtual int32_t WriteDateTime(int32_t index, int64_t date);
 
   // Makes a slice of this FontData. The returned slice will share the data with
   // the original FontData.
   // @param offset the start of the slice
   // @param length the number of bytes in the slice
   // @return a slice of the original FontData
-  virtual CALLER_ATTACH FontData* slice(int32_t offset, int32_t length);
+  virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length);
 
   // Makes a bottom bound only slice of this array. The returned slice will
   // share the data with the original FontData.
   // @param offset the start of the slice
   // @return a slice of the original FontData
-  virtual CALLER_ATTACH FontData* slice(int32_t offset);
+  virtual CALLER_ATTACH FontData* Slice(int32_t offset);
+
+ private:
+  WritableFontData(WritableFontData* data, int32_t offset);
+  WritableFontData(WritableFontData* data, int32_t offset, int32_t length);
 };
 typedef Ptr<WritableFontData> WritableFontDataPtr;
 
diff --git a/sfntly/font.cc b/sfntly/font.cc
index bd5614f..fefa17e 100644
--- a/sfntly/font.cc
+++ b/sfntly/font.cc
@@ -14,95 +14,85 @@
  * limitations under the License.
  */
 
+#include "sfntly/font.h"
+
 #include <functional>
 #include <algorithm>
 #include <map>
 #include <typeinfo>
 
-#include "sfntly/font.h"
+#include "sfntly/data/font_input_stream.h"
 #include "sfntly/font_factory.h"
-#include "sfntly/tag.h"
 #include "sfntly/math/fixed1616.h"
 #include "sfntly/math/font_math.h"
-#include "sfntly/data/font_input_stream.h"
 #include "sfntly/font_header_table.h"
 #include "sfntly/horizontal_header_table.h"
 #include "sfntly/horizontal_metrics_table.h"
-#include "sfntly/maximum_profile_table.h"
 #include "sfntly/loca_table.h"
+#include "sfntly/maximum_profile_table.h"
 #include "sfntly/port/exception_type.h"
+#include "sfntly/tag.h"
 
 namespace sfntly {
 
-const int32_t SFNTVERSION_1 = Fixed1616::fixed(1, 0);
+const int32_t SFNTVERSION_1 = Fixed1616::Fixed(1, 0);
 
 /******************************************************************************
  * Font class
  ******************************************************************************/
 Font::~Font() {}
 
+bool Font::HasTable(int32_t tag) {
+  TableMap::const_iterator result = tables_.find(tag);
+  TableMap::const_iterator end = tables_.end();
+  return (result != end);
+}
+
+Table* Font::GetTable(int32_t tag) {
+  if (!HasTable(tag)) {
+    return NULL;
+  }
+  return tables_[tag];
+}
+
+TableMap* Font::Tables() {
+  return &tables_;
+}
+
+void Font::Serialize(OutputStream* os, IntegerList* table_ordering) {
+  assert(table_ordering);
+  IntegerList final_table_ordering;
+  TableOrdering(table_ordering, &final_table_ordering);
+  TableHeaderList table_records;
+  BuildTableHeadersForSerialization(&final_table_ordering, &table_records);
+
+  FontOutputStream fos(os);
+  SerializeHeader(&fos, &table_records);
+  SerializeTables(&fos, &table_records);
+}
+
+CALLER_ATTACH WritableFontData* Font::GetNewData(int32_t size) {
+  return factory_->GetNewData(size);
+}
+
 Font::Font(FontFactory* factory, int32_t sfnt_version, ByteVector* digest,
            TableMap* tables)
-    : factory_(factory), sfnt_version_(sfnt_version) {
+    : factory_(factory),
+      sfnt_version_(sfnt_version) {
   // non-trivial assignments that makes debugging hard if placed in
   // initialization list
   digest_ = *digest;
   tables_ = *tables;
 }
 
-int32_t Font::version() {
-  return sfnt_version_;
-}
-
-ByteVector* Font::digest() {
-  return &digest_;
-}
-
-int64_t Font::checksum() {
-  return checksum_;
-}
-
-int32_t Font::numTables() {
-  return (int32_t)tables_.size();
-}
-
-bool Font::hasTable(int32_t tag) {
-  TableMap::const_iterator result = tables_.find(tag);
-  TableMap::const_iterator end = tables_.end();
-  return (result != end);
-}
-
-Table* Font::table(int32_t tag) {
-  if (!hasTable(tag)) {
-    return NULL;
-  }
-  return tables_[tag];
-}
-
-TableMap* Font::tables() {
-  return &tables_;
-}
-
-void Font::serialize(OutputStream* os, IntegerList* table_ordering) {
-  assert(table_ordering);
-  IntegerList final_table_ordering;
-  tableOrdering(table_ordering, &final_table_ordering);
-  TableHeaderList table_records;
-  buildTableHeadersForSerialization(&final_table_ordering, &table_records);
-
-  FontOutputStream fos(os);
-  serializeHeader(&fos, &table_records);
-  serializeTables(&fos, &table_records);
-}
-
-void Font::buildTableHeadersForSerialization(IntegerList* table_ordering,
+void Font::BuildTableHeadersForSerialization(IntegerList* table_ordering,
                                              TableHeaderList* table_headers) {
   assert(table_headers);
   assert(table_ordering);
 
   IntegerList final_table_ordering;
-  tableOrdering(table_ordering, &final_table_ordering);
-  int32_t table_offset = Offset::kTableRecordBegin + numTables() *
+  TableOrdering(table_ordering, &final_table_ordering);
+  int32_t table_offset = Offset::kTableRecordBegin + num_tables() *
                          Offset::kTableRecordSize;
   for (IntegerList::iterator tag = final_table_ordering.begin(),
                              tag_end = final_table_ordering.end();
@@ -110,42 +100,42 @@
     TablePtr table = tables_[*tag];
     if (table != NULL) {
       TableHeaderPtr header =
-          new Table::Header(*tag, table->calculatedChecksum(), table_offset,
-                            table->length());
+          new Table::Header(*tag, table->CalculatedChecksum(), table_offset,
+                            table->Length());
       table_headers->push_back(header);
-      table_offset += (table->length() + 3) & ~3;
+      table_offset += (table->Length() + 3) & ~3;
     }
   }
 }
 
-void Font::serializeHeader(FontOutputStream* fos,
+void Font::SerializeHeader(FontOutputStream* fos,
                            TableHeaderList* table_headers) {
-  fos->writeFixed(sfnt_version_);
-  fos->writeUShort(table_headers->size());
-  int32_t log2_of_max_power_of_2 = FontMath::log2(table_headers->size());
+  fos->WriteFixed(sfnt_version_);
+  fos->WriteUShort(table_headers->size());
+  int32_t log2_of_max_power_of_2 = FontMath::Log2(table_headers->size());
   int32_t search_range = 2 << (log2_of_max_power_of_2 - 1 + 4);
-  fos->writeUShort(search_range);
-  fos->writeUShort(log2_of_max_power_of_2);
-  fos->writeUShort((table_headers->size() * 16) - search_range);
+  fos->WriteUShort(search_range);
+  fos->WriteUShort(log2_of_max_power_of_2);
+  fos->WriteUShort((table_headers->size() * 16) - search_range);
 
   for (TableHeaderList::iterator record = table_headers->begin(),
                                  record_end = table_headers->end();
                                  record != record_end; ++record) {
-    fos->writeULong((*record)->tag());
-    fos->writeULong((int32_t)((*record)->checksum()));
-    fos->writeULong((*record)->offset());
-    fos->writeULong((*record)->length());
+    fos->WriteULong((*record)->tag());
+    fos->WriteULong((int32_t)((*record)->checksum()));
+    fos->WriteULong((*record)->offset());
+    fos->WriteULong((*record)->length());
   }
 }
 
-void Font::serializeTables(FontOutputStream* fos,
+void Font::SerializeTables(FontOutputStream* fos,
                            TableHeaderList* table_headers) {
   ByteVector SERIALIZATION_FILLER(3);
   std::fill(SERIALIZATION_FILLER.begin(), SERIALIZATION_FILLER.end(), 0);
   for (TableHeaderList::iterator record = table_headers->begin(),
                                  end_of_headers = table_headers->end();
                                  record != end_of_headers; ++record) {
-    TablePtr target_table = table((*record)->tag());
+    TablePtr target_table = GetTable((*record)->tag());
     if (target_table == NULL) {
 #if defined (SFNTLY_NO_EXCEPTION)
       return;
@@ -153,22 +143,22 @@
       throw IOException("Table out of sync with font header.");
 #endif
     }
-    int32_t table_size = target_table->serialize(fos);
+    int32_t table_size = target_table->Serialize(fos);
     if (table_size != (*record)->length()) {
       assert(false);
     }
     int32_t filler_size = ((table_size + 3) & ~3) - table_size;
-    fos->write(&SERIALIZATION_FILLER, 0, filler_size);
+    fos->Write(&SERIALIZATION_FILLER, 0, filler_size);
   }
 }
 
-void Font::tableOrdering(IntegerList* default_table_ordering,
+void Font::TableOrdering(IntegerList* default_table_ordering,
                          IntegerList* table_ordering) {
   assert(default_table_ordering);
   assert(table_ordering);
   table_ordering->clear();
   if (default_table_ordering->empty()) {
-    defaultTableOrdering(default_table_ordering);
+    DefaultTableOrdering(default_table_ordering);
   }
 
   typedef std::map<int32_t, bool> Int2Bool;
@@ -181,7 +171,7 @@
   for (IntegerList::iterator tag = default_table_ordering->begin(),
                              tag_end = default_table_ordering->end();
                              tag != tag_end; ++tag) {
-    if (hasTable(*tag)) {
+    if (HasTable(*tag)) {
       table_ordering->push_back(*tag);
       tables_in_font[*tag] = true;
     }
@@ -194,10 +184,10 @@
   }
 }
 
-void Font::defaultTableOrdering(IntegerList* default_table_ordering) {
+void Font::DefaultTableOrdering(IntegerList* default_table_ordering) {
   assert(default_table_ordering);
   default_table_ordering->clear();
-  if (hasTable(Tag::CFF)) {
+  if (HasTable(Tag::CFF)) {
     default_table_ordering->resize(CFF_TABLE_ORDERING_SIZE);
     std::copy(CFF_TABLE_ORDERING, CFF_TABLE_ORDERING + CFF_TABLE_ORDERING_SIZE,
               default_table_ordering->begin());
@@ -209,62 +199,32 @@
             default_table_ordering->begin());
 }
 
-CALLER_ATTACH WritableFontData* Font::getNewData(int32_t size) {
-  return factory_->getNewData(size);
-}
-
 /******************************************************************************
  * Font::Builder class
  ******************************************************************************/
 Font::Builder::~Builder() {}
 
-Font::Builder::Builder(FontFactory* factory)
-    : factory_(factory), sfnt_version_(SFNTVERSION_1) {
-}
-
-void Font::Builder::loadFont(InputStream* is) {
-  // Note: we do not throw exception here for is.  This is more of an assertion.
-  assert(is);
-  FontInputStream font_is(is);
-  TableHeaderSortedSet records;
-  readHeader(&font_is, &records);
-  loadTableData(&records, &font_is, &data_blocks_);
-  buildAllTableBuilders(&data_blocks_, &table_builders_);
-  font_is.close();
-}
-
-void Font::Builder::loadFont(ByteArray* ba,
-                             int32_t offset_to_offset_table) {
-  // Note: we do not throw exception here for is.  This is more of an assertion.
-  assert(ba);
-  WritableFontDataPtr fd = new WritableFontData(ba);
-  TableHeaderSortedSet records;
-  readHeader(fd, offset_to_offset_table, &records);
-  loadTableData(&records, fd, &data_blocks_);
-  buildAllTableBuilders(&data_blocks_, &table_builders_);
-}
-
-CALLER_ATTACH Font::Builder* Font::Builder::getOTFBuilder(
+CALLER_ATTACH Font::Builder* Font::Builder::GetOTFBuilder(
     FontFactory* factory, InputStream* is) {
   FontBuilderPtr builder = new Builder(factory);
-  builder->loadFont(is);
-  return builder.detach();
+  builder->LoadFont(is);
+  return builder.Detach();
 }
 
-CALLER_ATTACH Font::Builder* Font::Builder::getOTFBuilder(
+CALLER_ATTACH Font::Builder* Font::Builder::GetOTFBuilder(
     FontFactory* factory, ByteArray* ba, int32_t offset_to_offset_table) {
   FontBuilderPtr builder = new Builder(factory);
-  builder->loadFont(ba, offset_to_offset_table);
-  return builder.detach();
+  builder->LoadFont(ba, offset_to_offset_table);
+  return builder.Detach();
 }
 
-CALLER_ATTACH Font::Builder* Font::Builder::getOTFBuilder(
+CALLER_ATTACH Font::Builder* Font::Builder::GetOTFBuilder(
     FontFactory* factory) {
   FontBuilderPtr builder = new Builder(factory);
-  return builder.detach();
+  return builder.Detach();
 }
 
-bool Font::Builder::readyToBuild() {
+bool Font::Builder::ReadyToBuild() {
   // just read in data with no manipulation
   if (table_builders_.empty() && !data_blocks_.empty()) {
     return true;
@@ -275,73 +235,69 @@
                                  table_builder_end = table_builders_.end();
                                  table_builder != table_builder_end;
                                  ++table_builder) {
-    if (!table_builder->second->readyToBuild())
+    if (!table_builder->second->ReadyToBuild())
       return false;
   }
   return true;
 }
 
-CALLER_ATTACH Font* Font::Builder::build() {
+CALLER_ATTACH Font* Font::Builder::Build() {
   TableMap tables;
   if (!table_builders_.empty()) {
-    buildTablesFromBuilders(&table_builders_, &tables);
+    BuildTablesFromBuilders(&table_builders_, &tables);
   }
   FontPtr font = new Font(factory_, sfnt_version_, &digest_, &tables);
   table_builders_.clear();
   data_blocks_.clear();
-  return font.detach();
+  return font.Detach();
 }
 
-CALLER_ATTACH WritableFontData* Font::Builder::getNewData(int32_t capacity) {
-  return factory_->getNewData(capacity);
+CALLER_ATTACH WritableFontData* Font::Builder::GetNewData(int32_t capacity) {
+  return factory_->GetNewData(capacity);
 }
 
-CALLER_ATTACH WritableFontData* Font::Builder::getNewGrowableData(
+CALLER_ATTACH WritableFontData* Font::Builder::GetNewGrowableData(
     ReadableFontData* src_data) {
-  return factory_->getNewGrowableData(src_data);
+  return factory_->GetNewGrowableData(src_data);
 }
 
-void Font::Builder::setDigest(ByteVector* digest) {
+void Font::Builder::SetDigest(ByteVector* digest) {
   digest_.clear();
   digest_ = *digest;
 }
 
-void Font::Builder::cleanTableBuilders() {
+void Font::Builder::CleanTableBuilders() {
   table_builders_.clear();
 }
 
-bool Font::Builder::hasTableBuilder(int32_t tag) {
+bool Font::Builder::HasTableBuilder(int32_t tag) {
   return (table_builders_.find(tag) != table_builders_.end());
 }
 
-Table::Builder* Font::Builder::getTableBuilder(int32_t tag) {
-  if (hasTableBuilder(tag))
+Table::Builder* Font::Builder::GetTableBuilder(int32_t tag) {
+  if (HasTableBuilder(tag))
     return table_builders_[tag];
   return NULL;
 }
 
-CALLER_ATTACH Table::Builder* Font::Builder::newTableBuilder(int32_t tag) {
+CALLER_ATTACH Table::Builder* Font::Builder::NewTableBuilder(int32_t tag) {
   TableHeaderPtr header = new Table::Header(tag);
-  TableBuilderPtr builder = Table::Builder::getBuilder(this, header, NULL);
+  TableBuilderPtr builder = Table::Builder::GetBuilder(this, header, NULL);
   table_builders_.insert(TableBuilderEntry(header->tag(), builder));
   return builder;
 }
 
-CALLER_ATTACH Table::Builder* Font::Builder::newTableBuilder(
-    int32_t tag, ReadableFontData* src_data) {
+CALLER_ATTACH Table::Builder*
+    Font::Builder::NewTableBuilder(int32_t tag, ReadableFontData* src_data) {
   WritableFontDataPtr data;
-  data.attach(getNewGrowableData(src_data));
+  data.Attach(GetNewGrowableData(src_data));
   TableHeaderPtr header = new Table::Header(tag);
-  TableBuilderPtr builder = Table::Builder::getBuilder(this, header, data);
+  TableBuilderPtr builder = Table::Builder::GetBuilder(this, header, data);
   table_builders_.insert(TableBuilderEntry(tag, builder));
   return builder;
 }
 
-TableBuilderMap* Font::Builder::tableBuilders() {
-  return &table_builders_;
-}
-
-void Font::Builder::tableBuilderTags(IntegerSet* key_set) {
+void Font::Builder::TableBuilderTags(IntegerSet* key_set) {
   assert(key_set);
   key_set->clear();
   for (TableBuilderMap::iterator i = table_builders_.begin(),
@@ -350,53 +306,76 @@
   }
 }
 
-void Font::Builder::removeTableBuilder(int32_t tag) {
+void Font::Builder::RemoveTableBuilder(int32_t tag) {
   TableBuilderMap::iterator target = table_builders_.find(tag);
   if (target != table_builders_.end()) {
     table_builders_.erase(target);
   }
 }
 
-int32_t Font::Builder::numberOfTableBuilders() {
-  return (int32_t)table_builders_.size();
+Font::Builder::Builder(FontFactory* factory)
+    : factory_(factory), sfnt_version_(SFNTVERSION_1) {
 }
 
-int32_t Font::Builder::sfntWrapperSize() {
+void Font::Builder::LoadFont(InputStream* is) {
+  // Note: we do not throw exception here for is.  This is more of an assertion.
+  assert(is);
+  FontInputStream font_is(is);
+  TableHeaderSortedSet records;
+  ReadHeader(&font_is, &records);
+  LoadTableData(&records, &font_is, &data_blocks_);
+  BuildAllTableBuilders(&data_blocks_, &table_builders_);
+  font_is.Close();
+}
+
+void Font::Builder::LoadFont(ByteArray* ba,
+                             int32_t offset_to_offset_table) {
+  // Note: we do not throw exception here for is.  This is more of an assertion.
+  assert(ba);
+  WritableFontDataPtr fd = new WritableFontData(ba);
+  TableHeaderSortedSet records;
+  ReadHeader(fd, offset_to_offset_table, &records);
+  LoadTableData(&records, fd, &data_blocks_);
+  BuildAllTableBuilders(&data_blocks_, &table_builders_);
+}
+
+int32_t Font::Builder::SfntWrapperSize() {
   return Offset::kSfntHeaderSize +
          (Offset::kTableRecordSize * table_builders_.size());
 }
 
-void Font::Builder::buildAllTableBuilders(DataBlockMap* table_data,
+void Font::Builder::BuildAllTableBuilders(DataBlockMap* table_data,
                                           TableBuilderMap* builder_map) {
   for (DataBlockMap::iterator record = table_data->begin(),
                               record_end = table_data->end();
                               record != record_end; ++record) {
     TableBuilderPtr builder;
-    builder.attach(getTableBuilder(record->first.p_, record->second.p_));
+    builder.Attach(GetTableBuilder(record->first.p_, record->second.p_));
     builder_map->insert(TableBuilderEntry(record->first->tag(), builder));
   }
-  interRelateBuilders(&table_builders_);
+  InterRelateBuilders(&table_builders_);
 }
 
-CALLER_ATTACH Table::Builder* Font::Builder::getTableBuilder(
-    Table::Header* header, WritableFontData* data) {
-  return Table::Builder::getBuilder(this, header, data);
+CALLER_ATTACH Table::Builder*
+    Font::Builder::GetTableBuilder(Table::Header* header,
+                                   WritableFontData* data) {
+  return Table::Builder::GetBuilder(this, header, data);
 }
 
-void Font::Builder::buildTablesFromBuilders(TableBuilderMap* builder_map,
+void Font::Builder::BuildTablesFromBuilders(TableBuilderMap* builder_map,
                                             TableMap* table_map) {
-  interRelateBuilders(builder_map);
+  InterRelateBuilders(builder_map);
 
   // Now build all the tables.
   for (TableBuilderMap::iterator builder = builder_map->begin(),
                                  builder_end = builder_map->end();
                                  builder != builder_end; ++builder) {
     TablePtr table;
-    if (builder->second->readyToBuild()) {
+    if (builder->second->ReadyToBuild()) {
 #if !defined (SFNTLY_NO_EXCEPTION)
       try {
 #endif
-        table.attach(down_cast<Table*>(builder->second->build()));
+        table.Attach(down_cast<Table*>(builder->second->Build()));
 #if !defined (SFNTLY_NO_EXCEPTION)
       } catch(IOException& e) {
         std::string builder_string = "Unable to build table - ";
@@ -419,7 +398,7 @@
   }
 }
 
-void Font::Builder::interRelateBuilders(TableBuilderMap* builder_map) {
+void Font::Builder::InterRelateBuilders(TableBuilderMap* builder_map) {
   FontHeaderTableBuilderPtr header_table_builder =
       down_cast<FontHeaderTable::Builder*>((*builder_map)[Tag::head].p_);
   HorizontalHeaderTableBuilderPtr horizontal_header_builder =
@@ -435,87 +414,89 @@
   // set the inter table data required to build certain tables
   if (horizontal_metrics_builder != NULL) {
     if (max_profile_builder != NULL) {
-      horizontal_metrics_builder->setNumGlyphs(
-          max_profile_builder->numGlyphs());
+      horizontal_metrics_builder->SetNumGlyphs(
+          max_profile_builder->NumGlyphs());
     }
     if (horizontal_header_builder != NULL) {
-      horizontal_metrics_builder->setNumberOfHMetrics(
-          horizontal_header_builder->numberOfHMetrics());
+      horizontal_metrics_builder->SetNumberOfHMetrics(
+          horizontal_header_builder->NumberOfHMetrics());
     }
   }
 
   if (loca_table_builder != NULL) {
     if (max_profile_builder != NULL) {
-      loca_table_builder->setNumGlyphs(max_profile_builder->numGlyphs());
+      loca_table_builder->SetNumGlyphs(max_profile_builder->NumGlyphs());
     }
     if (header_table_builder != NULL) {
-      loca_table_builder->setFormatVersion(
-          header_table_builder->indexToLocFormat());
+      loca_table_builder->SetFormatVersion(
+          header_table_builder->IndexToLocFormat());
     }
   }
 }
 
-void Font::Builder::readHeader(FontInputStream* is,
+void Font::Builder::ReadHeader(FontInputStream* is,
                                TableHeaderSortedSet* records) {
   assert(records);
-  sfnt_version_ = is->readFixed();
-  num_tables_ = is->readUShort();
-  search_range_ = is->readUShort();
-  entry_selector_ = is->readUShort();
-  range_shift_ = is->readUShort();
+  sfnt_version_ = is->ReadFixed();
+  num_tables_ = is->ReadUShort();
+  search_range_ = is->ReadUShort();
+  entry_selector_ = is->ReadUShort();
+  range_shift_ = is->ReadUShort();
 
   for (int32_t table_number = 0; table_number < num_tables_; ++table_number) {
     // Need to use temporary vars here.  C++ evaluates function parameters from
     // right to left and thus breaks the order of input stream.
-    int32_t tag = is->readULongAsInt();
-    int64_t checksum = is->readULong();
-    int32_t offset = is->readULongAsInt();
-    int32_t length = is->readULongAsInt();
+    int32_t tag = is->ReadULongAsInt();
+    int64_t checksum = is->ReadULong();
+    int32_t offset = is->ReadULongAsInt();
+    int32_t length = is->ReadULongAsInt();
     TableHeaderPtr table = new Table::Header(tag, checksum, offset, length);
     records->insert(table);
   }
 }
 
-void Font::Builder::loadTableData(TableHeaderSortedSet* headers,
+void Font::Builder::ReadHeader(ReadableFontData* fd,
+                               int32_t offset,
+                               TableHeaderSortedSet* records) {
+  assert(records);
+  sfnt_version_ = fd->ReadFixed(offset + Offset::kSfntVersion);
+  num_tables_ = fd->ReadUShort(offset + Offset::kNumTables);
+  search_range_ = fd->ReadUShort(offset + Offset::kSearchRange);
+  entry_selector_ = fd->ReadUShort(offset + Offset::kEntrySelector);
+  range_shift_ = fd->ReadUShort(offset + Offset::kRangeShift);
+
+  int32_t table_offset = offset + Offset::kTableRecordBegin;
+  for (int32_t table_number = 0;
+       table_number < num_tables_;
+       table_number++, table_offset += Offset::kTableRecordSize) {
+    int32_t tag = fd->ReadULongAsInt(table_offset + Offset::kTableTag);
+    int64_t checksum = fd->ReadULong(table_offset + Offset::kTableCheckSum);
+    int32_t offset = fd->ReadULongAsInt(table_offset + Offset::kTableOffset);
+    int32_t length = fd->ReadULongAsInt(table_offset + Offset::kTableLength);
+    TableHeaderPtr table = new Table::Header(tag, checksum, offset, length);
+    records->insert(table);
+  }
+}
+
+void Font::Builder::LoadTableData(TableHeaderSortedSet* headers,
                                   FontInputStream* is,
                                   DataBlockMap* table_data) {
   assert(table_data);
   for (TableHeaderSortedSet::iterator
            table_header = headers->begin(), table_end = headers->end();
            table_header != table_end; ++table_header) {
-    is->skip((*table_header)->offset() - is->position());
+    is->Skip((*table_header)->offset() - is->position());
     FontInputStream table_is(is, (*table_header)->length());
     int32_t roundup_length = ((*table_header)->length() + 3) & ~3;
-    ByteArrayPtr array = factory_->getNewArray(roundup_length);
-    array->copyFrom(&table_is, (*table_header)->length());
+    ByteArrayPtr array;
+    array.Attach(factory_->GetNewArray(roundup_length));
+    array->CopyFrom(&table_is, (*table_header)->length());
     WritableFontDataPtr data = new WritableFontData(array);
     table_data->insert(DataBlockEntry(*table_header, data));
   }
 }
 
-void Font::Builder::readHeader(ReadableFontData* fd, int32_t offset,
-                               TableHeaderSortedSet* records) {
-  assert(records);
-  sfnt_version_ = fd->readFixed(offset + Offset::kSfntVersion);
-  num_tables_ = fd->readUShort(offset + Offset::kNumTables);
-  search_range_ = fd->readUShort(offset + Offset::kSearchRange);
-  entry_selector_ = fd->readUShort(offset + Offset::kEntrySelector);
-  range_shift_ = fd->readUShort(offset + Offset::kRangeShift);
-
-  int32_t table_offset = offset + Offset::kTableRecordBegin;
-  for (int32_t table_number = 0;
-       table_number < num_tables_;
-       table_number++, table_offset += Offset::kTableRecordSize) {
-    int32_t tag = fd->readULongAsInt(table_offset + Offset::kTableTag);
-    int64_t checksum = fd->readULong(table_offset + Offset::kTableCheckSum);
-    int32_t offset = fd->readULongAsInt(table_offset + Offset::kTableOffset);
-    int32_t length = fd->readULongAsInt(table_offset + Offset::kTableLength);
-    TableHeaderPtr table = new Table::Header(tag, checksum, offset, length);
-    records->insert(table);
-  }
-}
-
-void Font::Builder::loadTableData(TableHeaderSortedSet* headers,
+void Font::Builder::LoadTableData(TableHeaderSortedSet* headers,
                                   WritableFontData* fd,
                                   DataBlockMap* table_data) {
   for (TableHeaderSortedSet::iterator
@@ -523,7 +504,7 @@
            table_header != table_end; ++table_header) {
     int32_t roundup_length = ((*table_header)->length() + 3) & ~3;
     FontDataPtr sliced_data;
-    sliced_data.attach(fd->slice((*table_header)->offset(), roundup_length));
+    sliced_data.Attach(fd->Slice((*table_header)->offset(), roundup_length));
     WritableFontDataPtr data = down_cast<WritableFontData*>(sliced_data.p_);
     table_data->insert(DataBlockEntry(*table_header, data));
   }
diff --git a/sfntly/font.h b/sfntly/font.h
index cbd9607..5ce7f17 100644
--- a/sfntly/font.h
+++ b/sfntly/font.h
@@ -122,13 +122,132 @@
 
 class FontFactory;
 class Font : public RefCounted<Font> {
+ public:
+  class Builder : public FontDataTableBuilderContainer,
+                  public RefCounted<Builder> {
+   public:
+    virtual ~Builder();
+
+    static CALLER_ATTACH Builder*
+        GetOTFBuilder(FontFactory* factory, InputStream* is);
+    static CALLER_ATTACH Builder*
+        GetOTFBuilder(FontFactory* factory,
+                      ByteArray* ba,
+                      int32_t offset_to_offset_table);
+    static CALLER_ATTACH Builder* GetOTFBuilder(FontFactory* factory);
+    virtual bool ReadyToBuild();
+    virtual CALLER_ATTACH Font* Build();
+    virtual CALLER_ATTACH WritableFontData* GetNewData(int32_t capacity);
+    virtual CALLER_ATTACH WritableFontData*
+        GetNewGrowableData(ReadableFontData* data);
+    virtual void SetDigest(ByteVector* digest);
+    virtual void CleanTableBuilders();
+    virtual bool HasTableBuilder(int32_t tag);
+    virtual Table::Builder* GetTableBuilder(int32_t tag);
+
+    // Creates a new table builder for the table type given by the table id tag.
+    // This new table has been added to the font and will replace any existing
+    // builder for that table.
+    // @return new empty table of the type specified by tag; if tag is not known
+    //         then a generic OpenTypeTable is returned
+    virtual CALLER_ATTACH Table::Builder* NewTableBuilder(int32_t tag);
+    virtual CALLER_ATTACH Table::Builder*
+        NewTableBuilder(int32_t tag, ReadableFontData* src_data);
+    virtual TableBuilderMap* table_builders() { return &table_builders_; }
+    virtual void TableBuilderTags(IntegerSet* key_set);
+    // Note: different from Java: we don't return object in removeTableBuilder
+    virtual void RemoveTableBuilder(int32_t tag);
+    virtual int32_t number_of_table_builders() {
+      return (int32_t)table_builders_.size();
+    }
+
+   private:
+    explicit Builder(FontFactory* factory);
+    virtual void LoadFont(InputStream* is);
+    virtual void LoadFont(ByteArray* buffer, int32_t offset_to_offset_table);
+    int32_t SfntWrapperSize();
+    void BuildAllTableBuilders(DataBlockMap* table_data,
+                               TableBuilderMap* builder_map);
+    CALLER_ATTACH Table::Builder*
+        GetTableBuilder(Table::Header* header, WritableFontData* data);
+    void BuildTablesFromBuilders(TableBuilderMap* builder_map,
+                                 TableMap* tables);
+    static void InterRelateBuilders(TableBuilderMap* builder_map);
+    void ReadHeader(FontInputStream* is, TableHeaderSortedSet* records);
+    void ReadHeader(ReadableFontData* fd,
+                    int32_t offset,
+                    TableHeaderSortedSet* records);
+    void LoadTableData(TableHeaderSortedSet* headers,
+                       FontInputStream* is,
+                       DataBlockMap* table_data);
+    void LoadTableData(TableHeaderSortedSet* headers,
+                       WritableFontData* fd,
+                       DataBlockMap* table_data);
+
+    TableBuilderMap table_builders_;
+    FontFactory* factory_;  // dumb pointer, avoid circular refcounting
+    int32_t sfnt_version_;
+    int32_t num_tables_;
+    int32_t search_range_;
+    int32_t entry_selector_;
+    int32_t range_shift_;
+    DataBlockMap data_blocks_;
+    ByteVector digest_;
+  };
+
+  virtual ~Font();
+
+  // Gets the sfnt version set in the sfnt wrapper of the font.
+  int32_t version() { return sfnt_version_; }
+
+  // Gets a copy of the fonts digest that was created when the font was read. If
+  // no digest was set at creation time then the return result will be null.
+  ByteVector* digest() { return &digest_; }
+
+  // Get the checksum for this font.
+  int64_t checksum() { return checksum_; }
+
+  // Get the number of tables in this font.
+  int32_t num_tables() { return (int32_t)tables_.size(); }
+
+  // Whether the font has a particular table.
+  bool HasTable(int32_t tag);
+
+  // UNIMPLEMENTED: public Iterator<? extends Table> iterator
+
+  // Get the table in this font with the specified id.
+  // @param tag the identifier of the table
+  // @return the table specified if it exists; null otherwise
+  // C++ port: rename table() to GetTable()
+  Table* GetTable(int32_t tag);
+
+  // Get a map of the tables in this font accessed by table tag.
+  // @return an unmodifiable view of the tables in this font
+  TableMap* Tables();
+
+  // Serialize the font to the output stream.
+  // @param os the destination for the font serialization
+  // @param tableOrdering the table ordering to apply
+  void Serialize(OutputStream* os, IntegerList* table_ordering);
+
+  // Get a new data object. The size is a request for a data object and the
+  // returned data object will support at least that amount. A value greater
+  // than zero for the size is a request for a fixed size data object. A
+  // negative or zero value for the size is a request for a variable sized data
+  // object with the absolute value of the size being an estimate of the space
+  // required.
+  // @param size greater than zero is a request for a fixed size data object of
+  //        the given size; less than or equal to zero is a request for a
+  //        variable size data object with the absolute size as an estimate
+  CALLER_ATTACH WritableFontData* GetNewData(int32_t size);
+
  private:
   // Offsets to specific elements in the underlying data. These offsets are
   // relative to the start of the table or the start of sub-blocks within the
   // table.
   struct Offset {
     enum {
-    // Offsets within the main directory
+      // Offsets within the main directory
       kSfntVersion = 0,
       kNumTables = 4,
       kSearchRange = 6,
@@ -137,7 +256,7 @@
       kTableRecordBegin = 12,
       kSfntHeaderSize = 12,
 
-    // Offsets within a specific table record
+      // Offsets within a specific table record
       kTableTag = 0,
       kTableCheckSum = 4,
       kTableOffset = 8,
@@ -150,139 +269,17 @@
 //  static const int32_t CFF_TABLE_ORDERING[];
 //  static const int32_t TRUE_TYPE_TABLE_ORDERING[];
 
- public:
-  virtual ~Font();
-
- private:
   Font(FontFactory* factory, int32_t sfnt_version, ByteVector* digest,
        TableMap* tables);
 
- public:
-  // Gets the sfnt version set in the sfnt wrapper of the font.
-  virtual int32_t version();
+  void BuildTableHeadersForSerialization(IntegerList* table_ordering,
+                                         TableHeaderList* table_headers);
+  void SerializeHeader(FontOutputStream* fos, TableHeaderList* table_headers);
+  void SerializeTables(FontOutputStream* fos, TableHeaderList* table_headers);
+  void TableOrdering(IntegerList* default_table_ordering,
+                     IntegerList* table_ordering);
+  void DefaultTableOrdering(IntegerList* default_table_ordering);
 
-  // Gets a copy of the fonts digest that was created when the font was read. If
-  // no digest was set at creation time then the return result will be null.
-  virtual ByteVector* digest();
-
-  // Get the checksum for this font.
-  virtual int64_t checksum();
-
-  // Get the number of tables in this font.
-  virtual int32_t numTables();
-
-  // Whether the font has a particular table.
-  virtual bool hasTable(int32_t tag);
-
-  // UNIMPLEMENTED: public Iterator<? extends Table> iterator
-
-  // Get the table in this font with the specified id.
-  // @param tag the identifier of the table
-  // @return the table specified if it exists; null otherwise
-  virtual Table* table(int32_t tag);
-
-  // Get a map of the tables in this font accessed by table tag.
-  // @return an unmodifiable view of the tables in this font
-  virtual TableMap* tables();
-
-  // Serialize the font to the output stream.
-  // @param os the destination for the font serialization
-  // @param tableOrdering the table ordering to apply
-  virtual void serialize(OutputStream* os, IntegerList* table_ordering);
-
- private:
-  void buildTableHeadersForSerialization(IntegerList* table_ordering,
-    TableHeaderList* table_headers);
-  void serializeHeader(FontOutputStream* fos, TableHeaderList* table_headers);
-  void serializeTables(FontOutputStream* fos, TableHeaderList* table_headers);
-  void tableOrdering(IntegerList* default_table_ordering,
-    IntegerList* table_ordering);
-  void defaultTableOrdering(IntegerList* default_table_ordering);
-
- public:
-  class Builder : public FontDataTableBuilderContainer,
-                  public RefCounted<Builder> {
-   public:
-    virtual ~Builder();
-
-   private:
-    explicit Builder(FontFactory* factory);
-    virtual void loadFont(InputStream* is);
-    virtual void loadFont(ByteArray* buffer, int32_t offset_to_offset_table);
-
-   public:
-    static CALLER_ATTACH Builder*
-        getOTFBuilder(FontFactory* factory, InputStream* is);
-    static CALLER_ATTACH Builder*
-        getOTFBuilder(FontFactory* factory, ByteArray* ba,
-                      int32_t offset_to_offset_table);
-    static CALLER_ATTACH Builder* getOTFBuilder(FontFactory* factory);
-    virtual bool readyToBuild();
-    virtual CALLER_ATTACH Font* build();
-    virtual CALLER_ATTACH WritableFontData* getNewData(int32_t capacity);
-    virtual CALLER_ATTACH WritableFontData*
-        getNewGrowableData(ReadableFontData* data);
-    virtual void setDigest(ByteVector* digest);
-    virtual void cleanTableBuilders();
-    virtual bool hasTableBuilder(int32_t tag);
-    virtual Table::Builder* getTableBuilder(int32_t tag);
-
-    // Creates a new table builder for the table type given by the table id tag.
-    // This new table has been added to the font and will replace any existing
-    // builder for that table.
-    // @return new empty table of the type specified by tag; if tag is not known
-    //         then a generic OpenTypeTable is returned
-    virtual CALLER_ATTACH Table::Builder* newTableBuilder(int32_t tag);
-    virtual CALLER_ATTACH Table::Builder*
-        newTableBuilder(int32_t tag, ReadableFontData* src_data);
-    virtual TableBuilderMap* tableBuilders();
-    virtual void tableBuilderTags(IntegerSet* key_set);
-    // Note: different from Java: we don't return object in removeTableBuilder
-    virtual void removeTableBuilder(int32_t tag);
-    virtual int32_t numberOfTableBuilders();
-
-   private:
-    int32_t sfntWrapperSize();
-    void buildAllTableBuilders(DataBlockMap* table_data,
-                               TableBuilderMap* builder_map);
-    CALLER_ATTACH Table::Builder*
-        getTableBuilder(Table::Header* header, WritableFontData* data);
-    void buildTablesFromBuilders(TableBuilderMap* builder_map,
-                                 TableMap* tables);
-    static void interRelateBuilders(TableBuilderMap* builder_map);
-    void readHeader(FontInputStream* is, TableHeaderSortedSet* records);
-    void loadTableData(TableHeaderSortedSet* headers, FontInputStream* is,
-                       DataBlockMap* table_data);
-    void readHeader(ReadableFontData* fd, int32_t offset,
-                    TableHeaderSortedSet* records);
-    void loadTableData(TableHeaderSortedSet* headers, WritableFontData* fd,
-                       DataBlockMap* table_data);
-
-   private:
-    TableBuilderMap table_builders_;
-    FontFactory* factory_;  // dumb pointer, avoid circular refcounting
-    int32_t sfnt_version_;
-    int32_t num_tables_;
-    int32_t search_range_;
-    int32_t entry_selector_;
-    int32_t range_shift_;
-    DataBlockMap data_blocks_;
-    ByteVector digest_;
-  };
-
- public:
-  // Get a new data object. The size is a request for a data object and the
-  // returned data object will support at least that amount. A value greater
-  // than zero for the size is a request for a fixed size data object. A
-  // negative or zero value for the size is a request for a variable sized data
-  // object with the absolute value of the size being an estimate of the space
-  // required.
-  // @param size greater than zero is a request for a fixed size data object of
-  //        the given size; less than or equal to zero is a request for a
-  //        variable size data object with the absolute size as an estimate
-  CALLER_ATTACH WritableFontData* getNewData(int32_t size);
-
- private:
   FontFactory* factory_;  // dumb pointer, avoid circular ref-counting
   int32_t sfnt_version_;
   ByteVector digest_;
diff --git a/sfntly/font_data_table.cc b/sfntly/font_data_table.cc
index 9896b24..1f9d1cc 100644
--- a/sfntly/font_data_table.cc
+++ b/sfntly/font_data_table.cc
@@ -15,6 +15,7 @@
  */
 
 #include "sfntly/font_data_table.h"
+
 #include "sfntly/data/font_output_stream.h"
 
 namespace sfntly {
@@ -29,158 +30,142 @@
 
 FontDataTable::~FontDataTable() {}
 
-ReadableFontData* FontDataTable::readFontData() {
+ReadableFontData* FontDataTable::ReadFontData() {
   return data_;
 }
 
-int32_t FontDataTable::length() {
-  return data_->length();
+int32_t FontDataTable::Length() {
+  return data_->Length();
 }
 
-int32_t FontDataTable::padding() {
+int32_t FontDataTable::Padding() {
   return -1;
 }
 
-int32_t FontDataTable::dataLength() {
-  int32_t paddings = padding();
-  return (paddings == -1) ? length() : length() - paddings;
+int32_t FontDataTable::DataLength() {
+  int32_t paddings = Padding();
+  return (paddings == -1) ? Length() : Length() - paddings;
 }
 
-int32_t FontDataTable::serialize(OutputStream* os) {
-  return data_->copyTo(os);
+int32_t FontDataTable::Serialize(OutputStream* os) {
+  return data_->CopyTo(os);
 }
 
 /******************************************************************************
  * FontDataTable::Builder class
  ******************************************************************************/
-void FontDataTable::Builder::init(FontDataTableBuilderContainer* container) {
-  container_ = container;
-  model_changed_ = false;
-  data_changed_ = false;
+CALLER_ATTACH WritableFontData* FontDataTable::Builder::Data() {
+  WritableFontDataPtr new_data;
+  if (model_changed_) {
+    if (!SubReadyToSerialize()) {
+      return NULL;
+    }
+    int32_t size = SubDataSizeToSerialize();
+    new_data.Attach(container_->GetNewData(size));
+    SubSerialize(new_data);
+  } else {
+    ReadableFontDataPtr data = InternalReadData();
+    new_data.Attach(container_->GetNewData(data != NULL ? data->Length() : 0));
+    data->CopyTo(new_data);
+  }
+  return new_data.Detach();
+}
+
+void FontDataTable::Builder::SetData(ReadableFontData* data) {
+  InternalSetData(data, true);
+}
+
+
+CALLER_ATTACH FontDataTable* FontDataTable::Builder::Build() {
+  ReadableFontDataPtr data = InternalReadData();
+  if (model_changed_) {
+    // Let subclass serialize from model.
+    if (!SubReadyToSerialize()) {
+      return NULL;
+    }
+    int32_t size = SubDataSizeToSerialize();
+    WritableFontDataPtr new_data;
+    new_data.Attach(container_->GetNewData(size));
+    SubSerialize(new_data);
+    data = new_data;
+  }
+  FontDataTablePtr table = SubBuildTable(data);
+  NotifyPostTableBuild(table);
+  return table;
+}
+
+bool FontDataTable::Builder::ReadyToBuild() {
+  return true;
+}
+
+ReadableFontData* FontDataTable::Builder::InternalReadData() {
+  return (r_data_ != NULL) ? r_data_.p_ :
+                             static_cast<ReadableFontData*>(w_data_.p_);
+}
+
+WritableFontData* FontDataTable::Builder::InternalWriteData() {
+  if (w_data_ == NULL) {
+    WritableFontDataPtr new_data;
+    new_data.Attach(container_->GetNewData(r_data_->Length()));
+    r_data_->CopyTo(new_data);
+    InternalSetData(new_data, false);
+  }
+  return w_data_.p_;
+}
+
+CALLER_ATTACH WritableFontData*
+    FontDataTable::Builder::InternalNewData(int32_t size) {
+  return container_->GetNewData(size);
 }
 
 FontDataTable::Builder::Builder(FontDataTableBuilderContainer* container) {
-  init(container);
+  Init(container);
 }
 
 FontDataTable::Builder::Builder(FontDataTableBuilderContainer* container,
                                 WritableFontData* data) {
-  init(container);
+  Init(container);
   w_data_ = data;
 }
 
 FontDataTable::Builder::Builder(FontDataTableBuilderContainer* container,
                                 ReadableFontData* data) {
-  init(container);
+  Init(container);
   r_data_ = data;
 }
 
 FontDataTable::Builder::~Builder() {
 }
 
-WritableFontData* FontDataTable::Builder::data() {
-  WritableFontDataPtr new_data;
-  if (model_changed_) {
-    if (!subReadyToSerialize()) {
-      return NULL;
-    }
-    int32_t size = subDataSizeToSerialize();
-    new_data.attach(container_->getNewData(size));
-    subSerialize(new_data);
-  } else {
-    ReadableFontDataPtr data = internalReadData();
-    new_data.attach(container_->getNewData(data != NULL ? data->length() : 0));
-    data->copyTo(new_data);
-  }
-  return new_data.detach();
+void FontDataTable::Builder::Init(FontDataTableBuilderContainer* container) {
+  container_ = container;
+  model_changed_ = false;
+  data_changed_ = false;
 }
 
-void FontDataTable::Builder::setData(ReadableFontData* data) {
-  internalSetData(data, true);
+void FontDataTable::Builder::NotifyPostTableBuild(FontDataTable* table) {
+  // Default: NOP.
+  UNREFERENCED_PARAMETER(table);
 }
 
-void FontDataTable::Builder::internalSetData(WritableFontData* data,
+void FontDataTable::Builder::InternalSetData(WritableFontData* data,
                                              bool data_changed) {
   w_data_ = data;
   r_data_ = NULL;
   if (data_changed) {
     data_changed_ = true;
-    subDataSet();
+    SubDataSet();
   }
 }
 
-void FontDataTable::Builder::internalSetData(ReadableFontData* data,
+void FontDataTable::Builder::InternalSetData(ReadableFontData* data,
                                              bool data_changed) {
   w_data_ = NULL;
   r_data_ = data;
   if (data_changed) {
     data_changed_ = true;
-    subDataSet();
+    SubDataSet();
   }
 }
 
-CALLER_ATTACH FontDataTable* FontDataTable::Builder::build() {
-  ReadableFontDataPtr data = internalReadData();
-  if (model_changed_) {
-    // Let subclass serialize from model.
-    if (!subReadyToSerialize()) {
-      return NULL;
-    }
-    int32_t size = subDataSizeToSerialize();
-    WritableFontDataPtr new_data;
-    new_data.attach(container_->getNewData(size));
-    subSerialize(new_data);
-    data = new_data;
-  }
-  FontDataTablePtr table = subBuildTable(data);
-  notifyPostTableBuild(table);
-  return table;
-}
-
-bool FontDataTable::Builder::readyToBuild() {
-  return true;
-}
-
-ReadableFontData* FontDataTable::Builder::internalReadData() {
-  return (r_data_ != NULL) ? r_data_.p_ :
-                             static_cast<ReadableFontData*>(w_data_.p_);
-}
-
-WritableFontData* FontDataTable::Builder::internalWriteData() {
-  if (w_data_ == NULL) {
-    WritableFontDataPtr new_data;
-    new_data.attach(container_->getNewData(r_data_->length()));
-    r_data_->copyTo(new_data);
-    internalSetData(new_data, false);
-  }
-  return w_data_.p_;
-}
-
-WritableFontData* FontDataTable::Builder::internalNewData(int32_t size) {
-  return container_->getNewData(size);
-}
-
-bool FontDataTable::Builder::dataChanged() {
-  return data_changed_;
-}
-
-bool FontDataTable::Builder::modelChanged() {
-  return model_changed_;
-}
-
-bool FontDataTable::Builder::setModelChanged() {
-  return setModelChanged(true);
-}
-
-bool FontDataTable::Builder::setModelChanged(bool changed) {
-  bool old = model_changed_;
-  model_changed_ = changed;
-  return old;
-}
-
-void FontDataTable::Builder::notifyPostTableBuild(FontDataTable* table) {
-  // default: NOP
-  UNREFERENCED_PARAMETER(table);
-}
-
 }  // namespace sfntly
diff --git a/sfntly/font_data_table.h b/sfntly/font_data_table.h
index 28bec15..9b3b467 100644
--- a/sfntly/font_data_table.h
+++ b/sfntly/font_data_table.h
@@ -25,75 +25,58 @@
 
 class FontDataTable : virtual public RefCount {
  public:
-  explicit FontDataTable(ReadableFontData* data);
-  virtual ~FontDataTable();
-
-  // Get the readable font data for this table.
-  ReadableFontData* readFontData();
-
-  // Get the length of the data for this table in bytes. This is the full
-  // allocated length of the data and may or may not include any padding.
-  virtual int32_t length();
-
-  // Get the number of bytes of padding used in the table. The padding bytes are
-  // used to align the table length to a 4 byte boundary.
-  virtual int32_t padding();
-
-  // Return the number of bytes of non-padded data in the table. If the padding
-  // is unknown or unknowable then the total number of bytes of data in the
-  // tables is returned.
-  virtual int32_t dataLength();
-
-  virtual int32_t serialize(OutputStream* os);
-
- public:
   // Note: original version is abstract Builder<T extends FontDataTable>
   //       C++ template is not designed that way so plain class is chosen.
   class Builder : virtual public RefCount {
-   protected:
-    explicit Builder(FontDataTableBuilderContainer* container);
-    Builder(FontDataTableBuilderContainer* container, WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* container, ReadableFontData* data);
-    virtual ~Builder();
-
-    void init(FontDataTableBuilderContainer* container);
-
    public:
     // Get a snapshot copy of the internal data of the builder.
     // This causes any internal data structures to be serialized to a new data
     // object. This data object belongs to the caller and must be properly
     // disposed of. No changes are made to the builder and any changes to the
     // data directly do not affect the internal state. To do that a subsequent
-    // call must be made to {@link #setData(WritableFontData)}.
+    // call must be made to {@link #SetData(WritableFontData)}.
     // @return a copy of the internal data of the builder
-    WritableFontData* data();
-    virtual void setData(ReadableFontData* data);
+    CALLER_ATTACH WritableFontData* Data();
+    virtual void SetData(ReadableFontData* data);
 
-   private:
-    void internalSetData(WritableFontData* data, bool data_changed);
-    void internalSetData(ReadableFontData* data, bool data_changed);
+    // Note: changed from protected to avoid accessibility error in C++
+    virtual CALLER_ATTACH FontDataTable* Build();
+    virtual bool ReadyToBuild();
 
-   public:  // Note: changed from protected to avoid accessibility error in C++
-    virtual FontDataTable* build();
-    virtual bool readyToBuild();
-    virtual ReadableFontData* internalReadData();
-    virtual WritableFontData* internalWriteData();
-    virtual WritableFontData* internalNewData(int32_t size);
-    virtual bool dataChanged();
-    virtual bool modelChanged();
-    virtual bool setModelChanged();
-    virtual bool setModelChanged(bool changed);
+    ReadableFontData* InternalReadData();
+    WritableFontData* InternalWriteData();
+    CALLER_ATTACH WritableFontData* InternalNewData(int32_t size);
 
-   protected:  // subclass API
-    virtual void notifyPostTableBuild(FontDataTable* table);
-    virtual int32_t subSerialize(WritableFontData* new_data) = 0;
-    virtual bool subReadyToSerialize() = 0;
-    virtual int32_t subDataSizeToSerialize() = 0;
-    virtual void subDataSet() = 0;
+    bool data_changed() { return data_changed_; }
+    bool modelChanged() { return model_changed_; }
+    bool set_model_changed() { return set_model_changed(true); }
+    bool set_model_changed(bool changed) {
+      bool old = model_changed_;
+      model_changed_ = changed;
+      return old;
+    }
+
+   protected:
+    explicit Builder(FontDataTableBuilderContainer* container);
+    Builder(FontDataTableBuilderContainer* container, WritableFontData* data);
+    Builder(FontDataTableBuilderContainer* container, ReadableFontData* data);
+    virtual ~Builder();
+
+    void Init(FontDataTableBuilderContainer* container);
+
+    // subclass API
+    virtual void NotifyPostTableBuild(FontDataTable* table);
+    virtual int32_t SubSerialize(WritableFontData* new_data) = 0;
+    virtual bool SubReadyToSerialize() = 0;
+    virtual int32_t SubDataSizeToSerialize() = 0;
+    virtual void SubDataSet() = 0;
     virtual CALLER_ATTACH FontDataTable*
-        subBuildTable(ReadableFontData* data) = 0;
+        SubBuildTable(ReadableFontData* data) = 0;
 
    private:
+    void InternalSetData(WritableFontData* data, bool data_changed);
+    void InternalSetData(ReadableFontData* data, bool data_changed);
+
     FontDataTableBuilderContainer* container_;  // avoid circular ref-counting
     WritableFontDataPtr w_data_;
     ReadableFontDataPtr r_data_;
@@ -101,7 +84,29 @@
     bool data_changed_;
   };
 
+  explicit FontDataTable(ReadableFontData* data);
+  virtual ~FontDataTable();
+
+  // Get the readable font data for this table.
+  ReadableFontData* ReadFontData();
+
+  // Get the length of the data for this table in bytes. This is the full
+  // allocated length of the data and may or may not include any padding.
+  virtual int32_t Length();
+
+  // Get the number of bytes of padding used in the table. The padding bytes are
+  // used to align the table length to a 4 byte boundary.
+  virtual int32_t Padding();
+
+  // Return the number of bytes of non-padded data in the table. If the padding
+  // is unknown or unknowable then the total number of bytes of data in the
+  // tables is returned.
+  virtual int32_t DataLength();
+
+  virtual int32_t Serialize(OutputStream* os);
+
  protected:
+  // TODO(arthurhsu): style guide violation: protected member, need refactoring
   ReadableFontDataPtr data_;
 };
 typedef Ptr<FontDataTable> FontDataTablePtr;
diff --git a/sfntly/font_data_table_builder_container.h b/sfntly/font_data_table_builder_container.h
index 7866a36..f3ccf61 100644
--- a/sfntly/font_data_table_builder_container.h
+++ b/sfntly/font_data_table_builder_container.h
@@ -23,7 +23,7 @@
 
 class FontDataTableBuilderContainer {
  public:
-  virtual WritableFontData* getNewData(int32_t size) = 0;
+  virtual WritableFontData* GetNewData(int32_t size) = 0;
   // Make gcc -Wnon-virtual-dtor happy.
   virtual ~FontDataTableBuilderContainer() {}
 };
diff --git a/sfntly/font_factory.cc b/sfntly/font_factory.cc
index b741f0a..d5b2397 100644
--- a/sfntly/font_factory.cc
+++ b/sfntly/font_factory.cc
@@ -14,229 +14,233 @@
  * limitations under the License.
  */
 
+#include "sfntly/font_factory.h"
+
 #include <string.h>
 
-#include "sfntly/font_factory.h"
 #include "sfntly/tag.h"
 #include "sfntly/data/memory_byte_array.h"
 #include "sfntly/data/growable_memory_byte_array.h"
 
 namespace sfntly {
 
-FontFactory::FontFactory() : fingerprint_(false) {
-}
-
 FontFactory::~FontFactory() {
 }
 
-CALLER_ATTACH FontFactory* FontFactory::getInstance() {
+CALLER_ATTACH FontFactory* FontFactory::GetInstance() {
   FontFactoryPtr instance = new FontFactory();
-  return instance.detach();
+  return instance.Detach();
 }
 
-void FontFactory::fingerprintFont(bool fingerprint) {
+void FontFactory::FingerprintFont(bool fingerprint) {
   fingerprint_ = fingerprint;
 }
 
-bool FontFactory::fingerprintFont() {
+bool FontFactory::FingerprintFont() {
   return fingerprint_;
 }
 
-void FontFactory::loadFonts(InputStream* is, FontArray* output) {
+void FontFactory::LoadFonts(InputStream* is, FontArray* output) {
   assert(output);
   PushbackInputStream* pbis = down_cast<PushbackInputStream*>(is);
-  if (isCollection(pbis)) {
-    loadCollection(pbis, output);
+  if (IsCollection(pbis)) {
+    LoadCollection(pbis, output);
     return;
   }
-  FontPtr font = loadSingleOTF(pbis);
+  FontPtr font = LoadSingleOTF(pbis);
   if (font) {
     output->push_back(font);
   }
 }
 
-void FontFactory::loadFontsForBuilding(InputStream* is,
+void FontFactory::LoadFonts(ByteArray* ba, FontArray* output) {
+  if (IsCollection(ba)) {
+    LoadCollection(ba, output);
+    return;
+  }
+  FontPtr font;
+  font.Attach(LoadSingleOTF(ba));
+  if (font) {
+    output->push_back(font);
+  }
+}
+
+void FontFactory::LoadFontsForBuilding(InputStream* is,
                                        FontBuilderArray* output) {
   PushbackInputStream* pbis = down_cast<PushbackInputStream*>(is);
-  if (isCollection(pbis)) {
-    loadCollectionForBuilding(pbis, output);
+  if (IsCollection(pbis)) {
+    LoadCollectionForBuilding(pbis, output);
     return;
   }
   FontBuilderPtr builder;
-  builder.attach(loadSingleOTFForBuilding(pbis));
+  builder.Attach(LoadSingleOTFForBuilding(pbis));
   if (builder) {
     output->push_back(builder);
   }
 }
 
-Font* FontFactory::loadSingleOTF(InputStream* is) {
+void FontFactory::LoadFontsForBuilding(ByteArray* ba,
+                                       FontBuilderArray* output) {
+  if (IsCollection(ba)) {
+    LoadCollectionForBuilding(ba, output);
+    return;
+  }
   FontBuilderPtr builder;
-  builder.attach(loadSingleOTFForBuilding(is));
-  return builder->build();
+  builder.Attach(LoadSingleOTFForBuilding(ba, 0));
+  if (builder) {
+    output->push_back(builder);
+  }
 }
 
-void FontFactory::loadCollection(InputStream* is, FontArray* output) {
+CALLER_ATTACH WritableFontData* FontFactory::GetNewData(int32_t capacity) {
+  // UNIMPLMENTED: if (capacity > 0) { this.GetNewFixedData(capacity); }
+  // Seems a no-op.
+  return GetNewGrowableData(capacity);
+}
+
+CALLER_ATTACH WritableFontData* FontFactory::GetNewFixedData(int32_t capacity) {
+  ByteArrayPtr buffer;
+  buffer.Attach(GetNewArray(capacity));
+  WritableFontDataPtr new_fixed_data = new WritableFontData(buffer);
+  return new_fixed_data.Detach();
+}
+
+CALLER_ATTACH WritableFontData* FontFactory::GetNewGrowableData(
+    int32_t capacity) {
+  ByteArrayPtr buffer;
+  buffer.Attach(GetNewGrowableArray(capacity));
+  WritableFontDataPtr new_growable_data = new WritableFontData(buffer);
+  return new_growable_data.Detach();
+}
+
+CALLER_ATTACH WritableFontData* FontFactory::GetNewGrowableData(
+    ReadableFontData* src_data) {
+  WritableFontDataPtr data;
+  data.Attach(GetNewGrowableData(src_data->Length()));
+  src_data->CopyTo(data);
+  return data.Detach();
+}
+
+CALLER_ATTACH ByteArray* FontFactory::GetNewArray(int32_t length) {
+  ByteArrayPtr new_fixed_array = new MemoryByteArray(length);
+  return new_fixed_array.Detach();
+}
+
+CALLER_ATTACH ByteArray* FontFactory::GetNewGrowableArray(int32_t length) {
+  UNREFERENCED_PARAMETER(length);
+  ByteArrayPtr new_growable_array = new GrowableMemoryByteArray();
+  return new_growable_array.Detach();
+}
+
+void FontFactory::SerializeFont(Font* font, OutputStream* os) {
+  font->Serialize(os, &table_ordering_);
+}
+
+void FontFactory::SetSerializationTableOrdering(
+    const IntegerList& table_ordering) {
+  table_ordering_ = table_ordering;
+}
+
+CALLER_ATTACH Font::Builder* FontFactory::NewFontBuilder() {
+  return Font::Builder::GetOTFBuilder(this);
+}
+
+CALLER_ATTACH Font* FontFactory::LoadSingleOTF(InputStream* is) {
+  FontBuilderPtr builder;
+  builder.Attach(LoadSingleOTFForBuilding(is));
+  return builder->Build();
+}
+
+CALLER_ATTACH Font* FontFactory::LoadSingleOTF(ByteArray* ba) {
+  FontBuilderPtr builder;
+  builder.Attach(LoadSingleOTFForBuilding(ba, 0));
+  return builder->Build();
+}
+
+void FontFactory::LoadCollection(InputStream* is, FontArray* output) {
   FontBuilderArray ba;
-  loadCollectionForBuilding(is, &ba);
+  LoadCollectionForBuilding(is, &ba);
   output->reserve(ba.size());
   for (FontBuilderArray::iterator builder = ba.begin(), builders_end = ba.end();
                                   builder != builders_end; ++builder) {
       FontPtr font;
-      font.attach((*builder)->build());
+      font.Attach((*builder)->Build());
       output->push_back(font);
   }
 }
 
-Font::Builder* FontFactory::loadSingleOTFForBuilding(InputStream* is) {
-  // UNIMPLEMENTED: SHA-1 hash checking via Java DigestStream
-  Font::Builder* builder = Font::Builder::getOTFBuilder(this, is);
-  // UNIMPLEMENTED: setDigest
-  return builder;
-}
-
-void FontFactory::loadCollectionForBuilding(InputStream* is,
-                                            FontBuilderArray* builders) {
-  ByteArrayPtr ba = new GrowableMemoryByteArray();
-  ba->copyFrom(is);
-  loadCollectionForBuilding(ba, builders);
-}
-
-bool FontFactory::isCollection(PushbackInputStream* pbis) {
-  ByteVector tag(4);
-  pbis->read(&tag);
-  pbis->unread(&tag);
-  return Tag::ttcf == generate_tag(tag[0], tag[1], tag[2], tag[3]);
-}
-
-void FontFactory::loadFonts(ByteArray* ba, FontArray* output) {
-  if (isCollection(ba)) {
-    loadCollection(ba, output);
-    return;
-  }
-  FontPtr font;
-  font.attach(loadSingleOTF(ba));
-  if (font) {
-    output->push_back(font);
-  }
-}
-
-void FontFactory::loadFontsForBuilding(ByteArray* ba,
-                                       FontBuilderArray* output) {
-  if (isCollection(ba)) {
-    loadCollectionForBuilding(ba, output);
-    return;
-  }
-  FontBuilderPtr builder;
-  builder.attach(loadSingleOTFForBuilding(ba, 0));
-  if (builder) {
-    output->push_back(builder);
-  }
-}
-
-Font* FontFactory::loadSingleOTF(ByteArray* ba) {
-  FontBuilderPtr builder;
-  builder.attach(loadSingleOTFForBuilding(ba, 0));
-  return builder->build();
-}
-
-void FontFactory::loadCollection(ByteArray* ba, FontArray* output) {
+void FontFactory::LoadCollection(ByteArray* ba, FontArray* output) {
   FontBuilderArray builders;
-  loadCollectionForBuilding(ba, &builders);
-  output->reserve(ba->size());
+  LoadCollectionForBuilding(ba, &builders);
+  output->reserve(ba->Size());
   for (FontBuilderArray::iterator
-       builder = builders.begin(), builders_end = builders.end();
+           builder = builders.begin(), builders_end = builders.end();
        builder != builders_end; ++builder) {
     FontPtr font;
-    font.attach((*builder)->build());
+    font.Attach((*builder)->Build());
     output->push_back(font);
   }
 }
 
-Font::Builder* FontFactory::loadSingleOTFForBuilding(ByteArray* ba,
-    int32_t offset_to_offset_table) {
+CALLER_ATTACH Font::Builder*
+    FontFactory::LoadSingleOTFForBuilding(InputStream* is) {
   // UNIMPLEMENTED: SHA-1 hash checking via Java DigestStream
-  Font::Builder* builder =
-      Font::Builder::getOTFBuilder(this, ba, offset_to_offset_table);
+  Font::Builder* builder = Font::Builder::GetOTFBuilder(this, is);
   // UNIMPLEMENTED: setDigest
   return builder;
 }
 
-void FontFactory::loadCollectionForBuilding(ByteArray* ba,
+CALLER_ATTACH Font::Builder*
+    FontFactory::LoadSingleOTFForBuilding(ByteArray* ba,
+                                          int32_t offset_to_offset_table) {
+  // UNIMPLEMENTED: SHA-1 hash checking via Java DigestStream
+  Font::Builder* builder =
+      Font::Builder::GetOTFBuilder(this, ba, offset_to_offset_table);
+  // UNIMPLEMENTED: setDigest
+  return builder;
+}
+
+void FontFactory::LoadCollectionForBuilding(InputStream* is,
+                                            FontBuilderArray* builders) {
+  ByteArrayPtr ba = new GrowableMemoryByteArray();
+  ba->CopyFrom(is);
+  LoadCollectionForBuilding(ba, builders);
+}
+
+void FontFactory::LoadCollectionForBuilding(ByteArray* ba,
                                             FontBuilderArray* builders) {
   ReadableFontDataPtr rfd = new ReadableFontData(ba);
-  int32_t ttc_tag = rfd->readULongAsInt(Offset::kTTCTag);
+  int32_t ttc_tag = rfd->ReadULongAsInt(Offset::kTTCTag);
   UNREFERENCED_PARAMETER(ttc_tag);
-  int32_t version = rfd->readFixed(Offset::kVersion);
+  int32_t version = rfd->ReadFixed(Offset::kVersion);
   UNREFERENCED_PARAMETER(version);
-  int32_t num_fonts = rfd->readULongAsInt(Offset::kNumFonts);
+  int32_t num_fonts = rfd->ReadULongAsInt(Offset::kNumFonts);
 
   builders->reserve(num_fonts);
   int32_t offset_table_offset = Offset::kOffsetTable;
   for (int32_t font_number = 0; font_number < num_fonts;
        font_number++, offset_table_offset += DataSize::kULONG) {
-    int32_t offset = rfd->readULongAsInt(offset_table_offset);
+    int32_t offset = rfd->ReadULongAsInt(offset_table_offset);
     FontBuilderPtr builder;
-    builder.attach(loadSingleOTFForBuilding(ba, offset));
+    builder.Attach(LoadSingleOTFForBuilding(ba, offset));
     builders->push_back(builder);
   }
 }
 
-bool FontFactory::isCollection(ByteArray* ba) {
+bool FontFactory::IsCollection(PushbackInputStream* pbis) {
+  ByteVector tag(4);
+  pbis->Read(&tag);
+  pbis->Unread(&tag);
+  return Tag::ttcf == GenerateTag(tag[0], tag[1], tag[2], tag[3]);
+}
+
+bool FontFactory::IsCollection(ByteArray* ba) {
   return Tag::ttcf ==
-         generate_tag(ba->get(0), ba->get(1), ba->get(2), ba->get(3));
+         GenerateTag(ba->Get(0), ba->Get(1), ba->Get(2), ba->Get(3));
 }
 
-CALLER_ATTACH WritableFontData* FontFactory::getNewData(int32_t capacity) {
-  // UNIMPLMENTED: if (capacity > 0) { this.getNewFixedData(capacity); }
-  // seems a no-op
-  return getNewGrowableData(capacity);
-}
-
-CALLER_ATTACH WritableFontData* FontFactory::getNewFixedData(int32_t capacity) {
-  ByteArrayPtr buffer;
-  buffer.attach(getNewArray(capacity));
-  WritableFontDataPtr new_fixed_data = new WritableFontData(buffer);
-  return new_fixed_data.detach();
-}
-
-CALLER_ATTACH WritableFontData* FontFactory::getNewGrowableData(
-    int32_t capacity) {
-  ByteArrayPtr buffer;
-  buffer.attach(getNewGrowableArray(capacity));
-  WritableFontDataPtr new_growable_data = new WritableFontData(buffer);
-  return new_growable_data.detach();
-}
-
-CALLER_ATTACH WritableFontData* FontFactory::getNewGrowableData(
-    ReadableFontData* src_data) {
-  WritableFontDataPtr data;
-  data.attach(getNewGrowableData(src_data->length()));
-  src_data->copyTo(data);
-  return data.detach();
-}
-
-CALLER_ATTACH ByteArray* FontFactory::getNewArray(int32_t length) {
-  ByteArrayPtr new_fixed_array = new MemoryByteArray(length);
-  return new_fixed_array.detach();
-}
-
-CALLER_ATTACH ByteArray* FontFactory::getNewGrowableArray(int32_t length) {
-  UNREFERENCED_PARAMETER(length);
-  ByteArrayPtr new_growable_array = new GrowableMemoryByteArray();
-  return new_growable_array.detach();
-}
-
-void FontFactory::serializeFont(Font* font, OutputStream* os) {
-  font->serialize(os, &table_ordering_);
-}
-
-void FontFactory::setSerializationTableOrdering(
-    const IntegerList& table_ordering) {
-  table_ordering_ = table_ordering;
-}
-
-CALLER_ATTACH Font::Builder* FontFactory::newFontBuilder() {
-  return Font::Builder::getOTFBuilder(this);
+FontFactory::FontFactory()
+    : fingerprint_(false) {
 }
 
 }  // namespace sfntly
diff --git a/sfntly/font_factory.h b/sfntly/font_factory.h
index 907ea66..7be0841 100644
--- a/sfntly/font_factory.h
+++ b/sfntly/font_factory.h
@@ -26,20 +26,92 @@
 namespace sfntly {
 
 class FontFactory : public RefCounted<FontFactory> {
+ public:
+  virtual ~FontFactory();
+
+  // Factory method for the construction of a font factory.
+  static CALLER_ATTACH FontFactory* GetInstance();
+
+  // Toggle whether fonts that are loaded are fingerprinted with a SHA-1 hash.
+  // If a font is fingerprinted then a SHA-1 hash is generated at load time and
+  // stored in the font. This is useful for uniquely identifying fonts. By
+  // default this is turned on.
+  // @param fingerprint whether fingerprinting should be turned on or off
+  // TODO(arthurhsu): IMPLEMENT: C++ port currently don't do any SHA-1
+  void FingerprintFont(bool fingerprint);
+  bool FingerprintFont();
+
+  // Load the font(s) from the input stream. The current settings on the factory
+  // are used during the loading process. One or more fonts are returned if the
+  // stream contains valid font data. Some font container formats may have more
+  // than one font and in this case multiple font objects will be returned. If
+  // the data in the stream cannot be parsed or is invalid an array of size zero
+  // will be returned.
+  void LoadFonts(InputStream* is, FontArray* output);
+
+  // ByteArray font loading
+  // Load the font(s) from the byte array. The current settings on the factory
+  // are used during the loading process. One or more fonts are returned if the
+  // stream contains valid font data. Some font container formats may have more
+  // than one font and in this case multiple font objects will be returned. If
+  // the data in the stream cannot be parsed or is invalid an array of size zero
+  // will be returned.
+  void LoadFonts(ByteArray* ba, FontArray* output);
+
+  // Load the font(s) from the input stream into font builders. The current
+  // settings on the factory are used during the loading process. One or more
+  // font builders are returned if the stream contains valid font data. Some
+  // font container formats may have more than one font and in this case
+  // multiple font builder objects will be returned. If the data in the stream
+  // cannot be parsed or is invalid an array of size zero will be returned.
+  void LoadFontsForBuilding(InputStream* is, FontBuilderArray* output);
+
+  // Load the font(s) from the byte array into font builders. The current
+  // settings on the factory are used during the loading process. One or more
+  // font builders are returned if the stream contains valid font data. Some
+  // font container formats may have more than one font and in this case
+  // multiple font builder objects will be returned. If the data in the stream
+  // cannot be parsed or is invalid an array of size zero will be returned.
+  void LoadFontsForBuilding(ByteArray* ba, FontBuilderArray* output);
+
+  CALLER_ATTACH WritableFontData* GetNewData(int32_t capacity);
+  CALLER_ATTACH WritableFontData* GetNewFixedData(int32_t capacity);
+  CALLER_ATTACH WritableFontData* GetNewGrowableData(int32_t capacity);
+  CALLER_ATTACH WritableFontData*
+      GetNewGrowableData(ReadableFontData* src_data);
+  CALLER_ATTACH ByteArray* GetNewArray(int32_t length);
+  CALLER_ATTACH ByteArray* GetNewGrowableArray(int32_t length);
+
+  // Font serialization
+  // Serialize the font to the output stream.
+  // NOTE: in this port we attempted not to implement I/O stream because dealing
+  //       with cross-platform I/O stream itself is big enough as a project.
+  //       Byte buffer it is.
+  void SerializeFont(Font* font, OutputStream* os);
+
+  // Set the table ordering to be used in serializing a font. The table ordering
+  // is an ordered list of table ids and tables will be serialized in the order
+  // given. Any tables whose id is not listed in the ordering will be placed in
+  // an unspecified order following those listed.
+  void SetSerializationTableOrdering(const IntegerList& table_ordering);
+
+  // Get an empty font builder for creating a new font from scratch.
+  CALLER_ATTACH Font::Builder* NewFontBuilder();
+
  private:
   // Offsets to specific elements in the underlying data. These offsets are
   // relative to the start of the table or the start of sub-blocks within the
   // table.
   struct Offset {
     enum {
-      // Offsets within the main directory
+      // Offsets within the main directory.
       kTTCTag = 0,
       kVersion = 4,
       kNumFonts = 8,
       kOffsetTable = 12,
 
-      // TTC Version 2.0 extensions
-      // offsets from end of OffsetTable
+      // TTC Version 2.0 extensions.
+      // Offsets from end of OffsetTable.
       kulDsigTag = 0,
       kulDsigLength = 4,
       kulDsigOffset = 8
@@ -48,97 +120,22 @@
 
   FontFactory();
 
- public:  // class is final, no virtual functions unless from parent
-  virtual ~FontFactory();
+  CALLER_ATTACH Font* LoadSingleOTF(InputStream* is);
+  CALLER_ATTACH Font* LoadSingleOTF(ByteArray* ba);
 
-  // Factory method for the construction of a font factory.
-  static CALLER_ATTACH FontFactory* getInstance();
+  void LoadCollection(InputStream* is, FontArray* output);
+  void LoadCollection(ByteArray* ba, FontArray* output);
 
-  // Toggle whether fonts that are loaded are fingerprinted with a SHA-1 hash.
-  // If a font is fingerprinted then a SHA-1 hash is generated at load time and
-  // stored in the font. This is useful for uniquely identifying fonts. By
-  // default this is turned on.
-  // @param fingerprint whether fingerprinting should be turned on or off
-  // TODO(arthurhsu): IMPLEMENT: C++ port currently don't do any SHA-1
-  void fingerprintFont(bool fingerprint);
-  bool fingerprintFont();
-
-  // Load the font(s) from the input stream. The current settings on the factory
-  // are used during the loading process. One or more fonts are returned if the
-  // stream contains valid font data. Some font container formats may have more
-  // than one font and in this case multiple font objects will be returned. If
-  // the data in the stream cannot be parsed or is invalid an array of size zero
-  // will be returned.
-  void loadFonts(InputStream* is, FontArray* output);
-
-  // Load the font(s) from the input stream into font builders. The current
-  // settings on the factory are used during the loading process. One or more
-  // font builders are returned if the stream contains valid font data. Some
-  // font container formats may have more than one font and in this case
-  // multiple font builder objects will be returned. If the data in the stream
-  // cannot be parsed or is invalid an array of size zero will be returned.
-  void loadFontsForBuilding(InputStream* is, FontBuilderArray* output);
-
- private:
-  Font* loadSingleOTF(InputStream* is);
-  void loadCollection(InputStream* is, FontArray* output);
-  Font::Builder* loadSingleOTFForBuilding(InputStream* is);
-  void loadCollectionForBuilding(InputStream* is, FontBuilderArray* builders);
-  static bool isCollection(PushbackInputStream* pbis);
-
- public:
-  // ByteArray font loading
-  // Load the font(s) from the byte array. The current settings on the factory
-  // are used during the loading process. One or more fonts are returned if the
-  // stream contains valid font data. Some font container formats may have more
-  // than one font and in this case multiple font objects will be returned. If
-  // the data in the stream cannot be parsed or is invalid an array of size zero
-  // will be returned.
-  void loadFonts(ByteArray* ba, FontArray* output);
-
-  // Load the font(s) from the byte array into font builders. The current
-  // settings on the factory are used during the loading process. One or more
-  // font builders are returned if the stream contains valid font data. Some
-  // font container formats may have more than one font and in this case
-  // multiple font builder objects will be returned. If the data in the stream
-  // cannot be parsed or is invalid an array of size zero will be returned.
-  void loadFontsForBuilding(ByteArray* ba, FontBuilderArray* output);
-
- private:
-  CALLER_ATTACH Font* loadSingleOTF(ByteArray* ba);
-  void loadCollection(ByteArray* ba, FontArray* output);
+  CALLER_ATTACH Font::Builder* LoadSingleOTFForBuilding(InputStream* is);
   CALLER_ATTACH Font::Builder*
-      loadSingleOTFForBuilding(ByteArray* ba, int32_t offset_to_offset_table);
-  void loadCollectionForBuilding(ByteArray* ba, FontBuilderArray* builders);
-  static bool isCollection(ByteArray* ba);
+      LoadSingleOTFForBuilding(ByteArray* ba, int32_t offset_to_offset_table);
 
- public:
-  CALLER_ATTACH WritableFontData* getNewData(int32_t capacity);
-  CALLER_ATTACH WritableFontData* getNewFixedData(int32_t capacity);
-  CALLER_ATTACH WritableFontData* getNewGrowableData(int32_t capacity);
-  CALLER_ATTACH WritableFontData*
-      getNewGrowableData(ReadableFontData* src_data);
-  CALLER_ATTACH ByteArray* getNewArray(int32_t length);
-  CALLER_ATTACH ByteArray* getNewGrowableArray(int32_t length);
+  void LoadCollectionForBuilding(InputStream* is, FontBuilderArray* builders);
+  void LoadCollectionForBuilding(ByteArray* ba, FontBuilderArray* builders);
 
- public:
-  // Font serialization
-  // Serialize the font to the output stream.
-  // NOTE: in this port we attempted not to implement I/O stream because dealing
-  //       with cross-platform I/O stream itself is big enough as a project.
-  //       Byte buffer it is.
-  void serializeFont(Font* font, OutputStream* os);
+  static bool IsCollection(PushbackInputStream* pbis);
+  static bool IsCollection(ByteArray* ba);
 
-  // Set the table ordering to be used in serializing a font. The table ordering
-  // is an ordered list of table ids and tables will be serialized in the order
-  // given. Any tables whose id is not listed in the ordering will be placed in
-  // an unspecified order following those listed.
-  void setSerializationTableOrdering(const IntegerList& table_ordering);
-
-  // Get an empty font builder for creating a new font from scratch.
-  CALLER_ATTACH Font::Builder* newFontBuilder();
-
- private:
   bool fingerprint_;
   IntegerList table_ordering_;
 };
diff --git a/sfntly/font_header_table.cc b/sfntly/font_header_table.cc
index 7710c5a..f896001 100644
--- a/sfntly/font_header_table.cc
+++ b/sfntly/font_header_table.cc
@@ -20,83 +20,83 @@
 /******************************************************************************
  * FontHeaderTable class
  ******************************************************************************/
+FontHeaderTable::~FontHeaderTable() {}
+
+int32_t FontHeaderTable::TableVersion() {
+  return data_->ReadFixed(Offset::kTableVersion);
+}
+
+int32_t FontHeaderTable::FontRevision() {
+  return data_->ReadFixed(Offset::kFontRevision);
+}
+
+int64_t FontHeaderTable::ChecksumAdjustment() {
+  return data_->ReadULong(Offset::kCheckSumAdjustment);
+}
+
+int64_t FontHeaderTable::MagicNumber() {
+  return data_->ReadULong(Offset::kMagicNumber);
+}
+
+int32_t FontHeaderTable::FlagsAsInt() {
+  return data_->ReadUShort(Offset::kFlags);
+}
+
+int32_t FontHeaderTable::UnitsPerEm() {
+  return data_->ReadUShort(Offset::kUnitsPerEm);
+}
+
+int64_t FontHeaderTable::Created() {
+  return data_->ReadDateTimeAsLong(Offset::kCreated);
+}
+
+int64_t FontHeaderTable::Modified() {
+  return data_->ReadDateTimeAsLong(Offset::kModified);
+}
+
+int32_t FontHeaderTable::XMin() {
+  return data_->ReadUShort(Offset::kXMin);
+}
+
+int32_t FontHeaderTable::YMin() {
+  return data_->ReadUShort(Offset::kYMin);
+}
+
+int32_t FontHeaderTable::XMax() {
+  return data_->ReadUShort(Offset::kXMax);
+}
+
+int32_t FontHeaderTable::YMax() {
+  return data_->ReadUShort(Offset::kYMax);
+}
+
+int32_t FontHeaderTable::MacStyleAsInt() {
+  return data_->ReadUShort(Offset::kMacStyle);
+}
+
+int32_t FontHeaderTable::LowestRecPPEM() {
+  return data_->ReadUShort(Offset::kLowestRecPPEM);
+}
+
+int32_t FontHeaderTable::FontDirectionHint() {
+  return data_->ReadShort(Offset::kFontDirectionHint);
+}
+
+int32_t FontHeaderTable::IndexToLocFormat() {
+  return data_->ReadShort(Offset::kIndexToLocFormat);
+}
+
+int32_t FontHeaderTable::GlyphDataFormat() {
+  return data_->ReadShort(Offset::kGlyphDataFormat);
+}
+
 FontHeaderTable::FontHeaderTable(Header* header, ReadableFontData* data)
     : Table(header, data) {
   IntegerList checksum_ranges;
   checksum_ranges.push_back(0);
   checksum_ranges.push_back(Offset::kCheckSumAdjustment);
   checksum_ranges.push_back(Offset::kMagicNumber);
-  data_->setCheckSumRanges(checksum_ranges);
-}
-
-FontHeaderTable::~FontHeaderTable() {}
-
-int32_t FontHeaderTable::tableVersion() {
-  return data_->readFixed(Offset::kTableVersion);
-}
-
-int32_t FontHeaderTable::fontRevision() {
-  return data_->readFixed(Offset::kFontRevision);
-}
-
-int64_t FontHeaderTable::checksumAdjustment() {
-  return data_->readULong(Offset::kCheckSumAdjustment);
-}
-
-int64_t FontHeaderTable::magicNumber() {
-  return data_->readULong(Offset::kMagicNumber);
-}
-
-int32_t FontHeaderTable::flagsAsInt() {
-  return data_->readUShort(Offset::kFlags);
-}
-
-int32_t FontHeaderTable::unitsPerEm() {
-  return data_->readUShort(Offset::kUnitsPerEm);
-}
-
-int64_t FontHeaderTable::created() {
-  return data_->readDateTimeAsLong(Offset::kCreated);
-}
-
-int64_t FontHeaderTable::modified() {
-  return data_->readDateTimeAsLong(Offset::kModified);
-}
-
-int32_t FontHeaderTable::xMin() {
-  return data_->readUShort(Offset::kXMin);
-}
-
-int32_t FontHeaderTable::yMin() {
-  return data_->readUShort(Offset::kYMin);
-}
-
-int32_t FontHeaderTable::xMax() {
-  return data_->readUShort(Offset::kXMax);
-}
-
-int32_t FontHeaderTable::yMax() {
-  return data_->readUShort(Offset::kYMax);
-}
-
-int32_t FontHeaderTable::macStyleAsInt() {
-  return data_->readUShort(Offset::kMacStyle);
-}
-
-int32_t FontHeaderTable::lowestRecPPEM() {
-  return data_->readUShort(Offset::kLowestRecPPEM);
-}
-
-int32_t FontHeaderTable::fontDirectionHint() {
-  return data_->readShort(Offset::kFontDirectionHint);
-}
-
-int32_t FontHeaderTable::indexToLocFormat() {
-  return data_->readShort(Offset::kIndexToLocFormat);
-}
-
-int32_t FontHeaderTable::glyphDataFormat() {
-  return data_->readShort(Offset::kGlyphDataFormat);
+  data_->SetCheckSumRanges(checksum_ranges);
 }
 
 /******************************************************************************
@@ -114,146 +114,146 @@
 
 FontHeaderTable::Builder::~Builder() {}
 
-CALLER_ATTACH FontDataTable* FontHeaderTable::Builder::subBuildTable(
+CALLER_ATTACH FontDataTable* FontHeaderTable::Builder::SubBuildTable(
     ReadableFontData* data) {
   FontDataTablePtr table = new FontHeaderTable(header(), data);
-  return table.detach();
+  return table.Detach();
 }
 
-int32_t FontHeaderTable::Builder::tableVersion() {
-  return down_cast<FontHeaderTable*>(table())->tableVersion();
+int32_t FontHeaderTable::Builder::TableVersion() {
+  return down_cast<FontHeaderTable*>(GetTable())->TableVersion();
 }
 
-void FontHeaderTable::Builder::setTableVersion(int32_t version) {
-  internalWriteData()->writeFixed(Offset::kTableVersion, version);
+void FontHeaderTable::Builder::SetTableVersion(int32_t version) {
+  InternalWriteData()->WriteFixed(Offset::kTableVersion, version);
 }
 
-int32_t FontHeaderTable::Builder::fontRevision() {
-  return down_cast<FontHeaderTable*>(table())->fontRevision();
+int32_t FontHeaderTable::Builder::FontRevision() {
+  return down_cast<FontHeaderTable*>(GetTable())->FontRevision();
 }
 
-void FontHeaderTable::Builder::setFontRevision(int32_t revision) {
-  internalWriteData()->writeFixed(Offset::kFontRevision, revision);
+void FontHeaderTable::Builder::SetFontRevision(int32_t revision) {
+  InternalWriteData()->WriteFixed(Offset::kFontRevision, revision);
 }
 
-int64_t FontHeaderTable::Builder::checksumAdjustment() {
-  return down_cast<FontHeaderTable*>(table())->checksumAdjustment();
+int64_t FontHeaderTable::Builder::ChecksumAdjustment() {
+  return down_cast<FontHeaderTable*>(GetTable())->ChecksumAdjustment();
 }
 
-void FontHeaderTable::Builder::setChecksumAdjustment(int64_t adjustment) {
-  internalWriteData()->writeULong(Offset::kCheckSumAdjustment, adjustment);
+void FontHeaderTable::Builder::SetChecksumAdjustment(int64_t adjustment) {
+  InternalWriteData()->WriteULong(Offset::kCheckSumAdjustment, adjustment);
 }
 
-int64_t FontHeaderTable::Builder::magicNumber() {
-  return down_cast<FontHeaderTable*>(table())->magicNumber();
+int64_t FontHeaderTable::Builder::MagicNumber() {
+  return down_cast<FontHeaderTable*>(GetTable())->MagicNumber();
 }
 
-void FontHeaderTable::Builder::setMagicNumber(int64_t magic_number) {
-  internalWriteData()->writeULong(Offset::kMagicNumber, magic_number);
+void FontHeaderTable::Builder::SetMagicNumber(int64_t magic_number) {
+  InternalWriteData()->WriteULong(Offset::kMagicNumber, magic_number);
 }
 
-int32_t FontHeaderTable::Builder::flagsAsInt() {
-  return down_cast<FontHeaderTable*>(table())->flagsAsInt();
+int32_t FontHeaderTable::Builder::FlagsAsInt() {
+  return down_cast<FontHeaderTable*>(GetTable())->FlagsAsInt();
 }
 
-void FontHeaderTable::Builder::setFlagsAsInt(int32_t flags) {
-  internalWriteData()->writeUShort(Offset::kFlags, flags);
+void FontHeaderTable::Builder::SetFlagsAsInt(int32_t flags) {
+  InternalWriteData()->WriteUShort(Offset::kFlags, flags);
 }
 
-int32_t FontHeaderTable::Builder::unitsPerEm() {
-  return down_cast<FontHeaderTable*>(table())->unitsPerEm();
+int32_t FontHeaderTable::Builder::UnitsPerEm() {
+  return down_cast<FontHeaderTable*>(GetTable())->UnitsPerEm();
 }
 
-void FontHeaderTable::Builder::setUnitsPerEm(int32_t units) {
-  internalWriteData()->writeUShort(Offset::kUnitsPerEm, units);
+void FontHeaderTable::Builder::SetUnitsPerEm(int32_t units) {
+  InternalWriteData()->WriteUShort(Offset::kUnitsPerEm, units);
 }
 
-int64_t FontHeaderTable::Builder::created() {
-  return down_cast<FontHeaderTable*>(table())->modified();
+int64_t FontHeaderTable::Builder::Created() {
+  return down_cast<FontHeaderTable*>(GetTable())->Created();
 }
 
-void FontHeaderTable::Builder::setCreated(int64_t date) {
-  internalWriteData()->writeDateTime(Offset::kCreated, date);
+void FontHeaderTable::Builder::SetCreated(int64_t date) {
+  InternalWriteData()->WriteDateTime(Offset::kCreated, date);
 }
 
-int64_t FontHeaderTable::Builder::modified() {
-  return down_cast<FontHeaderTable*>(table())->modified();
+int64_t FontHeaderTable::Builder::Modified() {
+  return down_cast<FontHeaderTable*>(GetTable())->Modified();
 }
 
-void FontHeaderTable::Builder::setModified(int64_t date) {
-  internalWriteData()->writeDateTime(Offset::kModified, date);
+void FontHeaderTable::Builder::SetModified(int64_t date) {
+  InternalWriteData()->WriteDateTime(Offset::kModified, date);
 }
 
-int32_t FontHeaderTable::Builder::xMin() {
-  return down_cast<FontHeaderTable*>(table())->xMin();
+int32_t FontHeaderTable::Builder::XMin() {
+  return down_cast<FontHeaderTable*>(GetTable())->XMin();
 }
 
-void FontHeaderTable::Builder::setXMin(int32_t xmin) {
-  internalWriteData()->writeShort(Offset::kXMin, xmin);
+void FontHeaderTable::Builder::SetXMin(int32_t xmin) {
+  InternalWriteData()->WriteShort(Offset::kXMin, xmin);
 }
 
-int32_t FontHeaderTable::Builder::yMin() {
-  return down_cast<FontHeaderTable*>(table())->yMin();
+int32_t FontHeaderTable::Builder::YMin() {
+  return down_cast<FontHeaderTable*>(GetTable())->YMin();
 }
 
-void FontHeaderTable::Builder::setYMin(int32_t ymin) {
-  internalWriteData()->writeShort(Offset::kYMin, ymin);
+void FontHeaderTable::Builder::SetYMin(int32_t ymin) {
+  InternalWriteData()->WriteShort(Offset::kYMin, ymin);
 }
 
-int32_t FontHeaderTable::Builder::xMax() {
-  return down_cast<FontHeaderTable*>(table())->xMax();
+int32_t FontHeaderTable::Builder::XMax() {
+  return down_cast<FontHeaderTable*>(GetTable())->XMax();
 }
 
-void FontHeaderTable::Builder::setXMax(int32_t xmax) {
-  internalWriteData()->writeShort(Offset::kXMax, xmax);
+void FontHeaderTable::Builder::SetXMax(int32_t xmax) {
+  InternalWriteData()->WriteShort(Offset::kXMax, xmax);
 }
 
-int32_t FontHeaderTable::Builder::yMax() {
-  return down_cast<FontHeaderTable*>(table())->yMax();
+int32_t FontHeaderTable::Builder::YMax() {
+  return down_cast<FontHeaderTable*>(GetTable())->YMax();
 }
 
-void FontHeaderTable::Builder::setYMax(int32_t ymax) {
-  internalWriteData()->writeShort(Offset::kYMax, ymax);
+void FontHeaderTable::Builder::SetYMax(int32_t ymax) {
+  InternalWriteData()->WriteShort(Offset::kYMax, ymax);
 }
 
-int32_t FontHeaderTable::Builder::macStyleAsInt() {
-  return down_cast<FontHeaderTable*>(table())->macStyleAsInt();
+int32_t FontHeaderTable::Builder::MacStyleAsInt() {
+  return down_cast<FontHeaderTable*>(GetTable())->MacStyleAsInt();
 }
 
-void FontHeaderTable::Builder::setMacStyleAsInt(int32_t style) {
-  internalWriteData()->writeUShort(Offset::kMacStyle, style);
+void FontHeaderTable::Builder::SetMacStyleAsInt(int32_t style) {
+  InternalWriteData()->WriteUShort(Offset::kMacStyle, style);
 }
 
-int32_t FontHeaderTable::Builder::lowestRecPPEM() {
-  return down_cast<FontHeaderTable*>(table())->lowestRecPPEM();
+int32_t FontHeaderTable::Builder::LowestRecPPEM() {
+  return down_cast<FontHeaderTable*>(GetTable())->LowestRecPPEM();
 }
 
-void FontHeaderTable::Builder::setLowestRecPPEM(int32_t size) {
-  internalWriteData()->writeUShort(Offset::kLowestRecPPEM, size);
+void FontHeaderTable::Builder::SetLowestRecPPEM(int32_t size) {
+  InternalWriteData()->WriteUShort(Offset::kLowestRecPPEM, size);
 }
 
-int32_t FontHeaderTable::Builder::fontDirectionHint() {
-  return down_cast<FontHeaderTable*>(table())->fontDirectionHint();
+int32_t FontHeaderTable::Builder::FontDirectionHint() {
+  return down_cast<FontHeaderTable*>(GetTable())->FontDirectionHint();
 }
 
-void FontHeaderTable::Builder::setFontDirectionHint(int32_t hint) {
-  internalWriteData()->writeShort(Offset::kFontDirectionHint, hint);
+void FontHeaderTable::Builder::SetFontDirectionHint(int32_t hint) {
+  InternalWriteData()->WriteShort(Offset::kFontDirectionHint, hint);
 }
 
-int32_t FontHeaderTable::Builder::indexToLocFormat() {
-  return down_cast<FontHeaderTable*>(table())->indexToLocFormat();
+int32_t FontHeaderTable::Builder::IndexToLocFormat() {
+  return down_cast<FontHeaderTable*>(GetTable())->IndexToLocFormat();
 }
 
-void FontHeaderTable::Builder::setIndexToLocFormat(int32_t format) {
-  internalWriteData()->writeShort(Offset::kIndexToLocFormat, format);
+void FontHeaderTable::Builder::SetIndexToLocFormat(int32_t format) {
+  InternalWriteData()->WriteShort(Offset::kIndexToLocFormat, format);
 }
 
-int32_t FontHeaderTable::Builder::glyphDataFormat() {
-  return down_cast<FontHeaderTable*>(table())->glyphDataFormat();
+int32_t FontHeaderTable::Builder::GlyphDataFormat() {
+  return down_cast<FontHeaderTable*>(GetTable())->GlyphDataFormat();
 }
 
-void FontHeaderTable::Builder::setGlyphDataFormat(int32_t format) {
-  internalWriteData()->writeShort(Offset::kGlyphDataFormat, format);
+void FontHeaderTable::Builder::SetGlyphDataFormat(int32_t format) {
+  InternalWriteData()->WriteShort(Offset::kGlyphDataFormat, format);
 }
 
 }  // namespace sfntly
diff --git a/sfntly/font_header_table.h b/sfntly/font_header_table.h
index c8aa9fe..dd6f593 100644
--- a/sfntly/font_header_table.h
+++ b/sfntly/font_header_table.h
@@ -39,6 +39,101 @@
 };
 
 class FontHeaderTable : public Table, public RefCounted<FontHeaderTable> {
+ public:
+  class Builder : public Table::TableBasedTableBuilder,
+                  public RefCounted<Builder> {
+   public:
+    // Constructor scope altered to public because C++ does not allow base
+    // class to instantiate derived class with protected constructors.
+    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+            WritableFontData* data);
+    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+            ReadableFontData* data);
+    virtual ~Builder();
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+    virtual int32_t TableVersion();
+    virtual void SetTableVersion(int32_t version);
+    virtual int32_t FontRevision();
+    virtual void SetFontRevision(int32_t revision);
+    virtual int64_t ChecksumAdjustment();
+    virtual void SetChecksumAdjustment(int64_t adjustment);
+    virtual int64_t MagicNumber();
+    virtual void SetMagicNumber(int64_t magic_number);
+    virtual int32_t FlagsAsInt();
+    virtual void SetFlagsAsInt(int32_t flags);
+    // TODO(arthurhsu): IMPLEMENT EnumSet<Flags> Flags()
+    // TODO(arthurhsu): IMPLEMENT setFlags(EnumSet<Flags> flags)
+    virtual int32_t UnitsPerEm();
+    virtual void SetUnitsPerEm(int32_t units);
+    virtual int64_t Created();
+    virtual void SetCreated(int64_t date);
+    virtual int64_t Modified();
+    virtual void SetModified(int64_t date);
+    virtual int32_t XMin();
+    virtual void SetXMin(int32_t xmin);
+    virtual int32_t YMin();
+    virtual void SetYMin(int32_t ymin);
+    virtual int32_t XMax();
+    virtual void SetXMax(int32_t xmax);
+    virtual int32_t YMax();
+    virtual void SetYMax(int32_t ymax);
+    virtual int32_t MacStyleAsInt();
+    virtual void SetMacStyleAsInt(int32_t style);
+    // TODO(arthurhsu): IMPLEMENT EnumSet<MacStyle> macStyle()
+    // TODO(arthurhsu): IMPLEMENT setMacStyle(EnumSet<MacStyle> style)
+    virtual int32_t LowestRecPPEM();
+    virtual void SetLowestRecPPEM(int32_t size);
+    virtual int32_t FontDirectionHint();
+    virtual void SetFontDirectionHint(int32_t hint);
+    virtual int32_t IndexToLocFormat();
+    virtual void SetIndexToLocFormat(int32_t format);
+    virtual int32_t GlyphDataFormat();
+    virtual void SetGlyphDataFormat(int32_t format);
+  };
+
+  virtual ~FontHeaderTable();
+  int32_t TableVersion();
+  int32_t FontRevision();
+
+  // Get the checksum adjustment. To compute: set it to 0, sum the entire font
+  // as ULONG, then store 0xB1B0AFBA - sum.
+  int64_t ChecksumAdjustment();
+
+  // Get the magic number. Set to 0x5F0F3CF5.
+  int64_t MagicNumber();
+
+  // TODO(arthurhsu): IMPLEMENT: EnumSet<Flags>
+  int32_t FlagsAsInt();
+  // TODO(arthurhsu): IMPLEMENT: Flags() returning EnumSet<Flags>
+
+  int32_t UnitsPerEm();
+
+  // Get the created date. Number of seconds since 12:00 midnight, January 1,
+  // 1904. 64-bit integer.
+  int64_t Created();
+  // Get the modified date. Number of seconds since 12:00 midnight, January 1,
+  // 1904. 64-bit integer.
+  int64_t Modified();
+
+  // Get the x min. For all glyph bounding boxes.
+  int32_t XMin();
+  // Get the y min. For all glyph bounding boxes.
+  int32_t YMin();
+  // Get the x max. For all glyph bounding boxes.
+  int32_t XMax();
+  // Get the y max. For all glyph bounding boxes.
+  int32_t YMax();
+
+  // TODO(arthurhsu): IMPLEMENT: EnumSet<MacStyle>
+  int32_t MacStyleAsInt();
+  // TODO(arthurhsu): IMPLEMENT: macStyle() returning EnumSet<MacStyle>
+
+  int32_t LowestRecPPEM();
+  int32_t FontDirectionHint();  // Note: no AsInt() form, already int
+  int32_t IndexToLocFormat();  // Note: no AsInt() form, already int
+  int32_t GlyphDataFormat();
+
  private:
   struct Offset {
     enum {
@@ -62,104 +157,7 @@
     };
   };
 
- private:
   FontHeaderTable(Header* header, ReadableFontData* data);
-
- public:  // class is final, no virtual functions unless from parent
-  virtual ~FontHeaderTable();
-  int32_t tableVersion();
-  int32_t fontRevision();
-
-  // Get the checksum adjustment. To compute: set it to 0, sum the entire font
-  // as ULONG, then store 0xB1B0AFBA - sum.
-  int64_t checksumAdjustment();
-
-  // Get the magic number. Set to 0x5F0F3CF5.
-  int64_t magicNumber();
-
-  // TODO(arthurhsu): IMPLEMENT: EnumSet<Flags>
-  int32_t flagsAsInt();
-  // TODO(arthurhsu): IMPLEMENT: flags() returning EnumSet<Flags>
-
-  int32_t unitsPerEm();
-
-  // Get the created date. Number of seconds since 12:00 midnight, January 1,
-  // 1904. 64-bit integer.
-  int64_t created();
-  // Get the modified date. Number of seconds since 12:00 midnight, January 1,
-  // 1904. 64-bit integer.
-  int64_t modified();
-
-  // Get the x min. For all glyph bounding boxes.
-  int32_t xMin();
-  // Get the y min. For all glyph bounding boxes.
-  int32_t yMin();
-  // Get the x max. For all glyph bounding boxes.
-  int32_t xMax();
-  // Get the y max. For all glyph bounding boxes.
-  int32_t yMax();
-
-  // TODO(arthurhsu): IMPLEMENT: EnumSet<MacStyle>
-  int32_t macStyleAsInt();
-  // TODO(arthurhsu): IMPLEMENT: macStyle() returning EnumSet<MacStyle>
-
-  int32_t lowestRecPPEM();
-  int32_t fontDirectionHint();  // Note: no AsInt() form, already int
-  int32_t indexToLocFormat();  // Note: no AsInt() form, already int
-  int32_t glyphDataFormat();
-
- public:
-  class Builder : public Table::TableBasedTableBuilder,
-                  public RefCounted<Builder> {
-   public:
-    // Constructor scope altered to public because C++ does not allow base
-    // class to instantiate derived class with protected constructors.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            ReadableFontData* data);
-    virtual ~Builder();
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
-    virtual int32_t tableVersion();
-    virtual void setTableVersion(int32_t version);
-    virtual int32_t fontRevision();
-    virtual void setFontRevision(int32_t revision);
-    virtual int64_t checksumAdjustment();
-    virtual void setChecksumAdjustment(int64_t adjustment);
-    virtual int64_t magicNumber();
-    virtual void setMagicNumber(int64_t magic_number);
-    virtual int32_t flagsAsInt();
-    virtual void setFlagsAsInt(int32_t flags);
-    // TODO(arthurhsu): IMPLEMENT EnumSet<Flags> flags()
-    // TODO(arthurhsu): IMPLEMENT setFlags(EnumSet<Flags> flags)
-    virtual int32_t unitsPerEm();
-    virtual void setUnitsPerEm(int32_t units);
-    virtual int64_t created();
-    virtual void setCreated(int64_t date);
-    virtual int64_t modified();
-    virtual void setModified(int64_t date);
-    virtual int32_t xMin();
-    virtual void setXMin(int32_t xmin);
-    virtual int32_t yMin();
-    virtual void setYMin(int32_t ymin);
-    virtual int32_t xMax();
-    virtual void setXMax(int32_t xmax);
-    virtual int32_t yMax();
-    virtual void setYMax(int32_t ymax);
-    virtual int32_t macStyleAsInt();
-    virtual void setMacStyleAsInt(int32_t style);
-    // TODO(arthurhsu): IMPLEMENT EnumSet<MacStyle> macStyle()
-    // TODO(arthurhsu): IMPLEMENT setMacStyle(EnumSet<MacStyle> style)
-    virtual int32_t lowestRecPPEM();
-    virtual void setLowestRecPPEM(int32_t size);
-    virtual int32_t fontDirectionHint();
-    virtual void setFontDirectionHint(int32_t hint);
-    virtual int32_t indexToLocFormat();
-    virtual void setIndexToLocFormat(int32_t format);
-    virtual int32_t glyphDataFormat();
-    virtual void setGlyphDataFormat(int32_t format);
-  };
 };
 typedef Ptr<FontHeaderTable> FontHeaderTablePtr;
 typedef Ptr<FontHeaderTable::Builder> FontHeaderTableBuilderPtr;
diff --git a/sfntly/glyph_table.cc b/sfntly/glyph_table.cc
index 3ff6d97..99e7c06 100644
--- a/sfntly/glyph_table.cc
+++ b/sfntly/glyph_table.cc
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
+#include "sfntly/glyph_table.h"
+
 #include <stdlib.h>
 
-#include "sfntly/glyph_table.h"
 #include "sfntly/port/exception_type.h"
 
 namespace sfntly {
@@ -47,33 +48,38 @@
 /******************************************************************************
  * GlyphTable class
  ******************************************************************************/
+GlyphTable::~GlyphTable() {
+}
+
+GlyphTable::Glyph* GlyphTable::GetGlyph(int32_t offset, int32_t length) {
+  return GlyphTable::Glyph::GetGlyph(data_, offset, length);
+}
+
 GlyphTable::GlyphTable(Header* header, ReadableFontData* data)
-    : Table(header, data) {}
-
-GlyphTable::~GlyphTable() {}
-
-GlyphTable::Glyph* GlyphTable::glyph(int32_t offset, int32_t length) {
-  return GlyphTable::Glyph::getGlyph(data_, offset, length);
+    : Table(header, data) {
 }
 
 /******************************************************************************
  * GlyphTable::Builder class
  ******************************************************************************/
 GlyphTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                            Header* header, WritableFontData* data) :
-    Table::ArrayElementTableBuilder(font_builder, header, data) {}
+                             Header* header,
+                             WritableFontData* data)
+    : Table::ArrayElementTableBuilder(font_builder, header, data) {
+}
 
-GlyphTable::Builder::~Builder() {}
+GlyphTable::Builder::~Builder() {
+}
 
-void GlyphTable::Builder::setLoca(const IntegerList& loca) {
+void GlyphTable::Builder::SetLoca(const IntegerList& loca) {
   loca_ = loca;
-  setModelChanged(false);
+  set_model_changed(false);
   glyph_builders_.clear();
 }
 
-void GlyphTable::Builder::generateLocaList(IntegerList* locas) {
+void GlyphTable::Builder::GenerateLocaList(IntegerList* locas) {
   assert(locas);
-  GlyphBuilderList* glyph_builders = getGlyphBuilders();
+  GlyphBuilderList* glyph_builders = GetGlyphBuilders();
   locas->resize(glyph_builders->size());
   locas->push_back(0);
   if (glyph_builders->size() == 0) {
@@ -83,14 +89,71 @@
     for (GlyphBuilderList::iterator b = glyph_builders->begin(),
                                     b_end = glyph_builders->end();
                                     b != b_end; ++b) {
-      int32_t size = (*b)->subDataSizeToSerialize();
+      int32_t size = (*b)->SubDataSizeToSerialize();
       locas->push_back(total + size);
       total += size;
     }
   }
 }
 
-void GlyphTable::Builder::initialize(ReadableFontData* data,
+GlyphTable::GlyphBuilderList* GlyphTable::Builder::GlyphBuilders() {
+  return GetGlyphBuilders();
+}
+
+void GlyphTable::Builder::SetGlyphBuilders(GlyphBuilderList* glyph_builders) {
+  glyph_builders_ = *glyph_builders;
+  set_model_changed();
+}
+
+CALLER_ATTACH GlyphTable::Glyph::Builder*
+    GlyphTable::Builder::GlyphBuilder(ReadableFontData* data) {
+  return Glyph::Builder::GetBuilder(this, data);
+}
+
+CALLER_ATTACH FontDataTable*
+    GlyphTable::Builder::SubBuildTable(ReadableFontData* data) {
+  FontDataTablePtr table = new GlyphTable(header(), data);
+  return table.Detach();
+}
+
+void GlyphTable::Builder::SubDataSet() {
+  glyph_builders_.clear();
+  set_model_changed(false);
+}
+
+int32_t GlyphTable::Builder::SubDataSizeToSerialize() {
+  if (glyph_builders_.empty())
+    return 0;
+
+  bool variable = false;
+  int32_t size = 0;
+
+  // Calculate size of each table.
+  for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
+                                  end = glyph_builders_.end(); b != end; ++b) {
+      int32_t glyph_size = (*b)->SubDataSizeToSerialize();
+      size += abs(glyph_size);
+      variable |= glyph_size <= 0;
+  }
+  return variable ? -size : size;
+}
+
+bool GlyphTable::Builder::SubReadyToSerialize() {
+  return !glyph_builders_.empty();
+}
+
+int32_t GlyphTable::Builder::SubSerialize(WritableFontData* new_data) {
+  int32_t size = 0;
+  for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
+                                  end = glyph_builders_.end(); b != end; ++b) {
+    FontDataPtr data;
+    data.Attach(new_data->Slice(size));
+    size += (*b)->SubSerialize(down_cast<WritableFontData*>(data.p_));
+  }
+  return size;
+}
+
+void GlyphTable::Builder::Initialize(ReadableFontData* data,
                                      const IntegerList& loca) {
   if (data != NULL) {
     if (loca_.empty()) {
@@ -106,222 +169,211 @@
     for (size_t i = 1; i < loca.size(); ++i) {
       loca_value = loca[i];
       GlyphBuilderPtr builder;
-      builder.attach(Glyph::Builder::getBuilder(this, data,
-          last_loca_value /*offset*/, loca_value - last_loca_value /*length*/));
+      builder.Attach(
+        Glyph::Builder::GetBuilder(this,
+                                   data,
+                                   last_loca_value /*offset*/,
+                                   loca_value - last_loca_value /*length*/));
       glyph_builders_.push_back(builder);
       last_loca_value = loca_value;
     }
   }
 }
 
-GlyphTable::GlyphBuilderList* GlyphTable::Builder::getGlyphBuilders() {
+GlyphTable::GlyphBuilderList* GlyphTable::Builder::GetGlyphBuilders() {
   if (glyph_builders_.empty()) {
-    initialize(internalReadData(), loca_);
-    setModelChanged();
+    Initialize(InternalReadData(), loca_);
+    set_model_changed();
   }
   return &glyph_builders_;
 }
 
-void GlyphTable::Builder::revert() {
+void GlyphTable::Builder::Revert() {
   glyph_builders_.clear();
-  setModelChanged(false);
-}
-
-GlyphTable::GlyphBuilderList* GlyphTable::Builder::glyphBuilders() {
-  return getGlyphBuilders();
-}
-
-void GlyphTable::Builder::setGlyphBuilders(GlyphBuilderList* glyph_builders) {
-  glyph_builders_ = *glyph_builders;
-  setModelChanged();
-}
-
-CALLER_ATTACH GlyphTable::Glyph::Builder* GlyphTable::Builder::glyphBuilder(
-    ReadableFontData* data) {
-  return Glyph::Builder::getBuilder(this, data);
-}
-
-CALLER_ATTACH FontDataTable* GlyphTable::Builder::subBuildTable(
-    ReadableFontData* data) {
-  FontDataTablePtr table = new GlyphTable(header(), data);
-  return table.detach();
-}
-
-void GlyphTable::Builder::subDataSet() {
-  glyph_builders_.clear();
-  setModelChanged(false);
-}
-
-int32_t GlyphTable::Builder::subDataSizeToSerialize() {
-  if (glyph_builders_.empty())
-    return 0;
-
-  bool variable = false;
-  int32_t size = 0;
-
-  // Calculate size of each table.
-  for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
-                                  end = glyph_builders_.end(); b != end; ++b) {
-      int32_t glyph_size = (*b)->subDataSizeToSerialize();
-      size += abs(glyph_size);
-      variable |= glyph_size <= 0;
-  }
-  return variable ? -size : size;
-}
-
-bool GlyphTable::Builder::subReadyToSerialize() {
-  return !glyph_builders_.empty();
-}
-
-int32_t GlyphTable::Builder::subSerialize(WritableFontData* new_data) {
-  int32_t size = 0;
-  for (GlyphBuilderList::iterator b = glyph_builders_.begin(),
-                                  end = glyph_builders_.end(); b != end; ++b) {
-    FontDataPtr data;
-    data.attach(new_data->slice(size));
-    size += (*b)->subSerialize(down_cast<WritableFontData*>(data.p_));
-  }
-  return size;
+  set_model_changed(false);
 }
 
 /******************************************************************************
  * GlyphTable::Glyph class
  ******************************************************************************/
+GlyphTable::Glyph::~Glyph() {}
+
+CALLER_ATTACH GlyphTable::Glyph*
+    GlyphTable::Glyph::GetGlyph(ReadableFontData* data,
+                                int32_t offset,
+                                int32_t length) {
+  int32_t type = GlyphType(data, offset, length);
+  GlyphPtr glyph;
+
+  ReadableFontDataPtr sliced_data;
+  sliced_data.Attach(down_cast<ReadableFontData*>(data->Slice(offset, length)));
+  if (type == GlyphType::kSimple) {
+    glyph = new SimpleGlyph(sliced_data);
+  }
+  glyph = new CompositeGlyph(sliced_data);
+  return glyph.Detach();
+}
+
+int32_t GlyphTable::Glyph::GlyphType() {
+  return glyph_type_;
+}
+
+int32_t GlyphTable::Glyph::NumberOfContours() {
+  return number_of_contours_;
+}
+
+int32_t GlyphTable::Glyph::XMin() {
+  return data_->ReadShort(Offset::kXMin);
+}
+
+int32_t GlyphTable::Glyph::XMax() {
+  return data_->ReadShort(Offset::kXMax);
+}
+
+int32_t GlyphTable::Glyph::YMin() {
+  return data_->ReadShort(Offset::kYMin);
+}
+
+int32_t GlyphTable::Glyph::YMax() {
+  return data_->ReadShort(Offset::kYMax);
+}
+
+int32_t GlyphTable::Glyph::Padding() {
+  return padding_;
+}
+
 GlyphTable::Glyph::Glyph(ReadableFontData* data, int32_t glyph_type)
-    : SubTable(data), glyph_type_(glyph_type) {
-  if (data_->length() == 0) {
+    : SubTable(data),
+      glyph_type_(glyph_type) {
+  if (data_->Length() == 0) {
     number_of_contours_ = 0;
   } else {
     // -1 if composite
-    number_of_contours_ = data_->readShort(Offset::kNumberOfContours);
+    number_of_contours_ = data_->ReadShort(Offset::kNumberOfContours);
   }
 }
 
-GlyphTable::Glyph::~Glyph() {}
-
-int32_t GlyphTable::Glyph::glyphType(ReadableFontData* data, int32_t offset,
+int32_t GlyphTable::Glyph::GlyphType(ReadableFontData* data,
+                                     int32_t offset,
                                      int32_t length) {
   if (length == 0) {
     return GlyphType::kSimple;
   }
-  int32_t number_of_contours = data->readShort(offset);
+  int32_t number_of_contours = data->ReadShort(offset);
   if (number_of_contours >= 0) {
     return GlyphType::kSimple;
   }
   return GlyphType::kComposite;
 }
 
-CALLER_ATTACH GlyphTable::Glyph* GlyphTable::Glyph::getGlyph(
-    ReadableFontData* data, int32_t offset, int32_t length) {
-  int32_t type = glyphType(data, offset, length);
-  GlyphPtr glyph;
-
-  ReadableFontDataPtr sliced_data;
-  sliced_data.attach(down_cast<ReadableFontData*>(data->slice(offset, length)));
-  if (type == GlyphType::kSimple) {
-    glyph = new SimpleGlyph(sliced_data);
-  }
-  glyph = new CompositeGlyph(sliced_data);
-  return glyph.detach();
-}
-
-int32_t GlyphTable::Glyph::glyphType() {
-  return glyph_type_;
-}
-
-int32_t GlyphTable::Glyph::numberOfContours() {
-  return number_of_contours_;
-}
-
-int32_t GlyphTable::Glyph::xMin() {
-  return data_->readShort(Offset::kXMin);
-}
-
-int32_t GlyphTable::Glyph::xMax() {
-  return data_->readShort(Offset::kXMax);
-}
-
-int32_t GlyphTable::Glyph::yMin() {
-  return data_->readShort(Offset::kYMin);
-}
-
-int32_t GlyphTable::Glyph::yMax() {
-  return data_->readShort(Offset::kYMax);
-}
-
-int32_t GlyphTable::Glyph::padding() {
-  return padding_;
-}
-
 /******************************************************************************
  * GlyphTable::Glyph::Builder class
  ******************************************************************************/
-GlyphTable::Glyph::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                                    WritableFontData* data) :
-    SubTable::Builder(font_builder, data) {
+GlyphTable::Glyph::Builder::~Builder() {
 }
 
 GlyphTable::Glyph::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                                    ReadableFontData* data) :
-    SubTable::Builder(font_builder, data) {
+                                    WritableFontData* data)
+    : SubTable::Builder(font_builder, data) {
 }
 
-GlyphTable::Glyph::Builder::~Builder() {}
-
-CALLER_ATTACH GlyphTable::Glyph::Builder*
-    GlyphTable::Glyph::Builder::getBuilder(
-        FontDataTableBuilderContainer* table_builder, ReadableFontData* data) {
-  return getBuilder(table_builder, data, 0, data->length());
+GlyphTable::Glyph::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+                                    ReadableFontData* data)
+    : SubTable::Builder(font_builder, data) {
 }
 
 CALLER_ATTACH GlyphTable::Glyph::Builder*
-    GlyphTable::Glyph::Builder::getBuilder(
-        FontDataTableBuilderContainer* table_builder, ReadableFontData* data,
-        int32_t offset, int32_t length) {
-  int32_t type = Glyph::glyphType(data, offset, length);
+    GlyphTable::Glyph::Builder::GetBuilder(
+        FontDataTableBuilderContainer* table_builder,
+        ReadableFontData* data) {
+  return GetBuilder(table_builder, data, 0, data->Length());
+}
+
+CALLER_ATTACH GlyphTable::Glyph::Builder*
+    GlyphTable::Glyph::Builder::GetBuilder(
+        FontDataTableBuilderContainer* table_builder,
+        ReadableFontData* data,
+        int32_t offset,
+        int32_t length) {
+  int32_t type = Glyph::GlyphType(data, offset, length);
   GlyphBuilderPtr builder;
   ReadableFontDataPtr sliced_data;
-  sliced_data.attach(down_cast<ReadableFontData*>(data->slice(offset, length)));
+  sliced_data.Attach(down_cast<ReadableFontData*>(data->Slice(offset, length)));
   if (type == GlyphType::kSimple) {
     builder = new SimpleGlyph::SimpleGlyphBuilder(table_builder, sliced_data);
   } else {
     builder = new CompositeGlyph::CompositeGlyphBuilder(table_builder,
                                                         sliced_data);
   }
-  return builder.detach();
+  return builder.Detach();
 }
 
-void GlyphTable::Glyph::Builder::subDataSet() {
+void GlyphTable::Glyph::Builder::SubDataSet() {
   // NOP
 }
 
-int32_t GlyphTable::Glyph::Builder::subDataSizeToSerialize() {
-  return internalReadData()->length();
+int32_t GlyphTable::Glyph::Builder::SubDataSizeToSerialize() {
+  return InternalReadData()->Length();
 }
 
-bool GlyphTable::Glyph::Builder::subReadyToSerialize() {
+bool GlyphTable::Glyph::Builder::SubReadyToSerialize() {
   return true;
 }
 
-int32_t GlyphTable::Glyph::Builder::subSerialize(WritableFontData* new_data) {
-  return internalReadData()->copyTo(new_data);
+int32_t GlyphTable::Glyph::Builder::SubSerialize(WritableFontData* new_data) {
+  return InternalReadData()->CopyTo(new_data);
 }
 
 /******************************************************************************
- * GlyphTable::SimpleGlyph and its builder
+ * GlyphTable::SimpleGlyph
  ******************************************************************************/
 GlyphTable::SimpleGlyph::SimpleGlyph(ReadableFontData* data)
     : GlyphTable::Glyph(data, GlyphType::kSimple) {
 }
 
-GlyphTable::SimpleGlyph::~SimpleGlyph() {}
+GlyphTable::SimpleGlyph::~SimpleGlyph() {
+}
 
-void GlyphTable::SimpleGlyph::initialize() {
+int32_t GlyphTable::SimpleGlyph::InstructionSize() {
+  Initialize();
+  return instruction_size_;
+}
+
+CALLER_ATTACH ReadableFontData* GlyphTable::SimpleGlyph::Instructions() {
+  Initialize();
+  return down_cast<ReadableFontData*>(
+             data_->Slice(instructions_offset_, InstructionSize()));
+}
+
+int32_t GlyphTable::SimpleGlyph::NumberOfPoints(int32_t contour) {
+  Initialize();
+  if (contour >= NumberOfContours()) {
+    return 0;
+  }
+  return contour_index_[contour + 1] - contour_index_[contour];
+}
+
+int32_t GlyphTable::SimpleGlyph::XCoordinate(int32_t contour, int32_t point) {
+  Initialize();
+  return x_coordinates_[contour_index_[contour] + point];
+}
+
+int32_t GlyphTable::SimpleGlyph::YCoordinate(int32_t contour, int32_t point) {
+  Initialize();
+  return y_coordinates_[contour_index_[contour] + point];
+}
+
+bool GlyphTable::SimpleGlyph::OnCurve(int32_t contour, int32_t point) {
+  Initialize();
+  return on_curve_[contour_index_[contour] + point];
+}
+
+void GlyphTable::SimpleGlyph::Initialize() {
   if (initialized_) {
     return;
   }
 
-  if (readFontData()->length() == 0) {
+  if (ReadFontData()->Length() == 0) {
     instruction_size_ = 0;
     number_of_points_ = 0;
     instructions_offset_ = 0;
@@ -331,38 +383,38 @@
     return;
   }
 
-  instruction_size_ = data_->readUShort(Offset::kSimpleEndPtsOfCountours +
-      numberOfContours() * DataSize::kUSHORT);
+  instruction_size_ = data_->ReadUShort(Offset::kSimpleEndPtsOfCountours +
+      NumberOfContours() * DataSize::kUSHORT);
   instructions_offset_ = Offset::kSimpleEndPtsOfCountours +
-      (numberOfContours() + 1) * DataSize::kUSHORT;
+      (NumberOfContours() + 1) * DataSize::kUSHORT;
   flags_offset_ = instructions_offset_ + instruction_size_ * DataSize::kBYTE;
-  number_of_points_ = contourEndPoint(numberOfContours() - 1) + 1;
+  number_of_points_ = ContourEndPoint(NumberOfContours() - 1) + 1;
   x_coordinates_.resize(number_of_points_);
   y_coordinates_.resize(number_of_points_);
   on_curve_.resize(number_of_points_);
-  parseData(false);
+  ParseData(false);
   x_coordinates_offset_ = flags_offset_ + flag_byte_count_ * DataSize::kBYTE;
   y_coordinates_offset_ = x_coordinates_offset_ + x_byte_count_ *
       DataSize::kBYTE;
-  contour_index_.resize(numberOfContours() + 1);
+  contour_index_.resize(NumberOfContours() + 1);
   contour_index_[0] = 0;
   for (uint32_t contour = 0; contour < contour_index_.size() - 1; ++contour) {
-    contour_index_[contour + 1] = contourEndPoint(contour) + 1;
+    contour_index_[contour + 1] = ContourEndPoint(contour) + 1;
   }
-  parseData(true);
+  ParseData(true);
   int32_t non_padded_data_length =
     5 * DataSize::kSHORT +
-    (numberOfContours() * DataSize::kUSHORT) +
+    (NumberOfContours() * DataSize::kUSHORT) +
     DataSize::kUSHORT +
     (instruction_size_ * DataSize::kBYTE) +
     (flag_byte_count_ * DataSize::kBYTE) +
     (x_byte_count_ * DataSize::kBYTE) +
     (y_byte_count_ * DataSize::kBYTE);
-  padding_ = length() - non_padded_data_length;
+  padding_ = Length() - non_padded_data_length;
   initialized_ = true;
 }
 
-void GlyphTable::SimpleGlyph::parseData(bool fill_arrays) {
+void GlyphTable::SimpleGlyph::ParseData(bool fill_arrays) {
   int32_t flag = 0;
   int32_t flag_repeat = 0;
   int32_t flag_index = 0;
@@ -373,9 +425,9 @@
        ++point_index) {
     // get the flag for the current point
     if (flag_repeat == 0) {
-      flag = flagAsInt(flag_index++);
+      flag = FlagAsInt(flag_index++);
       if ((flag & kFLAG_REPEAT) == kFLAG_REPEAT) {
-        flag_repeat = flagAsInt(flag_index++);
+        flag_repeat = FlagAsInt(flag_index++);
       }
     } else {
       flag_repeat--;
@@ -390,7 +442,7 @@
       // single byte x coord value
       if (fill_arrays) {
         x_coordinates_[point_index] =
-            data_->readUByte(x_coordinates_offset_ + x_byte_index);
+            data_->ReadUByte(x_coordinates_offset_ + x_byte_index);
         x_coordinates_[point_index] *=
             ((flag & kFLAG_XREPEATSIGN) == kFLAG_XREPEATSIGN) ? 1 : -1;
       }
@@ -400,7 +452,7 @@
       if (!((flag & kFLAG_XREPEATSIGN) == kFLAG_XREPEATSIGN)) {
         if (fill_arrays) {
           x_coordinates_[point_index] =
-            data_->readShort(x_coordinates_offset_ + x_byte_index);
+            data_->ReadShort(x_coordinates_offset_ + x_byte_index);
         }
         x_byte_index += 2;
       }
@@ -413,7 +465,7 @@
     if ((flag & kFLAG_YSHORT) == kFLAG_YSHORT) {
       if (fill_arrays) {
         y_coordinates_[point_index] =
-          data_->readUByte(y_coordinates_offset_ + y_byte_index);
+          data_->ReadUByte(y_coordinates_offset_ + y_byte_index);
         y_coordinates_[point_index] *=
           ((flag & kFLAG_YREPEATSIGN) == kFLAG_YREPEATSIGN) ? 1 : -1;
       }
@@ -422,7 +474,7 @@
       if (!((flag & kFLAG_YREPEATSIGN) == kFLAG_YREPEATSIGN)) {
         if (fill_arrays) {
           y_coordinates_[point_index] =
-            data_->readShort(y_coordinates_offset_ + y_byte_index);
+            data_->ReadShort(y_coordinates_offset_ + y_byte_index);
         }
         y_byte_index += 2;
       }
@@ -436,86 +488,130 @@
   y_byte_count_ = y_byte_index;
 }
 
-int32_t GlyphTable::SimpleGlyph::flagAsInt(int32_t index) {
-  return data_->readUByte(flags_offset_ + index * DataSize::kBYTE);
+int32_t GlyphTable::SimpleGlyph::FlagAsInt(int32_t index) {
+  return data_->ReadUByte(flags_offset_ + index * DataSize::kBYTE);
 }
 
-int32_t GlyphTable::SimpleGlyph::contourEndPoint(int32_t contour) {
-  return data_->readUShort(contour * DataSize::kUSHORT +
+int32_t GlyphTable::SimpleGlyph::ContourEndPoint(int32_t contour) {
+  return data_->ReadUShort(contour * DataSize::kUSHORT +
                            Offset::kSimpleEndPtsOfCountours);
 }
 
-int32_t GlyphTable::SimpleGlyph::instructionSize() {
-  initialize();
-  return instruction_size_;
-}
-
-CALLER_ATTACH ReadableFontData* GlyphTable::SimpleGlyph::instructions() {
-  initialize();
-  return down_cast<ReadableFontData*>(
-             data_->slice(instructions_offset_, instructionSize()));
-}
-
-int32_t GlyphTable::SimpleGlyph::numberOfPoints(int32_t contour) {
-  initialize();
-  if (contour >= numberOfContours()) {
-    return 0;
-  }
-  return contour_index_[contour + 1] - contour_index_[contour];
-}
-
-int32_t GlyphTable::SimpleGlyph::xCoordinate(int32_t contour, int32_t point) {
-  initialize();
-  return x_coordinates_[contour_index_[contour] + point];
-}
-
-int32_t GlyphTable::SimpleGlyph::yCoordinate(int32_t contour, int32_t point) {
-  initialize();
-  return y_coordinates_[contour_index_[contour] + point];
-}
-
-bool GlyphTable::SimpleGlyph::onCurve(int32_t contour, int32_t point) {
-  initialize();
-  return on_curve_[contour_index_[contour] + point];
+/******************************************************************************
+ * GlyphTable::SimpleGlyph::Builder
+ ******************************************************************************/
+GlyphTable::SimpleGlyph::SimpleGlyphBuilder::~SimpleGlyphBuilder() {
 }
 
 GlyphTable::SimpleGlyph::SimpleGlyphBuilder::SimpleGlyphBuilder(
-    FontDataTableBuilderContainer* table_builder, WritableFontData* data) :
-    Glyph::Builder(table_builder, data) {
+    FontDataTableBuilderContainer* table_builder,
+    WritableFontData* data)
+    : Glyph::Builder(table_builder, data) {
 }
 
 GlyphTable::SimpleGlyph::SimpleGlyphBuilder::SimpleGlyphBuilder(
-    FontDataTableBuilderContainer* table_builder, ReadableFontData* data) :
-    Glyph::Builder(table_builder, data) {
+    FontDataTableBuilderContainer* table_builder,
+    ReadableFontData* data)
+    : Glyph::Builder(table_builder, data) {
 }
 
-GlyphTable::SimpleGlyph::SimpleGlyphBuilder::~SimpleGlyphBuilder() {}
-
 CALLER_ATTACH FontDataTable*
-    GlyphTable::SimpleGlyph::SimpleGlyphBuilder::subBuildTable(
+    GlyphTable::SimpleGlyph::SimpleGlyphBuilder::SubBuildTable(
         ReadableFontData* data) {
   FontDataTablePtr table = new SimpleGlyph(data);
-  return table.detach();
+  return table.Detach();
 }
 
 /******************************************************************************
- * GlyphTable::CompositeGlyph and its builder
+ * GlyphTable::CompositeGlyph
  ******************************************************************************/
 GlyphTable::CompositeGlyph::CompositeGlyph(ReadableFontData* data)
     : GlyphTable::Glyph(data, GlyphType::kComposite),
-      instruction_size_(0), instructions_offset_(0) {
-  parseData();
+      instruction_size_(0),
+      instructions_offset_(0) {
+  ParseData();
 }
 
-GlyphTable::CompositeGlyph::~CompositeGlyph() {}
+GlyphTable::CompositeGlyph::~CompositeGlyph() {
+}
 
-void GlyphTable::CompositeGlyph::parseData() {
+int32_t GlyphTable::CompositeGlyph::Flags(int32_t contour) {
+  return data_->ReadUShort(contour_index_[contour]);
+}
+
+int32_t GlyphTable::CompositeGlyph::NumGlyphs() {
+  return contour_index_.size();
+}
+
+int32_t GlyphTable::CompositeGlyph::GlyphIndex(int32_t contour) {
+  return data_->ReadUShort(DataSize::kUSHORT + contour_index_[contour]);
+}
+
+int32_t GlyphTable::CompositeGlyph::Argument1(int32_t contour) {
+  int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
+  int32_t contour_flags = Flags(contour);
+  if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
+                       kFLAG_ARG_1_AND_2_ARE_WORDS) {
+    return data_->ReadUShort(index);
+  }
+  return data_->ReadByte(index);
+}
+
+int32_t GlyphTable::CompositeGlyph::Argument2(int32_t contour) {
+  int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
+  int32_t contour_flags = Flags(contour);
+  if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
+                       kFLAG_ARG_1_AND_2_ARE_WORDS) {
+    return data_->ReadUShort(index + DataSize::kUSHORT);
+  }
+  return data_->ReadByte(index + DataSize::kUSHORT);
+}
+
+int32_t GlyphTable::CompositeGlyph::TransformationSize(int32_t contour) {
+  int32_t contour_flags = Flags(contour);
+  if ((contour_flags & kFLAG_WE_HAVE_A_SCALE) == kFLAG_WE_HAVE_A_SCALE) {
+      return DataSize::kF2DOT14;
+    } else if ((contour_flags & kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) ==
+                                kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) {
+      return 2 * DataSize::kF2DOT14;
+    } else if ((contour_flags & kFLAG_WE_HAVE_A_TWO_BY_TWO) ==
+                                kFLAG_WE_HAVE_A_TWO_BY_TWO) {
+      return 4 * DataSize::kF2DOT14;
+    }
+    return 0;
+}
+
+void GlyphTable::CompositeGlyph::Transformation(int32_t contour,
+                                                ByteVector* transformation) {
+  int32_t contour_flags = Flags(contour);
+  int32_t index = contour_index_[contour] + 2 * DataSize::kUSHORT;
+  if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
+                       kFLAG_ARG_1_AND_2_ARE_WORDS) {
+    index += 2 * DataSize::kSHORT;
+  } else {
+    index += 2 * DataSize::kBYTE;
+  }
+  int32_t tsize = TransformationSize(contour);
+  transformation->resize(tsize);
+  data_->ReadBytes(index, transformation, 0, tsize);
+}
+
+int32_t GlyphTable::CompositeGlyph::InstructionSize() {
+  return instruction_size_;
+}
+
+CALLER_ATTACH ReadableFontData* GlyphTable::CompositeGlyph::Instructions() {
+  return down_cast<ReadableFontData*>(
+             data_->Slice(instructions_offset_, InstructionSize()));
+}
+
+void GlyphTable::CompositeGlyph::ParseData() {
   int32_t index = 5 * DataSize::kUSHORT;
   int32_t flags = kFLAG_MORE_COMPONENTS;
 
   while ((flags & kFLAG_MORE_COMPONENTS) == kFLAG_MORE_COMPONENTS) {
     contour_index_.push_back(index);
-    flags = data_->readUShort(index);
+    flags = data_->ReadUShort(index);
     index += 2 * DataSize::kUSHORT;  // flags and glyphIndex
     if ((flags & kFLAG_ARG_1_AND_2_ARE_WORDS) == kFLAG_ARG_1_AND_2_ARE_WORDS) {
       index += 2 * DataSize::kSHORT;
@@ -533,102 +629,38 @@
     }
     int32_t non_padded_data_length = index;
     if ((flags & kFLAG_WE_HAVE_INSTRUCTIONS) == kFLAG_WE_HAVE_INSTRUCTIONS) {
-      instruction_size_ = data_->readUShort(index);
+      instruction_size_ = data_->ReadUShort(index);
       index += DataSize::kUSHORT;
       instructions_offset_ = index;
       non_padded_data_length = index + (instruction_size_ * DataSize::kBYTE);
     }
-    padding_ = length() - non_padded_data_length;
+    padding_ = Length() - non_padded_data_length;
   }
 }
 
-int32_t GlyphTable::CompositeGlyph::flags(int32_t contour) {
-  return data_->readUShort(contour_index_[contour]);
-}
-
-int32_t GlyphTable::CompositeGlyph::numGlyphs() {
-  return contour_index_.size();
-}
-
-int32_t GlyphTable::CompositeGlyph::glyphIndex(int32_t contour) {
-  return data_->readUShort(DataSize::kUSHORT + contour_index_[contour]);
-}
-
-int32_t GlyphTable::CompositeGlyph::argument1(int32_t contour) {
-  int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
-  int32_t contour_flags = flags(contour);
-  if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
-                       kFLAG_ARG_1_AND_2_ARE_WORDS) {
-    return data_->readUShort(index);
-  }
-  return data_->readByte(index);
-}
-
-int32_t GlyphTable::CompositeGlyph::argument2(int32_t contour) {
-  int32_t index = 2 * DataSize::kUSHORT + contour_index_[contour];
-  int32_t contour_flags = flags(contour);
-  if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
-                       kFLAG_ARG_1_AND_2_ARE_WORDS) {
-    return data_->readUShort(index + DataSize::kUSHORT);
-  }
-  return data_->readByte(index + DataSize::kUSHORT);
-}
-
-int32_t GlyphTable::CompositeGlyph::transformationSize(int32_t contour) {
-  int32_t contour_flags = flags(contour);
-  if ((contour_flags & kFLAG_WE_HAVE_A_SCALE) == kFLAG_WE_HAVE_A_SCALE) {
-      return DataSize::kF2DOT14;
-    } else if ((contour_flags & kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) ==
-                                kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) {
-      return 2 * DataSize::kF2DOT14;
-    } else if ((contour_flags & kFLAG_WE_HAVE_A_TWO_BY_TWO) ==
-                                kFLAG_WE_HAVE_A_TWO_BY_TWO) {
-      return 4 * DataSize::kF2DOT14;
-    }
-    return 0;
-}
-
-void GlyphTable::CompositeGlyph::transformation(int32_t contour,
-                                                ByteVector* transformation) {
-  int32_t contour_flags = flags(contour);
-  int32_t index = contour_index_[contour] + 2 * DataSize::kUSHORT;
-  if ((contour_flags & kFLAG_ARG_1_AND_2_ARE_WORDS) ==
-                       kFLAG_ARG_1_AND_2_ARE_WORDS) {
-    index += 2 * DataSize::kSHORT;
-  } else {
-    index += 2 * DataSize::kBYTE;
-  }
-  int32_t tsize = transformationSize(contour);
-  transformation->resize(tsize);
-  data_->readBytes(index, transformation, 0, tsize);
-}
-
-int32_t GlyphTable::CompositeGlyph::instructionSize() {
-  return instruction_size_;
-}
-
-CALLER_ATTACH ReadableFontData* GlyphTable::CompositeGlyph::instructions() {
-  return down_cast<ReadableFontData*>(
-             data_->slice(instructions_offset_, instructionSize()));
+/******************************************************************************
+ * GlyphTable::CompositeGlyph::Builder
+ ******************************************************************************/
+GlyphTable::CompositeGlyph::CompositeGlyphBuilder::~CompositeGlyphBuilder() {
 }
 
 GlyphTable::CompositeGlyph::CompositeGlyphBuilder::CompositeGlyphBuilder(
-    FontDataTableBuilderContainer* table_builder, WritableFontData* data) :
-    Glyph::Builder(table_builder, data) {
+    FontDataTableBuilderContainer* table_builder,
+    WritableFontData* data)
+    : Glyph::Builder(table_builder, data) {
 }
 
 GlyphTable::CompositeGlyph::CompositeGlyphBuilder::CompositeGlyphBuilder(
-    FontDataTableBuilderContainer* table_builder, ReadableFontData* data) :
-    Glyph::Builder(table_builder, data) {
+    FontDataTableBuilderContainer* table_builder,
+    ReadableFontData* data)
+    : Glyph::Builder(table_builder, data) {
 }
 
-GlyphTable::CompositeGlyph::CompositeGlyphBuilder::~CompositeGlyphBuilder() {}
-
 CALLER_ATTACH FontDataTable*
-    GlyphTable::CompositeGlyph::CompositeGlyphBuilder::subBuildTable(
+    GlyphTable::CompositeGlyph::CompositeGlyphBuilder::SubBuildTable(
         ReadableFontData* data) {
   FontDataTablePtr table = new CompositeGlyph(data);
-  return table.detach();
+  return table.Detach();
 }
 
 }  // namespace sfntly
diff --git a/sfntly/glyph_table.h b/sfntly/glyph_table.h
index 8a7a8aa..c066d47 100644
--- a/sfntly/glyph_table.h
+++ b/sfntly/glyph_table.h
@@ -36,66 +36,9 @@
 //       before GlyphTable::Builder to avoid compilation errors.
 class GlyphTable : public Table, public RefCounted<GlyphTable> {
  public:
-  struct Offset {
-    enum {
-      // header
-      kNumberOfContours = 0,
-      kXMin = 2,
-      kYMin = 4,
-      kXMax = 6,
-      kYMax = 8,
-
-      // Simple Glyph Description
-      kSimpleEndPtsOfCountours = 10,
-      // offset from the end of the contours array
-      kSimpleInstructionLength = 0,
-      kSimpleInstructions = 2,
-      // flags
-      // xCoordinates
-      // yCoordinates
-
-      // Composite Glyph Description
-      kCompositeFlags = 0,
-      kCompositeGyphIndexWithoutFlag = 0,
-      kCompositeGlyphIndexWithFlag = 2,
-    };
-  };
-
- private:
-  GlyphTable(Header* header, ReadableFontData* data);
-
- public:
-  virtual ~GlyphTable();
-
-  class Glyph;
-  Glyph* glyph(int32_t offset, int32_t length);
-
   class Builder;
   class Glyph : public SubTable {
-   protected:
-    // Note: constructor refactored in C++ to avoid heavy lifting.
-    //       caller need to do data->slice(offset, length) beforehand.
-    Glyph(ReadableFontData* data, int32_t glyph_type);
-
-   private:
-    static int32_t glyphType(ReadableFontData* data, int32_t offset,
-                             int32_t length);
-
    public:
-    virtual ~Glyph();
-    static CALLER_ATTACH Glyph* getGlyph(ReadableFontData* data, int32_t offset,
-                                         int32_t length);
-    virtual int32_t glyphType();
-    virtual int32_t numberOfContours();
-    virtual int32_t xMin();
-    virtual int32_t xMax();
-    virtual int32_t yMin();
-    virtual int32_t yMax();
-    virtual int32_t padding();  // override FontDataTable::padding()
-
-    virtual int32_t instructionSize() = 0;
-    virtual ReadableFontData* instructions() = 0;
-
     // Note: Contour is an empty class for the version ported
     class Contour {
      protected:
@@ -104,42 +47,67 @@
     };
 
     class Builder : public SubTable::Builder {
+     public:
+      virtual ~Builder();
+
      protected:
       // Incoming table_builder is GlyphTable::Builder*.
       // Note: constructor refactored in C++ to avoid heavy lifting.
-      //       caller need to do data->slice(offset, length) beforehand.
+      //       caller need to do data->Slice(offset, length) beforehand.
       Builder(FontDataTableBuilderContainer* table_builder,
               WritableFontData* data);
       Builder(FontDataTableBuilderContainer* table_builder,
               ReadableFontData* data);
 
-     public:
-      virtual ~Builder();
+      static CALLER_ATTACH Builder*
+          GetBuilder(FontDataTableBuilderContainer* table_builder,
+                     ReadableFontData* data);
+      static CALLER_ATTACH Builder*
+          GetBuilder(FontDataTableBuilderContainer* table_builder,
+                     ReadableFontData* data,
+                     int32_t offset,
+                     int32_t length);
+      virtual void SubDataSet();
+      virtual int32_t SubDataSizeToSerialize();
+      virtual bool SubReadyToSerialize();
+      virtual int32_t SubSerialize(WritableFontData* new_data);
 
-     protected:
-      static CALLER_ATTACH Builder* getBuilder(
-          FontDataTableBuilderContainer* table_builder, ReadableFontData* data);
-      static CALLER_ATTACH Builder* getBuilder(
-          FontDataTableBuilderContainer* table_builder, ReadableFontData* data,
-          int32_t offset, int32_t length);
-      virtual void subDataSet();
-      virtual int32_t subDataSizeToSerialize();
-      virtual bool subReadyToSerialize();
-      virtual int32_t subSerialize(WritableFontData* new_data);
-
-     protected:
+     private:
       int32_t format_;
       friend class GlyphTable::Builder;
     };
 
-   private:
-    int32_t glyph_type_;
-    int32_t number_of_contours_;
+    virtual ~Glyph();
+    static CALLER_ATTACH Glyph* GetGlyph(ReadableFontData* data,
+                                         int32_t offset,
+                                         int32_t length);
+    virtual int32_t GlyphType();
+    virtual int32_t NumberOfContours();
+    virtual int32_t XMin();
+    virtual int32_t XMax();
+    virtual int32_t YMin();
+    virtual int32_t YMax();
+    virtual int32_t Padding();  // override FontDataTable::Padding()
+
+    virtual int32_t InstructionSize() = 0;
+    virtual ReadableFontData* Instructions() = 0;
 
    protected:
-    int32_t padding_;
-  };
+    // Note: constructor refactored in C++ to avoid heavy lifting.
+    //       caller need to do data->Slice(offset, length) beforehand.
+    Glyph(ReadableFontData* data, int32_t glyph_type);
 
+    // TODO(arthurhsu): violating C++ style guide, need refactoring.
+    int32_t padding_;
+
+   private:
+    static int32_t GlyphType(ReadableFontData* data,
+                             int32_t offset,
+                             int32_t length);
+
+    int32_t glyph_type_;
+    int32_t number_of_contours_;
+  };  // class GlyphTable::Glyph
   typedef Ptr<GlyphTable::Glyph::Builder> GlyphBuilderPtr;
   typedef std::vector<GlyphBuilderPtr> GlyphBuilderList;
 
@@ -147,19 +115,14 @@
                   public RefCounted<GlyphTable::Builder> {
    public:
     // Note: Constructor scope altered to public for base class to instantiate.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
             WritableFontData* data);
     virtual ~Builder();
 
-    virtual void setLoca(const IntegerList& loca);
-    virtual void generateLocaList(IntegerList* locas);
+    virtual void SetLoca(const IntegerList& loca);
+    virtual void GenerateLocaList(IntegerList* locas);
 
-   private:
-    void initialize(ReadableFontData* data, const IntegerList& loca);
-    GlyphBuilderList* getGlyphBuilders();
-    void revert();
-
-   public:
     // Gets the List of glyph builders for the glyph table builder. These may be
     // manipulated in any way by the caller and the changes will be reflected in
     // the final glyph table produced.
@@ -168,22 +131,26 @@
     // List. If there is current data (i.e. data read from an existing font) and
     // the <code>loca</code> list has not been set or is null, empty, or
     // invalid, then an empty glyph builder List will be returned.
-    GlyphBuilderList* glyphBuilders();
+    GlyphBuilderList* GlyphBuilders();
 
     // Replace the internal glyph builders with the one provided.
-    void setGlyphBuilders(GlyphBuilderList* glyph_builders);
+    void SetGlyphBuilders(GlyphBuilderList* glyph_builders);
 
     // Glyph builder factories
-    CALLER_ATTACH Glyph::Builder* glyphBuilder(ReadableFontData* data);
+    CALLER_ATTACH Glyph::Builder* GlyphBuilder(ReadableFontData* data);
 
    protected:  // internal API for building
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-    virtual void subDataSet();
-    virtual int32_t subDataSizeToSerialize();
-    virtual bool subReadyToSerialize();
-    virtual int32_t subSerialize(WritableFontData* new_data);
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+    virtual void SubDataSet();
+    virtual int32_t SubDataSizeToSerialize();
+    virtual bool SubReadyToSerialize();
+    virtual int32_t SubSerialize(WritableFontData* new_data);
 
    private:
+    void Initialize(ReadableFontData* data, const IntegerList& loca);
+    GlyphBuilderList* GetGlyphBuilders();
+    void Revert();
+
     GlyphBuilderList glyph_builders_;
     IntegerList loca_;
   };
@@ -197,34 +164,12 @@
     static const int32_t kFLAG_XREPEATSIGN;
     static const int32_t kFLAG_YREPEATSIGN;
 
-   public:
-    // Note: constructor refactored in C++ to avoid heavy lifting.
-    //       caller need to do data->slice(offset, length) beforehand.
-    explicit SimpleGlyph(ReadableFontData* data);
-    virtual ~SimpleGlyph();
-
-   public:
     class SimpleContour : public Glyph::Contour {
      protected:
       SimpleContour() {}
       virtual ~SimpleContour() {}
     };
 
-   private:
-    void initialize();
-    void parseData(bool fill_arrays);
-    int32_t flagAsInt(int32_t index);
-    int32_t contourEndPoint(int32_t contour);
-
-   public:  // class is final, , no virtual functions unless from parent
-    virtual int32_t instructionSize();
-    virtual CALLER_ATTACH ReadableFontData* instructions();
-    int32_t numberOfPoints(int32_t contour);
-    int32_t xCoordinate(int32_t contour, int32_t point);
-    int32_t yCoordinate(int32_t contour, int32_t point);
-    bool onCurve(int32_t contour, int32_t point);
-
-   public:
     class SimpleGlyphBuilder : public Glyph::Builder,
                                public RefCounted<SimpleGlyphBuilder> {
      public:
@@ -232,17 +177,36 @@
 
      protected:
       // Note: constructor refactored in C++ to avoid heavy lifting.
-      //       caller need to do data->slice(offset, length) beforehand.
+      //       caller need to do data->Slice(offset, length) beforehand.
       SimpleGlyphBuilder(FontDataTableBuilderContainer* table_builder,
                          WritableFontData* data);
       SimpleGlyphBuilder(FontDataTableBuilderContainer* table_builder,
                          ReadableFontData* data);
       virtual CALLER_ATTACH FontDataTable*
-          subBuildTable(ReadableFontData* data);
+          SubBuildTable(ReadableFontData* data);
+
+     private:
       friend class Glyph::Builder;
     };
 
+    // Note: constructor refactored in C++ to avoid heavy lifting.
+    //       caller need to do data->Slice(offset, length) beforehand.
+    explicit SimpleGlyph(ReadableFontData* data);
+    virtual ~SimpleGlyph();
+
+    virtual int32_t InstructionSize();
+    virtual CALLER_ATTACH ReadableFontData* Instructions();
+    int32_t NumberOfPoints(int32_t contour);
+    int32_t XCoordinate(int32_t contour, int32_t point);
+    int32_t YCoordinate(int32_t contour, int32_t point);
+    bool OnCurve(int32_t contour, int32_t point);
+
    private:
+    void Initialize();
+    void ParseData(bool fill_arrays);
+    int32_t FlagAsInt(int32_t index);
+    int32_t ContourEndPoint(int32_t contour);
+
     bool initialized_;
     int32_t instruction_size_;
     int32_t number_of_points_;
@@ -279,27 +243,6 @@
     static const int32_t kFLAG_SCALED_COMPONENT_OFFSET;
     static const int32_t kFLAG_UNSCALED_COMPONENT_OFFSET;
 
-   public:
-    // Note: constructor refactored in C++ to avoid heavy lifting.
-    //       caller need to do data->slice(offset, length) beforehand.
-    explicit CompositeGlyph(ReadableFontData* data);
-    virtual ~CompositeGlyph();
-
-   private:
-    void parseData();
-
-   public:  // class is final, no virtual functions unless from parent
-    int32_t flags(int32_t contour);
-    int32_t numGlyphs();
-    int32_t glyphIndex(int32_t contour);
-    int32_t argument1(int32_t contour);
-    int32_t argument2(int32_t contour);
-    int32_t transformationSize(int32_t contour);
-    void transformation(int32_t contour, ByteVector* transformation);
-    virtual int32_t instructionSize();
-    virtual CALLER_ATTACH ReadableFontData* instructions();
-
-   public:
     class CompositeGlyphBuilder : public Glyph::Builder,
                                   public RefCounted<CompositeGlyphBuilder> {
      public:
@@ -307,22 +250,74 @@
 
      protected:
       // Note: constructor refactored in C++ to avoid heavy lifting.
-      //       caller need to do data->slice(offset, length) beforehand.
+      //       caller need to do data->Slice(offset, length) beforehand.
       CompositeGlyphBuilder(FontDataTableBuilderContainer* table_builder,
                             WritableFontData* data);
       CompositeGlyphBuilder(FontDataTableBuilderContainer* table_builder,
                             ReadableFontData* data);
 
       virtual CALLER_ATTACH FontDataTable*
-          subBuildTable(ReadableFontData* data);
+          SubBuildTable(ReadableFontData* data);
+
+     private:
       friend class Glyph::Builder;
     };
 
+    // Note: constructor refactored in C++ to avoid heavy lifting.
+    //       caller need to do data->Slice(offset, length) beforehand.
+    explicit CompositeGlyph(ReadableFontData* data);
+    virtual ~CompositeGlyph();
+
+    int32_t Flags(int32_t contour);
+    int32_t NumGlyphs();
+    int32_t GlyphIndex(int32_t contour);
+    int32_t Argument1(int32_t contour);
+    int32_t Argument2(int32_t contour);
+    int32_t TransformationSize(int32_t contour);
+    void Transformation(int32_t contour, ByteVector* transformation);
+    virtual int32_t InstructionSize();
+    virtual CALLER_ATTACH ReadableFontData* Instructions();
+
    private:
+    void ParseData();
+
     IntegerList contour_index_;
     int32_t instruction_size_;
     int32_t instructions_offset_;
   };
+
+  virtual ~GlyphTable();
+
+  // C++ port: rename glyph() to GetGlyph().
+  Glyph* GetGlyph(int32_t offset, int32_t length);
+
+ private:
+  struct Offset {
+    enum {
+      // header
+      kNumberOfContours = 0,
+      kXMin = 2,
+      kYMin = 4,
+      kXMax = 6,
+      kYMax = 8,
+
+      // Simple Glyph Description
+      kSimpleEndPtsOfCountours = 10,
+      // offset from the end of the contours array
+      kSimpleInstructionLength = 0,
+      kSimpleInstructions = 2,
+      // flags
+      // xCoordinates
+      // yCoordinates
+
+      // Composite Glyph Description
+      kCompositeFlags = 0,
+      kCompositeGyphIndexWithoutFlag = 0,
+      kCompositeGlyphIndexWithFlag = 2,
+    };
+  };
+
+  GlyphTable(Header* header, ReadableFontData* data);
 };
 typedef Ptr<GlyphTable> GlyphTablePtr;
 typedef Ptr<GlyphTable::Builder> GlyphTableBuilderPtr;
diff --git a/sfntly/horizontal_header_table.cc b/sfntly/horizontal_header_table.cc
index f30e8db..a987d70 100644
--- a/sfntly/horizontal_header_table.cc
+++ b/sfntly/horizontal_header_table.cc
@@ -24,189 +24,192 @@
 /******************************************************************************
  * HorizontalHeaderTable class
  ******************************************************************************/
-HorizontalHeaderTable:: HorizontalHeaderTable(Header* header,
-                                              ReadableFontData* data) :
-    Table(header, data) {}
-
 HorizontalHeaderTable:: ~HorizontalHeaderTable() {}
 
-int32_t HorizontalHeaderTable::version() {
-  return data_->readFixed(Offset::kVersion);
+int32_t HorizontalHeaderTable::Version() {
+  return data_->ReadFixed(Offset::kVersion);
 }
 
-int32_t HorizontalHeaderTable::ascender() {
-  return data_->readShort(Offset::kAscender);
+int32_t HorizontalHeaderTable::Ascender() {
+  return data_->ReadShort(Offset::kAscender);
 }
 
-int32_t HorizontalHeaderTable::descender() {
-  return data_->readShort(Offset::kDescender);
+int32_t HorizontalHeaderTable::Descender() {
+  return data_->ReadShort(Offset::kDescender);
 }
 
-int32_t HorizontalHeaderTable::lineGap() {
-  return data_->readShort(Offset::kLineGap);
+int32_t HorizontalHeaderTable::LineGap() {
+  return data_->ReadShort(Offset::kLineGap);
 }
 
-int32_t HorizontalHeaderTable::advanceWidthMax() {
-  return data_->readUShort(Offset::kAdvanceWidthMax);
+int32_t HorizontalHeaderTable::AdvanceWidthMax() {
+  return data_->ReadUShort(Offset::kAdvanceWidthMax);
 }
 
-int32_t HorizontalHeaderTable::minLeftSideBearing() {
-  return data_->readShort(Offset::kMinLeftSideBearing);
+int32_t HorizontalHeaderTable::MinLeftSideBearing() {
+  return data_->ReadShort(Offset::kMinLeftSideBearing);
 }
 
-int32_t HorizontalHeaderTable::minRightSideBearing() {
-  return data_->readShort(Offset::kMinRightSideBearing);
+int32_t HorizontalHeaderTable::MinRightSideBearing() {
+  return data_->ReadShort(Offset::kMinRightSideBearing);
 }
 
-int32_t HorizontalHeaderTable::xMaxExtent() {
-  return data_->readShort(Offset::kXMaxExtent);
+int32_t HorizontalHeaderTable::XMaxExtent() {
+  return data_->ReadShort(Offset::kXMaxExtent);
 }
 
-int32_t HorizontalHeaderTable::caretSlopeRise() {
-  return data_->readShort(Offset::kCaretSlopeRise);
+int32_t HorizontalHeaderTable::CaretSlopeRise() {
+  return data_->ReadShort(Offset::kCaretSlopeRise);
 }
 
-int32_t HorizontalHeaderTable::caretSlopeRun() {
-  return data_->readShort(Offset::kCaretSlopeRun);
+int32_t HorizontalHeaderTable::CaretSlopeRun() {
+  return data_->ReadShort(Offset::kCaretSlopeRun);
 }
 
-int32_t HorizontalHeaderTable::caretOffset() {
-  return data_->readShort(Offset::kCaretOffset);
+int32_t HorizontalHeaderTable::CaretOffset() {
+  return data_->ReadShort(Offset::kCaretOffset);
 }
 
-int32_t HorizontalHeaderTable::metricDataFormat() {
-  return data_->readShort(Offset::kMetricDataFormat);
+int32_t HorizontalHeaderTable::MetricDataFormat() {
+  return data_->ReadShort(Offset::kMetricDataFormat);
 }
 
-int32_t HorizontalHeaderTable::numberOfHMetrics() {
-  return data_->readUShort(Offset::kNumberOfHMetrics);
+int32_t HorizontalHeaderTable::NumberOfHMetrics() {
+  return data_->ReadUShort(Offset::kNumberOfHMetrics);
+}
+
+HorizontalHeaderTable:: HorizontalHeaderTable(Header* header,
+                                              ReadableFontData* data)
+    : Table(header, data) {
 }
 
 /******************************************************************************
  * HorizontalHeaderTable::Builder class
  ******************************************************************************/
 HorizontalHeaderTable::Builder::Builder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    WritableFontData* data) :
-    Table::TableBasedTableBuilder(font_builder, header, data) {
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    WritableFontData* data)
+    : Table::TableBasedTableBuilder(font_builder, header, data) {
 }
 
 HorizontalHeaderTable::Builder::Builder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    ReadableFontData* data) :
-    Table::TableBasedTableBuilder(font_builder, header, data) {
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    ReadableFontData* data)
+    : Table::TableBasedTableBuilder(font_builder, header, data) {
 }
 
 HorizontalHeaderTable::Builder::~Builder() {}
 
-CALLER_ATTACH FontDataTable* HorizontalHeaderTable::Builder::subBuildTable(
-    ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+    HorizontalHeaderTable::Builder::SubBuildTable(ReadableFontData* data) {
   FontDataTablePtr table = new HorizontalHeaderTable(header(), data);
-  return table.detach();
+  return table.Detach();
 }
 
-int32_t HorizontalHeaderTable::Builder::version() {
-  return internalReadData()->readFixed(Offset::kVersion);
+int32_t HorizontalHeaderTable::Builder::Version() {
+  return InternalReadData()->ReadFixed(Offset::kVersion);
 }
 
-void HorizontalHeaderTable::Builder::setVersion(int32_t version) {
-  internalWriteData()->writeFixed(Offset::kVersion, version);
+void HorizontalHeaderTable::Builder::SetVersion(int32_t version) {
+  InternalWriteData()->WriteFixed(Offset::kVersion, version);
 }
 
-int32_t HorizontalHeaderTable::Builder::ascender() {
-  return internalReadData()->readUShort(Offset::kAscender);
+int32_t HorizontalHeaderTable::Builder::Ascender() {
+  return InternalReadData()->ReadUShort(Offset::kAscender);
 }
 
-void HorizontalHeaderTable::Builder::setAscender(int32_t ascender) {
-  internalWriteData()->writeUShort(Offset::kVersion, ascender);
+void HorizontalHeaderTable::Builder::SetAscender(int32_t ascender) {
+  InternalWriteData()->WriteUShort(Offset::kVersion, ascender);
 }
 
-int32_t HorizontalHeaderTable::Builder::descender() {
-  return internalReadData()->readUShort(Offset::kDescender);
+int32_t HorizontalHeaderTable::Builder::Descender() {
+  return InternalReadData()->ReadUShort(Offset::kDescender);
 }
 
-void HorizontalHeaderTable::Builder::setDescender(int32_t descender) {
-  internalWriteData()->writeUShort(Offset::kDescender, descender);
+void HorizontalHeaderTable::Builder::SetDescender(int32_t descender) {
+  InternalWriteData()->WriteUShort(Offset::kDescender, descender);
 }
 
-int32_t HorizontalHeaderTable::Builder::lineGap() {
-  return internalReadData()->readUShort(Offset::kLineGap);
+int32_t HorizontalHeaderTable::Builder::LineGap() {
+  return InternalReadData()->ReadUShort(Offset::kLineGap);
 }
 
-void HorizontalHeaderTable::Builder::setLineGap(int32_t line_gap) {
-  internalWriteData()->writeUShort(Offset::kLineGap, line_gap);
+void HorizontalHeaderTable::Builder::SetLineGap(int32_t line_gap) {
+  InternalWriteData()->WriteUShort(Offset::kLineGap, line_gap);
 }
 
-int32_t HorizontalHeaderTable::Builder::advanceWidthMax() {
-  return internalReadData()->readUShort(Offset::kAdvanceWidthMax);
+int32_t HorizontalHeaderTable::Builder::AdvanceWidthMax() {
+  return InternalReadData()->ReadUShort(Offset::kAdvanceWidthMax);
 }
 
-void HorizontalHeaderTable::Builder::setAdvanceWidthMax(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kAdvanceWidthMax, value);
+void HorizontalHeaderTable::Builder::SetAdvanceWidthMax(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kAdvanceWidthMax, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::minLeftSideBearing() {
-  return internalReadData()->readUShort(Offset::kMinLeftSideBearing);
+int32_t HorizontalHeaderTable::Builder::MinLeftSideBearing() {
+  return InternalReadData()->ReadUShort(Offset::kMinLeftSideBearing);
 }
 
-void HorizontalHeaderTable::Builder::setMinLeftSideBearing(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kMinLeftSideBearing, value);
+void HorizontalHeaderTable::Builder::SetMinLeftSideBearing(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kMinLeftSideBearing, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::minRightSideBearing() {
-  return internalReadData()->readUShort(Offset::kMinRightSideBearing);
+int32_t HorizontalHeaderTable::Builder::MinRightSideBearing() {
+  return InternalReadData()->ReadUShort(Offset::kMinRightSideBearing);
 }
 
-void HorizontalHeaderTable::Builder::setMinRightSideBearing(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kMinRightSideBearing, value);
+void HorizontalHeaderTable::Builder::SetMinRightSideBearing(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kMinRightSideBearing, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::xMaxExtent() {
-  return internalReadData()->readUShort(Offset::kXMaxExtent);
+int32_t HorizontalHeaderTable::Builder::XMaxExtent() {
+  return InternalReadData()->ReadUShort(Offset::kXMaxExtent);
 }
 
-void HorizontalHeaderTable::Builder::setXMaxExtent(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kXMaxExtent, value);
+void HorizontalHeaderTable::Builder::SetXMaxExtent(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kXMaxExtent, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::caretSlopeRise() {
-  return internalReadData()->readUShort(Offset::kCaretSlopeRise);
+int32_t HorizontalHeaderTable::Builder::CaretSlopeRise() {
+  return InternalReadData()->ReadUShort(Offset::kCaretSlopeRise);
 }
 
-void HorizontalHeaderTable::Builder::setCaretSlopeRise(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kCaretSlopeRise, value);
+void HorizontalHeaderTable::Builder::SetCaretSlopeRise(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kCaretSlopeRise, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::caretSlopeRun() {
-  return internalReadData()->readUShort(Offset::kCaretSlopeRun);
+int32_t HorizontalHeaderTable::Builder::CaretSlopeRun() {
+  return InternalReadData()->ReadUShort(Offset::kCaretSlopeRun);
 }
 
-void HorizontalHeaderTable::Builder::setCaretSlopeRun(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kCaretSlopeRun, value);
+void HorizontalHeaderTable::Builder::SetCaretSlopeRun(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kCaretSlopeRun, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::caretOffset() {
-  return internalReadData()->readUShort(Offset::kCaretOffset);
+int32_t HorizontalHeaderTable::Builder::CaretOffset() {
+  return InternalReadData()->ReadUShort(Offset::kCaretOffset);
 }
 
-void HorizontalHeaderTable::Builder::setCaretOffset(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kCaretOffset, value);
+void HorizontalHeaderTable::Builder::SetCaretOffset(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kCaretOffset, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::metricDataFormat() {
-  return internalReadData()->readUShort(Offset::kMetricDataFormat);
+int32_t HorizontalHeaderTable::Builder::MetricDataFormat() {
+  return InternalReadData()->ReadUShort(Offset::kMetricDataFormat);
 }
 
-void HorizontalHeaderTable::Builder::setMetricDataFormat(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kMetricDataFormat, value);
+void HorizontalHeaderTable::Builder::SetMetricDataFormat(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kMetricDataFormat, value);
 }
 
-int32_t HorizontalHeaderTable::Builder::numberOfHMetrics() {
-  return internalReadData()->readUShort(Offset::kNumberOfHMetrics);
+int32_t HorizontalHeaderTable::Builder::NumberOfHMetrics() {
+  return InternalReadData()->ReadUShort(Offset::kNumberOfHMetrics);
 }
 
-void HorizontalHeaderTable::Builder::setNumberOfHMetrics(int32_t value) {
-  internalWriteData()->writeUShort(Offset::kNumberOfHMetrics, value);
+void HorizontalHeaderTable::Builder::SetNumberOfHMetrics(int32_t value) {
+  InternalWriteData()->WriteUShort(Offset::kNumberOfHMetrics, value);
 }
 
 }  // namespace sfntly
diff --git a/sfntly/horizontal_header_table.h b/sfntly/horizontal_header_table.h
index 704391c..e8a3534 100644
--- a/sfntly/horizontal_header_table.h
+++ b/sfntly/horizontal_header_table.h
@@ -23,6 +23,64 @@
 
 class HorizontalHeaderTable : public Table,
                               public RefCounted<HorizontalHeaderTable> {
+ public:
+  class Builder : public Table::TableBasedTableBuilder,
+                  public RefCounted<Builder> {
+   public:
+    // Constructor scope altered to public because C++ does not allow base
+    // class to instantiate derived class with protected constructors.
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
+            WritableFontData* data);
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
+            ReadableFontData* data);
+    virtual ~Builder();
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+    int32_t Version();
+    void SetVersion(int32_t version);
+    int32_t Ascender();
+    void SetAscender(int32_t ascender);
+    int32_t Descender();
+    void SetDescender(int32_t descender);
+    int32_t LineGap();
+    void SetLineGap(int32_t line_gap);
+    int32_t AdvanceWidthMax();
+    void SetAdvanceWidthMax(int32_t value);
+    int32_t MinLeftSideBearing();
+    void SetMinLeftSideBearing(int32_t value);
+    int32_t MinRightSideBearing();
+    void SetMinRightSideBearing(int32_t value);
+    int32_t XMaxExtent();
+    void SetXMaxExtent(int32_t value);
+    int32_t CaretSlopeRise();
+    void SetCaretSlopeRise(int32_t value);
+    int32_t CaretSlopeRun();
+    void SetCaretSlopeRun(int32_t value);
+    int32_t CaretOffset();
+    void SetCaretOffset(int32_t value);
+    int32_t MetricDataFormat();
+    void SetMetricDataFormat(int32_t value);
+    int32_t NumberOfHMetrics();
+    void SetNumberOfHMetrics(int32_t value);
+  };
+
+  virtual ~HorizontalHeaderTable();
+  int32_t Version();
+  int32_t Ascender();
+  int32_t Descender();
+  int32_t LineGap();
+  int32_t AdvanceWidthMax();
+  int32_t MinLeftSideBearing();
+  int32_t MinRightSideBearing();
+  int32_t XMaxExtent();
+  int32_t CaretSlopeRise();
+  int32_t CaretSlopeRun();
+  int32_t CaretOffset();
+  int32_t MetricDataFormat();
+  int32_t NumberOfHMetrics();
+
  private:
   struct Offset {
     enum {
@@ -42,65 +100,7 @@
     };
   };
 
- private:
   HorizontalHeaderTable(Header* header, ReadableFontData* data);
-
- public:
-  virtual ~HorizontalHeaderTable();
-  int32_t version();
-  int32_t ascender();
-  int32_t descender();
-  int32_t lineGap();
-  int32_t advanceWidthMax();
-  int32_t minLeftSideBearing();
-  int32_t minRightSideBearing();
-  int32_t xMaxExtent();
-  int32_t caretSlopeRise();
-  int32_t caretSlopeRun();
-  int32_t caretOffset();
-  int32_t metricDataFormat();
-  int32_t numberOfHMetrics();
-
- public:
-  class Builder : public Table::TableBasedTableBuilder,
-                  public RefCounted<Builder> {
-   public:
-    // Constructor scope altered to public because C++ does not allow base
-    // class to instantiate derived class with protected constructors.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            ReadableFontData* data);
-    virtual ~Builder();
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
-    int32_t version();
-    void setVersion(int32_t version);
-    int32_t ascender();
-    void setAscender(int32_t ascender);
-    int32_t descender();
-    void setDescender(int32_t descender);
-    int32_t lineGap();
-    void setLineGap(int32_t line_gap);
-    int32_t advanceWidthMax();
-    void setAdvanceWidthMax(int32_t value);
-    int32_t minLeftSideBearing();
-    void setMinLeftSideBearing(int32_t value);
-    int32_t minRightSideBearing();
-    void setMinRightSideBearing(int32_t value);
-    int32_t xMaxExtent();
-    void setXMaxExtent(int32_t value);
-    int32_t caretSlopeRise();
-    void setCaretSlopeRise(int32_t value);
-    int32_t caretSlopeRun();
-    void setCaretSlopeRun(int32_t value);
-    int32_t caretOffset();
-    void setCaretOffset(int32_t value);
-    int32_t metricDataFormat();
-    void setMetricDataFormat(int32_t value);
-    int32_t numberOfHMetrics();
-    void setNumberOfHMetrics(int32_t value);
-  };
 };
 typedef Ptr<HorizontalHeaderTable> HorizontalHeaderTablePtr;
 typedef Ptr<HorizontalHeaderTable::Builder> HorizontalHeaderTableBuilderPtr;
diff --git a/sfntly/horizontal_metrics_table.cc b/sfntly/horizontal_metrics_table.cc
index c151e18..921d8bc 100644
--- a/sfntly/horizontal_metrics_table.cc
+++ b/sfntly/horizontal_metrics_table.cc
@@ -21,29 +21,17 @@
 /******************************************************************************
  * HorizontalMetricsTable class
  ******************************************************************************/
-HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
-                                               ReadableFontData* data) :
-    Table(header, data) {
-}
-
-HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
-                                               ReadableFontData* data,
-                                               int32_t num_hmetrics,
-                                               int32_t num_glyphs) :
-    Table(header, data), num_hmetrics_(num_hmetrics), num_glyphs_(num_glyphs) {
-}
-
 HorizontalMetricsTable::~HorizontalMetricsTable() {}
 
-int32_t HorizontalMetricsTable::numberOfHMetrics() {
+int32_t HorizontalMetricsTable::NumberOfHMetrics() {
   return num_hmetrics_;
 }
 
-int32_t HorizontalMetricsTable::numberOfLSBs() {
+int32_t HorizontalMetricsTable::NumberOfLSBs() {
   return num_glyphs_ - num_hmetrics_;
 }
 
-int32_t HorizontalMetricsTable::hMetricAdvanceWidth(int32_t entry) {
+int32_t HorizontalMetricsTable::HMetricAdvanceWidth(int32_t entry) {
   if (entry > num_hmetrics_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -53,10 +41,10 @@
   }
   int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
                    Offset::kHMetricsAdvanceWidth;
-  return data_->readUShort(offset);
+  return data_->ReadUShort(offset);
 }
 
-int32_t HorizontalMetricsTable::hMetricLSB(int32_t entry) {
+int32_t HorizontalMetricsTable::HMetricLSB(int32_t entry) {
   if (entry > num_hmetrics_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -66,10 +54,10 @@
   }
   int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
                    Offset::kHMetricsLeftSideBearing;
-  return data_->readShort(offset);
+  return data_->ReadShort(offset);
 }
 
-int32_t HorizontalMetricsTable::lsbTableEntry(int32_t entry) {
+int32_t HorizontalMetricsTable::LsbTableEntry(int32_t entry) {
   if (entry > num_hmetrics_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -79,62 +67,78 @@
   }
   int32_t offset = Offset::kHMetricsStart + (entry * Offset::kHMetricsSize) +
                    Offset::kLeftSideBearingSize;
-  return data_->readShort(offset);
+  return data_->ReadShort(offset);
 }
 
-int32_t HorizontalMetricsTable::advanceWidth(int32_t glyph_id) {
+int32_t HorizontalMetricsTable::AdvanceWidth(int32_t glyph_id) {
   if (glyph_id < num_hmetrics_) {
-    return hMetricAdvanceWidth(glyph_id);
+    return HMetricAdvanceWidth(glyph_id);
   }
-  return hMetricAdvanceWidth(glyph_id - num_hmetrics_);
+  return HMetricAdvanceWidth(glyph_id - num_hmetrics_);
+}
+
+HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
+                                               ReadableFontData* data)
+    : Table(header, data) {
+}
+
+HorizontalMetricsTable::HorizontalMetricsTable(Header* header,
+                                               ReadableFontData* data,
+                                               int32_t num_hmetrics,
+                                               int32_t num_glyphs)
+    : Table(header, data),
+      num_hmetrics_(num_hmetrics),
+      num_glyphs_(num_glyphs) {
 }
 
 /******************************************************************************
  * HorizontalMetricsTable::Builder class
  ******************************************************************************/
-void HorizontalMetricsTable::Builder::init() {
-  num_hmetrics_ = -1;
-  num_glyphs_ = -1;
+HorizontalMetricsTable::Builder::Builder(
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    WritableFontData* data)
+    : Table::TableBasedTableBuilder(font_builder, header, data) {
+  Init();
 }
 
 HorizontalMetricsTable::Builder::Builder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    WritableFontData* data) :
-    Table::TableBasedTableBuilder(font_builder, header, data) {
-  init();
-}
-
-HorizontalMetricsTable::Builder::Builder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    ReadableFontData* data) :
-    Table::TableBasedTableBuilder(font_builder, header, data) {
-  init();
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    ReadableFontData* data)
+    : Table::TableBasedTableBuilder(font_builder, header, data) {
+  Init();
 }
 
 HorizontalMetricsTable::Builder::~Builder() {}
 
-CALLER_ATTACH FontDataTable* HorizontalMetricsTable::Builder::subBuildTable(
-    ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+    HorizontalMetricsTable::Builder::SubBuildTable(ReadableFontData* data) {
   FontDataTablePtr table =
       new HorizontalMetricsTable(header(), data, num_hmetrics_, num_glyphs_);
-  return table.detach();
+  return table.Detach();
 }
 
-void HorizontalMetricsTable::Builder::setNumberOfHMetrics(
-                                          int32_t num_hmetrics) {
+void HorizontalMetricsTable::Builder::SetNumberOfHMetrics(
+    int32_t num_hmetrics) {
   assert(num_hmetrics >= 0);
   num_hmetrics_ = num_hmetrics;
-  HorizontalMetricsTable* table = down_cast<HorizontalMetricsTable*>(
-                                      this->table());
+  HorizontalMetricsTable* table =
+      down_cast<HorizontalMetricsTable*>(this->GetTable());
   table->num_hmetrics_ = num_hmetrics;
 }
 
-void HorizontalMetricsTable::Builder::setNumGlyphs(int32_t num_glyphs) {
+void HorizontalMetricsTable::Builder::SetNumGlyphs(int32_t num_glyphs) {
   assert(num_glyphs >= 0);
   num_glyphs_ = num_glyphs;
-  HorizontalMetricsTable* table = down_cast<HorizontalMetricsTable*>(
-                                      this->table());
+  HorizontalMetricsTable* table =
+      down_cast<HorizontalMetricsTable*>(this->GetTable());
   table->num_glyphs_ = num_glyphs;
 }
 
+void HorizontalMetricsTable::Builder::Init() {
+  num_hmetrics_ = -1;
+  num_glyphs_ = -1;
+}
+
 }  // namespace sfntly
diff --git a/sfntly/horizontal_metrics_table.h b/sfntly/horizontal_metrics_table.h
index c393fee..aead6fa 100644
--- a/sfntly/horizontal_metrics_table.h
+++ b/sfntly/horizontal_metrics_table.h
@@ -23,6 +23,39 @@
 
 class HorizontalMetricsTable : public Table,
                                public RefCounted<HorizontalMetricsTable> {
+ public:
+  class Builder : public Table::TableBasedTableBuilder,
+                  public RefCounted<Builder> {
+   public:
+    // Constructor scope altered to public because C++ does not allow base
+    // class to instantiate derived class with protected constructors.
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
+            WritableFontData* data);
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
+            ReadableFontData* data);
+    virtual ~Builder();
+
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+    void SetNumberOfHMetrics(int32_t num_hmetrics);
+    void SetNumGlyphs(int32_t num_glyphs);
+
+   private:
+    void Init();
+
+    int32_t num_hmetrics_;
+    int32_t num_glyphs_;
+  };
+
+  virtual ~HorizontalMetricsTable();
+  int32_t NumberOfHMetrics();
+  int32_t NumberOfLSBs();
+  int32_t HMetricAdvanceWidth(int32_t entry);
+  int32_t HMetricLSB(int32_t entry);
+  int32_t LsbTableEntry(int32_t entry);
+  int32_t AdvanceWidth(int32_t glyph_id);
+
  private:
   struct Offset {
     enum {
@@ -38,43 +71,12 @@
     };
   };
 
- private:
   HorizontalMetricsTable(Header* header, ReadableFontData* data);
-  HorizontalMetricsTable(Header* header, ReadableFontData* data,
-                         int32_t num_hmetrics, int32_t num_glyphs);
+  HorizontalMetricsTable(Header* header,
+                         ReadableFontData* data,
+                         int32_t num_hmetrics,
+                         int32_t num_glyphs);
 
- public:  // class is final, no virtual functions unless inherited from parent.
-  virtual ~HorizontalMetricsTable();
-  int32_t numberOfHMetrics();
-  int32_t numberOfLSBs();
-  int32_t hMetricAdvanceWidth(int32_t entry);
-  int32_t hMetricLSB(int32_t entry);
-  int32_t lsbTableEntry(int32_t entry);
-  int32_t advanceWidth(int32_t glyph_id);
-
- public:
-  class Builder : public Table::TableBasedTableBuilder,
-                  public RefCounted<Builder> {
-   public:
-    // Constructor scope altered to public because C++ does not allow base
-    // class to instantiate derived class with protected constructors.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            ReadableFontData* data);
-    virtual ~Builder();
-    void init();
-
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-    void setNumberOfHMetrics(int32_t num_hmetrics);
-    void setNumGlyphs(int32_t num_glyphs);
-
-   private:
-    int32_t num_hmetrics_;
-    int32_t num_glyphs_;
-  };
-
- private:
   int32_t num_hmetrics_;
   int32_t num_glyphs_;
 };
diff --git a/sfntly/loca_table.cc b/sfntly/loca_table.cc
index 1cd1d92..e82f709 100644
--- a/sfntly/loca_table.cc
+++ b/sfntly/loca_table.cc
@@ -21,20 +21,13 @@
 /******************************************************************************
  * LocaTable class
  ******************************************************************************/
-LocaTable::LocaTable(Header* header, ReadableFontData* data)
-    : Table(header, data) {}
-
-LocaTable::LocaTable(Header* header, ReadableFontData* data, int32_t version,
-                     int32_t num_glyphs)
-    : Table(header, data), version_(version), num_glyphs_(num_glyphs) {}
-
 LocaTable::~LocaTable() {}
 
-int32_t LocaTable::numGlyphs() {
+int32_t LocaTable::NumGlyphs() {
   return num_glyphs_;
 }
 
-int32_t LocaTable::glyphOffset(int32_t glyph_id) {
+int32_t LocaTable::GlyphOffset(int32_t glyph_id) {
   if (glyph_id < 0 || glyph_id >= num_glyphs_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -42,10 +35,10 @@
     throw IndexOutOfBoundException("Glyph ID is out of bounds.");
 #endif
   }
-  return loca(glyph_id);
+  return Loca(glyph_id);
 }
 
-int32_t LocaTable::glyphLength(int32_t glyph_id) {
+int32_t LocaTable::GlyphLength(int32_t glyph_id) {
   if (glyph_id < 0 || glyph_id >= num_glyphs_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -53,14 +46,14 @@
     throw IndexOutOfBoundException("Glyph ID is out of bounds.");
 #endif
   }
-  return loca(glyph_id + 1) - loca(glyph_id);
+  return Loca(glyph_id + 1) - Loca(glyph_id);
 }
 
-int32_t LocaTable::numLocas() {
+int32_t LocaTable::NumLocas() {
   return num_glyphs_ + 1;
 }
 
-int32_t LocaTable::loca(int32_t index) {
+int32_t LocaTable::Loca(int32_t index) {
   if (index > num_glyphs_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -69,92 +62,73 @@
 #endif
   }
   if (version_ == IndexToLocFormat::kShortOffset) {
-    return 2 * data_->readShort(index * DataSize::kUSHORT);
+    return 2 * data_->ReadShort(index * DataSize::kUSHORT);
   }
-  return data_->readULongAsInt(index * DataSize::kULONG);
+  return data_->ReadULongAsInt(index * DataSize::kULONG);
+}
+
+LocaTable::LocaTable(Header* header, ReadableFontData* data)
+    : Table(header, data) {
+}
+
+LocaTable::LocaTable(Header* header,
+                     ReadableFontData* data,
+                     int32_t version,
+                     int32_t num_glyphs)
+    : Table(header, data), version_(version), num_glyphs_(num_glyphs) {
 }
 
 /******************************************************************************
- * LocaTable::Builder class
+ * LocaTable::Iterator class
  ******************************************************************************/
-LocaTable::LocaIterator::LocaIterator(LocaTable* table) : index_(-1) {
+LocaTable::LocaIterator::LocaIterator(LocaTable* table)
+    : index_(-1) {
   table_ = table;
 }
 
-bool LocaTable::LocaIterator::hasNext() {
+bool LocaTable::LocaIterator::HasNext() {
   return index_ <= table_->num_glyphs_;
 }
 
-int32_t LocaTable::LocaIterator::next() {
-  return table_->loca(index_++);
+int32_t LocaTable::LocaIterator::Next() {
+  return table_->Loca(index_++);
 }
 
 /******************************************************************************
  * LocaTable::Builder class
  ******************************************************************************/
-void LocaTable::Builder::init() {
-  num_glyphs_ = -1;
-  format_version_ = IndexToLocFormat::kLongOffset;
-}
-
 LocaTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
                             Header* header, WritableFontData* data) :
     Table::ArrayElementTableBuilder(font_builder, header, data) {
-  init();
+  Init();
 }
 
 LocaTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
                             Header* header, ReadableFontData* data) :
     Table::ArrayElementTableBuilder(font_builder, header, data) {
-  init();
+  Init();
 }
 
 LocaTable::Builder::~Builder() {}
 
-void LocaTable::Builder::initialize(ReadableFontData* data) {
-  if (data) {
-    if (numGlyphs() < 0) {
-#if defined (SFNTLY_NO_EXCEPTION)
-      return;
-#else
-      throw IllegalStateException("numglyphs not set on LocaTable Builder.");
-#endif
-    }
-    LocaTablePtr table =
-        new LocaTable(header(), data, format_version_, num_glyphs_);
-    LocaTable::LocaIterator loca_iter(table);
-    while (loca_iter.hasNext()) {
-      loca_.push_back(loca_iter.next());
-    }
-  }
-}
-
-IntegerList* LocaTable::Builder::getLocaList() {
-  if (loca_.empty()) {
-    initialize(internalReadData());
-    setModelChanged();
-  }
-  return &loca_;
-}
-
-void LocaTable::Builder::setFormatVersion(int32_t format_version) {
+void LocaTable::Builder::SetFormatVersion(int32_t format_version) {
   format_version_ = format_version;
 }
 
-IntegerList* LocaTable::Builder::locaList() {
-  return getLocaList();
+IntegerList* LocaTable::Builder::LocaList() {
+  return GetLocaList();
 }
 
-void LocaTable::Builder::setLocaList(IntegerList* list) {
+void LocaTable::Builder::SetLocaList(IntegerList* list) {
   loca_.clear();
   if (list) {
     loca_ = *list;
     num_glyphs_ = loca_.size();
-    setModelChanged();
+    set_model_changed();
   }
 }
 
-int32_t LocaTable::Builder::glyphOffset(int32_t glyph_id) {
+int32_t LocaTable::Builder::GlyphOffset(int32_t glyph_id) {
   if (glyph_id < 0 || glyph_id > (num_glyphs_ + 1)) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -162,10 +136,10 @@
     throw IndexOutOfBoundException("Glyph ID is out of bounds.");
 #endif
   }
-  return loca(glyph_id);
+  return Loca(glyph_id);
 }
 
-int32_t LocaTable::Builder::glyphLength(int32_t glyph_id) {
+int32_t LocaTable::Builder::GlyphLength(int32_t glyph_id) {
   if (glyph_id < 0 || glyph_id > (num_glyphs_ + 1)) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -173,49 +147,49 @@
     throw IndexOutOfBoundException("Glyph ID is out of bounds.");
 #endif
   }
-  return loca(glyph_id + 1) - loca(glyph_id);
+  return Loca(glyph_id + 1) - Loca(glyph_id);
 }
 
-void LocaTable::Builder::setNumGlyphs(int32_t num_glyphs) {
+void LocaTable::Builder::SetNumGlyphs(int32_t num_glyphs) {
   num_glyphs_ = num_glyphs;
 }
 
-int32_t LocaTable::Builder::numGlyphs() {
+int32_t LocaTable::Builder::NumGlyphs() {
   if (!loca_.empty()) {
     return loca_.size() - 1;
   }
   return num_glyphs_;
 }
 
-void LocaTable::Builder::revert() {
+void LocaTable::Builder::Revert() {
   loca_.clear();
-  setModelChanged(false);
+  set_model_changed(false);
 }
 
-void LocaTable::Builder::clear() {
-  getLocaList()->clear();
+void LocaTable::Builder::Clear() {
+  GetLocaList()->clear();
 }
 
-int32_t LocaTable::Builder::numLocas() {
-  return getLocaList()->size();
+int32_t LocaTable::Builder::NumLocas() {
+  return GetLocaList()->size();
 }
 
-int32_t LocaTable::Builder::loca(int32_t index) {
-  return getLocaList()->at(index);
+int32_t LocaTable::Builder::Loca(int32_t index) {
+  return GetLocaList()->at(index);
 }
 
-CALLER_ATTACH FontDataTable* LocaTable::Builder::subBuildTable(
+CALLER_ATTACH FontDataTable* LocaTable::Builder::SubBuildTable(
     ReadableFontData* data) {
   FontDataTablePtr table =
       new LocaTable(header(), data, format_version_, num_glyphs_);
-  return table.detach();
+  return table.Detach();
 }
 
-void LocaTable::Builder::subDataSet() {
-  initialize(internalReadData());
+void LocaTable::Builder::SubDataSet() {
+  Initialize(InternalReadData());
 }
 
-int32_t LocaTable::Builder::subDataSizeToSerialize() {
+int32_t LocaTable::Builder::SubDataSizeToSerialize() {
   if (loca_.empty()) {
     return 0;
   }
@@ -225,21 +199,52 @@
   return loca_.size() * DataSize::kUSHORT;
 }
 
-bool LocaTable::Builder::subReadyToSerialize() {
+bool LocaTable::Builder::SubReadyToSerialize() {
   return !loca_.empty();
 }
 
-int32_t LocaTable::Builder::subSerialize(WritableFontData* new_data) {
+int32_t LocaTable::Builder::SubSerialize(WritableFontData* new_data) {
   int32_t size = 0;
   for (IntegerList::iterator l = loca_.begin(), end = loca_.end();
                              l != end; ++l) {
     if (format_version_ == IndexToLocFormat::kLongOffset) {
-      size += new_data->writeULong(size, *l);
+      size += new_data->WriteULong(size, *l);
     } else {
-      size += new_data->writeUShort(size, *l / 2);
+      size += new_data->WriteUShort(size, *l / 2);
     }
   }
   return 0;
 }
 
+void LocaTable::Builder::Init() {
+  num_glyphs_ = -1;
+  format_version_ = IndexToLocFormat::kLongOffset;
+}
+
+void LocaTable::Builder::Initialize(ReadableFontData* data) {
+  if (data) {
+    if (NumGlyphs() < 0) {
+#if defined (SFNTLY_NO_EXCEPTION)
+      return;
+#else
+      throw IllegalStateException("numglyphs not set on LocaTable Builder.");
+#endif
+    }
+    LocaTablePtr table =
+        new LocaTable(header(), data, format_version_, num_glyphs_);
+    LocaTable::LocaIterator loca_iter(table);
+    while (loca_iter.HasNext()) {
+      loca_.push_back(loca_iter.Next());
+    }
+  }
+}
+
+IntegerList* LocaTable::Builder::GetLocaList() {
+  if (loca_.empty()) {
+    Initialize(InternalReadData());
+    set_model_changed();
+  }
+  return &loca_;
+}
+
 }  // namespace sfntly
diff --git a/sfntly/loca_table.h b/sfntly/loca_table.h
index 741cb56..dcf9715 100644
--- a/sfntly/loca_table.h
+++ b/sfntly/loca_table.h
@@ -23,50 +23,19 @@
 namespace sfntly {
 
 class LocaTable : public Table, public RefCounted<LocaTable> {
- private:
-  LocaTable(Header* header, ReadableFontData* data);
-  LocaTable(Header* header, ReadableFontData* data, int32_t version,
-            int32_t num_glyphs);
-
- public:  // class is final, no virtual unless inherited from parents.
-  virtual ~LocaTable();
-  int32_t numGlyphs();
-
-  // Return the offset for the given glyph id. Valid glyph ids are from 0 to the
-  // one less than the number of glyphs. The zero entry is the special entry for
-  // the notdef glyph. The final entry beyond the last glyph id is used to
-  // calculate the size of the last glyph.
-  // @param glyphId the glyph id to get the offset for; must be less than or
-  //        equal to one more than the number of glyph ids
-  // @return the offset in the glyph table to the specified glyph id
-  int32_t glyphOffset(int32_t glyph_id);
-
-  // Get the length of the data in the glyph table for the specified glyph id.
-  int32_t glyphLength(int32_t glyph_id);
-
-  // Get the number of locations or locas. This will be one more than the number
-  // of glyphs for this table since the last loca position is used to indicate
-  // the size of the final glyph.
-  int32_t numLocas();
-
-  // Get the value from the loca table for the index specified. Valid index
-  // values run from 0 to the number of glyphs in the font.
-  int32_t loca(int32_t index);
-
  public:
   // Note: different implementation than Java, caller to instantiate this class
   //       object directly from stack instead of calling LocaTable::iterator().
   class LocaIterator {
    public:
     explicit LocaIterator(LocaTable* table);
-    bool hasNext();
-    int32_t next();
+    bool HasNext();
+    int32_t Next();
 
    private:
     int32_t index_;
     LocaTable* table_;  // use dumb pointer since it's a composition object
   };
-  friend class LocaIterator;
 
   class Builder : public Table::ArrayElementTableBuilder,
                   public RefCounted<Builder> {
@@ -78,21 +47,15 @@
             ReadableFontData* data);
     virtual ~Builder();
 
-   private:
-    void init();  // short hand for common code in ctors, C++ port only
-    void initialize(ReadableFontData* data);  // ported from Java
-    IntegerList* getLocaList();
-
-   public:  // static class, no virtual function unless inherited from parent.
-    void setFormatVersion(int32_t format_version);
+    void SetFormatVersion(int32_t format_version);
 
     // Gets the List of locas for loca table builder. These may be manipulated
     // in any way by the caller and the changes will be reflected in the final
     // loca table produced.
     // If there is no current data for the loca table builder or the loca list
     // have not been previously set then this will return an empty List.
-    IntegerList* locaList();
-    void setLocaList(IntegerList* list);
+    IntegerList* LocaList();
+    void SetLocaList(IntegerList* list);
 
     // Return the offset for the given glyph id. Valid glyph ids are from 0 to
     // one less than the number of glyphs. The zero entry is the special entry
@@ -101,43 +64,79 @@
     // @param glyphId the glyph id to get the offset for; must be less than or
     //        equal to one more than the number of glyph ids
     // @return the offset in the glyph table to the specified glyph id
-    int32_t glyphOffset(int32_t glyph_id);
+    int32_t GlyphOffset(int32_t glyph_id);
 
     // Get the length of the data in the glyph table for the specified glyph id.
-    int32_t glyphLength(int32_t glyph_id);
+    int32_t GlyphLength(int32_t glyph_id);
 
     // Set the number of glyphs.
     // This method sets the number of glyphs that the builder will attempt to
     // parse location data for from the raw binary data. This method only needs
     // to be called (and <b>must</b> be) when the raw data for this builder has
     // been changed.
-    void setNumGlyphs(int32_t num_glyphs);
-    int numGlyphs();
+    void SetNumGlyphs(int32_t num_glyphs);
+    int NumGlyphs();
 
-    void revert();
-    void clear();
+    void Revert();
+    void Clear();
 
     // Get the number of locations or locas. This will be one more than the
     // number of glyphs for this table since the last loca position is used to
     // indicate the size of the final glyph.
-    int32_t numLocas();
-    int32_t loca(int32_t index);
+    int32_t NumLocas();
+    int32_t Loca(int32_t index);
 
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-    virtual void subDataSet();
-    virtual int32_t subDataSizeToSerialize();
-    virtual bool subReadyToSerialize();
-    virtual int32_t subSerialize(WritableFontData* new_data);
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+    virtual void SubDataSet();
+    virtual int32_t SubDataSizeToSerialize();
+    virtual bool SubReadyToSerialize();
+    virtual int32_t SubSerialize(WritableFontData* new_data);
 
    private:
+    void Init();  // short hand for common code in ctors, C++ port only
+    void Initialize(ReadableFontData* data);  // ported from Java
+    IntegerList* GetLocaList();
+
     int32_t format_version_;  // Note: IndexToLocFormat
     int32_t num_glyphs_;
     IntegerList loca_;
   };
 
+  virtual ~LocaTable();
+  int32_t NumGlyphs();
+
+  // Return the offset for the given glyph id. Valid glyph ids are from 0 to the
+  // one less than the number of glyphs. The zero entry is the special entry for
+  // the notdef glyph. The final entry beyond the last glyph id is used to
+  // calculate the size of the last glyph.
+  // @param glyphId the glyph id to get the offset for; must be less than or
+  //        equal to one more than the number of glyph ids
+  // @return the offset in the glyph table to the specified glyph id
+  int32_t GlyphOffset(int32_t glyph_id);
+
+  // Get the length of the data in the glyph table for the specified glyph id.
+  int32_t GlyphLength(int32_t glyph_id);
+
+  // Get the number of locations or locas. This will be one more than the number
+  // of glyphs for this table since the last loca position is used to indicate
+  // the size of the final glyph.
+  int32_t NumLocas();
+
+  // Get the value from the loca table for the index specified. Valid index
+  // values run from 0 to the number of glyphs in the font.
+  int32_t Loca(int32_t index);
+
  private:
+  LocaTable(Header* header, ReadableFontData* data);
+  LocaTable(Header* header,
+            ReadableFontData* data,
+            int32_t version,
+            int32_t num_glyphs);
+
   int32_t version_;  // Note: IndexToLocFormat
   int32_t num_glyphs_;
+
+  friend class LocaIterator;
 };
 typedef Ptr<LocaTable> LocaTablePtr;
 typedef Ptr<LocaTable::Builder> LocaTableBuilderPtr;
diff --git a/sfntly/math/fixed1616.h b/sfntly/math/fixed1616.h
index aa3a62b..843da51 100644
--- a/sfntly/math/fixed1616.h
+++ b/sfntly/math/fixed1616.h
@@ -23,15 +23,15 @@
 
 class Fixed1616 {
  public:
-  static inline int32_t integral(int32_t fixed) {
+  static inline int32_t Integral(int32_t fixed) {
     return (fixed >> 16);
   }
 
-  static inline int32_t fractional(int32_t fixed) {
+  static inline int32_t Fractional(int32_t fixed) {
     return (fixed & 0xffff);
   }
 
-  static inline int32_t fixed(int32_t integral, int32_t fractional) {
+  static inline int32_t Fixed(int32_t integral, int32_t fractional) {
     return ((integral & 0xffff) << 16) | (fractional & 0xffff);
   }
 };
diff --git a/sfntly/math/font_math.h b/sfntly/math/font_math.h
index 78b9e51..f15a786 100644
--- a/sfntly/math/font_math.h
+++ b/sfntly/math/font_math.h
@@ -23,7 +23,7 @@
 
 class FontMath {
  public:
-  static int32_t log2(int32_t a) {
+  static int32_t Log2(int32_t a) {
     int r = 0;  // r will be lg(a)
     while (a != 0) {
       a >>= 1;
diff --git a/sfntly/maximum_profile_table.cc b/sfntly/maximum_profile_table.cc
index 61a176e..0ab2aaf 100644
--- a/sfntly/maximum_profile_table.cc
+++ b/sfntly/maximum_profile_table.cc
@@ -20,202 +20,204 @@
 /******************************************************************************
  * MaximumProfileTable class
  ******************************************************************************/
-MaximumProfileTable::MaximumProfileTable(Header* header,
-                                         ReadableFontData* data) :
-    Table(header, data) {
-}
-
 MaximumProfileTable::~MaximumProfileTable() {}
 
-int32_t MaximumProfileTable::version() {
-  return data_->readFixed(Offset::kVersion);
+int32_t MaximumProfileTable::Version() {
+  return data_->ReadFixed(Offset::kVersion);
 }
 
-int32_t MaximumProfileTable::numGlyphs() {
-  return data_->readUShort(Offset::kNumGlyphs);
+int32_t MaximumProfileTable::NumGlyphs() {
+  return data_->ReadUShort(Offset::kNumGlyphs);
 }
 
-int32_t MaximumProfileTable::maxPoints() {
-  return data_->readUShort(Offset::kMaxPoints);
+int32_t MaximumProfileTable::MaxPoints() {
+  return data_->ReadUShort(Offset::kMaxPoints);
 }
 
-int32_t MaximumProfileTable::maxContours() {
-  return data_->readUShort(Offset::kMaxContours);
+int32_t MaximumProfileTable::MaxContours() {
+  return data_->ReadUShort(Offset::kMaxContours);
 }
 
-int32_t MaximumProfileTable::maxCompositePoints() {
-  return data_->readUShort(Offset::kMaxCompositePoints);
+int32_t MaximumProfileTable::MaxCompositePoints() {
+  return data_->ReadUShort(Offset::kMaxCompositePoints);
 }
 
-int32_t MaximumProfileTable::maxZones() {
-  return data_->readUShort(Offset::kMaxZones);
+int32_t MaximumProfileTable::MaxZones() {
+  return data_->ReadUShort(Offset::kMaxZones);
 }
 
-int32_t MaximumProfileTable::maxTwilightPoints() {
-  return data_->readUShort(Offset::kMaxTwilightPoints);
+int32_t MaximumProfileTable::MaxTwilightPoints() {
+  return data_->ReadUShort(Offset::kMaxTwilightPoints);
 }
 
-int32_t MaximumProfileTable::maxStorage() {
-  return data_->readUShort(Offset::kMaxStorage);
+int32_t MaximumProfileTable::MaxStorage() {
+  return data_->ReadUShort(Offset::kMaxStorage);
 }
 
-int32_t MaximumProfileTable::maxFunctionDefs() {
-  return data_->readUShort(Offset::kMaxFunctionDefs);
+int32_t MaximumProfileTable::MaxFunctionDefs() {
+  return data_->ReadUShort(Offset::kMaxFunctionDefs);
 }
 
-int32_t MaximumProfileTable::maxStackElements() {
-  return data_->readUShort(Offset::kMaxStackElements);
+int32_t MaximumProfileTable::MaxStackElements() {
+  return data_->ReadUShort(Offset::kMaxStackElements);
 }
 
-int32_t MaximumProfileTable::maxSizeOfInstructions() {
-  return data_->readUShort(Offset::kMaxSizeOfInstructions);
+int32_t MaximumProfileTable::MaxSizeOfInstructions() {
+  return data_->ReadUShort(Offset::kMaxSizeOfInstructions);
 }
 
-int32_t MaximumProfileTable::maxComponentElements() {
-  return data_->readUShort(Offset::kMaxComponentElements);
+int32_t MaximumProfileTable::MaxComponentElements() {
+  return data_->ReadUShort(Offset::kMaxComponentElements);
 }
 
-int32_t MaximumProfileTable::maxComponentDepth() {
-  return data_->readUShort(Offset::kMaxComponentDepth);
+int32_t MaximumProfileTable::MaxComponentDepth() {
+  return data_->ReadUShort(Offset::kMaxComponentDepth);
+}
+
+MaximumProfileTable::MaximumProfileTable(Header* header,
+                                         ReadableFontData* data)
+    : Table(header, data) {
 }
 
 /******************************************************************************
  * MaximumProfileTable::Builder class
  ******************************************************************************/
 MaximumProfileTable::Builder::Builder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    WritableFontData* data) :
-    Table::TableBasedTableBuilder(font_builder, header, data) {
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    WritableFontData* data)
+    : Table::TableBasedTableBuilder(font_builder, header, data) {
 }
 
 MaximumProfileTable::Builder::Builder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    ReadableFontData* data) :
-    Table::TableBasedTableBuilder(font_builder, header, data) {
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    ReadableFontData* data)
+    : Table::TableBasedTableBuilder(font_builder, header, data) {
 }
 
 MaximumProfileTable::Builder::~Builder() {}
 
-CALLER_ATTACH FontDataTable* MaximumProfileTable::Builder::subBuildTable(
-    ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+    MaximumProfileTable::Builder::SubBuildTable(ReadableFontData* data) {
   FontDataTablePtr table = new MaximumProfileTable(header(), data);
-  return table.detach();
+  return table.Detach();
 }
 
-int32_t MaximumProfileTable::Builder::version() {
-  return internalReadData()->readUShort(Offset::kVersion);
+int32_t MaximumProfileTable::Builder::Version() {
+  return InternalReadData()->ReadUShort(Offset::kVersion);
 }
 
-void MaximumProfileTable::Builder::setVersion(int32_t version) {
-  internalWriteData()->writeUShort(Offset::kVersion, version);
+void MaximumProfileTable::Builder::SetVersion(int32_t version) {
+  InternalWriteData()->WriteUShort(Offset::kVersion, version);
 }
 
-int32_t MaximumProfileTable::Builder::numGlyphs() {
-  return internalReadData()->readUShort(Offset::kNumGlyphs);
+int32_t MaximumProfileTable::Builder::NumGlyphs() {
+  return InternalReadData()->ReadUShort(Offset::kNumGlyphs);
 }
 
-void MaximumProfileTable::Builder::setNumGlyphs(int32_t num_glyphs) {
-  internalWriteData()->writeUShort(Offset::kNumGlyphs, num_glyphs);
+void MaximumProfileTable::Builder::SetNumGlyphs(int32_t num_glyphs) {
+  InternalWriteData()->WriteUShort(Offset::kNumGlyphs, num_glyphs);
 }
 
-int32_t MaximumProfileTable::Builder::maxPoints() {
-  return internalReadData()->readUShort(Offset::kMaxPoints);
+int32_t MaximumProfileTable::Builder::MaxPoints() {
+  return InternalReadData()->ReadUShort(Offset::kMaxPoints);
 }
 
-void MaximumProfileTable::Builder::setMaxPoints(int32_t max_points) {
-  internalWriteData()->writeUShort(Offset::kMaxPoints, max_points);
+void MaximumProfileTable::Builder::SetMaxPoints(int32_t max_points) {
+  InternalWriteData()->WriteUShort(Offset::kMaxPoints, max_points);
 }
 
-int32_t MaximumProfileTable::Builder::maxContours() {
-  return internalReadData()->readUShort(Offset::kMaxContours);
+int32_t MaximumProfileTable::Builder::MaxContours() {
+  return InternalReadData()->ReadUShort(Offset::kMaxContours);
 }
 
-void MaximumProfileTable::Builder::setMaxContours(int32_t max_contours) {
-  internalWriteData()->writeUShort(Offset::kMaxContours, max_contours);
+void MaximumProfileTable::Builder::SetMaxContours(int32_t max_contours) {
+  InternalWriteData()->WriteUShort(Offset::kMaxContours, max_contours);
 }
 
-int32_t MaximumProfileTable::Builder::maxCompositePoints() {
-  return internalReadData()->readUShort(Offset::kMaxCompositePoints);
+int32_t MaximumProfileTable::Builder::MaxCompositePoints() {
+  return InternalReadData()->ReadUShort(Offset::kMaxCompositePoints);
 }
 
-void MaximumProfileTable::Builder::setMaxCompositePoints(
+void MaximumProfileTable::Builder::SetMaxCompositePoints(
     int32_t max_composite_points) {
-  internalWriteData()->writeUShort(Offset::kMaxCompositePoints,
+  InternalWriteData()->WriteUShort(Offset::kMaxCompositePoints,
                                    max_composite_points);
 }
 
-int32_t MaximumProfileTable::Builder::maxZones() {
-  return internalReadData()->readUShort(Offset::kMaxZones);
+int32_t MaximumProfileTable::Builder::MaxZones() {
+  return InternalReadData()->ReadUShort(Offset::kMaxZones);
 }
 
-void MaximumProfileTable::Builder::setMaxZones(int32_t max_zones) {
-  internalWriteData()->writeUShort(Offset::kMaxZones, max_zones);
+void MaximumProfileTable::Builder::SetMaxZones(int32_t max_zones) {
+  InternalWriteData()->WriteUShort(Offset::kMaxZones, max_zones);
 }
 
-int32_t MaximumProfileTable::Builder::maxTwilightPoints() {
-  return internalReadData()->readUShort(Offset::kMaxTwilightPoints);
+int32_t MaximumProfileTable::Builder::MaxTwilightPoints() {
+  return InternalReadData()->ReadUShort(Offset::kMaxTwilightPoints);
 }
 
-void MaximumProfileTable::Builder::setMaxTwilightPoints(
+void MaximumProfileTable::Builder::SetMaxTwilightPoints(
     int32_t max_twilight_points) {
-  internalWriteData()->writeUShort(Offset::kMaxTwilightPoints,
+  InternalWriteData()->WriteUShort(Offset::kMaxTwilightPoints,
                                    max_twilight_points);
 }
 
-int32_t MaximumProfileTable::Builder::maxStorage() {
-  return internalReadData()->readUShort(Offset::kMaxStorage);
+int32_t MaximumProfileTable::Builder::MaxStorage() {
+  return InternalReadData()->ReadUShort(Offset::kMaxStorage);
 }
 
-void MaximumProfileTable::Builder::setMaxStorage(int32_t max_storage) {
-  internalWriteData()->writeUShort(Offset::kMaxStorage, max_storage);
+void MaximumProfileTable::Builder::SetMaxStorage(int32_t max_storage) {
+  InternalWriteData()->WriteUShort(Offset::kMaxStorage, max_storage);
 }
 
-int32_t MaximumProfileTable::Builder::maxFunctionDefs() {
-  return internalReadData()->readUShort(Offset::kMaxFunctionDefs);
+int32_t MaximumProfileTable::Builder::MaxFunctionDefs() {
+  return InternalReadData()->ReadUShort(Offset::kMaxFunctionDefs);
 }
 
-void MaximumProfileTable::Builder::setMaxFunctionDefs(
+void MaximumProfileTable::Builder::SetMaxFunctionDefs(
     int32_t max_function_defs) {
-  internalWriteData()->writeUShort(Offset::kMaxFunctionDefs, max_function_defs);
+  InternalWriteData()->WriteUShort(Offset::kMaxFunctionDefs, max_function_defs);
 }
 
-int32_t MaximumProfileTable::Builder::maxStackElements() {
-  return internalReadData()->readUShort(Offset::kMaxStackElements);
+int32_t MaximumProfileTable::Builder::MaxStackElements() {
+  return InternalReadData()->ReadUShort(Offset::kMaxStackElements);
 }
 
-void MaximumProfileTable::Builder::setMaxStackElements(
+void MaximumProfileTable::Builder::SetMaxStackElements(
     int32_t max_stack_elements) {
-  internalWriteData()->writeUShort(Offset::kMaxStackElements,
+  InternalWriteData()->WriteUShort(Offset::kMaxStackElements,
                                    max_stack_elements);
 }
 
-int32_t MaximumProfileTable::Builder::maxSizeOfInstructions() {
-  return internalReadData()->readUShort(Offset::kMaxSizeOfInstructions);
+int32_t MaximumProfileTable::Builder::MaxSizeOfInstructions() {
+  return InternalReadData()->ReadUShort(Offset::kMaxSizeOfInstructions);
 }
 
-void MaximumProfileTable::Builder::setMaxSizeOfInstructions(
+void MaximumProfileTable::Builder::SetMaxSizeOfInstructions(
     int32_t max_size_of_instructions) {
-  internalWriteData()->writeUShort(Offset::kMaxSizeOfInstructions,
+  InternalWriteData()->WriteUShort(Offset::kMaxSizeOfInstructions,
                                    max_size_of_instructions);
 }
 
-int32_t MaximumProfileTable::Builder::maxComponentElements() {
-  return internalReadData()->readUShort(Offset::kMaxComponentElements);
+int32_t MaximumProfileTable::Builder::MaxComponentElements() {
+  return InternalReadData()->ReadUShort(Offset::kMaxComponentElements);
 }
 
-void MaximumProfileTable::Builder::setMaxComponentElements(
+void MaximumProfileTable::Builder::SetMaxComponentElements(
     int32_t max_component_elements) {
-  internalWriteData()->writeUShort(Offset::kMaxComponentElements,
+  InternalWriteData()->WriteUShort(Offset::kMaxComponentElements,
                                    max_component_elements);
 }
 
-int32_t MaximumProfileTable::Builder::maxComponentDepth() {
-  return internalReadData()->readUShort(Offset::kMaxComponentDepth);
+int32_t MaximumProfileTable::Builder::MaxComponentDepth() {
+  return InternalReadData()->ReadUShort(Offset::kMaxComponentDepth);
 }
 
-void MaximumProfileTable::Builder::setMaxComponentDepth(
+void MaximumProfileTable::Builder::SetMaxComponentDepth(
     int32_t max_component_depth) {
-  internalWriteData()->writeUShort(Offset::kMaxComponentDepth,
+  InternalWriteData()->WriteUShort(Offset::kMaxComponentDepth,
                                    max_component_depth);
 }
 
diff --git a/sfntly/maximum_profile_table.h b/sfntly/maximum_profile_table.h
index 044eccf..9e0d0a6 100644
--- a/sfntly/maximum_profile_table.h
+++ b/sfntly/maximum_profile_table.h
@@ -24,6 +24,63 @@
 
 class MaximumProfileTable : public Table,
                             public RefCounted<MaximumProfileTable> {
+ public:
+  class Builder : public Table::TableBasedTableBuilder,
+                  public RefCounted<Builder> {
+   public:
+    // Constructor scope altered to public because C++ does not allow base
+    // class to instantiate derived class with protected constructors.
+    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+            WritableFontData* data);
+    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+            ReadableFontData* data);
+    virtual ~Builder();
+
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+
+    int32_t Version();
+    void SetVersion(int32_t version);
+    int32_t NumGlyphs();
+    void SetNumGlyphs(int32_t num_glyphs);
+    int32_t MaxPoints();
+    void SetMaxPoints(int32_t max_points);
+    int32_t MaxContours();
+    void SetMaxContours(int32_t max_contours);
+    int32_t MaxCompositePoints();
+    void SetMaxCompositePoints(int32_t max_composite_points);
+    int32_t MaxZones();
+    void SetMaxZones(int32_t max_zones);
+    int32_t MaxTwilightPoints();
+    void SetMaxTwilightPoints(int32_t max_twilight_points);
+    int32_t MaxStorage();
+    void SetMaxStorage(int32_t max_storage);
+    int32_t MaxFunctionDefs();
+    void SetMaxFunctionDefs(int32_t max_function_defs);
+    int32_t MaxStackElements();
+    void SetMaxStackElements(int32_t max_stack_elements);
+    int32_t MaxSizeOfInstructions();
+    void SetMaxSizeOfInstructions(int32_t max_size_of_instructions);
+    int32_t MaxComponentElements();
+    void SetMaxComponentElements(int32_t max_component_elements);
+    int32_t MaxComponentDepth();
+    void SetMaxComponentDepth(int32_t max_component_depth);
+  };
+
+  virtual ~MaximumProfileTable();
+  int32_t Version();
+  int32_t NumGlyphs();
+  int32_t MaxPoints();
+  int32_t MaxContours();
+  int32_t MaxCompositePoints();
+  int32_t MaxZones();
+  int32_t MaxTwilightPoints();
+  int32_t MaxStorage();
+  int32_t MaxFunctionDefs();
+  int32_t MaxStackElements();
+  int32_t MaxSizeOfInstructions();
+  int32_t MaxComponentElements();
+  int32_t MaxComponentDepth();
+
  private:
   struct Offset {
     enum {
@@ -48,67 +105,7 @@
     };
   };
 
- private:
   MaximumProfileTable(Header* header, ReadableFontData* data);
-
- public:  // Class is final, no virtual functions unless derived from parent.
-  virtual ~MaximumProfileTable();
-  int32_t version();
-  int32_t numGlyphs();
-  int32_t maxPoints();
-  int32_t maxContours();
-  int32_t maxCompositePoints();
-  int32_t maxZones();
-  int32_t maxTwilightPoints();
-  int32_t maxStorage();
-  int32_t maxFunctionDefs();
-  int32_t maxStackElements();
-  int32_t maxSizeOfInstructions();
-  int32_t maxComponentElements();
-  int32_t maxComponentDepth();
-
- public:
-  class Builder : public Table::TableBasedTableBuilder,
-                  public RefCounted<Builder> {
-   public:
-    // Constructor scope altered to public because C++ does not allow base
-    // class to instantiate derived class with protected constructors.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            ReadableFontData* data);
-    virtual ~Builder();
-
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-
-   public:  // Class is static, no virtual functions unless derived from parent.
-    int32_t version();
-    void setVersion(int32_t version);
-    int32_t numGlyphs();
-    void setNumGlyphs(int32_t num_glyphs);
-    int32_t maxPoints();
-    void setMaxPoints(int32_t max_points);
-    int32_t maxContours();
-    void setMaxContours(int32_t max_contours);
-    int32_t maxCompositePoints();
-    void setMaxCompositePoints(int32_t max_composite_points);
-    int32_t maxZones();
-    void setMaxZones(int32_t max_zones);
-    int32_t maxTwilightPoints();
-    void setMaxTwilightPoints(int32_t max_twilight_points);
-    int32_t maxStorage();
-    void setMaxStorage(int32_t max_storage);
-    int32_t maxFunctionDefs();
-    void setMaxFunctionDefs(int32_t max_function_defs);
-    int32_t maxStackElements();
-    void setMaxStackElements(int32_t max_stack_elements);
-    int32_t maxSizeOfInstructions();
-    void setMaxSizeOfInstructions(int32_t max_size_of_instructions);
-    int32_t maxComponentElements();
-    void setMaxComponentElements(int32_t max_component_elements);
-    int32_t maxComponentDepth();
-    void setMaxComponentDepth(int32_t max_component_depth);
-  };
 };
 typedef Ptr<MaximumProfileTable> MaximumProfileTablePtr;
 typedef Ptr<MaximumProfileTable::Builder> MaximumProfileTableBuilderPtr;
diff --git a/sfntly/name_table.cc b/sfntly/name_table.cc
index 0858603..19c299c 100644
--- a/sfntly/name_table.cc
+++ b/sfntly/name_table.cc
@@ -14,142 +14,558 @@
  * limitations under the License.
  */
 
-#include "port/type.h"
+#include "sfntly/name_table.h"
 
 #include <stdio.h>
 #include <string.h>
 
 #include <unicode/unistr.h>
 
-#include "sfntly/name_table.h"
 #include "sfntly/font.h"
 #include "sfntly/port/exception_type.h"
 
 namespace sfntly {
 /******************************************************************************
+ * NameTable::NameEntryId class
+ ******************************************************************************/
+NameTable::NameEntryId::NameEntryId()
+    : platform_id_(0),
+      encoding_id_(0),
+      language_id_(0),
+      name_id_(0) {
+}
+
+NameTable::NameEntryId::NameEntryId(int32_t platform_id,
+                                    int32_t encoding_id,
+                                    int32_t language_id,
+                                    int32_t name_id)
+    : platform_id_(platform_id),
+      encoding_id_(encoding_id),
+      language_id_(language_id),
+      name_id_(name_id) {
+}
+
+NameTable::NameEntryId::NameEntryId(const NameTable::NameEntryId& rhs) {
+  *this = rhs;
+}
+
+const NameTable::NameEntryId&
+    NameTable::NameEntryId::operator=(const NameTable::NameEntryId& rhs) const {
+  platform_id_ = rhs.platform_id_;
+  encoding_id_ = rhs.encoding_id_;
+  language_id_ = rhs.language_id_;
+  name_id_ = rhs.name_id_;
+  return *this;
+}
+
+bool NameTable::NameEntryId::operator==(const NameEntryId& rhs) const {
+  return platform_id_ == rhs.platform_id_ &&
+         encoding_id_ == rhs.encoding_id_ &&
+         language_id_ == rhs.language_id_ &&
+         name_id_ == rhs.name_id_;
+}
+
+bool NameTable::NameEntryId::operator<(const NameEntryId& rhs) const {
+  if (platform_id_ != rhs.platform_id_) return platform_id_ < rhs.platform_id_;
+  if (encoding_id_ != rhs.encoding_id_) return encoding_id_ < rhs.encoding_id_;
+  if (language_id_ != rhs.language_id_) return language_id_ < rhs.language_id_;
+  return name_id_ < rhs.name_id_;
+}
+
+/******************************************************************************
+ * NameTable::NameEntry class
+ ******************************************************************************/
+NameTable::NameEntry::NameEntry() {
+  Init(0, 0, 0, 0, NULL);
+}
+
+NameTable::NameEntry::NameEntry(const NameEntryId& name_entry_id,
+                                const ByteVector& name_bytes) {
+  Init(name_entry_id.platform_id(),
+       name_entry_id.encoding_id(),
+       name_entry_id.language_id(),
+       name_entry_id.name_id(),
+       &name_bytes);
+}
+
+NameTable::NameEntry::NameEntry(int32_t platform_id,
+                                int32_t encoding_id,
+                                int32_t language_id,
+                                int32_t name_id,
+                                const ByteVector& name_bytes) {
+  Init(platform_id, encoding_id, language_id, name_id, &name_bytes);
+}
+
+NameTable::NameEntry::~NameEntry() {}
+
+ByteVector* NameTable::NameEntry::NameAsBytes() {
+  return &name_bytes_;
+}
+
+int32_t NameTable::NameEntry::NameBytesLength() {
+  return name_bytes_.size();
+}
+
+UChar* NameTable::NameEntry::Name() {
+  return NameTable::ConvertFromNameBytes(&name_bytes_,
+                                         platform_id(),
+                                         encoding_id());
+}
+
+bool NameTable::NameEntry::operator==(const NameEntry& rhs) const {
+  return (name_entry_id_ == rhs.name_entry_id_ &&
+          name_bytes_ == rhs.name_bytes_);
+}
+
+void NameTable::NameEntry::Init(int32_t platform_id,
+                                int32_t encoding_id,
+                                int32_t language_id,
+                                int32_t name_id,
+                                const ByteVector* name_bytes) {
+  name_entry_id_ = NameEntryId(platform_id, encoding_id, language_id, name_id);
+  if (name_bytes) {
+    name_bytes_ = *name_bytes;
+  } else {
+    name_bytes_.clear();
+  }
+}
+
+/******************************************************************************
+ * NameTable::NameEntryBuilder class
+ ******************************************************************************/
+NameTable::NameEntryBuilder::NameEntryBuilder() {
+  Init(0, 0, 0, 0, NULL);
+}
+
+NameTable::NameEntryBuilder::NameEntryBuilder(
+    const NameEntryId& name_entry_id, const ByteVector& name_bytes) {
+  Init(name_entry_id.platform_id(),
+       name_entry_id.encoding_id(),
+       name_entry_id.language_id(),
+       name_entry_id.name_id(),
+       &name_bytes);
+}
+
+NameTable::NameEntryBuilder::NameEntryBuilder(
+    const NameEntryId& name_entry_id) {
+  Init(name_entry_id.platform_id(),
+       name_entry_id.encoding_id(),
+       name_entry_id.language_id(),
+       name_entry_id.name_id(),
+       NULL);
+}
+
+NameTable::NameEntryBuilder::NameEntryBuilder(NameEntry* b) {
+  Init(b->platform_id(),
+       b->encoding_id(),
+       b->language_id(),
+       b->name_id(),
+       b->NameAsBytes());
+}
+
+NameTable::NameEntryBuilder::~NameEntryBuilder() {}
+
+void NameTable::NameEntryBuilder::SetName(const UChar* name) {
+  if (name == NULL) {
+    name_entry_->name_bytes_.clear();
+    return;
+  }
+  NameTable::ConvertToNameBytes(name,
+                                name_entry_->platform_id(),
+                                name_entry_->encoding_id(),
+                                &name_entry_->name_bytes_);
+}
+
+void NameTable::NameEntryBuilder::SetName(const ByteVector& name_bytes) {
+  name_entry_->name_bytes_.clear();
+  std::copy(name_bytes.begin(),
+            name_bytes.end(),
+            name_entry_->name_bytes_.begin());
+}
+
+void NameTable::NameEntryBuilder::SetName(const ByteVector& name_bytes,
+                                          int32_t offset,
+                                          int32_t length) {
+  name_entry_->name_bytes_.clear();
+  std::copy(name_bytes.begin() + offset,
+            name_bytes.begin() + offset + length,
+            name_entry_->name_bytes_.begin());
+}
+
+void NameTable::NameEntryBuilder::Init(int32_t platform_id,
+                                       int32_t encoding_id,
+                                       int32_t language_id,
+                                       int32_t name_id,
+                                       const ByteVector* name_bytes) {
+  name_entry_ = new NameEntry();
+  name_entry_->Init(platform_id, encoding_id, language_id, name_id, name_bytes);
+}
+
+/******************************************************************************
+ * NameTable::NameEntryFilterInPlace class (C++ port only)
+ ******************************************************************************/
+NameTable::NameEntryFilterInPlace::NameEntryFilterInPlace(int32_t platform_id,
+                                                          int32_t encoding_id,
+                                                          int32_t language_id,
+                                                          int32_t name_id)
+    : platform_id_(platform_id),
+      encoding_id_(encoding_id),
+      language_id_(language_id),
+      name_id_(name_id) {
+}
+
+bool NameTable::NameEntryFilterInPlace::Accept(int32_t platform_id,
+                                               int32_t encoding_id,
+                                               int32_t language_id,
+                                               int32_t name_id) {
+  return (platform_id_ == platform_id &&
+          encoding_id_ == encoding_id &&
+          language_id_ == language_id &&
+          name_id_ == name_id);
+}
+
+/******************************************************************************
+ * NameTable::NameEntryIterator class
+ ******************************************************************************/
+NameTable::NameEntryIterator::NameEntryIterator(NameTable* table) {
+  Init(table, NULL);
+}
+
+NameTable::NameEntryIterator::NameEntryIterator(NameTable* table,
+                                                NameEntryFilter* filter) {
+  Init(table, filter);
+}
+
+bool NameTable::NameEntryIterator::HasNext() {
+  if (!filter_) {
+    if (name_index_ < table_->NameCount()) {
+      return true;
+    }
+    return false;
+  }
+  for (; name_index_ < table_->NameCount(); ++name_index_) {
+    if (filter_->Accept(table_->PlatformId(name_index_),
+                        table_->EncodingId(name_index_),
+                        table_->LanguageId(name_index_),
+                        table_->NameId(name_index_))) {
+      return true;
+    }
+  }
+  return false;
+}
+
+CALLER_ATTACH NameTable::NameEntry* NameTable::NameEntryIterator::Next() {
+  if (!HasNext())
+    return NULL;
+  return table_->GetNameEntry(name_index_++);
+}
+
+void NameTable::NameEntryIterator::Remove() {
+#if !defined (SFNTLY_NO_EXCEPTION)
+  throw UnsupportedOperationException(
+            "Cannot remove a CMap table from an existing font.");
+#endif
+}
+
+void NameTable::NameEntryIterator::Init(NameTable* table,
+                                        NameEntryFilter* filter) {
+  table_ = table;
+  filter_ = filter;
+  name_index_ = 0;
+}
+
+/******************************************************************************
+ * NameTable::Builder class
+ ******************************************************************************/
+NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+                            Header* header,
+                            WritableFontData* data)
+    : Table::ArrayElementTableBuilder(font_builder, header, data) {
+}
+
+NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+                            Header* header,
+                            ReadableFontData* data)
+    : Table::ArrayElementTableBuilder(font_builder, header, data) {
+}
+
+void NameTable::Builder::RevertNames() {
+  name_entry_map_.clear();
+  set_model_changed(false);
+}
+
+int32_t NameTable::Builder::BuilderCount() {
+  GetNameBuilders();  // Ensure name_entry_map_ is built.
+  return (int32_t)name_entry_map_.size();
+}
+
+bool NameTable::Builder::Has(int32_t platform_id,
+                             int32_t encoding_id,
+                             int32_t language_id,
+                             int32_t name_id) {
+  NameEntryId probe(platform_id, encoding_id, language_id, name_id);
+  GetNameBuilders();  // Ensure name_entry_map_ is built.
+  return (name_entry_map_.find(probe) != name_entry_map_.end());
+}
+
+CALLER_ATTACH NameTable::NameEntryBuilder*
+    NameTable::Builder::NameBuilder(int32_t platform_id,
+                                    int32_t encoding_id,
+                                    int32_t language_id,
+                                    int32_t name_id) {
+  NameEntryId probe(platform_id, encoding_id, language_id, name_id);
+  NameEntryBuilderMap builders;
+  GetNameBuilders();  // Ensure name_entry_map_ is built.
+  if (name_entry_map_.find(probe) != name_entry_map_.end()) {
+    return name_entry_map_[probe];
+  }
+  NameEntryBuilderPtr builder = new NameEntryBuilder(probe);
+  name_entry_map_[probe] = builder;
+  return builder.Detach();
+}
+
+bool NameTable::Builder::Remove(int32_t platform_id,
+                                int32_t encoding_id,
+                                int32_t language_id,
+                                int32_t name_id) {
+  NameEntryId probe(platform_id, encoding_id, language_id, name_id);
+  GetNameBuilders();  // Ensure name_entry_map_ is built.
+  NameEntryBuilderMap::iterator position = name_entry_map_.find(probe);
+  if (position != name_entry_map_.end()) {
+    name_entry_map_.erase(position);
+    return true;
+  }
+  return false;
+}
+
+CALLER_ATTACH FontDataTable*
+    NameTable::Builder::SubBuildTable(ReadableFontData* data) {
+  FontDataTablePtr table = new NameTable(header(), data);
+  return table.Detach();
+}
+
+void NameTable::Builder::SubDataSet() {
+  name_entry_map_.clear();
+  set_model_changed(false);
+}
+
+int32_t NameTable::Builder::SubDataSizeToSerialize() {
+  if (name_entry_map_.empty()) {
+    return 0;
+  }
+
+  int32_t size = NameTable::Offset::kNameRecordStart +
+                 name_entry_map_.size() * NameTable::Offset::kNameRecordSize;
+  for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
+                                     end = name_entry_map_.end();
+                                     b != end; ++b) {
+    NameEntryBuilderPtr p = b->second;
+    NameEntry* entry = p->name_entry();
+    size += entry->NameBytesLength();
+  }
+  return size;
+}
+
+bool NameTable::Builder::SubReadyToSerialize() {
+  return !name_entry_map_.empty();
+}
+
+int32_t NameTable::Builder::SubSerialize(WritableFontData* new_data) {
+  int32_t string_table_start_offset =
+      NameTable::Offset::kNameRecordStart +
+      name_entry_map_.size() * NameTable::Offset::kNameRecordSize;
+
+  // Header
+  new_data->WriteUShort(NameTable::Offset::kFormat, 0);
+  new_data->WriteUShort(NameTable::Offset::kCount, name_entry_map_.size());
+  new_data->WriteUShort(NameTable::Offset::kStringOffset,
+                        string_table_start_offset);
+  int32_t name_record_offset = NameTable::Offset::kNameRecordStart;
+  int32_t string_offset = 0;
+  // Note: we offered operator< in NameEntryId, which will be used by std::less,
+  //       and therefore our map will act like TreeMap in Java to provide
+  //       sorted key set.
+  for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
+                                     end = name_entry_map_.end();
+                                     b != end; ++b) {
+    new_data->WriteUShort(
+        name_record_offset + NameTable::Offset::kNameRecordPlatformId,
+        b->first.platform_id());
+    new_data->WriteUShort(
+        name_record_offset + NameTable::Offset::kNameRecordEncodingId,
+        b->first.encoding_id());
+    new_data->WriteUShort(
+        name_record_offset + NameTable::Offset::kNameRecordLanguageId,
+        b->first.language_id());
+    new_data->WriteUShort(
+        name_record_offset + NameTable::Offset::kNameRecordNameId,
+        b->first.name_id());
+    NameEntry* builder_entry = b->second->name_entry();
+    new_data->WriteUShort(
+        name_record_offset + NameTable::Offset::kNameRecordStringLength,
+        builder_entry->NameBytesLength());
+    new_data->WriteUShort(
+        name_record_offset + NameTable::Offset::kNameRecordStringOffset,
+        string_offset);
+    name_record_offset += NameTable::Offset::kNameRecordSize;
+    string_offset += new_data->WriteBytes(
+        string_offset + string_table_start_offset,
+        builder_entry->NameAsBytes());
+  }
+
+  return string_offset + string_table_start_offset;
+}
+
+void NameTable::Builder::Initialize(ReadableFontData* data) {
+  if (data) {
+    NameTablePtr table = new NameTable(header(), data);
+    NameEntryIterator name_iter(table, NULL);
+    while (name_iter.HasNext()) {
+      NameEntryPtr name_entry = name_iter.Next();
+      NameEntryBuilderPtr name_entry_builder = new NameEntryBuilder(name_entry);
+      NameEntry* builder_entry = name_entry_builder->name_entry();
+      NameEntryId probe = builder_entry->name_entry_id();
+      name_entry_map_[probe] = name_entry_builder;
+    }
+  }
+}
+
+NameTable::NameEntryBuilderMap* NameTable::Builder::GetNameBuilders() {
+  if (name_entry_map_.empty()) {
+    Initialize(InternalReadData());
+  }
+  set_model_changed();
+  return &name_entry_map_;
+}
+
+/******************************************************************************
  * NameTable class
  ******************************************************************************/
-NameTable::NameTable(Header* header, ReadableFontData* data)
-    : Table(header, data) {}
-
 NameTable::~NameTable() {}
 
-int32_t NameTable::format() {
-  return data_->readUShort(Offset::kFormat);
+int32_t NameTable::Format() {
+  return data_->ReadUShort(Offset::kFormat);
 }
 
-int32_t NameTable::nameCount() {
-  return data_->readUShort(Offset::kCount);
+int32_t NameTable::NameCount() {
+  return data_->ReadUShort(Offset::kCount);
 }
 
-int32_t NameTable::stringOffset() {
-  return data_->readUShort(Offset::kStringOffset);
+int32_t NameTable::PlatformId(int32_t index) {
+  return data_->ReadUShort(Offset::kNameRecordPlatformId +
+                           OffsetForNameRecord(index));
 }
 
-int32_t NameTable::offsetForNameRecord(int32_t index) {
-  return Offset::kNameRecordStart + index * Offset::kNameRecordSize;
+int32_t NameTable::EncodingId(int32_t index) {
+  return data_->ReadUShort(Offset::kNameRecordEncodingId +
+                           OffsetForNameRecord(index));
 }
 
-int32_t NameTable::platformId(int32_t index) {
-  return data_->readUShort(Offset::kNameRecordPlatformId +
-                           offsetForNameRecord(index));
+int32_t NameTable::LanguageId(int32_t index) {
+  return data_->ReadUShort(Offset::kNameRecordLanguageId +
+                           OffsetForNameRecord(index));
 }
 
-int32_t NameTable::encodingId(int32_t index) {
-  return data_->readUShort(Offset::kNameRecordEncodingId +
-                           offsetForNameRecord(index));
+int32_t NameTable::NameId(int32_t index) {
+  return data_->ReadUShort(Offset::kNameRecordNameId +
+                           OffsetForNameRecord(index));
 }
 
-int32_t NameTable::languageId(int32_t index) {
-  return data_->readUShort(Offset::kNameRecordLanguageId +
-                           offsetForNameRecord(index));
-}
-
-int32_t NameTable::nameId(int32_t index) {
-  return data_->readUShort(Offset::kNameRecordNameId +
-                           offsetForNameRecord(index));
-}
-
-int32_t NameTable::nameLength(int32_t index) {
-  return data_->readUShort(Offset::kNameRecordStringLength +
-                           offsetForNameRecord(index));
-}
-
-int32_t NameTable::nameOffset(int32_t index) {
-  return data_->readUShort(Offset::kNameRecordStringOffset +
-                           offsetForNameRecord(index)) + stringOffset();
-}
-
-void NameTable::nameAsBytes(int32_t index, ByteVector* b) {
+void NameTable::NameAsBytes(int32_t index, ByteVector* b) {
   assert(b);
-  int32_t length = nameLength(index);
+  int32_t length = NameLength(index);
   b->clear();
   b->resize(length);
-  data_->readBytes(nameOffset(index), b, 0, length);
+  data_->ReadBytes(NameOffset(index), b, 0, length);
 }
 
-void NameTable::nameAsBytes(int32_t platform_id, int32_t encoding_id,
-                            int32_t language_id, int32_t name_id,
+void NameTable::NameAsBytes(int32_t platform_id,
+                            int32_t encoding_id,
+                            int32_t language_id,
+                            int32_t name_id,
                             ByteVector* b) {
   assert(b);
   NameEntryPtr entry;
-  entry.attach(nameEntry(platform_id, encoding_id, language_id, name_id));
+  entry.Attach(GetNameEntry(platform_id, encoding_id, language_id, name_id));
   if (entry) {
-    ByteVector* name = entry->nameAsBytes();
+    ByteVector* name = entry->NameAsBytes();
     std::copy(name->begin(), name->end(), b->begin());
   }
 }
 
-UChar* NameTable::name(int index) {
+UChar* NameTable::Name(int index) {
   ByteVector b;
-  nameAsBytes(index, &b);
-  return convertFromNameBytes(&b, platformId(index), encodingId(index));
+  NameAsBytes(index, &b);
+  return ConvertFromNameBytes(&b, PlatformId(index), EncodingId(index));
 }
 
-UChar* NameTable::name(int32_t platform_id, int32_t encoding_id,
-                       int32_t language_id, int32_t name_id) {
+UChar* NameTable::Name(int32_t platform_id,
+                       int32_t encoding_id,
+                       int32_t language_id,
+                       int32_t name_id) {
   NameEntryPtr entry;
-  entry.attach(nameEntry(platform_id, encoding_id, language_id, name_id));
+  entry.Attach(GetNameEntry(platform_id, encoding_id, language_id, name_id));
   if (entry) {
-    return entry->name();
+    return entry->Name();
   }
   return NULL;
 }
 
-CALLER_ATTACH NameTable::NameEntry* NameTable::nameEntry(int32_t index) {
+CALLER_ATTACH NameTable::NameEntry* NameTable::GetNameEntry(int32_t index) {
   ByteVector b;
-  nameAsBytes(index, &b);
-  NameEntryPtr instance = new NameEntry(platformId(index), encodingId(index),
-                                        languageId(index), nameId(index), b);
-  return instance.detach();
+  NameAsBytes(index, &b);
+  NameEntryPtr instance = new NameEntry(PlatformId(index),
+                                        EncodingId(index),
+                                        LanguageId(index),
+                                        NameId(index), b);
+  return instance.Detach();
 }
 
-CALLER_ATTACH NameTable::NameEntry* NameTable::nameEntry(int32_t platform_id,
-                                                         int32_t encoding_id,
-                                                         int32_t language_id,
-                                                         int32_t name_id) {
-  NameTable::NameEntryFilterInPlace filter(platform_id, encoding_id,
-                                           language_id, name_id);
-  NameTable::NameEntryIterator* name_entry_iter = iterator(&filter);
+CALLER_ATTACH NameTable::NameEntry* NameTable::GetNameEntry(int32_t platform_id,
+                                                            int32_t encoding_id,
+                                                            int32_t language_id,
+                                                            int32_t name_id) {
+  NameTable::NameEntryFilterInPlace
+      filter(platform_id, encoding_id, language_id, name_id);
+  NameTable::NameEntryIterator* name_entry_iter = Iterator(&filter);
   NameEntryPtr result;
-  if (name_entry_iter->hasNext()) {
-    result = name_entry_iter->next();
-    delete name_entry_iter;
-    return result;
+  if (name_entry_iter->HasNext()) {
+    result = name_entry_iter->Next();
   }
   delete name_entry_iter;
-  return NULL;
+  return result;
 }
 
-NameTable::NameEntryIterator* NameTable::iterator() {
+NameTable::NameEntryIterator* NameTable::Iterator() {
   return new NameTable::NameEntryIterator(this);
 }
 
-NameTable::NameEntryIterator* NameTable::iterator(NameEntryFilter* filter) {
+NameTable::NameEntryIterator* NameTable::Iterator(NameEntryFilter* filter) {
   return new NameTable::NameEntryIterator(this, filter);
 }
 
-const char* NameTable::getEncodingName(int32_t platform_id,
+NameTable::NameTable(Header* header, ReadableFontData* data)
+    : Table(header, data) {}
+
+int32_t NameTable::StringOffset() {
+  return data_->ReadUShort(Offset::kStringOffset);
+}
+
+int32_t NameTable::OffsetForNameRecord(int32_t index) {
+  return Offset::kNameRecordStart + index * Offset::kNameRecordSize;
+}
+
+int32_t NameTable::NameLength(int32_t index) {
+  return data_->ReadUShort(Offset::kNameRecordStringLength +
+                           OffsetForNameRecord(index));
+}
+
+int32_t NameTable::NameOffset(int32_t index) {
+  return data_->ReadUShort(Offset::kNameRecordStringOffset +
+                           OffsetForNameRecord(index)) + StringOffset();
+}
+
+const char* NameTable::GetEncodingName(int32_t platform_id,
                                        int32_t encoding_id) {
   switch (platform_id) {
     case PlatformId::kUnicode:
@@ -178,7 +594,7 @@
           return "MacThai";
         case MacintoshEncodingId::kChineseSimplified:
           return "EUC-CN";
-        default:  // unknown/unconfirmed cases are not ported
+        default:  // Note: unknown/unconfirmed cases are not ported.
           break;
       }
       break;
@@ -211,9 +627,9 @@
   return NULL;
 }
 
-UConverter* NameTable::getCharset(int32_t platform_id, int32_t encoding_id) {
+UConverter* NameTable::GetCharset(int32_t platform_id, int32_t encoding_id) {
   UErrorCode error_code = U_ZERO_ERROR;
-  UConverter* conv = ucnv_open(getEncodingName(platform_id, encoding_id),
+  UConverter* conv = ucnv_open(GetEncodingName(platform_id, encoding_id),
                                &error_code);
   if (U_SUCCESS(error_code)) {
     return conv;
@@ -225,12 +641,14 @@
   return NULL;
 }
 
-void NameTable::convertToNameBytes(const UChar* name, int32_t platform_id,
-                                   int32_t encoding_id, ByteVector* b) {
+void NameTable::ConvertToNameBytes(const UChar* name,
+                                   int32_t platform_id,
+                                   int32_t encoding_id,
+                                   ByteVector* b) {
   assert(b);
   assert(name);
   b->clear();
-  UConverter* cs = getCharset(platform_id, encoding_id);
+  UConverter* cs = GetCharset(platform_id, encoding_id);
   if (cs == NULL) {
     return;
   }
@@ -238,23 +656,28 @@
   // Preflight to get buffer size.
   UErrorCode error_code = U_ZERO_ERROR;
   int32_t length = ucnv_fromUChars(cs, NULL, 0, name, -1, &error_code);
-  b->resize(length + 4);  // the longest termination "\0" is 4 bytes
+  b->resize(length + 4);  // The longest termination "\0" is 4 bytes.
   memset(&((*b)[0]), 0, length + 4);
   error_code = U_ZERO_ERROR;
-  ucnv_fromUChars(cs, reinterpret_cast<char*>(&((*b)[0])), length + 4, name,
-                  -1, &error_code);
+  ucnv_fromUChars(cs,
+                  reinterpret_cast<char*>(&((*b)[0])),
+                  length + 4,
+                  name,
+                  -1,
+                  &error_code);
   if (!U_SUCCESS(error_code)) {
     b->clear();
   }
   ucnv_close(cs);
 }
 
-UChar* NameTable::convertFromNameBytes(ByteVector* name_bytes,
-    int32_t platform_id, int32_t encoding_id) {
+UChar* NameTable::ConvertFromNameBytes(ByteVector* name_bytes,
+                                       int32_t platform_id,
+                                       int32_t encoding_id) {
   if (name_bytes == NULL) {
     return NULL;
   }
-  UConverter* cs = getCharset(platform_id, encoding_id);
+  UConverter* cs = GetCharset(platform_id, encoding_id);
   UErrorCode error_code = U_ZERO_ERROR;
   if (cs == NULL) {
     char buffer[11] = {0};
@@ -280,9 +703,12 @@
   // No preflight needed here, we will be bigger.
   UChar* output_buffer = new UChar[name_bytes->size() + 1];
   memset(output_buffer, 0, sizeof(UChar) * (name_bytes->size() + 1));
-  int32_t length = ucnv_toUChars(cs, output_buffer, name_bytes->size(),
+  int32_t length = ucnv_toUChars(cs,
+                                 output_buffer,
+                                 name_bytes->size(),
                                  reinterpret_cast<char*>(&((*name_bytes)[0])),
-                                 name_bytes->size(), &error_code);
+                                 name_bytes->size(),
+                                 &error_code);
   ucnv_close(cs);
   if (length > 0) {
     return output_buffer;
@@ -292,413 +718,4 @@
   return NULL;
 }
 
-/******************************************************************************
- * NameTable::NameEntryId class
- ******************************************************************************/
-NameTable::NameEntryId::NameEntryId()
-    : platform_id_(0), encoding_id_(0), language_id_(0), name_id_(0) {
-}
-
-NameTable::NameEntryId::NameEntryId(int32_t platform_id, int32_t encoding_id,
-                                    int32_t language_id, int32_t name_id)
-    : platform_id_(platform_id), encoding_id_(encoding_id),
-      language_id_(language_id), name_id_(name_id) {
-}
-
-NameTable::NameEntryId::NameEntryId(const NameTable::NameEntryId& rhs) {
-  *this = rhs;
-}
-
-NameTable::NameEntryId::~NameEntryId() {}
-
-int32_t NameTable::NameEntryId::getPlatformId() const {
-  return platform_id_;
-}
-
-int32_t NameTable::NameEntryId::getEncodingId() const {
-  return encoding_id_;
-}
-
-int32_t NameTable::NameEntryId::getLanguageId() const {
-  return language_id_;
-}
-
-int32_t NameTable::NameEntryId::getNameId() const {
-  return name_id_;
-}
-
-const NameTable::NameEntryId& NameTable::NameEntryId::operator=(
-    const NameTable::NameEntryId& rhs) const {
-  platform_id_ = rhs.platform_id_;
-  encoding_id_ = rhs.encoding_id_;
-  language_id_ = rhs.language_id_;
-  name_id_ = rhs.name_id_;
-  return *this;
-}
-
-bool NameTable::NameEntryId::operator==(const NameEntryId& rhs) const {
-  return platform_id_ == rhs.platform_id_ && encoding_id_ == rhs.encoding_id_ &&
-         language_id_ == rhs.language_id_ && name_id_ == rhs.name_id_;
-}
-
-bool NameTable::NameEntryId::operator<(const NameEntryId& rhs) const {
-  if (platform_id_ != rhs.platform_id_) return platform_id_ < rhs.platform_id_;
-  if (encoding_id_ != rhs.encoding_id_) return encoding_id_ < rhs.encoding_id_;
-  if (language_id_ != rhs.language_id_) return language_id_ < rhs.language_id_;
-  return name_id_ < rhs.name_id_;
-}
-
-/******************************************************************************
- * NameTable::NameEntry class
- ******************************************************************************/
-void NameTable::NameEntry::init(int32_t platform_id, int32_t encoding_id,
-                                int32_t language_id, int32_t name_id,
-                                const ByteVector* name_bytes) {
-  name_entry_id_ = NameEntryId(platform_id, encoding_id, language_id, name_id);
-  if (name_bytes) {
-    name_bytes_ = *name_bytes;
-  } else {
-    name_bytes_.clear();
-  }
-}
-
-NameTable::NameEntry::NameEntry() {
-  init(0, 0, 0, 0, NULL);
-}
-
-NameTable::NameEntry::NameEntry(const NameEntryId& name_entry_id,
-                                const ByteVector& name_bytes) {
-  init(name_entry_id.getPlatformId(), name_entry_id.getEncodingId(),
-       name_entry_id.getLanguageId(), name_entry_id.getNameId(), &name_bytes);
-}
-
-NameTable::NameEntry::NameEntry(int32_t platform_id, int32_t encoding_id,
-                                int32_t language_id, int32_t name_id,
-                                const ByteVector& name_bytes) {
-  init(platform_id, encoding_id, language_id, name_id, &name_bytes);
-}
-
-NameTable::NameEntry::~NameEntry() {}
-
-NameTable::NameEntryId& NameTable::NameEntry::getNameEntryId() {
-  return name_entry_id_;
-}
-
-int32_t NameTable::NameEntry::platformId() {
-  return name_entry_id_.getPlatformId();
-}
-
-int32_t NameTable::NameEntry::encodingId() {
-  return name_entry_id_.getEncodingId();
-}
-
-int32_t NameTable::NameEntry::languageId() {
-  return name_entry_id_.getLanguageId();
-}
-
-int32_t NameTable::NameEntry::nameId() {
-  return name_entry_id_.getNameId();
-}
-
-int32_t NameTable::NameEntry::nameBytesLength() {
-  return name_bytes_.size();
-}
-
-ByteVector* NameTable::NameEntry::nameAsBytes() {
-  return &name_bytes_;
-}
-
-UChar* NameTable::NameEntry::name() {
-  return NameTable::convertFromNameBytes(&name_bytes_, platformId(),
-                                         encodingId());
-}
-
-bool NameTable::NameEntry::operator==(const NameEntry& rhs) const {
-  return (name_entry_id_ == rhs.name_entry_id_ &&
-          name_bytes_ == rhs.name_bytes_);
-}
-
-/******************************************************************************
- * NameTable::NameEntryBuilder class
- ******************************************************************************/
-NameTable::NameEntryBuilder::NameEntryBuilder() {
-  init(0, 0, 0, 0, NULL);
-}
-
-NameTable::NameEntryBuilder::NameEntryBuilder(
-    const NameEntryId& name_entry_id, const ByteVector& name_bytes) {
-  init(name_entry_id.getPlatformId(), name_entry_id.getEncodingId(),
-       name_entry_id.getLanguageId(), name_entry_id.getNameId(), &name_bytes);
-}
-
-NameTable::NameEntryBuilder::NameEntryBuilder(
-    const NameEntryId& name_entry_id) {
-  init(name_entry_id.getPlatformId(), name_entry_id.getEncodingId(),
-       name_entry_id.getLanguageId(), name_entry_id.getNameId(), NULL);
-}
-
-NameTable::NameEntryBuilder::NameEntryBuilder(NameEntry* b) {
-  init(b->platformId(), b->encodingId(), b->languageId(), b->nameId(),
-       b->nameAsBytes());
-}
-
-NameTable::NameEntryBuilder::~NameEntryBuilder() {}
-
-void NameTable::NameEntryBuilder::setName(const UChar* name) {
-  if (name == NULL) {
-    name_entry_->name_bytes_.clear();
-    return;
-  }
-  NameTable::convertToNameBytes(name, name_entry_->platformId(),
-                                name_entry_->encodingId(),
-                                &name_entry_->name_bytes_);
-}
-
-void NameTable::NameEntryBuilder::setName(const ByteVector& name_bytes) {
-  name_entry_->name_bytes_.clear();
-  std::copy(name_bytes.begin(), name_bytes.end(),
-            name_entry_->name_bytes_.begin());
-}
-
-void NameTable::NameEntryBuilder::setName(const ByteVector& name_bytes,
-    int32_t offset, int32_t length) {
-  name_entry_->name_bytes_.clear();
-  std::copy(name_bytes.begin() + offset, name_bytes.begin() + offset + length,
-            name_entry_->name_bytes_.begin());
-}
-
-CALLER_ATTACH NameTable::NameEntry* NameTable::NameEntryBuilder::entry() {
-  return name_entry_;
-}
-
-void NameTable::NameEntryBuilder::init(int32_t platform_id, int32_t encoding_id,
-    int32_t language_id, int32_t name_id, const ByteVector* name_bytes) {
-  name_entry_ = new NameEntry();
-  name_entry_->init(platform_id, encoding_id, language_id, name_id, name_bytes);
-}
-
-/******************************************************************************
- * NameTable::NameEntryFilterInPlace class (C++ port only)
- ******************************************************************************/
-NameTable::NameEntryFilterInPlace::NameEntryFilterInPlace(int32_t platform_id,
-    int32_t encoding_id, int32_t language_id, int32_t name_id)
-    : platform_id_(platform_id), encoding_id_(encoding_id),
-      language_id_(language_id), name_id_(name_id) {
-}
-
-bool NameTable::NameEntryFilterInPlace::accept(int32_t platform_id,
-    int32_t encoding_id, int32_t language_id, int32_t name_id) {
-  return (platform_id_ == platform_id && encoding_id_ == encoding_id &&
-          language_id_ == language_id && name_id_ == name_id);
-}
-
-/******************************************************************************
- * NameTable::NameEntryIterator class
- ******************************************************************************/
-void NameTable::NameEntryIterator::init(NameTable* table,
-                                        NameEntryFilter* filter) {
-  table_ = table;
-  filter_ = filter;
-  name_index_ = 0;
-}
-
-NameTable::NameEntryIterator::NameEntryIterator(NameTable* table) {
-  init(table, NULL);
-}
-
-NameTable::NameEntryIterator::NameEntryIterator(NameTable* table,
-                                                NameEntryFilter* filter) {
-  init(table, filter);
-}
-
-NameTable::NameEntryIterator::~NameEntryIterator() {
-}
-
-bool NameTable::NameEntryIterator::hasNext() {
-  if (!filter_) {
-    if (name_index_ < table_->nameCount()) {
-      return true;
-    }
-    return false;
-  }
-  for (; name_index_ < table_->nameCount(); ++name_index_) {
-    if (filter_->accept(table_->platformId(name_index_),
-                        table_->encodingId(name_index_),
-                        table_->languageId(name_index_),
-                        table_->nameId(name_index_))) {
-      return true;
-    }
-  }
-  return false;
-}
-
-CALLER_ATTACH NameTable::NameEntry* NameTable::NameEntryIterator::next() {
-  if (!hasNext())
-    return NULL;
-  return table_->nameEntry(name_index_++);
-}
-
-void NameTable::NameEntryIterator::remove() {
-#if !defined (SFNTLY_NO_EXCEPTION)
-  throw UnsupportedOperationException(
-            "Cannot remove a CMap table from an existing font.");
-#endif
-}
-
-/******************************************************************************
- * NameTable::Builder class
- ******************************************************************************/
-NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                            Header* header, WritableFontData* data) :
-    Table::ArrayElementTableBuilder(font_builder, header, data) {
-}
-
-NameTable::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                            Header* header, ReadableFontData* data) :
-    Table::ArrayElementTableBuilder(font_builder, header, data) {
-}
-
-void NameTable::Builder::initialize(ReadableFontData* data) {
-  if (data) {
-    NameTablePtr table = new NameTable(header(), data);
-    NameEntryIterator name_iter(table, NULL);
-    while (name_iter.hasNext()) {
-      NameEntryPtr name_entry = name_iter.next();
-      NameEntryBuilderPtr name_entry_builder = new NameEntryBuilder(name_entry);
-      NameEntry* builder_entry = name_entry_builder->entry();
-      NameEntryId probe = builder_entry->getNameEntryId();
-      name_entry_map_[probe] = name_entry_builder;
-    }
-  }
-}
-
-NameTable::NameEntryBuilderMap* NameTable::Builder::getNameBuilders() {
-  if (name_entry_map_.empty()) {
-    initialize(internalReadData());
-  }
-  setModelChanged();
-  return &name_entry_map_;
-}
-
-void NameTable::Builder::revertNames() {
-  name_entry_map_.clear();
-  setModelChanged(false);
-}
-
-int32_t NameTable::Builder::builderCount() {
-  getNameBuilders();  // ensure name_entry_map_ is built
-  return (int32_t)name_entry_map_.size();
-}
-
-bool NameTable::Builder::has(int32_t platform_id, int32_t encoding_id,
-                             int32_t language_id, int32_t name_id) {
-  NameEntryId probe(platform_id, encoding_id, language_id, name_id);
-  getNameBuilders();  // ensure name_entry_map_ is built
-  return (name_entry_map_.find(probe) != name_entry_map_.end());
-}
-
-CALLER_ATTACH NameTable::NameEntryBuilder* NameTable::Builder::nameBuilder(
-    int32_t platform_id, int32_t encoding_id, int32_t language_id,
-    int32_t name_id) {
-  NameEntryId probe(platform_id, encoding_id, language_id, name_id);
-  NameEntryBuilderMap builders;
-  getNameBuilders();  // ensure name_entry_map_ is built
-  if (name_entry_map_.find(probe) != name_entry_map_.end()) {
-    return name_entry_map_[probe];
-  }
-  NameEntryBuilderPtr builder = new NameEntryBuilder(probe);
-  name_entry_map_[probe] = builder;
-  return builder.detach();
-}
-
-bool NameTable::Builder::remove(int32_t platform_id, int32_t encoding_id,
-                                int32_t language_id, int32_t name_id) {
-  NameEntryId probe(platform_id, encoding_id, language_id, name_id);
-  getNameBuilders();  // ensure name_entry_map_ is built
-  NameEntryBuilderMap::iterator position = name_entry_map_.find(probe);
-  if (position != name_entry_map_.end()) {
-    name_entry_map_.erase(position);
-    return true;
-  }
-  return false;
-}
-
-CALLER_ATTACH FontDataTable* NameTable::Builder::subBuildTable(
-    ReadableFontData* data) {
-  FontDataTablePtr table = new NameTable(header(), data);
-  return table.detach();
-}
-
-void NameTable::Builder::subDataSet() {
-  name_entry_map_.clear();
-  setModelChanged(false);
-}
-
-int32_t NameTable::Builder::subDataSizeToSerialize() {
-  if (name_entry_map_.empty()) {
-    return 0;
-  }
-
-  int32_t size = NameTable::Offset::kNameRecordStart + name_entry_map_.size() *
-                 NameTable::Offset::kNameRecordSize;
-  for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
-                                     end = name_entry_map_.end();
-                                     b != end; ++b) {
-    NameEntryBuilderPtr p = b->second;
-    NameEntry* entry = p->entry();
-    size += entry->nameBytesLength();
-  }
-  return size;
-}
-
-bool NameTable::Builder::subReadyToSerialize() {
-  return !name_entry_map_.empty();
-}
-
-int32_t NameTable::Builder::subSerialize(WritableFontData* new_data) {
-  int32_t string_table_start_offset =
-      NameTable::Offset::kNameRecordStart + name_entry_map_.size() *
-      NameTable::Offset::kNameRecordSize;
-
-  // header
-  new_data->writeUShort(NameTable::Offset::kFormat, 0);
-  new_data->writeUShort(NameTable::Offset::kCount, name_entry_map_.size());
-  new_data->writeUShort(NameTable::Offset::kStringOffset,
-                        string_table_start_offset);
-  int32_t name_record_offset = NameTable::Offset::kNameRecordStart;
-  int32_t string_offset = 0;
-  // Note: we offered operator< in NameEntryId, which will be used by std::less,
-  //       and therefore our map will act like TreeMap in Java to provide
-  //       sorted key set.
-  for (NameEntryBuilderMap::iterator b = name_entry_map_.begin(),
-                                     end = name_entry_map_.end();
-                                     b != end; ++b) {
-    new_data->writeUShort(
-        name_record_offset + NameTable::Offset::kNameRecordPlatformId,
-        b->first.getPlatformId());
-    new_data->writeUShort(
-        name_record_offset + NameTable::Offset::kNameRecordEncodingId,
-        b->first.getEncodingId());
-    new_data->writeUShort(
-        name_record_offset + NameTable::Offset::kNameRecordLanguageId,
-        b->first.getLanguageId());
-    new_data->writeUShort(
-        name_record_offset + NameTable::Offset::kNameRecordNameId,
-        b->first.getNameId());
-    NameEntry* builder_entry = b->second->entry();
-    new_data->writeUShort(
-        name_record_offset + NameTable::Offset::kNameRecordStringLength,
-        builder_entry->nameBytesLength());
-    new_data->writeUShort(
-        name_record_offset + NameTable::Offset::kNameRecordStringOffset,
-        string_offset);
-    name_record_offset += NameTable::Offset::kNameRecordSize;
-    string_offset += new_data->writeBytes(
-        string_offset + string_table_start_offset,
-        builder_entry->nameAsBytes());
-  }
-
-  return string_offset + string_table_start_offset;
-}
-
 }  // namespace sfntly
diff --git a/sfntly/name_table.h b/sfntly/name_table.h
index 6d5df2b..d0dd345 100644
--- a/sfntly/name_table.h
+++ b/sfntly/name_table.h
@@ -34,6 +34,10 @@
 
 namespace sfntly {
 
+// The following code implements the name table defined in TTF/OTF spec, which
+// can be found at http://www.microsoft.com/typography/otspec/name.htm.
+
+// Name IDs defined in TTF/OTF spec.
 struct NameId {
   enum {
     kUnknown = -1,
@@ -63,6 +67,7 @@
   };
 };
 
+// Unicode language IDs used in Name Records.
 struct UnicodeLanguageId {
   enum {
     kUnknown = -1,
@@ -408,6 +413,266 @@
 };
 
 class NameTable : public Table, public RefCounted<NameTable> {
+ public:
+  // Unique identifier for a given name record.
+  class NameEntryId {
+   public:
+    NameEntryId();  // C++ port only, must provide default constructor.
+    NameEntryId(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+                int32_t name_id);
+    NameEntryId(const NameEntryId&);
+    // Make gcc -Wnon-virtual-dtor happy.
+    virtual ~NameEntryId() {}
+
+    int32_t platform_id() const { return platform_id_; }
+    int32_t encoding_id() const { return encoding_id_; }
+    int32_t language_id() const { return language_id_; }
+    int32_t name_id() const { return name_id_; }
+
+    const NameEntryId& operator=(const NameEntryId& rhs) const;
+    bool operator==(const NameEntryId& rhs) const;
+    bool operator<(const NameEntryId& rhs) const;
+
+   private:
+    mutable int32_t platform_id_;
+    mutable int32_t encoding_id_;
+    mutable int32_t language_id_;
+    mutable int32_t name_id_;
+  };
+
+  class NameEntryBuilder;
+
+  // Class to represent a name entry in the name table.
+  class NameEntry : public RefCounted<NameEntry> {
+   public:
+    NameEntry();
+    NameEntry(const NameEntryId& name_entry_id, const ByteVector& name_bytes);
+    NameEntry(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+              int32_t name_id, const ByteVector& name_bytes);
+    virtual ~NameEntry();
+
+    NameEntryId& name_entry_id() { return name_entry_id_; }
+    int32_t platform_id() const { return name_entry_id_.platform_id(); }
+    int32_t encoding_id() const { return name_entry_id_.encoding_id(); }
+    int32_t language_id() const { return name_entry_id_.language_id(); };
+    int32_t name_id() const { return name_entry_id_.name_id(); }
+
+    // Get the bytes for name.  Returned pointer is the address of private
+    // member of this class, do not attempt to delete.
+    ByteVector* NameAsBytes();
+
+    // C++ port only: get the length of NameAsBytes.
+    int32_t NameBytesLength();
+
+    // Returns the name in Unicode as UChar array.
+    // Note: ICU UChar* convention requires caller to delete[] it.
+    UChar* Name();
+    bool operator==(const NameEntry& rhs) const;
+
+   private:
+    void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+              int32_t name_id, const ByteVector* name_bytes);
+
+    NameEntryId name_entry_id_;
+    int32_t length_;
+    ByteVector name_bytes_;
+
+    friend class NameEntryBuilder;
+  };
+
+  // Builder of a name entry.
+  // C++ port: original Java hierarchy inherits from NameEntry.  In C++ port, we
+  // opted not doing so to avoid ref count issues and nasty protected members.
+  class NameEntryBuilder : public RefCounted<NameEntryBuilder> {
+   public:
+    NameEntryBuilder();
+    NameEntryBuilder(const NameEntryId& name_entry_id,
+                     const ByteVector& name_bytes);
+    explicit NameEntryBuilder(const NameEntryId& name_entry_id);
+    explicit NameEntryBuilder(NameEntry* entry);
+    virtual ~NameEntryBuilder();
+
+    virtual void SetName(const UChar* name);
+    virtual void SetName(const ByteVector& name_bytes);
+    virtual void SetName(const ByteVector& name_bytes, int32_t offset,
+                         int32_t length);
+
+    // C++ port only. CALLER_ATTACH is not added because the lifetime shall be
+    // controlled by this class, therefore the caller shall not increase the ref
+    // count.
+    NameEntry* name_entry() { return name_entry_; }
+
+   private:
+    void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+              int32_t name_id, const ByteVector* name_bytes);
+
+    Ptr<NameEntry> name_entry_;
+  };
+  typedef std::map<NameEntryId, Ptr<NameEntryBuilder> > NameEntryBuilderMap;
+
+  // An interface for a filter to use with the name entry iterator. This allows
+  // name entries to be iterated and only those acceptable to the filter will be
+  // returned.
+  class NameEntryFilter {
+   public:
+    virtual bool Accept(int32_t platform_id, int32_t encoding_id,
+                        int32_t language_id, int32_t name_id) = 0;
+    // Make gcc -Wnon-virtual-dtor happy.
+    virtual ~NameEntryFilter() {}
+  };
+
+  // C++ port only: an in-place filter to mimic Java Iterator's filtering.
+  class NameEntryFilterInPlace : public NameEntryFilter {
+   public:
+    NameEntryFilterInPlace(int32_t platform_id, int32_t encoding_id,
+                           int32_t language_id, int32_t name_id);
+    // Make gcc -Wnon-virtual-dtor happy.
+    virtual ~NameEntryFilterInPlace() {}
+
+    virtual bool Accept(int32_t platform_id, int32_t encoding_id,
+                        int32_t language_id, int32_t name_id);
+
+   private:
+    int32_t platform_id_;
+    int32_t encoding_id_;
+    int32_t language_id_;
+    int32_t name_id_;
+  };
+
+  // Mimic Java's iterator to iterate through the entries within the name table.
+  class NameEntryIterator {
+   public:
+    // If filter is NULL, filter through all tables.
+    explicit NameEntryIterator(NameTable* table);
+    NameEntryIterator(NameTable* table, NameEntryFilter* filter);
+    // Make gcc -Wnon-virtual-dtor happy.
+    virtual ~NameEntryIterator() {}
+
+    virtual bool HasNext();
+    virtual CALLER_ATTACH NameEntry* Next();
+    virtual void Remove();
+
+   private:
+    void Init(NameTable* table, NameEntryFilter* filter);
+
+    NameTable* table_;  // Use dumb pointer since it's a composition object.
+    int32_t name_index_;
+    NameEntryFilter* filter_;
+  };
+
+  // The builder to construct name table for outputting.
+  class Builder : public Table::ArrayElementTableBuilder,
+                  public RefCounted<Builder> {
+   public:
+    // Constructor scope altered to public because C++ does not allow base
+    // class to instantiate derived class with protected constructors.
+    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+            WritableFontData* data);
+    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+            ReadableFontData* data);
+
+    // Revert the name builders for the name table to the last version that came
+    // from data.
+    void RevertNames();
+
+    // Number of name entry builders contained.
+    int32_t BuilderCount();
+
+    // Note: For C++ port, clear() is not implemented.  The clear() function
+    //       implies completely remove name entry builders, which is easy in
+    //       Java but will take a lot of efforts in C++ to release the builders
+    //       nicely and correctly.
+    // TODO(arthurhsu): IMPLEMENT
+    // Clear the name builders for the name table.
+    // void clear();
+
+    // Check the existance of a name entry builder by key.
+    bool Has(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+             int32_t name_id);
+
+    // Get name entry builder by key.
+    CALLER_ATTACH NameEntryBuilder* NameBuilder(int32_t platform_id,
+        int32_t encoding_id, int32_t language_id, int32_t name_id);
+
+    // Remove name entry builder by key.
+    bool Remove(int32_t platform_id, int32_t encoding_id, int32_t language_id,
+                int32_t name_id);
+
+    // FontDataTable::Builder API implementation
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+    virtual void SubDataSet();
+    virtual int32_t SubDataSizeToSerialize();
+    virtual bool SubReadyToSerialize();
+    virtual int32_t SubSerialize(WritableFontData* new_data);
+
+   private:
+    void Initialize(ReadableFontData* data);
+    NameEntryBuilderMap* GetNameBuilders();
+
+    // Note: callers should use the getter funtion provided above to ensure that
+    // this is lazily initialized instead of accessing directly.
+    NameEntryBuilderMap name_entry_map_;
+  };
+
+  /****************************************************************************
+   * public methods of NameTable class
+   ****************************************************************************/
+  virtual ~NameTable();
+
+  // Get the format used in the name table.
+  virtual int32_t Format();
+
+  // Get the number of names in the name table.
+  virtual int32_t NameCount();
+
+  // Get the platform id for the given name record.
+  virtual int32_t PlatformId(int32_t index);
+
+  // Get the encoding id for the given name record.
+  // see MacintoshEncodingId, WindowsEncodingId, UnicodeEncodingId
+  virtual int32_t EncodingId(int32_t index);
+
+  // Get the language id for the given name record.
+  virtual int32_t LanguageId(int32_t index);
+
+  // Get the name id for given name record.
+  virtual int32_t NameId(int32_t index);
+
+  // Get the name as bytes for the specified name. If there is no entry for the
+  // requested name, then empty vector is returned.
+  virtual void NameAsBytes(int32_t index, ByteVector* b);
+  virtual void NameAsBytes(int32_t platform_id, int32_t encoding_id,
+                           int32_t language_id, int32_t name_id,
+                           ByteVector* b);
+
+  // Get the name as a UChar* for the given name record. If there is no
+  // encoding conversion available for the name record then a best attempt
+  // UChar* will be returned.
+  // Note: ICU UChar* convention requires caller to delete[] it.
+  virtual UChar* Name(int index);
+
+  // Get the name as a UChar* for the specified name. If there is no entry for
+  // the requested name then NULL is returned. If there is no encoding
+  // conversion available for the name then a best attempt UChar* will be
+  // returned.
+  // Note: ICU UChar* convention requires caller to delete[] it.
+  virtual UChar* Name(int32_t platform_id, int32_t encoding_id,
+                      int32_t language_id, int32_t name_id);
+
+  // Note: These functions are renamed in C++ port.  Their original Java name is
+  // nameEntry().
+  virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t index);
+  virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t platform_id,
+      int32_t encoding_id, int32_t language_id, int32_t name_id);
+
+  // Note: Not implemented in C++ port due to complexity and low usage.
+  // virtual void names(std::set<NameEntryPtr>*);
+
+  // Get the iterator to iterate through all name entries.
+  // Note: Caller delete the returned object.
+  virtual NameEntryIterator* Iterator();
+  virtual NameEntryIterator* Iterator(NameEntryFilter* filter);
+
  private:
   struct Offset {
     enum {
@@ -416,7 +681,7 @@
       kStringOffset = 4,
       kNameRecordStart = 6,
 
-      // format 1 - offset from the end of the name records
+      // Format 1 - offset from the end of the name records
       kLangTagCount = 0,
       kLangTagRecord = 2,
 
@@ -431,254 +696,36 @@
     };
   };
 
+  // The table shall be constructed using Builder, no direct instantiation.
   NameTable(Header* header, ReadableFontData* data);
 
- public:
-  virtual ~NameTable();
-  virtual int32_t format();
-
-  // Get the number of names in the name table.
-  virtual int32_t nameCount();
-
- private:
   // Get the offset to the string data in the name table.
-  int32_t stringOffset();
+  int32_t StringOffset();
 
   // Get the offset for the given name record.
-  int32_t offsetForNameRecord(int32_t index);
+  int32_t OffsetForNameRecord(int32_t index);
 
- public:
-  // Get the platform id for the given name record.
-  virtual int32_t platformId(int32_t index);
-
-  // Get the encoding id for the given name record.
-  // see MacintoshEncodingId, WindowsEncodingId, UnicodeEncodingId
-  virtual int32_t encodingId(int32_t index);
-
-  // Get the language id for the given name record.
-  virtual int32_t languageId(int32_t index);
-
-  // Get the name id for given name record.
-  virtual int32_t nameId(int32_t index);
-
- private:
   // Get the length of the string data for the given name record.
-  int32_t nameLength(int32_t index);
+  int32_t NameLength(int32_t index);
 
   // Get the offset of the string data for the given name record.
-  int32_t nameOffset(int32_t index);
+  int32_t NameOffset(int32_t index);
 
- public:
-  // Get the name as bytes for the specified name. If there is no entry for the
-  // requested name, then empty vector is returned.
-  virtual void nameAsBytes(int32_t index, ByteVector* b);
-  virtual void nameAsBytes(int32_t platform_id, int32_t encoding_id,
-                           int32_t language_id, int32_t name_id,
-                           ByteVector* b);
+  // Note: string literals are returned.  Caller shall not attempt to manipulate
+  // the returned pointer.
+  static const char* GetEncodingName(int32_t platform_id, int32_t encoding_id);
 
-  // Get the name as a UChar* for the given name record. If there is no
-  // encoding conversion available for the name record then a best attempt
-  // UChar* will be returned.
-  // Note: ICU UChar* convention requires caller to delete[] it.
-  virtual UChar* name(int index);
+  // Note: ICU UConverter* convention requires caller to ucnv_close() it.
+  static UConverter* GetCharset(int32_t platform_id, int32_t encoding_id);
 
-  // Get the name as a UChar* for the specified name. If there is no entry for
-  // the requested name then NULL is returned. If there is no encoding
-  // conversion available for the name then a best attempt UChar* will be
-  // returned.
-  // Note: ICU UChar* convention requires caller to delete[] it.
-  virtual UChar* name(int32_t platform_id, int32_t encoding_id,
-                      int32_t language_id, int32_t name_id);
-
-  class NameEntry;
-  virtual CALLER_ATTACH NameEntry* nameEntry(int32_t index);
-  virtual CALLER_ATTACH NameEntry* nameEntry(int32_t platform_id,
-      int32_t encoding_id, int32_t language_id, int32_t name_id);
-
-  // Note: Not implemented in C++ port due to complexity and low usage.
-  // virtual void names(std::set<NameEntryPtr>*);
-
-  class NameEntryId {
-   protected:
-    mutable int32_t platform_id_;
-    mutable int32_t encoding_id_;
-    mutable int32_t language_id_;
-    mutable int32_t name_id_;
-
-   public:
-    NameEntryId();  // C++ port only, must provide default constructor.
-    NameEntryId(int32_t platform_id, int32_t encoding_id, int32_t language_id,
-                int32_t name_id);
-    NameEntryId(const NameEntryId&);
-    virtual ~NameEntryId();
-    virtual int32_t getPlatformId() const;
-    virtual int32_t getEncodingId() const;
-    virtual int32_t getLanguageId() const;
-    virtual int32_t getNameId() const;
-    virtual const NameEntryId& operator=(const NameEntryId& rhs) const;
-    virtual bool operator==(const NameEntryId& rhs) const;
-    virtual bool operator<(const NameEntryId& rhs) const;
-  };
-
-  // Class to represent a name entry in the name table.
-  class NameEntryBuilder;
-  class NameEntry : public RefCounted<NameEntry> {
-   public:
-    NameEntry();
-    NameEntry(const NameEntryId& name_entry_id, const ByteVector& name_bytes);
-    NameEntry(int32_t platform_id, int32_t encoding_id, int32_t language_id,
-              int32_t name_id, const ByteVector& name_bytes);
-    virtual ~NameEntry();
-    virtual NameEntryId& getNameEntryId();
-    virtual int32_t platformId();
-    virtual int32_t encodingId();
-    virtual int32_t languageId();
-    virtual int32_t nameId();
-    virtual int32_t nameBytesLength();  // C++ port only
-    virtual ByteVector* nameAsBytes();
-    virtual UChar* name();
-    virtual bool operator==(const NameEntry& rhs) const;
-
-   private:
-    void init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
-              int32_t name_id, const ByteVector* name_bytes);
-
-    NameEntryId name_entry_id_;
-    int32_t length_;
-    ByteVector name_bytes_;
-
-    friend class NameEntryBuilder;
-  };
-
-  // C++ port: we don't use original Java hierarchy to avoid ref count issues
-  // and nasty protected members.
-  class NameEntryBuilder : public RefCounted<NameEntryBuilder> {
-   public:
-    NameEntryBuilder();
-    NameEntryBuilder(const NameEntryId& name_entry_id,
-                     const ByteVector& name_bytes);
-    explicit NameEntryBuilder(const NameEntryId& name_entry_id);
-    explicit NameEntryBuilder(NameEntry* entry);
-    virtual ~NameEntryBuilder();
-
-    virtual void setName(const UChar* name);
-    virtual void setName(const ByteVector& name_bytes);
-    virtual void setName(const ByteVector& name_bytes, int32_t offset,
-                         int32_t length);
-
-    // C++ port only member functions. CALLER_ATTACH is not added because the
-    // lifetime shall be controlled by build, therefore the caller shall not
-    // increase the ref count.
-    NameEntry* entry();
-
-  private:
-    void init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
-              int32_t name_id, const ByteVector* name_bytes);
-
-    Ptr<NameEntry> name_entry_;
-  };
-
-  class NameEntryFilter {
-   public:
-    virtual bool accept(int32_t platform_id, int32_t encoding_id,
-                        int32_t language_id, int32_t name_id) = 0;
-    // Make gcc -Wnon-virtual-dtor happy.
-    virtual ~NameEntryFilter() {}
-  };
-
-  // C++ port only
-  class NameEntryFilterInPlace : public NameEntryFilter {
-   public:
-    NameEntryFilterInPlace(int32_t platform_id, int32_t encoding_id,
-                           int32_t language_id, int32_t name_id);
-    // Make gcc -Wnon-virtual-dtor happy.
-    virtual ~NameEntryFilterInPlace() {}
-    virtual bool accept(int32_t platform_id, int32_t encoding_id,
-                        int32_t language_id, int32_t name_id);
-
-   private:
-    int32_t platform_id_;
-    int32_t encoding_id_;
-    int32_t language_id_;
-    int32_t name_id_;
-  };
-
-  class NameEntryIterator {
-   public:
-    // If filter is NULL, filter through all tables.
-    explicit NameEntryIterator(NameTable* table);
-    NameEntryIterator(NameTable* table, NameEntryFilter* filter);
-    // Make gcc -Wnon-virtual-dtor happy.
-    virtual ~NameEntryIterator();
-    virtual bool hasNext();
-    virtual CALLER_ATTACH NameEntry* next();
-    virtual void remove();
-
-   private:
-    void init(NameTable* table, NameEntryFilter* filter);
-
-    NameTable* table_;  // use dumb pointer since it's a composition object
-    int32_t name_index_;
-    NameEntryFilter* filter_;
-  };
-
-  // caller delete the object
-  virtual NameEntryIterator* iterator();
-  virtual NameEntryIterator* iterator(NameEntryFilter* filter);
-
- private:
-  static const char* getEncodingName(int32_t platform_id, int32_t encoding_id);
-  static UConverter* getCharset(int32_t platform_id, int32_t encoding_id);
-  static void convertToNameBytes(const UChar* name, int32_t platform_id,
+  // Note: Output will be stored in ByteVector* b.  Original data in b will be
+  // erased and replaced with converted name bytes.
+  static void ConvertToNameBytes(const UChar* name, int32_t platform_id,
                                  int32_t encoding_id, ByteVector* b);
-  static UChar* convertFromNameBytes(ByteVector* name_bytes,
+
+  // Note: ICU UChar* convention requires caller to delete[] it.
+  static UChar* ConvertFromNameBytes(ByteVector* name_bytes,
                                      int32_t platform_id, int32_t encoding_id);
-
- public:
-  typedef std::map<NameEntryId, Ptr<NameEntryBuilder> > NameEntryBuilderMap;
-
-  class Builder : public Table::ArrayElementTableBuilder,
-                  public RefCounted<Builder> {
-   public:
-    // Constructor scope altered to public because C++ does not allow base
-    // class to instantiate derived class with protected constructors.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            ReadableFontData* data);
-
-   private:
-    void initialize(ReadableFontData* data);
-    NameEntryBuilderMap* getNameBuilders();
-
-   public:  // static class in Java, functions are not virtual unless inherited
-    void revertNames();
-    int32_t builderCount();
-
-    // Note: For C++ port, this is not implemented so far.  The clear() function
-    //       implies completely remove name entry builders, which is easy in
-    //       Java but will take a lot of efforts in C++ to release the builders
-    //       nicely and correctly.
-    // TODO(arthurhsu): IMPLEMENT
-    // Clear the name builders for the name table.
-    // void clear();
-
-    bool has(int32_t platform_id, int32_t encoding_id, int32_t language_id,
-             int32_t name_id);
-    CALLER_ATTACH NameEntryBuilder* nameBuilder(int32_t platform_id,
-        int32_t encoding_id, int32_t language_id, int32_t name_id);
-    bool remove(int32_t platform_id, int32_t encoding_id, int32_t language_id,
-                int32_t name_id);
-
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-    virtual void subDataSet();
-    virtual int32_t subDataSizeToSerialize();
-    virtual bool subReadyToSerialize();
-    virtual int32_t subSerialize(WritableFontData* new_data);
-
-   private:
-    NameEntryBuilderMap name_entry_map_;
-  };
 };  // class NameTable
 typedef Ptr<NameTable> NameTablePtr;
 typedef Ptr<NameTable::NameEntry> NameEntryPtr;
diff --git a/sfntly/os2_table.cc b/sfntly/os2_table.cc
index 4e7189d..6d6d338 100644
--- a/sfntly/os2_table.cc
+++ b/sfntly/os2_table.cc
@@ -98,163 +98,164 @@
 /******************************************************************************
  * class OS2Table
  ******************************************************************************/
-OS2Table::OS2Table(Header* header, ReadableFontData* data)
-    : Table(header, data) {
-}
-
 OS2Table::~OS2Table() {}
 
-int32_t OS2Table::version() {
-  return data_->readUShort(Offset::kVersion);
+int32_t OS2Table::Version() {
+  return data_->ReadUShort(Offset::kVersion);
 }
 
-int32_t OS2Table::xAvgCharWidth() {
-  return data_->readShort(Offset::kXAvgCharWidth);
+int32_t OS2Table::XAvgCharWidth() {
+  return data_->ReadShort(Offset::kXAvgCharWidth);
 }
 
-int32_t OS2Table::usWeightClass() {
-  return data_->readUShort(Offset::kUsWeightClass);
+int32_t OS2Table::UsWeightClass() {
+  return data_->ReadUShort(Offset::kUsWeightClass);
 }
 
-int32_t OS2Table::usWidthClass() {
-  return data_->readUShort(Offset::kUsWidthClass);
+int32_t OS2Table::UsWidthClass() {
+  return data_->ReadUShort(Offset::kUsWidthClass);
 }
 
-int32_t OS2Table::fsType() {
-  return data_->readUShort(Offset::kFsType);
+int32_t OS2Table::FsType() {
+  return data_->ReadUShort(Offset::kFsType);
 }
 
-int32_t OS2Table::ySubscriptXSize() {
-  return data_->readShort(Offset::kYSubscriptXSize);
+int32_t OS2Table::YSubscriptXSize() {
+  return data_->ReadShort(Offset::kYSubscriptXSize);
 }
 
-int32_t OS2Table::ySubscriptYSize() {
-  return data_->readShort(Offset::kYSubscriptYSize);
+int32_t OS2Table::YSubscriptYSize() {
+  return data_->ReadShort(Offset::kYSubscriptYSize);
 }
 
-int32_t OS2Table::ySubscriptXOffset() {
-  return data_->readShort(Offset::kYSubscriptXOffset);
+int32_t OS2Table::YSubscriptXOffset() {
+  return data_->ReadShort(Offset::kYSubscriptXOffset);
 }
 
-int32_t OS2Table::ySubscriptYOffset() {
-  return data_->readShort(Offset::kYSubscriptYOffset);
+int32_t OS2Table::YSubscriptYOffset() {
+  return data_->ReadShort(Offset::kYSubscriptYOffset);
 }
 
-int32_t OS2Table::ySuperscriptXSize() {
-  return data_->readShort(Offset::kYSuperscriptXSize);
+int32_t OS2Table::YSuperscriptXSize() {
+  return data_->ReadShort(Offset::kYSuperscriptXSize);
 }
 
-int32_t OS2Table::ySuperscriptYSize() {
-  return data_->readShort(Offset::kYSuperscriptYSize);
+int32_t OS2Table::YSuperscriptYSize() {
+  return data_->ReadShort(Offset::kYSuperscriptYSize);
 }
 
-int32_t OS2Table::ySuperscriptXOffset() {
-  return data_->readShort(Offset::kYSuperscriptXOffset);
+int32_t OS2Table::YSuperscriptXOffset() {
+  return data_->ReadShort(Offset::kYSuperscriptXOffset);
 }
 
-int32_t OS2Table::ySuperscriptYOffset() {
-  return data_->readShort(Offset::kYSuperscriptYOffset);
+int32_t OS2Table::YSuperscriptYOffset() {
+  return data_->ReadShort(Offset::kYSuperscriptYOffset);
 }
 
-int32_t OS2Table::yStrikeoutSize() {
-  return data_->readShort(Offset::kYStrikeoutSize);
+int32_t OS2Table::YStrikeoutSize() {
+  return data_->ReadShort(Offset::kYStrikeoutSize);
 }
 
-int32_t OS2Table::yStrikeoutPosition() {
-  return data_->readShort(Offset::kYStrikeoutPosition);
+int32_t OS2Table::YStrikeoutPosition() {
+  return data_->ReadShort(Offset::kYStrikeoutPosition);
 }
 
-int32_t OS2Table::sFamilyClass() {
-  return data_->readShort(Offset::kSFamilyClass);
+int32_t OS2Table::SFamilyClass() {
+  return data_->ReadShort(Offset::kSFamilyClass);
 }
 
-void OS2Table::panose(ByteVector* value) {
+void OS2Table::Panose(ByteVector* value) {
   value->clear();
   value->resize(10);
-  data_->readBytes(Offset::kPanose, value, 0, 10);
+  data_->ReadBytes(Offset::kPanose, value, 0, 10);
 }
 
-int64_t OS2Table::ulUnicodeRange1() {
-  return data_->readULong(Offset::kUlUnicodeRange1);
+int64_t OS2Table::UlUnicodeRange1() {
+  return data_->ReadULong(Offset::kUlUnicodeRange1);
 }
 
-int64_t OS2Table::ulUnicodeRange2() {
-  return data_->readULong(Offset::kUlUnicodeRange2);
+int64_t OS2Table::UlUnicodeRange2() {
+  return data_->ReadULong(Offset::kUlUnicodeRange2);
 }
 
-int64_t OS2Table::ulUnicodeRange3() {
-  return data_->readULong(Offset::kUlUnicodeRange3);
+int64_t OS2Table::UlUnicodeRange3() {
+  return data_->ReadULong(Offset::kUlUnicodeRange3);
 }
 
-int64_t OS2Table::ulUnicodeRange4() {
-  return data_->readULong(Offset::kUlUnicodeRange4);
+int64_t OS2Table::UlUnicodeRange4() {
+  return data_->ReadULong(Offset::kUlUnicodeRange4);
 }
 
-void OS2Table::achVendId(ByteVector* b) {
+void OS2Table::AchVendId(ByteVector* b) {
   b->clear();
   b->resize(4);
-  data_->readBytes(Offset::kAchVendId, b, 0, 4);
+  data_->ReadBytes(Offset::kAchVendId, b, 0, 4);
 }
 
-int32_t OS2Table::fsSelection() {
-  return data_->readUShort(Offset::kFsSelection);
+int32_t OS2Table::FsSelection() {
+  return data_->ReadUShort(Offset::kFsSelection);
 }
 
-int32_t OS2Table::usFirstCharIndex() {
-  return data_->readUShort(Offset::kUsFirstCharIndex);
+int32_t OS2Table::UsFirstCharIndex() {
+  return data_->ReadUShort(Offset::kUsFirstCharIndex);
 }
 
-int32_t OS2Table::usLastCharIndex() {
-  return data_->readUShort(Offset::kUsLastCharIndex);
+int32_t OS2Table::UsLastCharIndex() {
+  return data_->ReadUShort(Offset::kUsLastCharIndex);
 }
 
-int32_t OS2Table::sTypoAscender() {
-  return data_->readShort(Offset::kSTypoAscender);
+int32_t OS2Table::STypoAscender() {
+  return data_->ReadShort(Offset::kSTypoAscender);
 }
 
-int32_t OS2Table::sTypoDecender() {
-  return data_->readShort(Offset::kSTypoDescender);
+int32_t OS2Table::STypoDecender() {
+  return data_->ReadShort(Offset::kSTypoDescender);
 }
 
-int32_t OS2Table::sTypoLineGap() {
-  return data_->readShort(Offset::kSTypoLineGap);
+int32_t OS2Table::STypoLineGap() {
+  return data_->ReadShort(Offset::kSTypoLineGap);
 }
 
-int32_t OS2Table::usWinAscent() {
-  return data_->readUShort(Offset::kUsWinAscent);
+int32_t OS2Table::UsWinAscent() {
+  return data_->ReadUShort(Offset::kUsWinAscent);
 }
 
-int32_t OS2Table::usWinDescent() {
-  return data_->readUShort(Offset::kUsWinDescent);
+int32_t OS2Table::UsWinDescent() {
+  return data_->ReadUShort(Offset::kUsWinDescent);
 }
 
-int64_t OS2Table::ulCodePageRange1() {
-  return data_->readULong(Offset::kUlCodePageRange1);
+int64_t OS2Table::UlCodePageRange1() {
+  return data_->ReadULong(Offset::kUlCodePageRange1);
 }
 
-int64_t OS2Table::ulCodePageRange2() {
-  return data_->readULong(Offset::kUlCodePageRange2);
+int64_t OS2Table::UlCodePageRange2() {
+  return data_->ReadULong(Offset::kUlCodePageRange2);
 }
 
-int64_t OS2Table::ulCodePageRange() {
-  return ((0xffffffff & ulCodePageRange2()) << 32) |
-         (0xffffffff & ulCodePageRange1());
+int64_t OS2Table::UlCodePageRange() {
+  // TODO(arthurhsu): Possible bug point, check with stuartg.
+  return ((0xffffffff & UlCodePageRange2()) << 32) |
+         (0xffffffff & UlCodePageRange1());
 }
 
-int32_t OS2Table::sxHeight() {
-  return data_->readShort(Offset::kSxHeight);
+int32_t OS2Table::SxHeight() {
+  return data_->ReadShort(Offset::kSxHeight);
 }
 
-int32_t OS2Table::usDefaultChar() {
-  return data_->readUShort(Offset::kUsDefaultChar);
+int32_t OS2Table::UsDefaultChar() {
+  return data_->ReadUShort(Offset::kUsDefaultChar);
 }
 
-int32_t OS2Table::usBreakChar() {
-  return data_->readUShort(Offset::kUsBreakChar);
+int32_t OS2Table::UsBreakChar() {
+  return data_->ReadUShort(Offset::kUsBreakChar);
 }
 
-int32_t OS2Table::usMaxContext() {
-  return data_->readUShort(Offset::kUsMaxContext);
+int32_t OS2Table::UsMaxContext() {
+  return data_->ReadUShort(Offset::kUsMaxContext);
+}
+
+OS2Table::OS2Table(Header* header, ReadableFontData* data)
+    : Table(header, data) {
 }
 
 /******************************************************************************
@@ -267,10 +268,10 @@
 
 OS2Table::Builder::~Builder() {}
 
-CALLER_ATTACH FontDataTable* OS2Table::Builder::subBuildTable(
+CALLER_ATTACH FontDataTable* OS2Table::Builder::SubBuildTable(
     ReadableFontData* data) {
   FontDataTablePtr table = new OS2Table(header(), data);
-  return table.detach();
+  return table.Detach();
 }
 
 }  // namespace sfntly
diff --git a/sfntly/os2_table.h b/sfntly/os2_table.h
index 9bf33c2..058435a 100644
--- a/sfntly/os2_table.h
+++ b/sfntly/os2_table.h
@@ -300,6 +300,61 @@
 };
 
 class OS2Table : public Table, public RefCounted<OS2Table> {
+ public:
+  class Builder : public Table::TableBasedTableBuilder,
+                  public RefCounted<Builder> {
+   public:
+    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+            WritableFontData* data);
+    virtual ~Builder();
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
+  };
+
+  ~OS2Table();
+
+  int32_t Version();
+  int32_t XAvgCharWidth();
+  int32_t UsWeightClass();
+  int32_t UsWidthClass();
+  // UNIMPLEMENTED: public EnumSet<EmbeddingFlags> fsType()
+  int32_t FsType();
+  int32_t YSubscriptXSize();
+  int32_t YSubscriptYSize();
+  int32_t YSubscriptXOffset();
+  int32_t YSubscriptYOffset();
+  int32_t YSuperscriptXSize();
+  int32_t YSuperscriptYSize();
+  int32_t YSuperscriptXOffset();
+  int32_t YSuperscriptYOffset();
+  int32_t YStrikeoutSize();
+  int32_t YStrikeoutPosition();
+  int32_t SFamilyClass();
+  void Panose(ByteVector* value);
+  int64_t UlUnicodeRange1();
+  int64_t UlUnicodeRange2();
+  int64_t UlUnicodeRange3();
+  int64_t UlUnicodeRange4();
+  // UNIMPLEMENTED: public EnumSet<UnicodeRange> UlUnicodeRange()
+  void AchVendId(ByteVector* b);
+  // UNIMPLEMENTED: public EnumSet<FsSelection> fsSelection()
+  int32_t FsSelection();
+  int32_t UsFirstCharIndex();
+  int32_t UsLastCharIndex();
+  int32_t STypoAscender();
+  int32_t STypoDecender();
+  int32_t STypoLineGap();
+  int32_t UsWinAscent();
+  int32_t UsWinDescent();
+  int64_t UlCodePageRange1();
+  int64_t UlCodePageRange2();
+  // UNIMPLEMENTED: public EnumSet<CodePageRange> ulCodePageRange()
+  int64_t UlCodePageRange();
+  int32_t SxHeight();
+  int32_t SCapHeight();
+  int32_t UsDefaultChar();
+  int32_t UsBreakChar();
+  int32_t UsMaxContext();
+
  private:
   struct Offset {
     enum {
@@ -344,62 +399,6 @@
   };
 
   OS2Table(Header* header, ReadableFontData* data);
-
- public:
-  ~OS2Table();
-
-  int32_t version();
-  int32_t xAvgCharWidth();
-  int32_t usWeightClass();
-  int32_t usWidthClass();
-  // UNIMPLEMENTED: public EnumSet<EmbeddingFlags> fsType()
-  int32_t fsType();
-  int32_t ySubscriptXSize();
-  int32_t ySubscriptYSize();
-  int32_t ySubscriptXOffset();
-  int32_t ySubscriptYOffset();
-  int32_t ySuperscriptXSize();
-  int32_t ySuperscriptYSize();
-  int32_t ySuperscriptXOffset();
-  int32_t ySuperscriptYOffset();
-  int32_t yStrikeoutSize();
-  int32_t yStrikeoutPosition();
-  int32_t sFamilyClass();
-  void panose(ByteVector* value);
-  int64_t ulUnicodeRange1();
-  int64_t ulUnicodeRange2();
-  int64_t ulUnicodeRange3();
-  int64_t ulUnicodeRange4();
-  // UNIMPLEMENTED: public EnumSet<UnicodeRange> ulUnicodeRange()
-  void achVendId(ByteVector* b);
-  // UNIMPLEMENTED: public EnumSet<FsSelection> fsSelection()
-  int32_t fsSelection();
-  int32_t usFirstCharIndex();
-  int32_t usLastCharIndex();
-  int32_t sTypoAscender();
-  int32_t sTypoDecender();
-  int32_t sTypoLineGap();
-  int32_t usWinAscent();
-  int32_t usWinDescent();
-  int64_t ulCodePageRange1();
-  int64_t ulCodePageRange2();
-  // UNIMPLEMENTED: public EnumSet<CodePageRange> ulCodePageRange()
-  int64_t ulCodePageRange();
-  int32_t sxHeight();
-  int32_t sCapHeight();
-  int32_t usDefaultChar();
-  int32_t usBreakChar();
-  int32_t usMaxContext();
-
- public:
-  class Builder : public Table::TableBasedTableBuilder,
-                  public RefCounted<Builder> {
-   public:
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
-            WritableFontData* data);
-    virtual ~Builder();
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
-  };
 };
 
 }  // namespace sfntly
diff --git a/sfntly/port/atomic.h b/sfntly/port/atomic.h
index 4c2d65b..abfc429 100644
--- a/sfntly/port/atomic.h
+++ b/sfntly/port/atomic.h
@@ -21,7 +21,7 @@
 
 #include <windows.h>
 
-static inline size_t atomicIncrement(size_t* address) {
+static inline size_t AtomicIncrement(size_t* address) {
 #if defined (_WIN64)
   return InterlockedIncrement64(reinterpret_cast<LONGLONG*>(address));
 #else
@@ -29,7 +29,7 @@
 #endif
 }
 
-static inline size_t atomicDecrement(size_t* address) {
+static inline size_t AtomicDecrement(size_t* address) {
 #if defined (_WIN64)
   return InterlockedDecrement64(reinterpret_cast<LONGLONG*>(address));
 #else
@@ -41,11 +41,11 @@
 
 #include <libkern/OSAtomic.h>
 
-static inline size_t atomicIncrement(size_t* address) {
+static inline size_t AtomicIncrement(size_t* address) {
   return OSAtomicIncrement32Barrier(reinterpret_cast<int32_t*>(address));
 }
 
-static inline size_t atomicDecrement(size_t* address) {
+static inline size_t AtomicDecrement(size_t* address) {
   return OSAtomicDecrement32Barrier(reinterpret_cast<int32_t*>(address));
 }
 
@@ -58,11 +58,11 @@
 
 #include <stddef.h>
 
-static inline size_t atomicIncrement(size_t* address) {
+static inline size_t AtomicIncrement(size_t* address) {
   return __sync_add_and_fetch(address, 1);
 }
 
-static inline size_t atomicDecrement(size_t* address) {
+static inline size_t AtomicDecrement(size_t* address) {
   return __sync_sub_and_fetch(address, 1);
 }
 
diff --git a/sfntly/port/endian.h b/sfntly/port/endian.h
index c6898ee..1364e42 100644
--- a/sfntly/port/endian.h
+++ b/sfntly/port/endian.h
@@ -22,18 +22,18 @@
 
 namespace sfntly {
 
-static inline uint16_t endian_swap16(uint16_t value) {
+static inline uint16_t EndianSwap16(uint16_t value) {
   return (uint16_t)((value >> 8) | (value << 8));
 }
 
-static inline int32_t endian_swap32(int32_t value) {
+static inline int32_t EndianSwap32(int32_t value) {
   return (((value & 0x000000ff) << 24) |
           ((value & 0x0000ff00) <<  8) |
           ((value & 0x00ff0000) >>  8) |
           ((value & 0xff000000) >> 24));
 }
 
-static inline uint64_t endian_swap64(uint64_t value) {
+static inline uint64_t EndianSwap64(uint64_t value) {
   return (((value & 0x00000000000000ffLL) << 56) |
           ((value & 0x000000000000ff00LL) << 40) |
           ((value & 0x0000000000ff0000LL) << 24) |
@@ -45,31 +45,31 @@
 }
 
 #ifdef SFNTLY_LITTLE_ENDIAN
-  #define toBE16(n) endian_swap16(n)
-  #define toBE32(n) endian_swap32(n)
-  #define toBE64(n) endian_swap64(n)
-  #define toLE16(n) (n)
-  #define toLE32(n) (n)
-  #define toLE64(n) (n)
-  #define fromBE16(n) endian_swap16(n)
-  #define fromBE32(n) endian_swap32(n)
-  #define fromBE64(n) endian_swap64(n)
-  #define fromLE16(n) (n)
-  #define fromLE32(n) (n)
-  #define fromLE64(n) (n)
+  #define ToBE16(n) EndianSwap16(n)
+  #define ToBE32(n) EndianSwap32(n)
+  #define ToBE64(n) EndianSwap64(n)
+  #define ToLE16(n) (n)
+  #define ToLE32(n) (n)
+  #define ToLE64(n) (n)
+  #define FromBE16(n) EndianSwap16(n)
+  #define FromBE32(n) EndianSwap32(n)
+  #define FromBE64(n) EndianSwap64(n)
+  #define FromLE16(n) (n)
+  #define FromLE32(n) (n)
+  #define FromLE64(n) (n)
 #else  // SFNTLY_BIG_ENDIAN
-  #define toBE16(n) (n)
-  #define toBE32(n) (n)
-  #define toBE64(n) (n)
-  #define toLE16(n) endian_swap16(n)
-  #define toLE32(n) endian_swap32(n)
-  #define toLE64(n) endian_swap64(n)
-  #define fromBE16(n) (n)
-  #define fromBE32(n) (n)
-  #define fromBE64(n) (n)
-  #define fromLE16(n) endian_swap16(n)
-  #define fromLE32(n) endian_swap32(n)
-  #define fromLE64(n) endian_swap64(n)
+  #define ToBE16(n) (n)
+  #define ToBE32(n) (n)
+  #define ToBE64(n) (n)
+  #define ToLE16(n) EndianSwap16(n)
+  #define ToLE32(n) EndianSwap32(n)
+  #define ToLE64(n) EndianSwap64(n)
+  #define FromBE16(n) (n)
+  #define FromBE32(n) (n)
+  #define FromBE64(n) (n)
+  #define FromLE16(n) EndianSwap16(n)
+  #define FromLE32(n) EndianSwap32(n)
+  #define FromLE64(n) EndianSwap64(n)
 #endif
 
 }  // namespace sfntly
diff --git a/sfntly/port/file_input_stream.cc b/sfntly/port/file_input_stream.cc
index 04a0fd6..661b6fd 100644
--- a/sfntly/port/file_input_stream.cc
+++ b/sfntly/port/file_input_stream.cc
@@ -23,38 +23,21 @@
 
 namespace sfntly {
 
-FileInputStream::FileInputStream() : file_(NULL), position_(0), length_(0) {
+FileInputStream::FileInputStream()
+    : file_(NULL),
+      position_(0),
+      length_(0) {
 }
 
 FileInputStream::~FileInputStream() {
-  close();
+  Close();
 }
 
-int32_t FileInputStream::available() {
+int32_t FileInputStream::Available() {
   return length_ - position_;
 }
 
-bool FileInputStream::open(const char* file_path) {
-  assert(file_path);
-  if (file_) {
-    close();
-  }
-#if defined (WIN32)
-  fopen_s(&file_, file_path, "rb");
-#else
-  file_ = fopen(file_path, "rb");
-#endif
-  if (file_ == NULL) {
-    return false;
-  }
-
-  fseek(file_, 0, SEEK_END);
-  length_ = ftell(file_);
-  fseek(file_, 0, SEEK_SET);
-  return true;
-}
-
-void FileInputStream::close() {
+void FileInputStream::Close() {
   if (file_) {
     fclose(file_);
     length_ = 0;
@@ -63,16 +46,16 @@
   }
 }
 
-void FileInputStream::mark(int32_t readlimit) {
+void FileInputStream::Mark(int32_t readlimit) {
   // NOP
   UNREFERENCED_PARAMETER(readlimit);
 }
 
-bool FileInputStream::markSupported() {
+bool FileInputStream::MarkSupported() {
   return false;
 }
 
-int32_t FileInputStream::read() {
+int32_t FileInputStream::Read() {
   if (!file_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -93,11 +76,11 @@
   return value;
 }
 
-int32_t FileInputStream::read(ByteVector* b) {
-  return read(b, 0, b->capacity());
+int32_t FileInputStream::Read(ByteVector* b) {
+  return Read(b, 0, b->capacity());
 }
 
-int32_t FileInputStream::read(ByteVector* b, int32_t offset, int32_t length) {
+int32_t FileInputStream::Read(ByteVector* b, int32_t offset, int32_t length) {
   assert(b);
   if (!file_) {
 #if defined (SFNTLY_NO_EXCEPTION)
@@ -122,11 +105,11 @@
   return actual_read;
 }
 
-void FileInputStream::reset() {
+void FileInputStream::Reset() {
   // NOP
 }
 
-int64_t FileInputStream::skip(int64_t n) {
+int64_t FileInputStream::Skip(int64_t n) {
   if (!file_) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return 0;
@@ -147,11 +130,11 @@
   return skip_count;
 }
 
-void FileInputStream::unread(ByteVector* b) {
-  unread(b, 0, b->capacity());
+void FileInputStream::Unread(ByteVector* b) {
+  Unread(b, 0, b->capacity());
 }
 
-void FileInputStream::unread(ByteVector* b, int32_t offset, int32_t length) {
+void FileInputStream::Unread(ByteVector* b, int32_t offset, int32_t length) {
   assert(b);
   assert(b->size() >= size_t(offset + length));
   if (!file_) {
@@ -164,9 +147,29 @@
   size_t unread_count = std::min<size_t>(position_, length);
   fseek(file_, position_ - unread_count, SEEK_SET);
   position_ -= unread_count;
-  read(b, offset, length);
+  Read(b, offset, length);
   fseek(file_, position_ - unread_count, SEEK_SET);
   position_ -= unread_count;
 }
 
+bool FileInputStream::Open(const char* file_path) {
+  assert(file_path);
+  if (file_) {
+    Close();
+  }
+#if defined (WIN32)
+  fopen_s(&file_, file_path, "rb");
+#else
+  file_ = fopen(file_path, "rb");
+#endif
+  if (file_ == NULL) {
+    return false;
+  }
+
+  fseek(file_, 0, SEEK_END);
+  length_ = ftell(file_);
+  fseek(file_, 0, SEEK_SET);
+  return true;
+}
+
 }  // namespace sfntly
diff --git a/sfntly/port/file_input_stream.h b/sfntly/port/file_input_stream.h
index 0ec85b6..a63726f 100644
--- a/sfntly/port/file_input_stream.h
+++ b/sfntly/port/file_input_stream.h
@@ -29,22 +29,22 @@
   virtual ~FileInputStream();
 
   // InputStream methods
-  virtual int32_t available();
-  virtual void close();
-  virtual void mark(int32_t readlimit);
-  virtual bool markSupported();
-  virtual int32_t read();
-  virtual int32_t read(ByteVector* b);
-  virtual int32_t read(ByteVector* b, int32_t offset, int32_t length);
-  virtual void reset();
-  virtual int64_t skip(int64_t n);
+  virtual int32_t Available();
+  virtual void Close();
+  virtual void Mark(int32_t readlimit);
+  virtual bool MarkSupported();
+  virtual int32_t Read();
+  virtual int32_t Read(ByteVector* b);
+  virtual int32_t Read(ByteVector* b, int32_t offset, int32_t length);
+  virtual void Reset();
+  virtual int64_t Skip(int64_t n);
 
   // PushbackInputStream methods
-  virtual void unread(ByteVector* b);
-  virtual void unread(ByteVector* b, int32_t offset, int32_t length);
+  virtual void Unread(ByteVector* b);
+  virtual void Unread(ByteVector* b, int32_t offset, int32_t length);
 
   // Own methods
-  virtual bool open(const char* file_path);
+  virtual bool Open(const char* file_path);
 
  private:
   FILE* file_;
diff --git a/sfntly/port/input_stream.h b/sfntly/port/input_stream.h
index ebbccf0..a56afb9 100644
--- a/sfntly/port/input_stream.h
+++ b/sfntly/port/input_stream.h
@@ -24,23 +24,24 @@
 // C++ equivalent to Java's OutputStream class
 class InputStream {
  public:
-  virtual int32_t available() = 0;
-  virtual void close() = 0;
-  virtual void mark(int32_t readlimit) = 0;
-  virtual bool markSupported() = 0;
-  virtual int32_t read() = 0;
-  virtual int32_t read(ByteVector* b) = 0;
-  virtual int32_t read(ByteVector* b, int32_t offset, int32_t length) = 0;
-  virtual void reset() = 0;
-  virtual int64_t skip(int64_t n) = 0;
   // Make gcc -Wnon-virtual-dtor happy.
   virtual ~InputStream() {}
+
+  virtual int32_t Available() = 0;
+  virtual void Close() = 0;
+  virtual void Mark(int32_t readlimit) = 0;
+  virtual bool MarkSupported() = 0;
+  virtual int32_t Read() = 0;
+  virtual int32_t Read(ByteVector* b) = 0;
+  virtual int32_t Read(ByteVector* b, int32_t offset, int32_t length) = 0;
+  virtual void Reset() = 0;
+  virtual int64_t Skip(int64_t n) = 0;
 };
 
 class PushbackInputStream : public InputStream {
  public:
-  virtual void unread(ByteVector* b) = 0;
-  virtual void unread(ByteVector* b, int32_t offset, int32_t length) = 0;
+  virtual void Unread(ByteVector* b) = 0;
+  virtual void Unread(ByteVector* b, int32_t offset, int32_t length) = 0;
 };
 
 }  // namespace sfntly
diff --git a/sfntly/port/memory_output_stream.cc b/sfntly/port/memory_output_stream.cc
index 1f3ecd4..5ddeec2 100644
--- a/sfntly/port/memory_output_stream.cc
+++ b/sfntly/port/memory_output_stream.cc
@@ -24,25 +24,27 @@
 MemoryOutputStream::~MemoryOutputStream() {
 }
 
-void MemoryOutputStream::write(ByteVector* buffer) {
+void MemoryOutputStream::Write(ByteVector* buffer) {
   store_.insert(store_.end(), buffer->begin(), buffer->end());
 }
 
-void MemoryOutputStream::write(ByteVector* buffer, int32_t offset,
+void MemoryOutputStream::Write(ByteVector* buffer,
+                               int32_t offset,
                                int32_t length) {
-  store_.insert(store_.end(), buffer->begin() + offset,
+  store_.insert(store_.end(),
+                buffer->begin() + offset,
                 buffer->begin() + offset + length);
 }
 
-void MemoryOutputStream::write(byte_t b) {
+void MemoryOutputStream::Write(byte_t b) {
   store_.push_back(b);
 }
 
-byte_t* MemoryOutputStream::get() {
+byte_t* MemoryOutputStream::Get() {
   return &(store_[0]);
 }
 
-size_t MemoryOutputStream::size() {
+size_t MemoryOutputStream::Size() {
   return store_.size();
 }
 
diff --git a/sfntly/port/memory_output_stream.h b/sfntly/port/memory_output_stream.h
index 4a7cb74..a0befea 100644
--- a/sfntly/port/memory_output_stream.h
+++ b/sfntly/port/memory_output_stream.h
@@ -32,14 +32,14 @@
   MemoryOutputStream();
   virtual ~MemoryOutputStream();
 
-  virtual void close() {}  // no-op
-  virtual void flush() {}  // no-op
-  virtual void write(ByteVector* buffer);
-  virtual void write(ByteVector* buffer, int32_t offset, int32_t length);
-  virtual void write(byte_t b);
+  virtual void Close() {}  // no-op
+  virtual void Flush() {}  // no-op
+  virtual void Write(ByteVector* buffer);
+  virtual void Write(ByteVector* buffer, int32_t offset, int32_t length);
+  virtual void Write(byte_t b);
 
-  byte_t* get();
-  size_t size();
+  byte_t* Get();
+  size_t Size();
 
  private:
   std::vector<byte_t> store_;
diff --git a/sfntly/port/output_stream.h b/sfntly/port/output_stream.h
index 0b232e2..c5d71cf 100644
--- a/sfntly/port/output_stream.h
+++ b/sfntly/port/output_stream.h
@@ -24,13 +24,14 @@
 // C++ equivalent to Java's OutputStream class
 class OutputStream {
  public:
-  virtual void close() = 0;
-  virtual void flush() = 0;
-  virtual void write(ByteVector* buffer) = 0;
-  virtual void write(ByteVector* buffer, int32_t offset, int32_t length) = 0;
-  virtual void write(byte_t b) = 0;
   // Make gcc -Wnon-virtual-dtor happy.
   virtual ~OutputStream() {}
+
+  virtual void Close() = 0;
+  virtual void Flush() = 0;
+  virtual void Write(ByteVector* buffer) = 0;
+  virtual void Write(ByteVector* buffer, int32_t offset, int32_t length) = 0;
+  virtual void Write(byte_t b) = 0;
 };
 
 }  // namespace sfntly
diff --git a/sfntly/port/refcount.h b/sfntly/port/refcount.h
index ed1fa96..6ac09bb 100644
--- a/sfntly/port/refcount.h
+++ b/sfntly/port/refcount.h
@@ -27,16 +27,16 @@
 //  public:
 //   static Foo* CreateInstance() {
 //     Ptr<Foo> obj = new Foo();  // ref count = 1
-//     return obj.detach();
+//     return obj.Detach();
 //   }
 // };
 // typedef Ptr<Foo> FooPtr;  // common short-hand notation
 // FooPtr obj;
-// obj.attach(Foo::CreatedInstance());  // ref count = 1
+// obj.Attach(Foo::CreatedInstance());  // ref count = 1
 // {
 //   FooPtr obj2 = obj;  // ref count = 2
 // }  // ref count = 1, obj2 out of scope
-// obj.release();  // ref count = 0, object destroyed
+// obj.Release();  // ref count = 0, object destroyed
 
 // Notes on usage:
 // 1. Virtual inherit from RefCount interface in base class if smart pointers
@@ -57,10 +57,10 @@
 //    VC++ will generate SEH which is not handled well in VC++ debugger.  One
 //    can use WinDBG to run it and get the faulting stack.
 // 6. Idioms for heap object as return value
-//    Foo* createFoo() { FooPtr obj = new Foo(); return obj.detach(); }
+//    Foo* createFoo() { FooPtr obj = new Foo(); return obj.Detach(); }
 //    Foo* passthru() { FooPtr obj = createFoo(), return obj; }
 //    FooPtr end_scope_pointer;
-//    end_scope_pointer.attach(passThrough);
+//    end_scope_pointer.Attach(passThrough);
 //    If you are not passing that object back, you are the end of scope.
 
 #ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_SFNTLY_PORT_REFCOUNT_H_
@@ -101,10 +101,11 @@
 
 class RefCount {
  public:
-  virtual size_t addRef() const = 0;
-  virtual size_t release() const = 0;
   // Make gcc -Wnon-virtual-dtor happy.
   virtual ~RefCount() {}
+
+  virtual size_t AddRef() const = 0;
+  virtual size_t Release() const = 0;
 };
 
 template <typename T>
@@ -114,8 +115,8 @@
   ~NoAddRefRelease();
 
  private:
-  virtual size_t addRef() const = 0;
-  virtual size_t release() const = 0;
+  virtual size_t AddRef() const = 0;
+  virtual size_t Release() const = 0;
 };
 
 template <typename TDerived>
@@ -123,15 +124,15 @@
  public:
   RefCounted() : ref_count_(0) {
 #if defined (ENABLE_OBJECT_COUNTER)
-    object_id_ = atomicIncrement(&next_id_);
-    atomicIncrement(&object_counter_);
+    object_id_ = AtomicIncrement(&next_id_);
+    AtomicIncrement(&object_counter_);
     DEBUG_OUTPUT("C ");
 #endif
   }
   RefCounted(const RefCounted<TDerived>&) : ref_count_(0) {}
   virtual ~RefCounted() {
 #if defined (ENABLE_OBJECT_COUNTER)
-    atomicDecrement(&object_counter_);
+    AtomicDecrement(&object_counter_);
     DEBUG_OUTPUT("D ");
 #endif
   }
@@ -141,14 +142,14 @@
     return *this;
   }
 
-  virtual size_t addRef() const {
-    size_t new_count = atomicIncrement(&ref_count_);
+  virtual size_t AddRef() const {
+    size_t new_count = AtomicIncrement(&ref_count_);
     DEBUG_OUTPUT("A ");
     return new_count;
   }
 
-  virtual size_t release() const {
-    size_t new_ref_count = atomicDecrement(&ref_count_);
+  virtual size_t Release() const {
+    size_t new_ref_count = AtomicDecrement(&ref_count_);
     DEBUG_OUTPUT("R ");
     if (new_ref_count == 0) {
       // A C-style is used to cast away const-ness and to derived.
@@ -189,7 +190,7 @@
   }
 
   ~Ptr() {
-    release();
+    Release();
   }
 
   T* operator=(T* pT) {
@@ -201,9 +202,9 @@
       if (p == NULL) {
         return NULL;
       }
-      p->addRef();  // always addRef() before release()
+      p->AddRef();  // always AddRef() before Release()
     }
-    release();
+    Release();
     p_ = pT;
     return p_;
   }
@@ -243,26 +244,26 @@
     return (p_ == pT);
   }
 
-  size_t release() const {
+  size_t Release() const {
     size_t ref_count = 0;
     if (p_) {
       RefCount* p = static_cast<RefCount*>(p_);
       if (p) {
-        ref_count = p->release();
+        ref_count = p->Release();
       }
       p_ = NULL;
     }
     return ref_count;
   }
 
-  void attach(T* pT) {
+  void Attach(T* pT) {
     if (p_ != pT) {
-      release();
+      Release();
       p_ = pT;
     }
   }
 
-  T* detach() {
+  T* Detach() {
     T* pT = p_;
     p_ = NULL;
     return pT;
diff --git a/sfntly/subtable.cc b/sfntly/subtable.cc
index 9ca94f3..782fd80 100644
--- a/sfntly/subtable.cc
+++ b/sfntly/subtable.cc
@@ -20,24 +20,25 @@
 /******************************************************************************
  * SubTable class
  ******************************************************************************/
-SubTable::SubTable(ReadableFontData* data) : FontDataTable(data) {
-}
-
 SubTable::~SubTable() {}
 
+SubTable::SubTable(ReadableFontData* data)
+    : FontDataTable(data) {
+}
+
 /******************************************************************************
  * SubTable::Builder class
  ******************************************************************************/
-SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
-                           WritableFontData* data) :
-    FontDataTable::Builder(container, data) {
-}
-
-SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
-                           ReadableFontData* data) :
-    FontDataTable::Builder(container, data) {
-}
-
 SubTable::Builder::~Builder() {}
 
+SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
+                           WritableFontData* data)
+    : FontDataTable::Builder(container, data) {
+}
+
+SubTable::Builder::Builder(FontDataTableBuilderContainer* container,
+                           ReadableFontData* data)
+    : FontDataTable::Builder(container, data) {
+}
+
 }  // namespace sfntly
diff --git a/sfntly/subtable.h b/sfntly/subtable.h
index 23e1e42..30ecf66 100644
--- a/sfntly/subtable.h
+++ b/sfntly/subtable.h
@@ -26,23 +26,22 @@
 // of these are the CMap subtables within CMap table (cmap) or a glyph within
 // the glyph table (glyf).
 class SubTable : public FontDataTable {
- protected:
-  // Note: constructor refactored in C++ to avoid heavy lifting.
-  //       caller need to do data->slice(offset, length) beforehand.
-  explicit SubTable(ReadableFontData* data);
-
- public:
-  virtual ~SubTable();
-
  public:
   class Builder : public FontDataTable::Builder {
+   public:
+    virtual ~Builder();
+
    protected:
     Builder(FontDataTableBuilderContainer* container, WritableFontData* data);
     Builder(FontDataTableBuilderContainer* container, ReadableFontData* data);
-
-   public:
-    virtual ~Builder();
   };
+
+  virtual ~SubTable();
+
+ protected:
+  // Note: constructor refactored in C++ to avoid heavy lifting.
+  //       caller need to do data->Slice(offset, length) beforehand.
+  explicit SubTable(ReadableFontData* data);
 };
 
 }  // namespace sfntly
diff --git a/sfntly/table.cc b/sfntly/table.cc
index 8a1ec02..a11177e 100644
--- a/sfntly/table.cc
+++ b/sfntly/table.cc
@@ -15,6 +15,7 @@
  */
 
 #include "sfntly/table.h"
+
 #include "sfntly/font.h"
 #include "sfntly/tag.h"
 #include "sfntly/cmap_table.h"
@@ -32,61 +33,56 @@
 /******************************************************************************
  * Table class
  ******************************************************************************/
-Table::Table(Header* header, ReadableFontData* data) : FontDataTable(data) {
-  header_ = header;
-}
-
 Table::~Table() {}
 
-int64_t Table::calculatedChecksum() {
-  return data_->checksum();
+int64_t Table::CalculatedChecksum() {
+  return data_->Checksum();
 }
 
-Table::Header* Table::header() {
-  return header_;
+WritableFontData* Table::GetNewData(int32_t size) {
+  return font_->GetNewData(size);
 }
 
-int32_t Table::headerTag() {
-  return header_->tag();
-}
-
-int32_t Table::headerOffset() {
-  return header_->offset();
-}
-
-int32_t Table::headerLength() {
-  return header_->length();
-}
-
-int64_t Table::headerChecksum() {
-  return header_->checksum();
-}
-
-WritableFontData* Table::getNewData(int32_t size) {
-  return font_->getNewData(size);
-}
-
-void Table::setFont(Font* font) {
+void Table::SetFont(Font* font) {
   font_ = font;
 }
 
+Table::Table(Header* header, ReadableFontData* data)
+    : FontDataTable(data) {
+  header_ = header;
+}
+
 /******************************************************************************
  * Table::Header class
  ******************************************************************************/
 Table::Header::Header(int32_t tag)
-    : tag_(tag), offset_(0), length_(0), offset_valid_(false), checksum_(0),
+    : tag_(tag),
+      offset_(0),
+      length_(0),
+      offset_valid_(false),
+      checksum_(0),
       checksum_valid_(false) {
 }
 
 Table::Header::Header(int32_t tag, int32_t length)
-    : tag_(tag), offset_(0), length_(length), offset_valid_(false),
-      checksum_(0), checksum_valid_(false) {
+    : tag_(tag),
+      offset_(0),
+      length_(length),
+      offset_valid_(false),
+      checksum_(0),
+      checksum_valid_(false) {
 }
 
-Table::Header::Header(int32_t tag, int64_t checksum, int32_t offset,
+Table::Header::Header(int32_t tag,
+                      int64_t checksum,
+                      int32_t offset,
                       int32_t length)
-    : tag_(tag), offset_(offset), length_(length), offset_valid_(true),
-      checksum_(checksum), checksum_valid_(true) {
+    : tag_(tag),
+      offset_(offset),
+      length_(length),
+      offset_valid_(true),
+      checksum_(checksum),
+      checksum_valid_(true) {
 }
 
 Table::Header::~Header() {}
@@ -96,58 +92,30 @@
   return lhs->offset_ > rhs->offset_;
 }
 
-int32_t Table::Header::tag() { return tag_; }
-int32_t Table::Header::offset() { return offset_; }
-int32_t Table::Header::length() { return length_; }
-bool Table::Header::offsetValid() { return offset_valid_; }
-int64_t Table::Header::checksum() { return checksum_; }
-bool Table::Header::checksumValid() { return checksum_valid_; }
-
 /******************************************************************************
  * Table::Builder class
  ******************************************************************************/
-Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                        Header* header, WritableFontData* data) :
-    FontDataTable::Builder(font_builder, data) {
-  header_ = header;
-}
-
-Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                        Header* header, ReadableFontData* data) :
-    FontDataTable::Builder(font_builder, data) {
-  header_ = header;
-}
-
-Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
-                        Header* header) :
-    FontDataTable::Builder(font_builder) {
-  header_ = header;
-}
-
 Table::Builder::~Builder() {
-  header_.release();
+  header_.Release();
 }
 
-Table::Header* Table::Builder::header() {
-  return header_;
-}
-
-void Table::Builder::notifyPostTableBuild(FontDataTable* table) {
-  if (modelChanged() || dataChanged()) {
+void Table::Builder::NotifyPostTableBuild(FontDataTable* table) {
+  if (modelChanged() || data_changed()) {
     Table* derived_table = down_cast<Table*>(table);
     header_ = new Header(header()->tag(),
-                         derived_table->readFontData()->length());
+                         derived_table->ReadFontData()->Length());
   }
 }
 
-WritableFontData* Table::Builder::getNewData(int32_t size) {
+WritableFontData* Table::Builder::GetNewData(int32_t size) {
   UNREFERENCED_PARAMETER(size);
-  return internalWriteData();
+  return InternalWriteData();
 }
 
-CALLER_ATTACH Table::Builder* Table::Builder::getBuilder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    WritableFontData* table_data) {
+CALLER_ATTACH Table::Builder*
+    Table::Builder::GetBuilder(FontDataTableBuilderContainer* font_builder,
+                               Header* header,
+                               WritableFontData* table_data) {
   int32_t tag = header->tag();
   TableBuilderPtr builder;
   Table::Builder* builder_raw = NULL;
@@ -199,77 +167,113 @@
   }
 
   builder = builder_raw;
-  return builder.detach();
+  return builder.Detach();
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+                        Header* header,
+                        WritableFontData* data)
+    : FontDataTable::Builder(font_builder, data) {
+  header_ = header;
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+                        Header* header,
+                        ReadableFontData* data)
+    : FontDataTable::Builder(font_builder, data) {
+  header_ = header;
+}
+
+Table::Builder::Builder(FontDataTableBuilderContainer* font_builder,
+                        Header* header)
+    : FontDataTable::Builder(font_builder) {
+  header_ = header;
 }
 
 /******************************************************************************
  * Table::TableBasedTableBuilder class
  ******************************************************************************/
-Table::TableBasedTableBuilder::TableBasedTableBuilder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    WritableFontData* data) : Builder(font_builder, header, data) {}
-
-Table::TableBasedTableBuilder::TableBasedTableBuilder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    ReadableFontData* data) : Builder(font_builder, header, data) {}
-
-Table::TableBasedTableBuilder::TableBasedTableBuilder(
-    FontDataTableBuilderContainer* font_builder, Header* header) :
-    Builder(font_builder, header) {}
-
 Table::TableBasedTableBuilder::~TableBasedTableBuilder() {}
 
-Table* Table::TableBasedTableBuilder::table() {
-  if (table_ == NULL) {
-    table_.attach(down_cast<Table*>(subBuildTable(internalReadData())));
-  }
-  return table_;
-}
-
-void Table::TableBasedTableBuilder::subDataSet() {
-  table_ = NULL;
-}
-
-int32_t Table::TableBasedTableBuilder::subDataSizeToSerialize() {
+int32_t Table::TableBasedTableBuilder::SubSerialize(WritableFontData* data) {
+  UNREFERENCED_PARAMETER(data);
   return 0;
 }
 
-bool Table::TableBasedTableBuilder::subReadyToSerialize() {
+bool Table::TableBasedTableBuilder::SubReadyToSerialize() {
   return false;
 }
 
-int32_t Table::TableBasedTableBuilder::subSerialize(WritableFontData* data) {
-  UNREFERENCED_PARAMETER(data);
+int32_t Table::TableBasedTableBuilder::SubDataSizeToSerialize() {
   return 0;
 }
 
+void Table::TableBasedTableBuilder::SubDataSet() {
+  table_ = NULL;
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    WritableFontData* data)
+    : Builder(font_builder, header, data) {
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    ReadableFontData* data)
+    : Builder(font_builder, header, data) {
+}
+
+Table::TableBasedTableBuilder::TableBasedTableBuilder(
+    FontDataTableBuilderContainer* font_builder,
+    Header* header)
+    : Builder(font_builder, header) {
+}
+
+Table* Table::TableBasedTableBuilder::GetTable() {
+  if (table_ == NULL) {
+    table_.Attach(down_cast<Table*>(SubBuildTable(InternalReadData())));
+  }
+  return table_;
+}
+
 /******************************************************************************
  * Table::GenericTableBuilder class
  ******************************************************************************/
 Table::GenericTableBuilder::GenericTableBuilder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    WritableFontData* data) :
-    TableBasedTableBuilder(font_builder, header, data) {}
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    WritableFontData* data)
+    : TableBasedTableBuilder(font_builder, header, data) {
+}
 
-CALLER_ATTACH FontDataTable* Table::GenericTableBuilder::subBuildTable(
-    ReadableFontData* data) {
+CALLER_ATTACH FontDataTable*
+    Table::GenericTableBuilder::SubBuildTable(ReadableFontData* data) {
   // Note: In C++ port, we use GenericTable, the ref-counted version of Table
   UNREFERENCED_PARAMETER(data);
-  FontDataTablePtr table = new GenericTable(this->header(), internalReadData());
-  return table.detach();
+  FontDataTablePtr table = new GenericTable(this->header(), InternalReadData());
+  return table.Detach();
 }
 
 /******************************************************************************
  * Table::ArrayElementTableBuilder class
  ******************************************************************************/
-Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    WritableFontData* data) : Builder(font_builder, header, data) {}
-
-Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
-    FontDataTableBuilderContainer* font_builder, Header* header,
-    ReadableFontData* data) : Builder(font_builder, header, data) {}
-
 Table::ArrayElementTableBuilder::~ArrayElementTableBuilder() {}
 
+Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    WritableFontData* data)
+    : Builder(font_builder, header, data) {
+}
+
+Table::ArrayElementTableBuilder::ArrayElementTableBuilder(
+    FontDataTableBuilderContainer* font_builder,
+    Header* header,
+    ReadableFontData* data)
+    : Builder(font_builder, header, data) {
+}
+
 }  // namespace sfntly
diff --git a/sfntly/table.h b/sfntly/table.h
index 9f05ef5..217abcd 100644
--- a/sfntly/table.h
+++ b/sfntly/table.h
@@ -36,13 +36,12 @@
     Header(int32_t tag, int64_t checksum, int32_t offset, int32_t length);
     virtual ~Header();
 
-   public:  // class is final, no virtual functions unless from parent
-    int32_t tag();
-    int32_t offset();
-    int32_t length();
-    bool offsetValid();
-    int64_t checksum();
-    bool checksumValid();
+    int32_t tag() { return tag_; }
+    int32_t offset() { return offset_; }
+    int32_t length() { return length_; }
+    bool offset_valid() { return offset_valid_; }
+    int64_t checksum() { return checksum_; }
+    bool checksum_valid() { return checksum_valid_; }
 
    private:
     int32_t tag_;
@@ -60,89 +59,95 @@
   //       chosen.
   class Builder : public FontDataTable::Builder,
                   public FontDataTableBuilderContainer {
+   public:
+    virtual ~Builder();
+    virtual Header* header() { return header_; }
+    virtual void NotifyPostTableBuild(FontDataTable* table);
+    virtual WritableFontData* GetNewData(int32_t size);
+
+    static CALLER_ATTACH Builder*
+        GetBuilder(FontDataTableBuilderContainer* font_builder,
+                   Header* header,
+                   WritableFontData* table_data);
+
    protected:
     // Note: original version is Font.Builder font_builder. This results in
     //       mutual inclusion happiness that Java solved for C++.  Therefore,
     //       we need to avoid that happiness when we port it to C++.
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
             WritableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header,
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header,
             ReadableFontData* data);
-    Builder(FontDataTableBuilderContainer* font_builder, Header* header);
-
-   public:
-    virtual ~Builder();
-    virtual Header* header();
-    virtual void notifyPostTableBuild(FontDataTable* table);
-    virtual WritableFontData* getNewData(int32_t size);
-
-   public:
-    static CALLER_ATTACH Builder* getBuilder(
-        FontDataTableBuilderContainer* font_builder, Header* header,
-        WritableFontData* table_data);
+    Builder(FontDataTableBuilderContainer* font_builder,
+            Header* header);
 
    private:
     Ptr<Header> header_;
   };
 
   class TableBasedTableBuilder : public Builder {
-   protected:
-    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
-      Header* header, WritableFontData* data);
-    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
-      Header* header, ReadableFontData* data);
-    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
-      Header* header);
    public:
     virtual ~TableBasedTableBuilder();
 
-   protected:
-    virtual Table* table();
-
-   public:
-    virtual int32_t subSerialize(WritableFontData* new_data);
-    virtual bool subReadyToSerialize();
-    virtual int32_t subDataSizeToSerialize();
-    virtual void subDataSet();
+    virtual int32_t SubSerialize(WritableFontData* new_data);
+    virtual bool SubReadyToSerialize();
+    virtual int32_t SubDataSizeToSerialize();
+    virtual void SubDataSet();
 
    protected:
+    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
+                           Header* header,
+                           WritableFontData* data);
+    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
+                           Header* header,
+                           ReadableFontData* data);
+    TableBasedTableBuilder(FontDataTableBuilderContainer* font_builder,
+                           Header* header);
+
+    // C++ port: renamed table() to GetTable()
+    virtual Table* GetTable();
+
+    // TODO(arthurhsu): style guide violation: protected member, need refactor
     Ptr<Table> table_;
   };
 
   class GenericTableBuilder : public TableBasedTableBuilder,
-    public RefCounted<GenericTableBuilder> {
+                              public RefCounted<GenericTableBuilder> {
    public:
     GenericTableBuilder(FontDataTableBuilderContainer* font_builder,
-      Header* header, WritableFontData* data);
-    virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
+                        Header* header,
+                        WritableFontData* data);
+    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
   };
 
   class ArrayElementTableBuilder : public Builder {
-   protected:
-    ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
-                             Header* header, WritableFontData* data);
-    ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
-                             Header* header, ReadableFontData* data);
    public:
     virtual ~ArrayElementTableBuilder();
+
+   protected:
+    ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
+                             Header* header,
+                             WritableFontData* data);
+    ArrayElementTableBuilder(FontDataTableBuilderContainer* font_builder,
+                             Header* header,
+                             ReadableFontData* data);
   };
 
+  virtual ~Table();
+  virtual int64_t CalculatedChecksum();
+  virtual Header* header()          { return header_; }
+  virtual int32_t header_tag()      { return header_->tag(); }
+  virtual int32_t header_offset()   { return header_->offset(); }
+  virtual int32_t header_length()   { return header_->length(); }
+  virtual int64_t header_checksum() { return header_->checksum(); }
+  virtual WritableFontData* GetNewData(int32_t size);
+  virtual void SetFont(Font* font);
+
  protected:
   Table(Header* header, ReadableFontData* data);
 
- public:
-  virtual ~Table();
-  virtual int64_t calculatedChecksum();
-  virtual Header* header();
-  virtual int32_t headerTag();
-  virtual int32_t headerOffset();
-  virtual int32_t headerLength();
-  virtual int64_t headerChecksum();
-
- public:  // FontDataTableBuilderContainer, deprecated
-  virtual WritableFontData* getNewData(int32_t size);
-  virtual void setFont(Font* font);
-
  private:
   Ptr<Header> header_;
   Ptr<Font> font_;
diff --git a/sfntly/tag.cc b/sfntly/tag.cc
index 257e65f..e3c11cd 100644
--- a/sfntly/tag.cc
+++ b/sfntly/tag.cc
@@ -19,42 +19,42 @@
 
 namespace sfntly {
 
-const int32_t Tag::ttcf = generate_tag('t', 't', 'c', 'f');
-const int32_t Tag::cmap = generate_tag('c', 'm', 'a', 'p');
-const int32_t Tag::head = generate_tag('h', 'e', 'a', 'd');
-const int32_t Tag::hhea = generate_tag('h', 'h', 'e', 'a');
-const int32_t Tag::hmtx = generate_tag('h', 'm', 't', 'x');
-const int32_t Tag::maxp = generate_tag('m', 'a', 'x', 'p');
-const int32_t Tag::name = generate_tag('n', 'a', 'm', 'e');
-const int32_t Tag::OS_2 = generate_tag('O', 'S', '/', '2');
-const int32_t Tag::post = generate_tag('p', 'o', 's', 't');
-const int32_t Tag::cvt  = generate_tag('c', 'v', 't', ' ');
-const int32_t Tag::fpgm = generate_tag('f', 'p', 'g', 'm');
-const int32_t Tag::glyf = generate_tag('g', 'l', 'y', 'f');
-const int32_t Tag::loca = generate_tag('l', 'o', 'c', 'a');
-const int32_t Tag::prep = generate_tag('p', 'r', 'e', 'p');
-const int32_t Tag::CFF  = generate_tag('C', 'F', 'F', ' ');
-const int32_t Tag::VORG = generate_tag('V', 'O', 'R', 'G');
-const int32_t Tag::EBDT = generate_tag('E', 'B', 'D', 'T');
-const int32_t Tag::EBLC = generate_tag('E', 'B', 'L', 'C');
-const int32_t Tag::EBSC = generate_tag('E', 'B', 'S', 'C');
-const int32_t Tag::BASE = generate_tag('B', 'A', 'S', 'E');
-const int32_t Tag::GDEF = generate_tag('G', 'D', 'E', 'F');
-const int32_t Tag::GPOS = generate_tag('G', 'P', 'O', 'S');
-const int32_t Tag::GSUB = generate_tag('G', 'S', 'U', 'B');
-const int32_t Tag::JSTF = generate_tag('J', 'S', 'T', 'F');
-const int32_t Tag::DSIG = generate_tag('D', 'S', 'I', 'G');
-const int32_t Tag::gasp = generate_tag('g', 'a', 's', 'p');
-const int32_t Tag::hdmx = generate_tag('h', 'd', 'm', 'x');
-const int32_t Tag::kern = generate_tag('k', 'e', 'r', 'n');
-const int32_t Tag::LTSH = generate_tag('L', 'T', 'S', 'H');
-const int32_t Tag::PCLT = generate_tag('P', 'C', 'L', 'T');
-const int32_t Tag::VDMX = generate_tag('V', 'D', 'M', 'X');
-const int32_t Tag::vhea = generate_tag('v', 'h', 'e', 'a');
-const int32_t Tag::vmtx = generate_tag('v', 'm', 't', 'x');
-const int32_t Tag::bhed = generate_tag('b', 'h', 'e', 'd');
-const int32_t Tag::bdat = generate_tag('b', 'd', 'a', 't');
-const int32_t Tag::bloc = generate_tag('b', 'l', 'o', 'c');
+const int32_t Tag::ttcf = GenerateTag('t', 't', 'c', 'f');
+const int32_t Tag::cmap = GenerateTag('c', 'm', 'a', 'p');
+const int32_t Tag::head = GenerateTag('h', 'e', 'a', 'd');
+const int32_t Tag::hhea = GenerateTag('h', 'h', 'e', 'a');
+const int32_t Tag::hmtx = GenerateTag('h', 'm', 't', 'x');
+const int32_t Tag::maxp = GenerateTag('m', 'a', 'x', 'p');
+const int32_t Tag::name = GenerateTag('n', 'a', 'm', 'e');
+const int32_t Tag::OS_2 = GenerateTag('O', 'S', '/', '2');
+const int32_t Tag::post = GenerateTag('p', 'o', 's', 't');
+const int32_t Tag::cvt  = GenerateTag('c', 'v', 't', ' ');
+const int32_t Tag::fpgm = GenerateTag('f', 'p', 'g', 'm');
+const int32_t Tag::glyf = GenerateTag('g', 'l', 'y', 'f');
+const int32_t Tag::loca = GenerateTag('l', 'o', 'c', 'a');
+const int32_t Tag::prep = GenerateTag('p', 'r', 'e', 'p');
+const int32_t Tag::CFF  = GenerateTag('C', 'F', 'F', ' ');
+const int32_t Tag::VORG = GenerateTag('V', 'O', 'R', 'G');
+const int32_t Tag::EBDT = GenerateTag('E', 'B', 'D', 'T');
+const int32_t Tag::EBLC = GenerateTag('E', 'B', 'L', 'C');
+const int32_t Tag::EBSC = GenerateTag('E', 'B', 'S', 'C');
+const int32_t Tag::BASE = GenerateTag('B', 'A', 'S', 'E');
+const int32_t Tag::GDEF = GenerateTag('G', 'D', 'E', 'F');
+const int32_t Tag::GPOS = GenerateTag('G', 'P', 'O', 'S');
+const int32_t Tag::GSUB = GenerateTag('G', 'S', 'U', 'B');
+const int32_t Tag::JSTF = GenerateTag('J', 'S', 'T', 'F');
+const int32_t Tag::DSIG = GenerateTag('D', 'S', 'I', 'G');
+const int32_t Tag::gasp = GenerateTag('g', 'a', 's', 'p');
+const int32_t Tag::hdmx = GenerateTag('h', 'd', 'm', 'x');
+const int32_t Tag::kern = GenerateTag('k', 'e', 'r', 'n');
+const int32_t Tag::LTSH = GenerateTag('L', 'T', 'S', 'H');
+const int32_t Tag::PCLT = GenerateTag('P', 'C', 'L', 'T');
+const int32_t Tag::VDMX = GenerateTag('V', 'D', 'M', 'X');
+const int32_t Tag::vhea = GenerateTag('v', 'h', 'e', 'a');
+const int32_t Tag::vmtx = GenerateTag('v', 'm', 't', 'x');
+const int32_t Tag::bhed = GenerateTag('b', 'h', 'e', 'd');
+const int32_t Tag::bdat = GenerateTag('b', 'd', 'a', 't');
+const int32_t Tag::bloc = GenerateTag('b', 'l', 'o', 'c');
 
 const int32_t CFF_TABLE_ORDERING[] = {
     Tag::head,
diff --git a/sfntly/tag.h b/sfntly/tag.h
index fe6da46..9e73007 100644
--- a/sfntly/tag.h
+++ b/sfntly/tag.h
@@ -82,7 +82,7 @@
   static const int32_t bloc;
 };
 
-inline int32_t generate_tag(char a, char b, char c, char d) {
+inline int32_t GenerateTag(char a, char b, char c, char d) {
   return (((int32_t)(a) << 24) |
           ((int32_t)(b) << 16) |
           ((int32_t)(c) <<  8) |
diff --git a/sfntly/tools/subsetter.cc b/sfntly/tools/subsetter.cc
index 44ba22e..c234a1e 100644
--- a/sfntly/tools/subsetter.cc
+++ b/sfntly/tools/subsetter.cc
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
+#include "sfntly/tools/subsetter/subsetter.h"
+
 #include <algorithm>
 #include <iterator>
 
-#include "sfntly/tools/subsetter/subsetter.h"
 #include "sfntly/tools/subsetter/glyph_table_subsetter.h"
 
 namespace sfntly {
@@ -31,32 +32,32 @@
 }
 
 Subsetter::~Subsetter() {
-  font_factory_.release();
-  font_.release();
+  font_factory_.Release();
+  font_.Release();
   table_subsetters_.clear();
 }
 
-void Subsetter::setGlyphs(IntegerList* glyphs) {
+void Subsetter::SetGlyphs(IntegerList* glyphs) {
   new_to_old_glyphs_ = *glyphs;
 }
 
-void Subsetter::setCMaps(CMapIdList* cmap_ids, int32_t number) {
+void Subsetter::SetCMaps(CMapIdList* cmap_ids, int32_t number) {
   UNREFERENCED_PARAMETER(cmap_ids);
   UNREFERENCED_PARAMETER(number);
   // TODO(arthurhsu): IMPLEMENT
 }
 
-void Subsetter::setRemoveTables(IntegerSet* remove_tables) {
+void Subsetter::SetRemoveTables(IntegerSet* remove_tables) {
   remove_tables_ = *remove_tables;
 }
 
-CALLER_ATTACH Font::Builder* Subsetter::subset() {
+CALLER_ATTACH Font::Builder* Subsetter::Subset() {
   FontBuilderPtr font_builder;
-  font_builder.attach(font_factory_->newFontBuilder());
+  font_builder.Attach(font_factory_->NewFontBuilder());
 
   IntegerSet table_tags;
-  for (TableMap::iterator i = font_->tables()->begin(),
-                          e = font_->tables()->end(); i != e; ++i) {
+  for (TableMap::iterator i = font_->Tables()->begin(),
+                          e = font_->Tables()->end(); i != e; ++i) {
     table_tags.insert(i->first);
   }
   if (!remove_tables_.empty()) {
@@ -70,9 +71,9 @@
            table_subsetter = table_subsetters_.begin(),
            table_subsetter_end = table_subsetters_.end();
            table_subsetter != table_subsetter_end; ++table_subsetter) {
-    bool handled = (*table_subsetter)->subset(this, font_, font_builder);
+    bool handled = (*table_subsetter)->Subset(this, font_, font_builder);
     if (handled) {
-      IntegerSet* handled_tags = (*table_subsetter)->tagsHandled();
+      IntegerSet* handled_tags = (*table_subsetter)->TagsHandled();
       IntegerSet result;
       std::set_difference(table_tags.begin(), table_tags.end(),
                           handled_tags->begin(), handled_tags->end(),
@@ -82,24 +83,24 @@
   }
   for (IntegerSet::iterator tag = table_tags.begin(),
                             tag_end = table_tags.end(); tag != tag_end; ++tag) {
-    Table* table = font_->table(*tag);
+    Table* table = font_->GetTable(*tag);
     if (table) {
-      // The newTableBuilder() call will alter internal state of font_builder
+      // The NewTableBuilder() call will alter internal state of font_builder
       // AND the reference count of returned object.  Therefore we need to
       // dereference it.
       TableBuilderPtr dereference;
-      dereference.attach(
-          font_builder->newTableBuilder(*tag, table->readFontData()));
+      dereference.Attach(
+          font_builder->NewTableBuilder(*tag, table->ReadFontData()));
     }
   }
-  return font_builder.detach();
+  return font_builder.Detach();
 }
 
-IntegerList* Subsetter::glyphPermutationTable() {
+IntegerList* Subsetter::GlyphPermutationTable() {
   return &new_to_old_glyphs_;
 }
 
-CMapIdList* Subsetter::cmapId() {
+CMapIdList* Subsetter::CMapId() {
   return &cmap_ids_;
 }
 
diff --git a/sfntly/tools/subsetter/glyph_table_subsetter.cc b/sfntly/tools/subsetter/glyph_table_subsetter.cc
index 04d0c48..7609f74 100644
--- a/sfntly/tools/subsetter/glyph_table_subsetter.cc
+++ b/sfntly/tools/subsetter/glyph_table_subsetter.cc
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
+#include "sfntly/tools/subsetter/glyph_table_subsetter.h"
+
 #include "sfntly/tag.h"
 #include "sfntly/glyph_table.h"
 #include "sfntly/loca_table.h"
 #include "sfntly/tools/subsetter/subsetter.h"
-#include "sfntly/tools/subsetter/glyph_table_subsetter.h"
 #include "sfntly/port/exception_type.h"
 
 namespace sfntly {
@@ -31,18 +32,19 @@
 
 GlyphTableSubsetter::~GlyphTableSubsetter() {}
 
-bool GlyphTableSubsetter::subset(Subsetter* subsetter, Font* font,
+bool GlyphTableSubsetter::Subset(Subsetter* subsetter,
+                                 Font* font,
                                  Font::Builder* font_builder) {
   assert(font);
   assert(subsetter);
   assert(font_builder);
 
-  IntegerList* permutation_table = subsetter->glyphPermutationTable();
+  IntegerList* permutation_table = subsetter->GlyphPermutationTable();
   if (!permutation_table || permutation_table->empty())
     return false;
 
-  GlyphTablePtr glyph_table = down_cast<GlyphTable*>(font->table(Tag::glyf));
-  LocaTablePtr loca_table = down_cast<LocaTable*>(font->table(Tag::loca));
+  GlyphTablePtr glyph_table = down_cast<GlyphTable*>(font->GetTable(Tag::glyf));
+  LocaTablePtr loca_table = down_cast<LocaTable*>(font->GetTable(Tag::loca));
   if (glyph_table == NULL || loca_table == NULL) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return false;
@@ -52,11 +54,11 @@
   }
 
   GlyphTableBuilderPtr glyph_table_builder;
-  glyph_table_builder.attach(down_cast<GlyphTable::Builder*>(
-       font_builder->newTableBuilder(Tag::glyf)));
+  glyph_table_builder.Attach(down_cast<GlyphTable::Builder*>(
+       font_builder->NewTableBuilder(Tag::glyf)));
   LocaTableBuilderPtr loca_table_builder;
-  loca_table_builder.attach(down_cast<LocaTable::Builder*>(
-       font_builder->newTableBuilder(Tag::loca)));
+  loca_table_builder.Attach(down_cast<LocaTable::Builder*>(
+       font_builder->NewTableBuilder(Tag::loca)));
   if (glyph_table_builder == NULL || loca_table_builder == NULL) {
 #if defined (SFNTLY_NO_EXCEPTION)
     return false;
@@ -65,25 +67,25 @@
 #endif
   }
   GlyphTable::GlyphBuilderList* glyph_builders =
-      glyph_table_builder->glyphBuilders();
+      glyph_table_builder->GlyphBuilders();
   for (IntegerList::iterator old_glyph_id = permutation_table->begin(),
                              old_glyph_id_end = permutation_table->end();
                              old_glyph_id != old_glyph_id_end; ++old_glyph_id) {
-    int old_offset = loca_table->glyphOffset(*old_glyph_id);
-    int old_length = loca_table->glyphLength(*old_glyph_id);
+    int old_offset = loca_table->GlyphOffset(*old_glyph_id);
+    int old_length = loca_table->GlyphLength(*old_glyph_id);
     GlyphPtr glyph;
-    glyph.attach(glyph_table->glyph(old_offset, old_length));
-    ReadableFontDataPtr data = glyph->readFontData();
+    glyph.Attach(glyph_table->GetGlyph(old_offset, old_length));
+    ReadableFontDataPtr data = glyph->ReadFontData();
     WritableFontDataPtr copy_data;
-    copy_data.attach(font_builder->getNewData(data->length()));
-    data->copyTo(copy_data);
+    copy_data.Attach(font_builder->GetNewData(data->Length()));
+    data->CopyTo(copy_data);
     GlyphBuilderPtr glyph_builder;
-    glyph_builder.attach(glyph_table_builder->glyphBuilder(copy_data));
+    glyph_builder.Attach(glyph_table_builder->GlyphBuilder(copy_data));
     glyph_builders->push_back(glyph_builder);
   }
   IntegerList loca_list;
-  glyph_table_builder->generateLocaList(&loca_list);
-  loca_table_builder->setLocaList(&loca_list);
+  glyph_table_builder->GenerateLocaList(&loca_list);
+  loca_table_builder->SetLocaList(&loca_list);
   return true;
 }
 
diff --git a/sfntly/tools/subsetter/glyph_table_subsetter.h b/sfntly/tools/subsetter/glyph_table_subsetter.h
index 14e3c3d..3687e27 100644
--- a/sfntly/tools/subsetter/glyph_table_subsetter.h
+++ b/sfntly/tools/subsetter/glyph_table_subsetter.h
@@ -27,7 +27,8 @@
   GlyphTableSubsetter();
   virtual ~GlyphTableSubsetter();
 
-  virtual bool subset(Subsetter* subsetter, Font* font,
+  virtual bool Subset(Subsetter* subsetter,
+                      Font* font,
                       Font::Builder* font_builder);
 };
 
diff --git a/sfntly/tools/subsetter/subsetter.h b/sfntly/tools/subsetter/subsetter.h
index 01308b5..df417ad 100644
--- a/sfntly/tools/subsetter/subsetter.h
+++ b/sfntly/tools/subsetter/subsetter.h
@@ -31,7 +31,7 @@
   Subsetter(Font* font, FontFactory* font_factory);
   virtual ~Subsetter();
 
-  virtual void setGlyphs(IntegerList* glyphs);
+  virtual void SetGlyphs(IntegerList* glyphs);
 
   // Set the cmaps to be used in the subsetted font. The cmaps are listed in
   // order of priority and the number parameter gives a count of how many of the
@@ -49,12 +49,12 @@
   //     into the subsetted font.
   // @param cmapIds the cmap ids to use for the subsetted font
   // @param number the maximum number of cmaps to place in the subsetted font
-  virtual void setCMaps(CMapIdList* cmap_ids, int32_t number);
+  virtual void SetCMaps(CMapIdList* cmap_ids, int32_t number);
 
-  virtual void setRemoveTables(IntegerSet* remove_tables);
-  virtual CALLER_ATTACH Font::Builder* subset();
-  virtual IntegerList* glyphPermutationTable();
-  virtual CMapIdList* cmapId();
+  virtual void SetRemoveTables(IntegerSet* remove_tables);
+  virtual CALLER_ATTACH Font::Builder* Subset();
+  virtual IntegerList* GlyphPermutationTable();
+  virtual CMapIdList* CMapId();
 
  private:
   FontPtr font_;
diff --git a/sfntly/tools/subsetter/table_subsetter.h b/sfntly/tools/subsetter/table_subsetter.h
index 9565da6..437705c 100644
--- a/sfntly/tools/subsetter/table_subsetter.h
+++ b/sfntly/tools/subsetter/table_subsetter.h
@@ -26,9 +26,9 @@
 class Subsetter;
 class TableSubsetter : virtual public RefCount {
  public:
-  virtual IntegerSet* tagsHandled() = 0;
-  virtual bool tagHandled(int32_t tag) = 0;
-  virtual bool subset(Subsetter* subsetter, Font* font,
+  virtual IntegerSet* TagsHandled() = 0;
+  virtual bool TagHandled(int32_t tag) = 0;
+  virtual bool Subset(Subsetter* subsetter, Font* font,
                       Font::Builder* font_builder) = 0;
 };
 typedef Ptr<TableSubsetter> TableSubsetterPtr;
diff --git a/sfntly/tools/subsetter/table_subsetter_impl.cc b/sfntly/tools/subsetter/table_subsetter_impl.cc
index 481f10f..f239c78 100644
--- a/sfntly/tools/subsetter/table_subsetter_impl.cc
+++ b/sfntly/tools/subsetter/table_subsetter_impl.cc
@@ -27,11 +27,11 @@
 
 TableSubsetterImpl::~TableSubsetterImpl() {}
 
-bool TableSubsetterImpl::tagHandled(int32_t tag) {
+bool TableSubsetterImpl::TagHandled(int32_t tag) {
   return tags_.find(tag) != tags_.end();
 }
 
-IntegerSet* TableSubsetterImpl::tagsHandled() {
+IntegerSet* TableSubsetterImpl::TagsHandled() {
   return &tags_;
 }
 
diff --git a/sfntly/tools/subsetter/table_subsetter_impl.h b/sfntly/tools/subsetter/table_subsetter_impl.h
index 7fabba8..162464a 100644
--- a/sfntly/tools/subsetter/table_subsetter_impl.h
+++ b/sfntly/tools/subsetter/table_subsetter_impl.h
@@ -25,8 +25,8 @@
  public:
   TableSubsetterImpl(const int32_t* tags, size_t tags_length);
   virtual ~TableSubsetterImpl();
-  virtual bool tagHandled(int32_t tag);
-  virtual IntegerSet* tagsHandled();
+  virtual bool TagHandled(int32_t tag);
+  virtual IntegerSet* TagsHandled();
 
  protected:
   IntegerSet tags_;
diff --git a/test/byte_array_test.cc b/test/byte_array_test.cc
index 7c6efa9..89478f4 100644
--- a/test/byte_array_test.cc
+++ b/test/byte_array_test.cc
@@ -27,50 +27,50 @@
 const int32_t BYTE_ARRAY_SIZES[] =
     {1, 7, 127, 128, 129, 255, 256, 257, 666, 1023, 10000, 0xffff, 0x10000};
 
-void fillTestByteArray(ByteArray* ba, int32_t size) {
+void FillTestByteArray(ByteArray* ba, int32_t size) {
   for (int32_t i = 0; i < size; ++i) {
-    ba->put(i, (byte_t)(i % 256));
+    ba->Put(i, (byte_t)(i % 256));
   }
 }
 
-void readByteArrayWithBuffer(ByteArray* ba, ByteVector* buffer, ByteVector* b) {
-  b->resize(ba->length());
+void ReadByteArrayWithBuffer(ByteArray* ba, ByteVector* buffer, ByteVector* b) {
+  b->resize(ba->Length());
   int32_t index = 0;
-  while (index < ba->length()) {
-    int32_t bytes_read = ba->get(index, buffer);
+  while (index < ba->Length()) {
+    int32_t bytes_read = ba->Get(index, buffer);
     std::copy(buffer->begin(), buffer->begin() + bytes_read,
               b->begin() + index);
     index += bytes_read;
   }
 }
 
-void readByteArrayWithSlidingWindow(ByteArray* ba, int window_size,
+void ReadByteArrayWithSlidingWindow(ByteArray* ba, int window_size,
                                     ByteVector* b) {
-  b->resize(ba->length());
+  b->resize(ba->Length());
   int32_t index = 0;
   int32_t actual_window_size = window_size;
-  while (index < ba->length()) {
+  while (index < ba->Length()) {
     actual_window_size =
         std::min<int32_t>(actual_window_size, b->size() - index);
-    int32_t bytes_read = ba->get(index, b, index, actual_window_size);
+    int32_t bytes_read = ba->Get(index, b, index, actual_window_size);
     index += bytes_read;
   }
 }
 
-bool readComparison(ByteArray* ba1, ByteArray* ba2) {
+bool ReadComparison(ByteArray* ba1, ByteArray* ba2) {
   // single byte reads
-  for (int i = 0; i < ba1->length(); ++i) {
-    EXPECT_EQ(ba1->get(i), ba2->get(i));
+  for (int i = 0; i < ba1->Length(); ++i) {
+    EXPECT_EQ(ba1->Get(i), ba2->Get(i));
   }
 
   ByteVector b1, b2;
   // buffer reads
-  int increments = std::max<int32_t>(ba1->length() / 11, 1);
-  for (int buffer_size = 1; buffer_size < ba1->length();
+  int increments = std::max<int32_t>(ba1->Length() / 11, 1);
+  for (int buffer_size = 1; buffer_size < ba1->Length();
        buffer_size += increments) {
     ByteVector buffer(buffer_size);
-    readByteArrayWithBuffer(ba1, &buffer, &b1);
-    readByteArrayWithBuffer(ba2, &buffer, &b2);
+    ReadByteArrayWithBuffer(ba1, &buffer, &b1);
+    ReadByteArrayWithBuffer(ba2, &buffer, &b2);
     EXPECT_GT(b1.size(), static_cast<size_t>(0));
     EXPECT_EQ(b1.size(), b2.size());
     EXPECT_TRUE(std::equal(b1.begin(), b1.end(), b2.begin()));
@@ -79,10 +79,10 @@
   // sliding window reads
   b1.clear();
   b2.clear();
-  for (int window_size = 1; window_size < ba1->length();
+  for (int window_size = 1; window_size < ba1->Length();
        window_size += increments) {
-    readByteArrayWithSlidingWindow(ba1, window_size, &b1);
-    readByteArrayWithSlidingWindow(ba2, window_size, &b2);
+    ReadByteArrayWithSlidingWindow(ba1, window_size, &b1);
+    ReadByteArrayWithSlidingWindow(ba2, window_size, &b2);
     EXPECT_GT(b1.size(), static_cast<size_t>(0));
     EXPECT_EQ(b1.size(), b2.size());
     EXPECT_TRUE(std::equal(b1.begin(), b1.end(), b2.begin()));
@@ -91,46 +91,46 @@
   return true;
 }
 
-bool copyTest(ByteArray* ba) {
-  ByteArrayPtr fixed_copy = new MemoryByteArray(ba->length());
-  ba->copyTo(fixed_copy);
-  EXPECT_EQ(ba->length(), fixed_copy->length());
-  EXPECT_TRUE(readComparison(ba, fixed_copy));
+bool CopyTest(ByteArray* ba) {
+  ByteArrayPtr fixed_copy = new MemoryByteArray(ba->Length());
+  ba->CopyTo(fixed_copy);
+  EXPECT_EQ(ba->Length(), fixed_copy->Length());
+  EXPECT_TRUE(ReadComparison(ba, fixed_copy));
 
   ByteArrayPtr growable_copy = new GrowableMemoryByteArray();
-  ba->copyTo(growable_copy);
-  EXPECT_EQ(ba->length(), growable_copy->length());
-  EXPECT_TRUE(readComparison(ba, growable_copy));
+  ba->CopyTo(growable_copy);
+  EXPECT_EQ(ba->Length(), growable_copy->Length());
+  EXPECT_TRUE(ReadComparison(ba, growable_copy));
 
   return true;
 }
 
-bool byteArrayTester(ByteArray* ba) {
-  return copyTest(ba);
+bool ByteArrayTester(ByteArray* ba) {
+  return CopyTest(ba);
 }
 
 }  // namespace byte_array_test
 
-bool testMemoryByteArray() {
+bool TestMemoryByteArray() {
   for (size_t i = 0;
        i < sizeof(byte_array_test::BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
     int32_t size = byte_array_test::BYTE_ARRAY_SIZES[i];
     fprintf(stderr, "fixed mem: iteration %ld, size %d\n", i, size);
     ByteArrayPtr ba = new MemoryByteArray(size);
-    byte_array_test::fillTestByteArray(ba, size);
-    EXPECT_TRUE(byte_array_test::byteArrayTester(ba));
+    byte_array_test::FillTestByteArray(ba, size);
+    EXPECT_TRUE(byte_array_test::ByteArrayTester(ba));
   }
   return true;
 }
 
-bool testGrowableMemoryByteArray() {
+bool TestGrowableMemoryByteArray() {
   for (size_t i = 0;
        i < sizeof(byte_array_test::BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
     int32_t size = byte_array_test::BYTE_ARRAY_SIZES[i];
     fprintf(stderr, "growable mem: iteration %ld, size %d\n", i, size);
     ByteArrayPtr ba = new GrowableMemoryByteArray();
-    byte_array_test::fillTestByteArray(ba, size);
-    EXPECT_TRUE(byte_array_test::byteArrayTester(ba));
+    byte_array_test::FillTestByteArray(ba, size);
+    EXPECT_TRUE(byte_array_test::ByteArrayTester(ba));
   }
   return true;
 }
diff --git a/test/byte_array_test.h b/test/byte_array_test.h
index 0d67ca8..88e8ce8 100644
--- a/test/byte_array_test.h
+++ b/test/byte_array_test.h
@@ -19,8 +19,8 @@
 
 namespace sfntly {
 
-bool testMemoryByteArray();
-bool testGrowableMemoryByteArray();
+bool TestMemoryByteArray();
+bool TestGrowableMemoryByteArray();
 
 }  // namespace sfntly
 
diff --git a/test/endian_test.cc b/test/endian_test.cc
index 887fed5..50beeeb 100644
--- a/test/endian_test.cc
+++ b/test/endian_test.cc
@@ -25,7 +25,7 @@
 
 namespace sfntly {
 
-bool testEndian() {
+bool TestEndian() {
   byte_t test_data[] = {
       0x68, 0x65, 0x61, 0x64,  // 0: head
       0xca, 0xca, 0xca, 0xca,  // 4: ubyte, byte, char
@@ -38,35 +38,35 @@
 
   ByteArrayPtr ba1 = new GrowableMemoryByteArray();
   for (size_t i = 0; i < sizeof(test_data); ++i) {
-    ba1->put(i, test_data[i]);
+    ba1->Put(i, test_data[i]);
   }
   ReadableFontDataPtr rfd = new ReadableFontData(ba1);
-  EXPECT_EQ(rfd->readULongAsInt(0), Tag::head);
-  EXPECT_EQ(rfd->readUByte(4), 202);
-  EXPECT_EQ(rfd->readByte(5), -54);
-  EXPECT_EQ(rfd->readChar(6), 202);
-  EXPECT_EQ(rfd->readUShort(8), 24);
-  EXPECT_EQ(rfd->readShort(10), -32744);
-  EXPECT_EQ(rfd->readUInt24(12), 24);
-  EXPECT_EQ(rfd->readULong(16), 24);
-  EXPECT_EQ(rfd->readLong(20), -256);
-  EXPECT_EQ(rfd->readFixed(24), Fixed1616::fixed(1, 0));
+  EXPECT_EQ(rfd->ReadULongAsInt(0), Tag::head);
+  EXPECT_EQ(rfd->ReadUByte(4), 202);
+  EXPECT_EQ(rfd->ReadByte(5), -54);
+  EXPECT_EQ(rfd->ReadChar(6), 202);
+  EXPECT_EQ(rfd->ReadUShort(8), 24);
+  EXPECT_EQ(rfd->ReadShort(10), -32744);
+  EXPECT_EQ(rfd->ReadUInt24(12), 24);
+  EXPECT_EQ(rfd->ReadULong(16), 24);
+  EXPECT_EQ(rfd->ReadLong(20), -256);
+  EXPECT_EQ(rfd->ReadFixed(24), Fixed1616::Fixed(1, 0));
 
   MemoryOutputStream os;
   FontOutputStream fos(&os);
-  fos.writeULong(Tag::head);
-  fos.write(202);
-  fos.write(202);
-  fos.write(202);
-  fos.write(202);
-  fos.writeUShort(24);
-  fos.writeShort(-32744);
-  fos.writeUInt24(24);
-  fos.writeChar(0);
-  fos.writeULong(24);
-  fos.writeLong(-256);
-  fos.writeFixed(Fixed1616::fixed(1, 0));
-  EXPECT_EQ(memcmp(os.get(), test_data, sizeof(test_data)), 0);
+  fos.WriteULong(Tag::head);
+  fos.Write(202);
+  fos.Write(202);
+  fos.Write(202);
+  fos.Write(202);
+  fos.WriteUShort(24);
+  fos.WriteShort(-32744);
+  fos.WriteUInt24(24);
+  fos.WriteChar(0);
+  fos.WriteULong(24);
+  fos.WriteLong(-256);
+  fos.WriteFixed(Fixed1616::Fixed(1, 0));
+  EXPECT_EQ(memcmp(os.Get(), test_data, sizeof(test_data)), 0);
 
   return true;
 }
diff --git a/test/endian_test.h b/test/endian_test.h
index ce96251..8fc36ff 100644
--- a/test/endian_test.h
+++ b/test/endian_test.h
@@ -19,7 +19,7 @@
 
 namespace sfntly {
 
-bool testEndian();
+bool TestEndian();
 
 }  // namespace sfntly
 
diff --git a/test/file_io_test.cc b/test/file_io_test.cc
index 1c02b0a..6c48a27 100644
--- a/test/file_io_test.cc
+++ b/test/file_io_test.cc
@@ -23,7 +23,7 @@
 
 namespace sfntly {
 
-bool testFileInputStream() {
+bool TestFileInputStream() {
   FILE* file_handle = NULL;
 #if defined (WIN32)
   fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
@@ -44,47 +44,47 @@
 
   // Full file reading test
   FileInputStream is;
-  is.open(SAMPLE_TTF_FILE);
-  EXPECT_EQ(length, (size_t)is.available());
+  is.Open(SAMPLE_TTF_FILE);
+  EXPECT_EQ(length, (size_t)is.Available());
   ByteVector b2;
-  is.read(&b2, 0, length);
-  is.close();
+  is.Read(&b2, 0, length);
+  is.Close();
   EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
   b2.clear();
 
   // Partial reading test
-  is.open(SAMPLE_TTF_FILE);
-  is.skip(89);
-  is.read(&b2, 0, 100);
+  is.Open(SAMPLE_TTF_FILE);
+  is.Skip(89);
+  is.Read(&b2, 0, 100);
   EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
   b2.clear();
 
   // Skip test
-  is.skip(-89);
-  is.read(&b2, 0, 100);
+  is.Skip(-89);
+  is.Read(&b2, 0, 100);
   EXPECT_EQ(memcmp(&(b1[100]), &(b2[0]), 100), 0);
   b2.clear();
-  is.skip(100);
-  is.read(&b2, 0, 100);
+  is.Skip(100);
+  is.Read(&b2, 0, 100);
   EXPECT_EQ(memcmp(&(b1[300]), &(b2[0]), 100), 0);
-  is.skip(-400);
+  is.Skip(-400);
   b2.clear();
 
   // Offset test
-  is.read(&b2, 0, 100);
-  is.read(&b2, 100, 100);
+  is.Read(&b2, 0, 100);
+  is.Read(&b2, 100, 100);
   EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), 200), 0);
 
   // Unread test
   ByteVector b3;
   b3.resize(200);
-  is.unread(&b3);
+  is.Unread(&b3);
   EXPECT_EQ(memcmp(&(b3[0]), &(b2[0]), 200), 0);
 
   return true;
 }
 
-bool testFontInputStreamBasic() {
+bool TestFontInputStreamBasic() {
   FILE* file_handle = NULL;
 #if defined (WIN32)
   fopen_s(&file_handle, SAMPLE_TTF_FILE, "rb");
@@ -104,47 +104,47 @@
   fclose(file_handle);
 
   FileInputStream is;
-  is.open(SAMPLE_TTF_FILE);
+  is.Open(SAMPLE_TTF_FILE);
   FontInputStream font_is1(&is);
-  EXPECT_EQ((size_t)font_is1.available(), length);
+  EXPECT_EQ((size_t)font_is1.Available(), length);
 
   ByteVector b2;
-  font_is1.read(&b2, 0, length);
-  font_is1.close();
+  font_is1.Read(&b2, 0, length);
+  font_is1.Close();
   EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), length), 0);
   b2.clear();
 
-  is.open(SAMPLE_TTF_FILE);
-  is.skip(89);
+  is.Open(SAMPLE_TTF_FILE);
+  is.Skip(89);
   FontInputStream font_is2(&is, 200);
-  font_is2.read(&b2, 0, 100);
+  font_is2.Read(&b2, 0, 100);
   EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
-  font_is2.read(&b2, 100, 100);
+  font_is2.Read(&b2, 100, 100);
   EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 200), 0);
   b2.clear();
-  font_is2.skip(-200);
-  font_is2.read(&b2, 0, 100);
+  font_is2.Skip(-200);
+  font_is2.Read(&b2, 0, 100);
   EXPECT_EQ(memcmp(&(b1[89]), &(b2[0]), 100), 0);
 
   return true;
 }
 
-bool testFontInputStreamTableLoading() {
+bool TestFontInputStreamTableLoading() {
   FileInputStream is;
-  is.open(SAMPLE_TTF_FILE);
+  is.Open(SAMPLE_TTF_FILE);
   FontInputStream font_is(&is);
 
-  font_is.skip(TTF_OFFSET[SAMPLE_TTF_GDEF]);
+  font_is.Skip(TTF_OFFSET[SAMPLE_TTF_GDEF]);
   FontInputStream gdef_is(&font_is, TTF_LENGTH[SAMPLE_TTF_GDEF]);
   ByteVector gdef_data;
-  gdef_is.read(&gdef_data, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
+  gdef_is.Read(&gdef_data, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
   EXPECT_EQ(memcmp(&(gdef_data[0]), TTF_GDEF_DATA,
                    TTF_LENGTH[SAMPLE_TTF_GDEF]), 0);
 
-  font_is.skip(TTF_OFFSET[SAMPLE_TTF_HEAD] - font_is.position());
+  font_is.Skip(TTF_OFFSET[SAMPLE_TTF_HEAD] - font_is.position());
   FontInputStream head_is(&font_is, TTF_LENGTH[SAMPLE_TTF_HEAD]);
   ByteVector head_data;
-  head_is.read(&head_data, 0, TTF_LENGTH[SAMPLE_TTF_HEAD]);
+  head_is.Read(&head_data, 0, TTF_LENGTH[SAMPLE_TTF_HEAD]);
   EXPECT_EQ(memcmp(&(head_data[0]), TTF_HEAD_DATA,
                    TTF_LENGTH[SAMPLE_TTF_HEAD]), 0);
 
diff --git a/test/file_io_test.h b/test/file_io_test.h
index ab5c109..9ff1972 100644
--- a/test/file_io_test.h
+++ b/test/file_io_test.h
@@ -19,9 +19,9 @@
 
 namespace sfntly {
 
-bool testFileInputStream();
-bool testFontInputStreamBasic();
-bool testFontInputStreamTableLoading();
+bool TestFileInputStream();
+bool TestFontInputStreamBasic();
+bool TestFontInputStreamTableLoading();
 
 }  // namespace sfntly
 
diff --git a/test/font_data_test.cc b/test/font_data_test.cc
index ad30522..3686856 100644
--- a/test/font_data_test.cc
+++ b/test/font_data_test.cc
@@ -28,87 +28,91 @@
 const int32_t BYTE_ARRAY_SIZES[] =
     {1, 7, 127, 128, 129, 255, 256, 257, 666, 1023, 0x10000};
 
-void fillTestByteArray(ByteArray* ba, int32_t size) {
+void FillTestByteArray(ByteArray* ba, int32_t size) {
   for (int32_t i = 0; i < size; ++i) {
-    ba->put(i, (byte_t)(i % 256));
+    ba->Put(i, (byte_t)(i % 256));
   }
 }
 
-void readFontDataWithSingleByte(ReadableFontData* rfd, ByteVector* buffer) {
-  buffer->resize(rfd->length());
-  for (int32_t index = 0; index < rfd->length(); ++index) {
-    (*buffer)[index] = (byte_t)(rfd->readByte(index));
+void ReadFontDataWithSingleByte(ReadableFontData* rfd, ByteVector* buffer) {
+  buffer->resize(rfd->Length());
+  for (int32_t index = 0; index < rfd->Length(); ++index) {
+    (*buffer)[index] = (byte_t)(rfd->ReadByte(index));
   }
 }
 
-void readFontDataWithBuffer(ReadableFontData* rfd, int32_t buffer_size,
+void ReadFontDataWithBuffer(ReadableFontData* rfd,
+                            int32_t buffer_size,
                             ByteVector* b) {
   ByteVector buffer(buffer_size);
-  b->resize(rfd->length());
+  b->resize(rfd->Length());
 
   int32_t index = 0;
-  while (index < rfd->length()) {
-    int32_t bytes_read = rfd->readBytes(index, &buffer, 0, buffer.size());
+  while (index < rfd->Length()) {
+    int32_t bytes_read = rfd->ReadBytes(index, &buffer, 0, buffer.size());
     EXPECT_GE(bytes_read, 0);
     std::copy(buffer.begin(), buffer.begin() + bytes_read, b->begin() + index);
     index += bytes_read;
   }
 }
 
-void readFontDataWithSlidingWindow(ReadableFontData* rfd, int32_t window_size,
+void ReadFontDataWithSlidingWindow(ReadableFontData* rfd, int32_t window_size,
                                    ByteVector* b) {
-  b->resize(rfd->length());
+  b->resize(rfd->Length());
   int32_t index = 0;
-  while (index < rfd->length()) {
+  while (index < rfd->Length()) {
     int32_t actual_window_size =
         std::min<int32_t>(window_size, b->size() - index);
-    int32_t bytes_read = rfd->readBytes(index, b, index, actual_window_size);
+    int32_t bytes_read = rfd->ReadBytes(index, b, index, actual_window_size);
     EXPECT_GE(bytes_read, 0);
     index += bytes_read;
   }
 }
 
-void writeFontDataWithSingleByte(ReadableFontData* rfd, WritableFontData* wfd) {
-  for (int32_t index = 0; index < rfd->length(); ++index) {
-    byte_t b = (byte_t)(rfd->readByte(index));
-    wfd->writeByte(index, b);
+void WriteFontDataWithSingleByte(ReadableFontData* rfd, WritableFontData* wfd) {
+  for (int32_t index = 0; index < rfd->Length(); ++index) {
+    byte_t b = (byte_t)(rfd->ReadByte(index));
+    wfd->WriteByte(index, b);
   }
 }
 
-void writeFontDataWithBuffer(ReadableFontData* rfd, WritableFontData* wfd,
+void WriteFontDataWithBuffer(ReadableFontData* rfd,
+                             WritableFontData* wfd,
                              int32_t buffer_size) {
   ByteVector buffer(buffer_size);
   int32_t index = 0;
-  while (index < rfd->length()) {
-    int32_t bytesRead = rfd->readBytes(index, &buffer, 0, buffer.size());
-    wfd->writeBytes(index, &buffer, 0, buffer.size());
+  while (index < rfd->Length()) {
+    int32_t bytesRead = rfd->ReadBytes(index, &buffer, 0, buffer.size());
+    wfd->WriteBytes(index, &buffer, 0, buffer.size());
     index += bytesRead;
   }
 }
 
-void writeFontDataWithSlidingWindow(ReadableFontData* rfd,
+void WriteFontDataWithSlidingWindow(ReadableFontData* rfd,
                                     WritableFontData* wfd,
                                     int32_t window_size) {
-  ByteVector b(rfd->length());
+  ByteVector b(rfd->Length());
   int32_t index = 0;
-  while (index < rfd->length()) {
+  while (index < rfd->Length()) {
     int32_t sliding_size = std::min<int32_t>(window_size, b.size() - index);
-    int32_t bytes_read = rfd->readBytes(index, &b, index, sliding_size);
-    wfd->writeBytes(index, &b, index, sliding_size);
+    int32_t bytes_read = rfd->ReadBytes(index, &b, index, sliding_size);
+    wfd->WriteBytes(index, &b, index, sliding_size);
     index += bytes_read;
   }
 }
 
-bool readComparison(int32_t offset, int32_t length, ReadableFontData* rfd1,
+bool ReadComparison(int32_t offset,
+                    int32_t length,
+                    ReadableFontData* rfd1,
                     ReadableFontData* rfd2) {
-  EXPECT_TRUE(length == rfd2->length());
+  EXPECT_TRUE(length == rfd2->Length());
   ByteVector b1, b2;
   b1.resize(length);
   b2.resize(length);
 
   // single byte reads
-  readFontDataWithSingleByte(rfd1, &b1);
-  readFontDataWithSingleByte(rfd2, &b2);
+  ReadFontDataWithSingleByte(rfd1, &b1);
+  ReadFontDataWithSingleByte(rfd2, &b2);
   EXPECT_EQ(memcmp(&(b1[offset]), &(b2[0]), length), 0);
 
   // buffer reads
@@ -119,8 +123,8 @@
     b2.clear();
     b1.resize(length);
     b2.resize(length);
-    readFontDataWithBuffer(rfd1, buffer_size, &b1);
-    readFontDataWithBuffer(rfd2, buffer_size, &b2);
+    ReadFontDataWithBuffer(rfd1, buffer_size, &b1);
+    ReadFontDataWithBuffer(rfd2, buffer_size, &b2);
     int result = memcmp(&(b1[offset]), &(b2[0]), length);
     EXPECT_EQ(result, 0);
   }
@@ -132,80 +136,80 @@
     b2.clear();
     b1.resize(length);
     b2.resize(length);
-    readFontDataWithSlidingWindow(rfd1, window_size, &b1);
-    readFontDataWithSlidingWindow(rfd2, window_size, &b2);
+    ReadFontDataWithSlidingWindow(rfd1, window_size, &b1);
+    ReadFontDataWithSlidingWindow(rfd2, window_size, &b2);
     int result = memcmp(&(b1[offset]), &(b2[0]), length);
     EXPECT_EQ(result, 0);
   }
   return true;
 }
 
-void slicingReadTest(ReadableFontData* rfd) {
-  for (int32_t trim = 0; trim < (rfd->length() / 2) + 1;
-       trim += (rfd->length() / 21) + 1) {
+void SlicingReadTest(ReadableFontData* rfd) {
+  for (int32_t trim = 0; trim < (rfd->Length() / 2) + 1;
+       trim += (rfd->Length() / 21) + 1) {
     fprintf(stderr, "\tread - trim = %d\n", trim);
-    int32_t length = rfd->length() - 2 * trim;
+    int32_t length = rfd->Length() - 2 * trim;
     ReadableFontDataPtr slice;
-    slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
-    EXPECT_TRUE(readComparison(trim, length, rfd, slice));
+    slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+    EXPECT_TRUE(ReadComparison(trim, length, rfd, slice));
   }
 }
 
-void slicingWriteTest(ReadableFontData* rfd, WritableFontData* wfd) {
-  for (int32_t trim = 0; trim < (rfd->length() / 2) + 1;
-       trim += (rfd->length() / 21) + 1) {
+void SlicingWriteTest(ReadableFontData* rfd, WritableFontData* wfd) {
+  for (int32_t trim = 0; trim < (rfd->Length() / 2) + 1;
+       trim += (rfd->Length() / 21) + 1) {
     fprintf(stderr, "\twrite - trim = %d\n", trim);
-    int32_t length = rfd->length() - 2 * trim;
+    int32_t length = rfd->Length() - 2 * trim;
     WritableFontDataPtr w_slice;
     ReadableFontDataPtr r_slice;
 
     // single byte writes
-    w_slice.attach(down_cast<WritableFontData*>(wfd->slice(trim, length)));
-    r_slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
-    writeFontDataWithSingleByte(r_slice, w_slice);
-    EXPECT_TRUE(readComparison(trim, length, rfd, w_slice));
+    w_slice.Attach(down_cast<WritableFontData*>(wfd->Slice(trim, length)));
+    r_slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+    WriteFontDataWithSingleByte(r_slice, w_slice);
+    EXPECT_TRUE(ReadComparison(trim, length, rfd, w_slice));
 
     // buffer writes
     int32_t increments = std::max<int32_t>(length / 11, 1);
     for (int32_t buffer_size = 1; buffer_size < length;
          buffer_size += increments) {
-      w_slice.attach(down_cast<WritableFontData*>(wfd->slice(trim, length)));
-      r_slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
-      writeFontDataWithBuffer(r_slice, w_slice, buffer_size);
-      EXPECT_TRUE(readComparison(trim, length, rfd, w_slice));
+      w_slice.Attach(down_cast<WritableFontData*>(wfd->Slice(trim, length)));
+      r_slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+      WriteFontDataWithBuffer(r_slice, w_slice, buffer_size);
+      EXPECT_TRUE(ReadComparison(trim, length, rfd, w_slice));
     }
 
     // sliding window writes
     for (int window_size = 1; window_size < length; window_size += increments) {
-      w_slice.attach(down_cast<WritableFontData*>(wfd->slice(trim, length)));
-      r_slice.attach(down_cast<ReadableFontData*>(rfd->slice(trim, length)));
-      writeFontDataWithSlidingWindow(r_slice, w_slice, window_size);
-      EXPECT_TRUE(readComparison(trim, length, rfd, w_slice));
+      w_slice.Attach(down_cast<WritableFontData*>(wfd->Slice(trim, length)));
+      r_slice.Attach(down_cast<ReadableFontData*>(rfd->Slice(trim, length)));
+      WriteFontDataWithSlidingWindow(r_slice, w_slice, window_size);
+      EXPECT_TRUE(ReadComparison(trim, length, rfd, w_slice));
     }
   }
 }
 
-bool testReadableFontData() {
+bool TestReadableFontData() {
   for (size_t i = 0; i < sizeof(BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
     int32_t size = BYTE_ARRAY_SIZES[i];
     ByteArrayPtr ba = new MemoryByteArray(size);
-    fillTestByteArray(ba, size);
+    FillTestByteArray(ba, size);
     ReadableFontDataPtr rfd = new ReadableFontData(ba);
-    slicingReadTest(rfd);
+    SlicingReadTest(rfd);
   }
   return true;
 }
 
-bool testWritableFontData() {
+bool TestWritableFontData() {
   for (size_t i = 0; i < sizeof(BYTE_ARRAY_SIZES) / sizeof(int32_t); ++i) {
     int32_t size = BYTE_ARRAY_SIZES[i];
     ByteArrayPtr ba = new MemoryByteArray(size);
-    fillTestByteArray(ba, size);
+    FillTestByteArray(ba, size);
     WritableFontDataPtr wfd = new WritableFontData(ba);
-    slicingReadTest(wfd);
+    SlicingReadTest(wfd);
     ByteArrayPtr temp = new MemoryByteArray(size);
     WritableFontDataPtr wfd_copy = new WritableFontData(temp);
-    slicingWriteTest(wfd, wfd_copy);
+    SlicingWriteTest(wfd, wfd_copy);
   }
   return true;
 }
diff --git a/test/font_data_test.h b/test/font_data_test.h
index 78e910d..bca1924 100644
--- a/test/font_data_test.h
+++ b/test/font_data_test.h
@@ -18,8 +18,8 @@
 #define TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_FONT_DATA_TEST_H_
 
 namespace sfntly {
-  bool testReadableFontData();
-  bool testWritableFontData();
+  bool TestReadableFontData();
+  bool TestWritableFontData();
 }
 
 #endif  // TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_FONT_DATA_TEST_H_
diff --git a/test/font_parsing_test.cc b/test/font_parsing_test.cc
index 3c9f732..71446ec 100644
--- a/test/font_parsing_test.cc
+++ b/test/font_parsing_test.cc
@@ -30,52 +30,52 @@
 
 namespace sfntly {
 
-bool testFontParsing() {
+bool TestFontParsing() {
   ByteVector input_buffer;
-  loadFile(SAMPLE_TTF_FILE, &input_buffer);
+  LoadFile(SAMPLE_TTF_FILE, &input_buffer);
   ByteArrayPtr ba = new MemoryByteArray(&(input_buffer[0]),
                                         input_buffer.size());
 
-  FontFactoryPtr factory = FontFactory::getInstance();
+  FontFactoryPtr factory = FontFactory::GetInstance();
   // File based
   FontBuilderArray font_builder_array;
-  builderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
+  BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
   // Memory based
   FontBuilderArray font_builder_array2;
-  factory->loadFontsForBuilding(ba, &font_builder_array2);
+  factory->LoadFontsForBuilding(ba, &font_builder_array2);
   FontBuilderPtr font_builder2 = font_builder_array2[0];
 
   for (size_t i = 0; i < SAMPLE_TTF_KNOWN_TAGS; ++i) {
-    EXPECT_TRUE(font_builder->hasTableBuilder(TTF_KNOWN_TAGS[i]));
-    EXPECT_TRUE(font_builder2->hasTableBuilder(TTF_KNOWN_TAGS[i]));
+    EXPECT_TRUE(font_builder->HasTableBuilder(TTF_KNOWN_TAGS[i]));
+    EXPECT_TRUE(font_builder2->HasTableBuilder(TTF_KNOWN_TAGS[i]));
   }
 
   // Generic table
   Ptr<Table::GenericTableBuilder> gdef_builder =
       down_cast<Table::GenericTableBuilder*>(
-          font_builder->getTableBuilder(Tag::GDEF));
+          font_builder->GetTableBuilder(Tag::GDEF));
   Ptr<Table::Header> gdef_header = gdef_builder->header();
   EXPECT_EQ(gdef_header->length(), TTF_LENGTH[SAMPLE_TTF_GDEF]);
   EXPECT_EQ(gdef_header->offset(), TTF_OFFSET[SAMPLE_TTF_GDEF]);
   EXPECT_EQ(gdef_header->checksum(), TTF_CHECKSUM[SAMPLE_TTF_GDEF]);
-  EXPECT_TRUE(gdef_header->checksumValid());
+  EXPECT_TRUE(gdef_header->checksum_valid());
 
-  WritableFontDataPtr wfd = gdef_builder->data();
+  WritableFontDataPtr wfd = gdef_builder->Data();
   ByteVector b;
   b.resize(TTF_LENGTH[SAMPLE_TTF_GDEF]);
-  wfd->readBytes(0, &b, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
+  wfd->ReadBytes(0, &b, 0, TTF_LENGTH[SAMPLE_TTF_GDEF]);
   EXPECT_EQ(memcmp(&(b[0]), TTF_GDEF_DATA, TTF_LENGTH[SAMPLE_TTF_GDEF]), 0);
 
   // Header table
   FontHeaderTableBuilderPtr header_builder =
       down_cast<FontHeaderTable::Builder*>(
-          font_builder->getTableBuilder(Tag::head));
+          font_builder->GetTableBuilder(Tag::head));
   Ptr<Table::Header> header_header = header_builder->header();
   EXPECT_EQ(header_header->length(), TTF_LENGTH[SAMPLE_TTF_HEAD]);
   EXPECT_EQ(header_header->offset(), TTF_OFFSET[SAMPLE_TTF_HEAD]);
   EXPECT_EQ(header_header->checksum(), TTF_CHECKSUM[SAMPLE_TTF_HEAD]);
-  EXPECT_TRUE(header_header->checksumValid());
+  EXPECT_TRUE(header_header->checksum_valid());
 
   // Data conformance
   for (size_t i = 0; i < SAMPLE_TTF_KNOWN_TAGS; ++i) {
@@ -83,46 +83,46 @@
     b1.resize(TTF_LENGTH[i]);
     b2.resize(TTF_LENGTH[i]);
     TableBuilderPtr builder1 =
-        font_builder->getTableBuilder(TTF_KNOWN_TAGS[i]);
+        font_builder->GetTableBuilder(TTF_KNOWN_TAGS[i]);
     TableBuilderPtr builder2 =
-        font_builder2->getTableBuilder(TTF_KNOWN_TAGS[i]);
-    WritableFontDataPtr wfd1 = builder1->data();
-    WritableFontDataPtr wfd2 = builder2->data();
-    wfd1->readBytes(0, &b1, 0, TTF_LENGTH[i]);
-    wfd2->readBytes(0, &b2, 0, TTF_LENGTH[i]);
+        font_builder2->GetTableBuilder(TTF_KNOWN_TAGS[i]);
+    WritableFontDataPtr wfd1 = builder1->Data();
+    WritableFontDataPtr wfd2 = builder2->Data();
+    wfd1->ReadBytes(0, &b1, 0, TTF_LENGTH[i]);
+    wfd2->ReadBytes(0, &b2, 0, TTF_LENGTH[i]);
     EXPECT_EQ(memcmp(&(b1[0]), &(b2[0]), TTF_LENGTH[i]), 0);
   }
 
   return true;
 }
 
-bool testTTFReadWrite() {
-  FontFactoryPtr factory = FontFactory::getInstance();
+bool TestTTFReadWrite() {
+  FontFactoryPtr factory = FontFactory::GetInstance();
   FontBuilderArray font_builder_array;
-  builderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
+  BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
-  FontPtr font = font_builder->build();
+  FontPtr font = font_builder->Build();
   MemoryOutputStream output_stream;
-  factory->serializeFont(font, &output_stream);
-  EXPECT_GE(output_stream.size(), SAMPLE_TTF_SIZE);
+  factory->SerializeFont(font, &output_stream);
+  EXPECT_GE(output_stream.Size(), SAMPLE_TTF_SIZE);
 
   return true;
 }
 
-bool testTTFMemoryBasedReadWrite() {
+bool TestTTFMemoryBasedReadWrite() {
   ByteVector input_buffer;
-  loadFile(SAMPLE_TTF_FILE, &input_buffer);
+  LoadFile(SAMPLE_TTF_FILE, &input_buffer);
 
-  FontFactoryPtr factory = FontFactory::getInstance();
+  FontFactoryPtr factory = FontFactory::GetInstance();
   FontBuilderArray font_builder_array;
   ByteArrayPtr ba = new MemoryByteArray(&(input_buffer[0]),
                                         input_buffer.size());
-  factory->loadFontsForBuilding(ba, &font_builder_array);
+  factory->LoadFontsForBuilding(ba, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
-  FontPtr font = font_builder->build();
+  FontPtr font = font_builder->Build();
   MemoryOutputStream output_stream;
-  factory->serializeFont(font, &output_stream);
-  EXPECT_GE(output_stream.size(), input_buffer.size());
+  factory->SerializeFont(font, &output_stream);
+  EXPECT_GE(output_stream.Size(), input_buffer.size());
 
   return true;
 }
diff --git a/test/font_parsing_test.h b/test/font_parsing_test.h
index d66689f..7b69a27 100644
--- a/test/font_parsing_test.h
+++ b/test/font_parsing_test.h
@@ -19,9 +19,9 @@
 
 namespace sfntly {
 
-bool testFontParsing();
-bool testTTFReadWrite();
-bool testTTFMemoryBasedReadWrite();
+bool TestFontParsing();
+bool TestTTFReadWrite();
+bool TestTTFMemoryBasedReadWrite();
 
 }  // namespace sfntly
 
diff --git a/test/main.cc b/test/main.cc
index 0838b94..2c77eda 100644
--- a/test/main.cc
+++ b/test/main.cc
@@ -35,60 +35,60 @@
 namespace sfntly {
 
 TEST(SmartPointer, All) {
-  EXPECT_TRUE(testSmartPointer());
+  EXPECT_TRUE(TestSmartPointer());
 }
 
 TEST(Endian, All) {
-  EXPECT_TRUE(sfntly::testEndian());
+  EXPECT_TRUE(sfntly::TestEndian());
 }
 
 #if defined RUN_LENGTHY_TESTS
 TEST(ByteArray, All) {
-  EXPECT_TRUE(sfntly::testMemoryByteArray());
-  EXPECT_TRUE(sfntly::testGrowableMemoryByteArray());
+  EXPECT_TRUE(sfntly::TestMemoryByteArray());
+  EXPECT_TRUE(sfntly::TestGrowableMemoryByteArray());
 }
 #endif
 
 #if defined RUN_LENGTHY_TESTS
 TEST(FontData, All) {
-  EXPECT_TRUE(sfntly::testReadableFontData());
-  EXPECT_TRUE(sfntly::testWritableFontData());
+  EXPECT_TRUE(sfntly::TestReadableFontData());
+  EXPECT_TRUE(sfntly::TestWritableFontData());
 }
 #endif
 
 TEST(FileIO, All) {
-  EXPECT_TRUE(sfntly::testFileInputStream());
-  EXPECT_TRUE(sfntly::testFontInputStreamBasic());
-  EXPECT_TRUE(sfntly::testFontInputStreamTableLoading());
+  EXPECT_TRUE(sfntly::TestFileInputStream());
+  EXPECT_TRUE(sfntly::TestFontInputStreamBasic());
+  EXPECT_TRUE(sfntly::TestFontInputStreamTableLoading());
 }
 
 TEST(OpenTypeData, All) {
-  EXPECT_TRUE(sfntly::testOTFRead());
-  EXPECT_TRUE(sfntly::testOTFCopy());
+  EXPECT_TRUE(sfntly::TestOTFRead());
+  EXPECT_TRUE(sfntly::TestOTFCopy());
 }
 
 TEST(FontParsing, All) {
-  EXPECT_TRUE(sfntly::testFontParsing());
-  EXPECT_TRUE(sfntly::testTTFReadWrite());
-  EXPECT_TRUE(sfntly::testTTFMemoryBasedReadWrite());
+  EXPECT_TRUE(sfntly::TestFontParsing());
+  EXPECT_TRUE(sfntly::TestTTFReadWrite());
+  EXPECT_TRUE(sfntly::TestTTFMemoryBasedReadWrite());
 }
 
 TEST(OTFBasicEditing, All) {
-  EXPECT_TRUE(sfntly::testOTFBasicEditing());
+  EXPECT_TRUE(sfntly::TestOTFBasicEditing());
 }
 
 TEST(NameEditing, All) {
-  EXPECT_TRUE(sfntly::testChangeOneName());
-  EXPECT_TRUE(sfntly::testModifyNameTableAndRevert());
-  EXPECT_TRUE(sfntly::testRemoveOneName());
+  EXPECT_TRUE(sfntly::TestChangeOneName());
+  EXPECT_TRUE(sfntly::TestModifyNameTableAndRevert());
+  EXPECT_TRUE(sfntly::TestRemoveOneName());
 }
 
 TEST(TestUtils, Extension) {
-  EXPECT_TRUE(sfntly::testExtension());
+  EXPECT_TRUE(sfntly::TestExtension());
 }
 
 TEST(TestUtils, Encoding) {
-  EXPECT_TRUE(sfntly::testEncoding());
+  EXPECT_TRUE(sfntly::TestEncoding());
 }
 
 }  // namespace sfntly
diff --git a/test/name_editing_test.cc b/test/name_editing_test.cc
index 7b87b78..6822bf0 100644
--- a/test/name_editing_test.cc
+++ b/test/name_editing_test.cc
@@ -36,49 +36,49 @@
 static ByteVector input_buffer;
 static ByteArrayPtr ba;
 
-void loadTestFile(FontFactory* factory, FontBuilderArray* font_builders) {
+void LoadTestFile(FontFactory* factory, FontBuilderArray* font_builders) {
   assert(factory);
   assert(font_builders);
   if (ba == NULL) {
-    loadFile(SAMPLE_TTF_FILE, &input_buffer);
+    LoadFile(SAMPLE_TTF_FILE, &input_buffer);
     ba = new MemoryByteArray(&(input_buffer[0]), input_buffer.size());
   }
 
-  factory->loadFontsForBuilding(ba, font_builders);
+  factory->LoadFontsForBuilding(ba, font_builders);
 }
 
-bool testChangeOneName() {
-  FontFactoryPtr factory = FontFactory::getInstance();
+bool TestChangeOneName() {
+  FontFactoryPtr factory = FontFactory::GetInstance();
   FontBuilderArray font_builder_array;
-  loadTestFile(factory, &font_builder_array);
+  LoadTestFile(factory, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
 
   NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
-      font_builder->getTableBuilder(Tag::name));
+      font_builder->GetTableBuilder(Tag::name));
 
   // Change the font name.
   NameEntryBuilderPtr neb =
-      name_builder->nameBuilder(PlatformId::kWindows,
+      name_builder->NameBuilder(PlatformId::kWindows,
                                 WindowsEncodingId::kUnicodeUCS2,
                                 WindowsLanguageId::kEnglish_UnitedStates,
                                 NameId::kFontFamilyName);
   U_STRING_DECL(new_name, "Timothy", 7);
-  neb->setName(new_name);
+  neb->SetName(new_name);
 
   // Build the font.
-  FontPtr font = font_builder->build();
+  FontPtr font = font_builder->Build();
 
   // Serialize and reload the serialized font.
   MemoryOutputStream os;
-  factory->serializeFont(font, &os);
+  factory->SerializeFont(font, &os);
   FontArray font_array;
-  ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
-  factory->loadFonts(new_ba, &font_array);
+  ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+  factory->LoadFonts(new_ba, &font_array);
   FontPtr new_font = font_array[0];
 
   // Check the font name.
-  NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
-  UChar* name = name_table->name(PlatformId::kWindows,
+  NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
+  UChar* name = name_table->Name(PlatformId::kWindows,
                                  WindowsEncodingId::kUnicodeUCS2,
                                  WindowsLanguageId::kEnglish_UnitedStates,
                                  NameId::kFontFamilyName);
@@ -88,86 +88,86 @@
   return true;
 }
 
-bool testModifyNameTableAndRevert() {
-  FontFactoryPtr factory = FontFactory::getInstance();
+bool TestModifyNameTableAndRevert() {
+  FontFactoryPtr factory = FontFactory::GetInstance();
   FontBuilderArray font_builder_array;
-  loadTestFile(factory, &font_builder_array);
+  LoadTestFile(factory, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
 
   NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
-      font_builder->getTableBuilder(Tag::name));
+      font_builder->GetTableBuilder(Tag::name));
 
   // Change the font name.
   NameEntryBuilderPtr neb =
-      name_builder->nameBuilder(PlatformId::kWindows,
+      name_builder->NameBuilder(PlatformId::kWindows,
                                 WindowsEncodingId::kUnicodeUCS2,
                                 WindowsLanguageId::kEnglish_UnitedStates,
                                 NameId::kFontFamilyName);
-  NameTable::NameEntry* neb_entry = neb->entry();
-  UChar* original_name = neb_entry->name();
+  NameTable::NameEntry* neb_entry = neb->name_entry();
+  UChar* original_name = neb_entry->Name();
   EXPECT_TRUE(original_name != NULL);
 
   U_STRING_DECL(new_name, "Timothy", 7);
-  neb->setName(new_name);
-  name_builder->revertNames();
+  neb->SetName(new_name);
+  name_builder->RevertNames();
 
   // Build the font.
-  FontPtr font = font_builder->build();
+  FontPtr font = font_builder->Build();
 
   // Serialize and reload the serialized font.
   MemoryOutputStream os;
-  factory->serializeFont(font, &os);
+  factory->SerializeFont(font, &os);
   FontArray font_array;
-  ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
-  factory->loadFonts(new_ba, &font_array);
+  ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+  factory->LoadFonts(new_ba, &font_array);
   FontPtr new_font = font_array[0];
 
   // Check the font name.
-  NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
-  UChar* name = name_table->name(PlatformId::kWindows,
+  NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
+  UChar* name = name_table->Name(PlatformId::kWindows,
                                  WindowsEncodingId::kUnicodeUCS2,
                                  WindowsLanguageId::kEnglish_UnitedStates,
                                  NameId::kFontFamilyName);
 
   EXPECT_EQ(u_strcmp(name, original_name), 0);
-  delete name;
-  delete original_name;
+  delete[] name;
+  delete[] original_name;
 
   return true;
 }
 
-bool testRemoveOneName() {
-  FontFactoryPtr factory = FontFactory::getInstance();
+bool TestRemoveOneName() {
+  FontFactoryPtr factory = FontFactory::GetInstance();
   FontBuilderArray font_builder_array;
-  loadTestFile(factory, &font_builder_array);
+  LoadTestFile(factory, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
 
   NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
-      font_builder->getTableBuilder(Tag::name));
+      font_builder->GetTableBuilder(Tag::name));
 
-  EXPECT_TRUE(name_builder->has(PlatformId::kWindows,
+  EXPECT_TRUE(name_builder->Has(PlatformId::kWindows,
                                 WindowsEncodingId::kUnicodeUCS2,
                                 WindowsLanguageId::kEnglish_UnitedStates,
                                 NameId::kFontFamilyName));
-  EXPECT_TRUE(name_builder->remove(PlatformId::kWindows,
+  EXPECT_TRUE(name_builder->Remove(PlatformId::kWindows,
                                    WindowsEncodingId::kUnicodeUCS2,
                                    WindowsLanguageId::kEnglish_UnitedStates,
                                    NameId::kFontFamilyName));
 
   // Build the font.
-  FontPtr font = font_builder->build();
+  FontPtr font = font_builder->Build();
 
   // Serialize and reload the serialized font.
   MemoryOutputStream os;
-  factory->serializeFont(font, &os);
+  factory->SerializeFont(font, &os);
   FontArray font_array;
-  ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
-  factory->loadFonts(new_ba, &font_array);
+  ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+  factory->LoadFonts(new_ba, &font_array);
   FontPtr new_font = font_array[0];
 
   // Check the font name.
-  NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
-  UChar* name = name_table->name(PlatformId::kWindows,
+  NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
+  UChar* name = name_table->Name(PlatformId::kWindows,
                                  WindowsEncodingId::kUnicodeUCS2,
                                  WindowsLanguageId::kEnglish_UnitedStates,
                                  NameId::kFontFamilyName);
@@ -179,14 +179,14 @@
 // Note: Function is not implemented but the test case is built.  Uncomment
 //       when NameTable::clear() is implemented.
 /*
-bool testClearAllNamesAndSetOne() {
-  FontFactoryPtr factory = FontFactory::getInstance();
+bool TestClearAllNamesAndSetOne() {
+  FontFactoryPtr factory = FontFactory::GetInstance();
   FontBuilderArray font_builder_array;
-  loadTestFile(factory, &font_builder_array);
+  LoadTestFile(factory, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
 
   NameTableBuilderPtr name_builder = down_cast<NameTable::Builder*>(
-      font_builder->getTableBuilder(Tag::name));
+      font_builder->GetTableBuilder(Tag::name));
 
   EXPECT_GT(name_builder->builderCount(), 0);
   name_builder->clear();
@@ -194,32 +194,34 @@
 
   // Change the font name.
   NameEntryBuilderPtr neb =
-      name_builder->nameBuilder(PlatformId::kWindows,
+      name_builder->NameBuilder(PlatformId::kWindows,
                                 WindowsEncodingId::kUnicodeUCS2,
                                 WindowsLanguageId::kEnglish_UnitedStates,
                                 NameId::kFontFamilyName);
   U_STRING_DECL(new_name, "Fred", 4);
-  neb->setName(new_name);
+  neb->SetName(new_name);
 
   // Build the font.
-  FontPtr font = font_builder->build();
+  FontPtr font = font_builder->Build();
 
   // Serialize and reload the serialized font.
   MemoryOutputStream os;
-  factory->serializeFont(font, &os);
+  factory->SerializeFont(font, &os);
   FontArray font_array;
-  ByteArrayPtr new_ba = new MemoryByteArray(os.get(), os.size());
-  factory->loadFonts(new_ba, &font_array);
+  ByteArrayPtr new_ba = new MemoryByteArray(os.Get(), os.Size());
+  factory->LoadFonts(new_ba, &font_array);
   FontPtr new_font = font_array[0];
 
   // Check the font name.
   NameTablePtr name_table = down_cast<NameTable*>(font->table(Tag::name));
-  UChar* name = name_table->name(PlatformId::kWindows,
+  UChar* name = name_table->Name(PlatformId::kWindows,
                                  WindowsEncodingId::kUnicodeUCS2,
                                  WindowsLanguageId::kEnglish_UnitedStates,
                                  NameId::kFontFamilyName);
-  EXPECT_EQ(name_table->nameCount(), 1);
+  EXPECT_EQ(name_table->NameCount(), 1);
   EXPECT_EQ(u_strcmp(name, new_name), 0);
+
+  delete[] name;
   return true;
 }
 */
diff --git a/test/name_editing_test.h b/test/name_editing_test.h
index b5edf0f..dff38d8 100644
--- a/test/name_editing_test.h
+++ b/test/name_editing_test.h
@@ -19,12 +19,12 @@
 
 namespace sfntly {
 
-bool testChangeOneName();
-bool testModifyNameTableAndRevert();
-bool testRemoveOneName();
+bool TestChangeOneName();
+bool TestModifyNameTableAndRevert();
+bool TestRemoveOneName();
 // Note: Function is not implemented but the test case is built.  Uncomment
 //       when NameTable::clear() is implemented.
-// bool testClearAllNamesAndSetOne();
+// bool TestClearAllNamesAndSetOne();
 
 }  // namespace sfntly
 
diff --git a/test/open_type_data_test.cc b/test/open_type_data_test.cc
index ef1d390..da07e69 100644
--- a/test/open_type_data_test.cc
+++ b/test/open_type_data_test.cc
@@ -24,7 +24,7 @@
 const byte_t TEST_OTF_DATA[] =
     {0xff, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
 
-bool testOTFRead() {
+bool TestOTFRead() {
   ByteVector bytes;
   for (size_t i = 0; i < sizeof(TEST_OTF_DATA) / sizeof(byte_t); ++i) {
     bytes.push_back(TEST_OTF_DATA[i]);
@@ -32,18 +32,18 @@
   ByteArrayPtr array = new MemoryByteArray(&(bytes[0]), bytes.size());
   ReadableFontDataPtr data = new ReadableFontData(array);
 
-  EXPECT_EQ(-1, data->readByte(0));
-  EXPECT_EQ(0xff, data->readUByte(0));
-  EXPECT_EQ(0x01, data->readByte(1));
-  EXPECT_EQ(65281, data->readUShort(0));
-  EXPECT_EQ(-255, data->readShort(0));
-  EXPECT_EQ(16711937, data->readUInt24(0));
-  EXPECT_EQ(4278255873LL, data->readULong(0));
-  EXPECT_EQ(-16711423, data->readLong(0));
+  EXPECT_EQ(-1, data->ReadByte(0));
+  EXPECT_EQ(0xff, data->ReadUByte(0));
+  EXPECT_EQ(0x01, data->ReadByte(1));
+  EXPECT_EQ(65281, data->ReadUShort(0));
+  EXPECT_EQ(-255, data->ReadShort(0));
+  EXPECT_EQ(16711937, data->ReadUInt24(0));
+  EXPECT_EQ(4278255873LL, data->ReadULong(0));
+  EXPECT_EQ(-16711423, data->ReadLong(0));
   return true;
 }
 
-bool testOTFCopy() {
+bool TestOTFCopy() {
   ByteVector source_bytes(1024);
   for (size_t i = 0; i < source_bytes.size(); ++i) {
     source_bytes[i] = (byte_t)(i & 0xff);
@@ -56,7 +56,7 @@
       new MemoryByteArray(&(destination_bytes[0]), 1024);
   WritableFontDataPtr destination = new WritableFontData(destination_array);
 
-  int32_t length = source->copyTo(destination);
+  int32_t length = source->CopyTo(destination);
   EXPECT_EQ(1024, length);
   EXPECT_TRUE(std::equal(source_bytes.begin(), source_bytes.end(),
                          destination_bytes.begin()));
diff --git a/test/open_type_data_test.h b/test/open_type_data_test.h
index 99bd422..30d8a54 100644
--- a/test/open_type_data_test.h
+++ b/test/open_type_data_test.h
@@ -19,8 +19,8 @@
 
 namespace sfntly {
 
-bool testOTFRead();
-bool testOTFCopy();
+bool TestOTFRead();
+bool TestOTFCopy();
 
 }  // namespace sfntly
 
diff --git a/test/otf_basic_editing_test.cc b/test/otf_basic_editing_test.cc
index 6c8bde9..e9f4bcd 100644
--- a/test/otf_basic_editing_test.cc
+++ b/test/otf_basic_editing_test.cc
@@ -29,39 +29,39 @@
 
 namespace sfntly {
 
-bool testOTFBasicEditing() {
-  FontFactoryPtr factory = FontFactory::getInstance();
+bool TestOTFBasicEditing() {
+  FontFactoryPtr factory = FontFactory::GetInstance();
   FontBuilderArray font_builder_array;
-  builderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
+  BuilderForFontFile(SAMPLE_TTF_FILE, factory, &font_builder_array);
   FontBuilderPtr font_builder = font_builder_array[0];
 
   // ensure the builder is not bogus
   EXPECT_TRUE(font_builder != NULL);
-  TableBuilderMap* builder_map = font_builder->tableBuilders();
+  TableBuilderMap* builder_map = font_builder->table_builders();
   EXPECT_TRUE(builder_map != NULL);
   for (TableBuilderMap::iterator i = builder_map->begin(),
                                  e = builder_map->end(); i != e; ++i) {
     EXPECT_TRUE(i->second != NULL);
     if (i->second == NULL) {
       char tag[5] = {0};
-      int32_t value = toBE32(i->first);
+      int32_t value = ToBE32(i->first);
       memcpy(tag, &value, 4);
       fprintf(stderr, "tag %s does not have valid builder\n", tag);
     }
   }
 
   IntegerSet builder_tags;
-  font_builder->tableBuilderTags(&builder_tags);
+  font_builder->TableBuilderTags(&builder_tags);
   FontHeaderTableBuilderPtr header_builder =
       down_cast<FontHeaderTable::Builder*>(
-          font_builder->getTableBuilder(Tag::head));
-  int64_t mod_date = header_builder->modified();
-  header_builder->setModified(mod_date + 1);
+          font_builder->GetTableBuilder(Tag::head));
+  int64_t mod_date = header_builder->Modified();
+  header_builder->SetModified(mod_date + 1);
   FontPtr font;
-  font.attach(font_builder->build());
+  font.Attach(font_builder->Build());
 
   // ensure every table had a builder
-  TableMap* table_map = font->tables();
+  TableMap* table_map = font->Tables();
   for (TableMap::iterator i = table_map->begin(), e = table_map->end();
                           i != e; ++i) {
     TablePtr table = (*i).second;
@@ -71,9 +71,9 @@
   }
   EXPECT_TRUE(builder_tags.empty());
 
-  FontHeaderTablePtr header = down_cast<FontHeaderTable*>(
-      font->table(Tag::head));
-  int64_t after_mod_date = header->modified();
+  FontHeaderTablePtr header =
+      down_cast<FontHeaderTable*>(font->GetTable(Tag::head));
+  int64_t after_mod_date = header->Modified();
   EXPECT_EQ(mod_date + 1, after_mod_date);
   return true;
 }
diff --git a/test/otf_basic_editing_test.h b/test/otf_basic_editing_test.h
index b3abfad..483ed90 100644
--- a/test/otf_basic_editing_test.h
+++ b/test/otf_basic_editing_test.h
@@ -19,7 +19,7 @@
 
 namespace sfntly {
 
-bool testOTFBasicEditing();
+bool TestOTFBasicEditing();
 
 }  // namespace sfntly
 
diff --git a/test/smart_pointer_test.cc b/test/smart_pointer_test.cc
index a35e289..7eac019 100644
--- a/test/smart_pointer_test.cc
+++ b/test/smart_pointer_test.cc
@@ -28,7 +28,7 @@
   int foo() { return foo_; }
 };
 
-bool testSmartPointer() {
+bool TestSmartPointer() {
   // scope out allocation
   {
     Ptr<Foo> p1;
@@ -55,7 +55,7 @@
     EXPECT_EQ(size_t(2), p3->ref_count_);
     EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
 
-    p3.release();
+    p3.Release();
     EXPECT_EQ(size_t(1), p1->ref_count_);
     EXPECT_EQ(NULL, p3.p_);
     EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);
diff --git a/test/smart_pointer_test.h b/test/smart_pointer_test.h
index ebc0a1f..b57f614 100644
--- a/test/smart_pointer_test.h
+++ b/test/smart_pointer_test.h
@@ -17,6 +17,6 @@
 #ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_SMART_POINTER_TEST_H_
 #define TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_SMART_POINTER_TEST_H_
 
-bool testSmartPointer();
+bool TestSmartPointer();
 
 #endif  // TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_SMART_POINTER_TEST_H_
diff --git a/test/test_font_utils.cc b/test/test_font_utils.cc
index 830f96e..2c7e1fe 100644
--- a/test/test_font_utils.cc
+++ b/test/test_font_utils.cc
@@ -23,32 +23,32 @@
 
 namespace sfntly {
 
-void builderForFontFile(const char* font_path, FontFactory* factory,
+void BuilderForFontFile(const char* font_path, FontFactory* factory,
                         FontBuilderArray* builders) {
   assert(factory);
   FileInputStream is;
-  is.open(font_path);
-  factory->loadFontsForBuilding(&is, builders);
+  is.Open(font_path);
+  factory->LoadFontsForBuilding(&is, builders);
   EXPECT_GT(builders->size(), static_cast<size_t>(0));
 }
 
-void serializeFont(const char* font_path, FontFactory* factory, Font* font) {
+void SerializeFont(const char* font_path, FontFactory* factory, Font* font) {
   assert(font_path);
   assert(factory);
   assert(font);
   MemoryOutputStream output_stream;
-  factory->serializeFont(font, &output_stream);
-  serializeToFile(&output_stream, font_path);
+  factory->SerializeFont(font, &output_stream);
+  SerializeToFile(&output_stream, font_path);
 }
 
-void loadFont(const char* font_path, FontFactory* factory, FontArray* fonts) {
+void LoadFont(const char* font_path, FontFactory* factory, FontArray* fonts) {
   FileInputStream is;
-  is.open(font_path);
-  factory->loadFonts(&is, fonts);
-  is.close();
+  is.Open(font_path);
+  factory->LoadFonts(&is, fonts);
+  is.Close();
 }
 
-void loadFile(const char* input_file_path, ByteVector* input_buffer) {
+void LoadFile(const char* input_file_path, ByteVector* input_buffer) {
   assert(input_file_path);
   assert(input_buffer);
 
@@ -68,7 +68,7 @@
   fclose(input_file);
 }
 
-void serializeToFile(MemoryOutputStream* output_stream, const char* file_path) {
+void SerializeToFile(MemoryOutputStream* output_stream, const char* file_path) {
   assert(file_path);
   assert(output_stream);
 
@@ -79,12 +79,12 @@
   output_file = fopen(file_path, "wb");
 #endif
   EXPECT_NE(output_file, reinterpret_cast<FILE*>(NULL));
-  fwrite(output_stream->get(), 1, output_stream->size(), output_file);
+  fwrite(output_stream->Get(), 1, output_stream->Size(), output_file);
   fflush(output_file);
   fclose(output_file);
 }
 
-void hexDump(const unsigned char* byte_data, size_t length) {
+void HexDump(const unsigned char* byte_data, size_t length) {
   if (byte_data == NULL || length == 0) {
     fprintf(stderr, "<NULL>\n");
     return;
diff --git a/test/test_font_utils.h b/test/test_font_utils.h
index b0c5696..6c70edc 100644
--- a/test/test_font_utils.h
+++ b/test/test_font_utils.h
@@ -23,15 +23,15 @@
 
 namespace sfntly {
 
-void builderForFontFile(const char* font_path, FontFactory* factory,
+void BuilderForFontFile(const char* font_path, FontFactory* factory,
                         FontBuilderArray* builders);
-void serializeFont(const char* font_path, FontFactory* factory, Font* font);
-void loadFont(const char* font_path, FontFactory* factory, FontArray* fonts);
+void SerializeFont(const char* font_path, FontFactory* factory, Font* font);
+void LoadFont(const char* font_path, FontFactory* factory, FontArray* fonts);
 
-void loadFile(const char* input_file_path, ByteVector* input_buffer);
-void serializeToFile(MemoryOutputStream* output_stream, const char* file_path);
+void LoadFile(const char* input_file_path, ByteVector* input_buffer);
+void SerializeToFile(MemoryOutputStream* output_stream, const char* file_path);
 
-void hexDump(const unsigned char* byte_data, size_t length);
+void HexDump(const unsigned char* byte_data, size_t length);
 
 }  // namespace sfntly
 
diff --git a/test/test_utils.cc b/test/test_utils.cc
index 4b4644e..4751b92 100644
--- a/test/test_utils.cc
+++ b/test/test_utils.cc
@@ -30,15 +30,15 @@
 TestUtils::TestUtils() {}
 
 // static
-// OutputStream createOutputStream(const char *file_path) {
+// OutputStream CreateOutputStream(const char *file_path) {
 // }
 
 // static
-// void TestUtils::createNewFile(const char* file_path) {
+// void TestUtils::CreateNewFile(const char* file_path) {
 // }
 
 // static
-int32_t TestUtils::encodeOneChar(UConverter* encoder, int16_t uchar) {
+int32_t TestUtils::EncodeOneChar(UConverter* encoder, int16_t uchar) {
   char* target = new char[ucnv_getMaxCharSize(encoder) * 2];
   char* target_end;
   UChar* source = new UChar[2];
@@ -69,7 +69,7 @@
 }
 
 // static
-UConverter* TestUtils::getEncoder(const char* charset_name) {
+UConverter* TestUtils::GetEncoder(const char* charset_name) {
   if (charset_name == NULL || strcmp(charset_name, "") == 0)
     return NULL;
   UErrorCode status = U_ZERO_ERROR;
@@ -81,7 +81,7 @@
 
 // Get a file's extension
 // static
-const char* TestUtils::extension(const char* file_path) {
+const char* TestUtils::Extension(const char* file_path) {
   if (!file_path)
     return NULL;
   return strrchr(file_path, EXTENSION_SEPARATOR);
diff --git a/test/test_utils.h b/test/test_utils.h
index 6aa4d99..4d692e1 100644
--- a/test/test_utils.h
+++ b/test/test_utils.h
@@ -40,8 +40,10 @@
   // @param length the length of the byte arrays to compare
   // @return true if the array segments are equal; false otherwise
   // TODO(dfilimon): implement
-  static bool equals(ByteArray* b1, int32_t offset1,
-                     ByteArray* b2, int32_t offset2);
+  static bool Equals(ByteArray* b1,
+                     int32_t offset1,
+                     ByteArray* b2,
+                     int32_t offset2);
 
   // @param offset1 offset to start comparing the first ByteArray from
   // @param ba1 the first ByteArray
@@ -50,8 +52,11 @@
   // @param length the number of bytes to compare
   // @return true if all bytes in the ranges given are equal; false otherwise
   // TODO(dfilimon): implement
-  static bool equals(ByteArray* b1, int32_t offset1,
-                     ByteArray* b2, int32_t offset2, int32_t length);
+  static bool Equals(ByteArray* b1,
+                     int32_t offset1,
+                     ByteArray* b2,
+                     int32_t offset2,
+                     int32_t length);
 
   // TODO(dfilimon): implement FileOutputStream in port/file_output_stream.*
   // static OutputStream createOutputStream(const char* file_path);
@@ -62,13 +67,13 @@
   // Creates a new file including deleting an already existing file with the
   // same path and name and creating any needed directories.
   // TODO(dfilimon): implement
-  static void createNewFile(const char* file_path);
+  static void CreateNewFile(const char* file_path);
 
   // Converts an integer into a 4 character string using the ASCII encoding.
   // @param i the value to convert
   // @return the String based on the number
   // TODO(dfilimon): implement
-  static void dumpLongAsString(int32_t i, std::string* result);
+  static void DumpLongAsString(int32_t i, std::string* result);
 
   // Calculate an OpenType checksum from the array.
   // @param b the array to calculate checksum on
@@ -76,20 +81,20 @@
   // @param length the number of bytes to check; must be a multiple of 4
   // @return checksum
   // TODO(dfilimon): implement
-  static int64_t checkSum(ByteArray* b, int32_t offset, int32_t length);
+  static int64_t CheckSum(ByteArray* b, int32_t offset, int32_t length);
 
   // Encode a single character in UTF-16.
   // We only support the BMP for now
   // @param encoder the encoder to use for the encoding
   // @param uchar the Unicode character to encode
   // @return the encoded character
-  static int32_t encodeOneChar(UConverter* encoder, int16_t uchar);
+  static int32_t EncodeOneChar(UConverter* encoder, int16_t uchar);
 
   // Get an encoder for the charset name.
   // If the name is null or the empty string then just return null.
   // @param charsetName the charset to get an encoder for
   // @return an encoder or null if no encoder available for charset name
-  static UConverter* getEncoder(const char* charsetName);
+  static UConverter* GetEncoder(const char* charsetName);
 
  private:
   static const char EXTENSION_SEPARATOR = '.';
@@ -99,7 +104,7 @@
   // @param file the whose name to process
   // @return string containing the extension or an empty string if
   // there is no extension
-  static const char* extension(const char* file_path);
+  static const char* Extension(const char* file_path);
 };
 }
 #endif  // TYPOGRAPHY_FONT_SFNTLY_SRC_TEST_TEST_UTILS_H_
diff --git a/test/test_utils_test.cc b/test/test_utils_test.cc
index 12c5512..41ba905 100644
--- a/test/test_utils_test.cc
+++ b/test/test_utils_test.cc
@@ -27,8 +27,8 @@
 
 // Check if proper encoding is being performed
 // Conversion is done from UTF16 to UTF8, SJIS
-bool testEncoding() {
-  UConverter* conv = TestUtils::getEncoder("utf8");
+bool TestEncoding() {
+  UConverter* conv = TestUtils::GetEncoder("utf8");
   EXPECT_TRUE(conv != NULL);
   // Ūnĭcōde̽
   UChar from[8] = {0x016A, 0x006E, 0x012D, 0x0063, 0x014D, 0x0064, 0x0065,
@@ -37,7 +37,7 @@
                       0x65, 0xcc, 0xbd};
   int32_t i, j = 0;
   for (i = 0; i < 7; ++i) {
-    int32_t encoded = TestUtils::encodeOneChar(conv, (int16_t)from[i]);
+    int32_t encoded = TestUtils::EncodeOneChar(conv, (int16_t)from[i]);
     for (; encoded; encoded <<= 8) {
       byte_t b = (encoded & 0xff000000) >> 24;
       if (!b)
@@ -54,22 +54,22 @@
 }
 
 // Check if the proper extension is obtained
-bool testExtension() {
+bool TestExtension() {
   // usual file name
   const char *result;
-  result = TestUtils::extension("../data/ext/arial.ttf");
+  result = TestUtils::Extension("../data/ext/tuffy.ttf");
   EXPECT_EQ(strcmp(result, ".ttf"), 0);
 
   // more than one 'extension'
-  result = TestUtils::extension("arial.ttf.fake");
+  result = TestUtils::Extension("tuffy.ttf.fake");
   EXPECT_EQ(strcmp(result, ".fake"), 0);
 
   // no extension
-  result = TestUtils::extension("arial");
+  result = TestUtils::Extension("tuffy");
   EXPECT_STREQ(result, NULL);
 
   // bogus extension
-  result = TestUtils::extension("arial.");
+  result = TestUtils::Extension("tuffy.");
   EXPECT_EQ(strcmp(result, "."), 0);
 
   return true;
diff --git a/test/test_utils_test.h b/test/test_utils_test.h
index 1b4649e..c830ed1 100644
--- a/test/test_utils_test.h
+++ b/test/test_utils_test.h
@@ -21,9 +21,9 @@
 
 namespace sfntly {
 
-bool testEncoding();
-bool testExtension();
-bool testReadFile();
+bool TestEncoding();
+bool TestExtension();
+bool TestReadFile();
 
 }  // namespace sfntly
 
